From c60c77dd467440a05ce382667e2ca8110f8b8df0 Mon Sep 17 00:00:00 2001 From: sofiia-tesliuk Date: Mon, 17 Aug 2020 17:10:48 +0000 Subject: [PATCH 1/8] removed pbtypes.Timestamp; --- diff/diff.pb.go | 585 +++++++++++++++++++++++++++++----------------- diff/diff.proto | 5 +- diff/diff_test.go | 19 +- diff/parse.go | 18 +- diff/print.go | 10 +- go.mod | 1 - 6 files changed, 402 insertions(+), 236 deletions(-) diff --git a/diff/diff.pb.go b/diff/diff.pb.go index 2e7c27f..9840148 100644 --- a/diff/diff.pb.go +++ b/diff/diff.pb.go @@ -1,34 +1,28 @@ -// Code generated by protoc-gen-gogo. +// Code generated by protoc-gen-gogo. DO NOT EDIT. // source: diff.proto -// DO NOT EDIT! -/* - Package diff is a generated protocol buffer package. - - It is generated from these files: - diff.proto - - It has these top-level messages: - FileDiff - Hunk - Stat -*/ package diff -import proto "github.com/gogo/protobuf/proto" -import fmt "fmt" -import math "math" - -// discarding unused import gogoproto "github.com/gogo/protobuf/gogoproto" -import pbtypes "sourcegraph.com/sqs/pbtypes" - -import io "io" +import ( + fmt "fmt" + _ "github.com/gogo/protobuf/gogoproto" + proto "github.com/gogo/protobuf/proto" + io "io" + math "math" + math_bits "math/bits" +) // Reference imports to suppress errors if they are not otherwise used. var _ = proto.Marshal var _ = fmt.Errorf var _ = math.Inf +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package + // A FileDiff represents a unified diff for a single file. // // A file unified diff has a header that resembles the following: @@ -39,20 +33,52 @@ type FileDiff struct { // the original name of the file OrigName string `protobuf:"bytes,1,opt,name=OrigName,proto3" json:"OrigName,omitempty"` // the original timestamp (nil if not present) - OrigTime *pbtypes.Timestamp `protobuf:"bytes,2,opt,name=OrigTime" json:"OrigTime,omitempty"` + OrigTime []byte `protobuf:"bytes,2,opt,name=OrigTime,proto3" json:"OrigTime,omitempty"` // the new name of the file (often same as OrigName) NewName string `protobuf:"bytes,3,opt,name=NewName,proto3" json:"NewName,omitempty"` // the new timestamp (nil if not present) - NewTime *pbtypes.Timestamp `protobuf:"bytes,4,opt,name=NewTime" json:"NewTime,omitempty"` + NewTime []byte `protobuf:"bytes,4,opt,name=NewTime,proto3" json:"NewTime,omitempty"` // extended header lines (e.g., git's "new mode ", "rename from ", etc.) - Extended []string `protobuf:"bytes,5,rep,name=Extended" json:"Extended,omitempty"` + Extended []string `protobuf:"bytes,5,rep,name=Extended,proto3" json:"Extended,omitempty"` // hunks that were changed from orig to new - Hunks []*Hunk `protobuf:"bytes,6,rep,name=Hunks" json:"Hunks,omitempty"` + Hunks []*Hunk `protobuf:"bytes,6,rep,name=Hunks,proto3" json:"Hunks,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *FileDiff) Reset() { *m = FileDiff{} } func (m *FileDiff) String() string { return proto.CompactTextString(m) } func (*FileDiff) ProtoMessage() {} +func (*FileDiff) Descriptor() ([]byte, []int) { + return fileDescriptor_686521effc814b25, []int{0} +} +func (m *FileDiff) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *FileDiff) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_FileDiff.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *FileDiff) XXX_Merge(src proto.Message) { + xxx_messageInfo_FileDiff.Merge(m, src) +} +func (m *FileDiff) XXX_Size() int { + return m.Size() +} +func (m *FileDiff) XXX_DiscardUnknown() { + xxx_messageInfo_FileDiff.DiscardUnknown(m) +} + +var xxx_messageInfo_FileDiff proto.InternalMessageInfo // A Hunk represents a series of changes (additions or deletions) in a file's // unified diff. @@ -75,12 +101,44 @@ type Hunk struct { // hunk will be 1. StartPosition int32 `protobuf:"varint,7,opt,name=StartPosition,proto3" json:"StartPosition,omitempty"` // hunk body (lines prefixed with '-', '+', or ' ') - Body []byte `protobuf:"bytes,8,opt,name=Body,proto3" json:"Body,omitempty"` + Body []byte `protobuf:"bytes,8,opt,name=Body,proto3" json:"Body,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *Hunk) Reset() { *m = Hunk{} } func (m *Hunk) String() string { return proto.CompactTextString(m) } func (*Hunk) ProtoMessage() {} +func (*Hunk) Descriptor() ([]byte, []int) { + return fileDescriptor_686521effc814b25, []int{1} +} +func (m *Hunk) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Hunk) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Hunk.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Hunk) XXX_Merge(src proto.Message) { + xxx_messageInfo_Hunk.Merge(m, src) +} +func (m *Hunk) XXX_Size() int { + return m.Size() +} +func (m *Hunk) XXX_DiscardUnknown() { + xxx_messageInfo_Hunk.DiscardUnknown(m) +} + +var xxx_messageInfo_Hunk proto.InternalMessageInfo // A Stat is a diff stat that represents the number of lines added/changed/deleted. type Stat struct { @@ -89,229 +147,281 @@ type Stat struct { // number of lines changed Changed int32 `protobuf:"varint,2,opt,name=Changed,proto3" json:""` // number of lines deleted - Deleted int32 `protobuf:"varint,3,opt,name=Deleted,proto3" json:""` + Deleted int32 `protobuf:"varint,3,opt,name=Deleted,proto3" json:""` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *Stat) Reset() { *m = Stat{} } func (m *Stat) String() string { return proto.CompactTextString(m) } func (*Stat) ProtoMessage() {} +func (*Stat) Descriptor() ([]byte, []int) { + return fileDescriptor_686521effc814b25, []int{2} +} +func (m *Stat) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Stat) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Stat.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Stat) XXX_Merge(src proto.Message) { + xxx_messageInfo_Stat.Merge(m, src) +} +func (m *Stat) XXX_Size() int { + return m.Size() +} +func (m *Stat) XXX_DiscardUnknown() { + xxx_messageInfo_Stat.DiscardUnknown(m) +} -func (m *FileDiff) Marshal() (data []byte, err error) { +var xxx_messageInfo_Stat proto.InternalMessageInfo + +func init() { + proto.RegisterType((*FileDiff)(nil), "diff.FileDiff") + proto.RegisterType((*Hunk)(nil), "diff.Hunk") + proto.RegisterType((*Stat)(nil), "diff.Stat") +} + +func init() { proto.RegisterFile("diff.proto", fileDescriptor_686521effc814b25) } + +var fileDescriptor_686521effc814b25 = []byte{ + // 381 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x5c, 0x92, 0x5f, 0x4e, 0xf2, 0x50, + 0x10, 0xc5, 0x29, 0xb4, 0xfc, 0x99, 0x8f, 0x2f, 0x9a, 0xfb, 0xd4, 0x10, 0x53, 0x9b, 0xc6, 0x87, + 0xbe, 0x08, 0x89, 0xae, 0x00, 0x44, 0xe3, 0x83, 0xa9, 0xa6, 0xb8, 0x81, 0x96, 0x4e, 0xcb, 0x8d, + 0xd0, 0x6b, 0xe0, 0x92, 0xea, 0x0e, 0x5c, 0x90, 0x8b, 0xe0, 0xd1, 0x15, 0x18, 0xe5, 0xd1, 0x55, + 0x98, 0x3b, 0xb7, 0x85, 0xe0, 0xdb, 0x9c, 0xdf, 0xe9, 0xdc, 0x99, 0x33, 0x29, 0x40, 0xc2, 0xd3, + 0xb4, 0xff, 0xbc, 0x14, 0x52, 0x30, 0x53, 0xd5, 0xbd, 0xf3, 0x8c, 0xcb, 0xd9, 0x3a, 0xee, 0x4f, + 0xc5, 0x62, 0x90, 0x89, 0x4c, 0x0c, 0xc8, 0x8c, 0xd7, 0x29, 0x29, 0x12, 0x54, 0xe9, 0x26, 0xef, + 0xdd, 0x80, 0xf6, 0x0d, 0x9f, 0xe3, 0x98, 0xa7, 0x29, 0xeb, 0x41, 0xfb, 0x7e, 0xc9, 0xb3, 0x20, + 0x5a, 0xa0, 0x6d, 0xb8, 0x86, 0xdf, 0x09, 0x77, 0xba, 0xf2, 0x1e, 0xf9, 0x02, 0xed, 0xba, 0x6b, + 0xf8, 0xdd, 0x70, 0xa7, 0x99, 0x0d, 0xad, 0x00, 0x0b, 0x6a, 0x6b, 0x50, 0x5b, 0x25, 0x4b, 0x87, + 0x9a, 0x4c, 0x6a, 0xaa, 0xa4, 0x7a, 0xef, 0xfa, 0x45, 0x62, 0x9e, 0x60, 0x62, 0x5b, 0x6e, 0x43, + 0xcd, 0xaa, 0x34, 0x73, 0xc1, 0xba, 0x5d, 0xe7, 0x4f, 0x2b, 0xbb, 0xe9, 0x36, 0xfc, 0x7f, 0x17, + 0xd0, 0xa7, 0x94, 0x0a, 0x85, 0xda, 0xf0, 0xde, 0xea, 0x60, 0xaa, 0x8a, 0x9d, 0xc1, 0x7f, 0xb5, + 0xc6, 0x44, 0x46, 0x4b, 0x79, 0xc7, 0x73, 0xbd, 0xb7, 0x15, 0x1e, 0x42, 0x76, 0x02, 0x1d, 0x05, + 0x54, 0xbd, 0xa2, 0xed, 0xad, 0x70, 0x0f, 0x98, 0x0f, 0x47, 0x14, 0x53, 0x04, 0x58, 0xcc, 0x79, + 0x8e, 0x43, 0x49, 0x31, 0xac, 0xf0, 0x2f, 0x66, 0x1e, 0x74, 0x03, 0x2c, 0xf6, 0xc3, 0x4c, 0xfa, + 0xec, 0x80, 0xa9, 0x60, 0x01, 0x16, 0x7a, 0x94, 0x45, 0xfe, 0x4e, 0xab, 0x73, 0x4c, 0x70, 0x2a, + 0xb9, 0xc8, 0xed, 0xa6, 0x3e, 0x54, 0x29, 0x55, 0x0e, 0x7a, 0xe2, 0x41, 0xac, 0x38, 0xf9, 0x2d, + 0x9d, 0xe3, 0x00, 0x32, 0x06, 0xe6, 0x48, 0x24, 0xaf, 0x76, 0x9b, 0x6e, 0x49, 0xb5, 0x17, 0x83, + 0x39, 0x91, 0x91, 0x64, 0x3d, 0xb0, 0x86, 0x89, 0xba, 0x26, 0x5d, 0x60, 0x64, 0xfe, 0x7c, 0x9e, + 0xd6, 0x42, 0x8d, 0x98, 0x03, 0xad, 0xab, 0x59, 0x94, 0x67, 0x98, 0xe8, 0xf4, 0xa5, 0x5b, 0x41, + 0xe5, 0x8f, 0x71, 0x8e, 0x12, 0x13, 0x9d, 0xbc, 0xf2, 0x4b, 0x38, 0x3a, 0xde, 0x7c, 0x3b, 0xb5, + 0xcd, 0xd6, 0x31, 0x3e, 0xb6, 0x8e, 0xf1, 0xb5, 0x75, 0x8c, 0xb8, 0x49, 0xbf, 0xcf, 0xe5, 0x6f, + 0x00, 0x00, 0x00, 0xff, 0xff, 0xb1, 0x2f, 0x14, 0x9f, 0x81, 0x02, 0x00, 0x00, +} + +func (m *FileDiff) Marshal() (dAtA []byte, err error) { size := m.Size() - data = make([]byte, size) - n, err := m.MarshalTo(data) + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } - return data[:n], nil + return dAtA[:n], nil } -func (m *FileDiff) MarshalTo(data []byte) (int, error) { +func (m *FileDiff) MarshalTo(dAtA []byte) (int, error) { var i int _ = i var l int _ = l if len(m.OrigName) > 0 { - data[i] = 0xa + dAtA[i] = 0xa i++ - i = encodeVarintDiff(data, i, uint64(len(m.OrigName))) - i += copy(data[i:], m.OrigName) + i = encodeVarintDiff(dAtA, i, uint64(len(m.OrigName))) + i += copy(dAtA[i:], m.OrigName) } - if m.OrigTime != nil { - data[i] = 0x12 + if len(m.OrigTime) > 0 { + dAtA[i] = 0x12 i++ - i = encodeVarintDiff(data, i, uint64(m.OrigTime.Size())) - n1, err := m.OrigTime.MarshalTo(data[i:]) - if err != nil { - return 0, err - } - i += n1 + i = encodeVarintDiff(dAtA, i, uint64(len(m.OrigTime))) + i += copy(dAtA[i:], m.OrigTime) } if len(m.NewName) > 0 { - data[i] = 0x1a + dAtA[i] = 0x1a i++ - i = encodeVarintDiff(data, i, uint64(len(m.NewName))) - i += copy(data[i:], m.NewName) + i = encodeVarintDiff(dAtA, i, uint64(len(m.NewName))) + i += copy(dAtA[i:], m.NewName) } - if m.NewTime != nil { - data[i] = 0x22 + if len(m.NewTime) > 0 { + dAtA[i] = 0x22 i++ - i = encodeVarintDiff(data, i, uint64(m.NewTime.Size())) - n2, err := m.NewTime.MarshalTo(data[i:]) - if err != nil { - return 0, err - } - i += n2 + i = encodeVarintDiff(dAtA, i, uint64(len(m.NewTime))) + i += copy(dAtA[i:], m.NewTime) } if len(m.Extended) > 0 { for _, s := range m.Extended { - data[i] = 0x2a + dAtA[i] = 0x2a i++ l = len(s) for l >= 1<<7 { - data[i] = uint8(uint64(l)&0x7f | 0x80) + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) l >>= 7 i++ } - data[i] = uint8(l) + dAtA[i] = uint8(l) i++ - i += copy(data[i:], s) + i += copy(dAtA[i:], s) } } if len(m.Hunks) > 0 { for _, msg := range m.Hunks { - data[i] = 0x32 + dAtA[i] = 0x32 i++ - i = encodeVarintDiff(data, i, uint64(msg.Size())) - n, err := msg.MarshalTo(data[i:]) + i = encodeVarintDiff(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n } } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } return i, nil } -func (m *Hunk) Marshal() (data []byte, err error) { +func (m *Hunk) Marshal() (dAtA []byte, err error) { size := m.Size() - data = make([]byte, size) - n, err := m.MarshalTo(data) + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } - return data[:n], nil + return dAtA[:n], nil } -func (m *Hunk) MarshalTo(data []byte) (int, error) { +func (m *Hunk) MarshalTo(dAtA []byte) (int, error) { var i int _ = i var l int _ = l if m.OrigStartLine != 0 { - data[i] = 0x8 + dAtA[i] = 0x8 i++ - i = encodeVarintDiff(data, i, uint64(m.OrigStartLine)) + i = encodeVarintDiff(dAtA, i, uint64(m.OrigStartLine)) } if m.OrigLines != 0 { - data[i] = 0x10 + dAtA[i] = 0x10 i++ - i = encodeVarintDiff(data, i, uint64(m.OrigLines)) + i = encodeVarintDiff(dAtA, i, uint64(m.OrigLines)) } if m.OrigNoNewlineAt != 0 { - data[i] = 0x18 + dAtA[i] = 0x18 i++ - i = encodeVarintDiff(data, i, uint64(m.OrigNoNewlineAt)) + i = encodeVarintDiff(dAtA, i, uint64(m.OrigNoNewlineAt)) } if m.NewStartLine != 0 { - data[i] = 0x20 + dAtA[i] = 0x20 i++ - i = encodeVarintDiff(data, i, uint64(m.NewStartLine)) + i = encodeVarintDiff(dAtA, i, uint64(m.NewStartLine)) } if m.NewLines != 0 { - data[i] = 0x28 + dAtA[i] = 0x28 i++ - i = encodeVarintDiff(data, i, uint64(m.NewLines)) + i = encodeVarintDiff(dAtA, i, uint64(m.NewLines)) } if len(m.Section) > 0 { - data[i] = 0x32 + dAtA[i] = 0x32 i++ - i = encodeVarintDiff(data, i, uint64(len(m.Section))) - i += copy(data[i:], m.Section) + i = encodeVarintDiff(dAtA, i, uint64(len(m.Section))) + i += copy(dAtA[i:], m.Section) } if m.StartPosition != 0 { - data[i] = 0x38 + dAtA[i] = 0x38 i++ - i = encodeVarintDiff(data, i, uint64(m.StartPosition)) + i = encodeVarintDiff(dAtA, i, uint64(m.StartPosition)) } - if m.Body != nil { - if len(m.Body) > 0 { - data[i] = 0x42 - i++ - i = encodeVarintDiff(data, i, uint64(len(m.Body))) - i += copy(data[i:], m.Body) - } + if len(m.Body) > 0 { + dAtA[i] = 0x42 + i++ + i = encodeVarintDiff(dAtA, i, uint64(len(m.Body))) + i += copy(dAtA[i:], m.Body) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } return i, nil } -func (m *Stat) Marshal() (data []byte, err error) { +func (m *Stat) Marshal() (dAtA []byte, err error) { size := m.Size() - data = make([]byte, size) - n, err := m.MarshalTo(data) + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } - return data[:n], nil + return dAtA[:n], nil } -func (m *Stat) MarshalTo(data []byte) (int, error) { +func (m *Stat) MarshalTo(dAtA []byte) (int, error) { var i int _ = i var l int _ = l if m.Added != 0 { - data[i] = 0x8 + dAtA[i] = 0x8 i++ - i = encodeVarintDiff(data, i, uint64(m.Added)) + i = encodeVarintDiff(dAtA, i, uint64(m.Added)) } if m.Changed != 0 { - data[i] = 0x10 + dAtA[i] = 0x10 i++ - i = encodeVarintDiff(data, i, uint64(m.Changed)) + i = encodeVarintDiff(dAtA, i, uint64(m.Changed)) } if m.Deleted != 0 { - data[i] = 0x18 + dAtA[i] = 0x18 i++ - i = encodeVarintDiff(data, i, uint64(m.Deleted)) + i = encodeVarintDiff(dAtA, i, uint64(m.Deleted)) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } return i, nil } -func encodeFixed64Diff(data []byte, offset int, v uint64) int { - data[offset] = uint8(v) - data[offset+1] = uint8(v >> 8) - data[offset+2] = uint8(v >> 16) - data[offset+3] = uint8(v >> 24) - data[offset+4] = uint8(v >> 32) - data[offset+5] = uint8(v >> 40) - data[offset+6] = uint8(v >> 48) - data[offset+7] = uint8(v >> 56) - return offset + 8 -} -func encodeFixed32Diff(data []byte, offset int, v uint32) int { - data[offset] = uint8(v) - data[offset+1] = uint8(v >> 8) - data[offset+2] = uint8(v >> 16) - data[offset+3] = uint8(v >> 24) - return offset + 4 -} -func encodeVarintDiff(data []byte, offset int, v uint64) int { +func encodeVarintDiff(dAtA []byte, offset int, v uint64) int { for v >= 1<<7 { - data[offset] = uint8(v&0x7f | 0x80) + dAtA[offset] = uint8(v&0x7f | 0x80) v >>= 7 offset++ } - data[offset] = uint8(v) + dAtA[offset] = uint8(v) return offset + 1 } func (m *FileDiff) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l l = len(m.OrigName) if l > 0 { n += 1 + l + sovDiff(uint64(l)) } - if m.OrigTime != nil { - l = m.OrigTime.Size() + l = len(m.OrigTime) + if l > 0 { n += 1 + l + sovDiff(uint64(l)) } l = len(m.NewName) if l > 0 { n += 1 + l + sovDiff(uint64(l)) } - if m.NewTime != nil { - l = m.NewTime.Size() + l = len(m.NewTime) + if l > 0 { n += 1 + l + sovDiff(uint64(l)) } if len(m.Extended) > 0 { @@ -326,10 +436,16 @@ func (m *FileDiff) Size() (n int) { n += 1 + l + sovDiff(uint64(l)) } } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } return n } func (m *Hunk) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l if m.OrigStartLine != 0 { @@ -354,16 +470,20 @@ func (m *Hunk) Size() (n int) { if m.StartPosition != 0 { n += 1 + sovDiff(uint64(m.StartPosition)) } - if m.Body != nil { - l = len(m.Body) - if l > 0 { - n += 1 + l + sovDiff(uint64(l)) - } + l = len(m.Body) + if l > 0 { + n += 1 + l + sovDiff(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) } return n } func (m *Stat) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l if m.Added != 0 { @@ -375,24 +495,20 @@ func (m *Stat) Size() (n int) { if m.Deleted != 0 { n += 1 + sovDiff(uint64(m.Deleted)) } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } return n } func sovDiff(x uint64) (n int) { - for { - n++ - x >>= 7 - if x == 0 { - break - } - } - return n + return (math_bits.Len64(x|1) + 6) / 7 } func sozDiff(x uint64) (n int) { return sovDiff(uint64((x << 1) ^ uint64((int64(x) >> 63)))) } -func (m *FileDiff) Unmarshal(data []byte) error { - l := len(data) +func (m *FileDiff) Unmarshal(dAtA []byte) error { + l := len(dAtA) iNdEx := 0 for iNdEx < l { preIndex := iNdEx @@ -404,9 +520,9 @@ func (m *FileDiff) Unmarshal(data []byte) error { if iNdEx >= l { return io.ErrUnexpectedEOF } - b := data[iNdEx] + b := dAtA[iNdEx] iNdEx++ - wire |= (uint64(b) & 0x7F) << shift + wire |= uint64(b&0x7F) << shift if b < 0x80 { break } @@ -432,9 +548,9 @@ func (m *FileDiff) Unmarshal(data []byte) error { if iNdEx >= l { return io.ErrUnexpectedEOF } - b := data[iNdEx] + b := dAtA[iNdEx] iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } @@ -444,16 +560,19 @@ func (m *FileDiff) Unmarshal(data []byte) error { return ErrInvalidLengthDiff } postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthDiff + } if postIndex > l { return io.ErrUnexpectedEOF } - m.OrigName = string(data[iNdEx:postIndex]) + m.OrigName = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field OrigTime", wireType) } - var msglen int + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowDiff @@ -461,25 +580,26 @@ func (m *FileDiff) Unmarshal(data []byte) error { if iNdEx >= l { return io.ErrUnexpectedEOF } - b := data[iNdEx] + b := dAtA[iNdEx] iNdEx++ - msglen |= (int(b) & 0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + if byteLen < 0 { + return ErrInvalidLengthDiff + } + postIndex := iNdEx + byteLen + if postIndex < 0 { return ErrInvalidLengthDiff } - postIndex := iNdEx + msglen if postIndex > l { return io.ErrUnexpectedEOF } + m.OrigTime = append(m.OrigTime[:0], dAtA[iNdEx:postIndex]...) if m.OrigTime == nil { - m.OrigTime = &pbtypes.Timestamp{} - } - if err := m.OrigTime.Unmarshal(data[iNdEx:postIndex]); err != nil { - return err + m.OrigTime = []byte{} } iNdEx = postIndex case 3: @@ -494,9 +614,9 @@ func (m *FileDiff) Unmarshal(data []byte) error { if iNdEx >= l { return io.ErrUnexpectedEOF } - b := data[iNdEx] + b := dAtA[iNdEx] iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } @@ -506,16 +626,19 @@ func (m *FileDiff) Unmarshal(data []byte) error { return ErrInvalidLengthDiff } postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthDiff + } if postIndex > l { return io.ErrUnexpectedEOF } - m.NewName = string(data[iNdEx:postIndex]) + m.NewName = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 4: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field NewTime", wireType) } - var msglen int + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowDiff @@ -523,25 +646,26 @@ func (m *FileDiff) Unmarshal(data []byte) error { if iNdEx >= l { return io.ErrUnexpectedEOF } - b := data[iNdEx] + b := dAtA[iNdEx] iNdEx++ - msglen |= (int(b) & 0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + if byteLen < 0 { + return ErrInvalidLengthDiff + } + postIndex := iNdEx + byteLen + if postIndex < 0 { return ErrInvalidLengthDiff } - postIndex := iNdEx + msglen if postIndex > l { return io.ErrUnexpectedEOF } + m.NewTime = append(m.NewTime[:0], dAtA[iNdEx:postIndex]...) if m.NewTime == nil { - m.NewTime = &pbtypes.Timestamp{} - } - if err := m.NewTime.Unmarshal(data[iNdEx:postIndex]); err != nil { - return err + m.NewTime = []byte{} } iNdEx = postIndex case 5: @@ -556,9 +680,9 @@ func (m *FileDiff) Unmarshal(data []byte) error { if iNdEx >= l { return io.ErrUnexpectedEOF } - b := data[iNdEx] + b := dAtA[iNdEx] iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } @@ -568,10 +692,13 @@ func (m *FileDiff) Unmarshal(data []byte) error { return ErrInvalidLengthDiff } postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthDiff + } if postIndex > l { return io.ErrUnexpectedEOF } - m.Extended = append(m.Extended, string(data[iNdEx:postIndex])) + m.Extended = append(m.Extended, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex case 6: if wireType != 2 { @@ -585,9 +712,9 @@ func (m *FileDiff) Unmarshal(data []byte) error { if iNdEx >= l { return io.ErrUnexpectedEOF } - b := data[iNdEx] + b := dAtA[iNdEx] iNdEx++ - msglen |= (int(b) & 0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } @@ -596,26 +723,33 @@ func (m *FileDiff) Unmarshal(data []byte) error { return ErrInvalidLengthDiff } postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthDiff + } if postIndex > l { return io.ErrUnexpectedEOF } m.Hunks = append(m.Hunks, &Hunk{}) - if err := m.Hunks[len(m.Hunks)-1].Unmarshal(data[iNdEx:postIndex]); err != nil { + if err := m.Hunks[len(m.Hunks)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skipDiff(data[iNdEx:]) + skippy, err := skipDiff(dAtA[iNdEx:]) if err != nil { return err } if skippy < 0 { return ErrInvalidLengthDiff } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthDiff + } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) iNdEx += skippy } } @@ -625,8 +759,8 @@ func (m *FileDiff) Unmarshal(data []byte) error { } return nil } -func (m *Hunk) Unmarshal(data []byte) error { - l := len(data) +func (m *Hunk) Unmarshal(dAtA []byte) error { + l := len(dAtA) iNdEx := 0 for iNdEx < l { preIndex := iNdEx @@ -638,9 +772,9 @@ func (m *Hunk) Unmarshal(data []byte) error { if iNdEx >= l { return io.ErrUnexpectedEOF } - b := data[iNdEx] + b := dAtA[iNdEx] iNdEx++ - wire |= (uint64(b) & 0x7F) << shift + wire |= uint64(b&0x7F) << shift if b < 0x80 { break } @@ -666,9 +800,9 @@ func (m *Hunk) Unmarshal(data []byte) error { if iNdEx >= l { return io.ErrUnexpectedEOF } - b := data[iNdEx] + b := dAtA[iNdEx] iNdEx++ - m.OrigStartLine |= (int32(b) & 0x7F) << shift + m.OrigStartLine |= int32(b&0x7F) << shift if b < 0x80 { break } @@ -685,9 +819,9 @@ func (m *Hunk) Unmarshal(data []byte) error { if iNdEx >= l { return io.ErrUnexpectedEOF } - b := data[iNdEx] + b := dAtA[iNdEx] iNdEx++ - m.OrigLines |= (int32(b) & 0x7F) << shift + m.OrigLines |= int32(b&0x7F) << shift if b < 0x80 { break } @@ -704,9 +838,9 @@ func (m *Hunk) Unmarshal(data []byte) error { if iNdEx >= l { return io.ErrUnexpectedEOF } - b := data[iNdEx] + b := dAtA[iNdEx] iNdEx++ - m.OrigNoNewlineAt |= (int32(b) & 0x7F) << shift + m.OrigNoNewlineAt |= int32(b&0x7F) << shift if b < 0x80 { break } @@ -723,9 +857,9 @@ func (m *Hunk) Unmarshal(data []byte) error { if iNdEx >= l { return io.ErrUnexpectedEOF } - b := data[iNdEx] + b := dAtA[iNdEx] iNdEx++ - m.NewStartLine |= (int32(b) & 0x7F) << shift + m.NewStartLine |= int32(b&0x7F) << shift if b < 0x80 { break } @@ -742,9 +876,9 @@ func (m *Hunk) Unmarshal(data []byte) error { if iNdEx >= l { return io.ErrUnexpectedEOF } - b := data[iNdEx] + b := dAtA[iNdEx] iNdEx++ - m.NewLines |= (int32(b) & 0x7F) << shift + m.NewLines |= int32(b&0x7F) << shift if b < 0x80 { break } @@ -761,9 +895,9 @@ func (m *Hunk) Unmarshal(data []byte) error { if iNdEx >= l { return io.ErrUnexpectedEOF } - b := data[iNdEx] + b := dAtA[iNdEx] iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } @@ -773,10 +907,13 @@ func (m *Hunk) Unmarshal(data []byte) error { return ErrInvalidLengthDiff } postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthDiff + } if postIndex > l { return io.ErrUnexpectedEOF } - m.Section = string(data[iNdEx:postIndex]) + m.Section = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 7: if wireType != 0 { @@ -790,9 +927,9 @@ func (m *Hunk) Unmarshal(data []byte) error { if iNdEx >= l { return io.ErrUnexpectedEOF } - b := data[iNdEx] + b := dAtA[iNdEx] iNdEx++ - m.StartPosition |= (int32(b) & 0x7F) << shift + m.StartPosition |= int32(b&0x7F) << shift if b < 0x80 { break } @@ -809,9 +946,9 @@ func (m *Hunk) Unmarshal(data []byte) error { if iNdEx >= l { return io.ErrUnexpectedEOF } - b := data[iNdEx] + b := dAtA[iNdEx] iNdEx++ - byteLen |= (int(b) & 0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } @@ -820,23 +957,33 @@ func (m *Hunk) Unmarshal(data []byte) error { return ErrInvalidLengthDiff } postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthDiff + } if postIndex > l { return io.ErrUnexpectedEOF } - m.Body = append([]byte{}, data[iNdEx:postIndex]...) + m.Body = append(m.Body[:0], dAtA[iNdEx:postIndex]...) + if m.Body == nil { + m.Body = []byte{} + } iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skipDiff(data[iNdEx:]) + skippy, err := skipDiff(dAtA[iNdEx:]) if err != nil { return err } if skippy < 0 { return ErrInvalidLengthDiff } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthDiff + } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) iNdEx += skippy } } @@ -846,8 +993,8 @@ func (m *Hunk) Unmarshal(data []byte) error { } return nil } -func (m *Stat) Unmarshal(data []byte) error { - l := len(data) +func (m *Stat) Unmarshal(dAtA []byte) error { + l := len(dAtA) iNdEx := 0 for iNdEx < l { preIndex := iNdEx @@ -859,9 +1006,9 @@ func (m *Stat) Unmarshal(data []byte) error { if iNdEx >= l { return io.ErrUnexpectedEOF } - b := data[iNdEx] + b := dAtA[iNdEx] iNdEx++ - wire |= (uint64(b) & 0x7F) << shift + wire |= uint64(b&0x7F) << shift if b < 0x80 { break } @@ -887,9 +1034,9 @@ func (m *Stat) Unmarshal(data []byte) error { if iNdEx >= l { return io.ErrUnexpectedEOF } - b := data[iNdEx] + b := dAtA[iNdEx] iNdEx++ - m.Added |= (int32(b) & 0x7F) << shift + m.Added |= int32(b&0x7F) << shift if b < 0x80 { break } @@ -906,9 +1053,9 @@ func (m *Stat) Unmarshal(data []byte) error { if iNdEx >= l { return io.ErrUnexpectedEOF } - b := data[iNdEx] + b := dAtA[iNdEx] iNdEx++ - m.Changed |= (int32(b) & 0x7F) << shift + m.Changed |= int32(b&0x7F) << shift if b < 0x80 { break } @@ -925,25 +1072,29 @@ func (m *Stat) Unmarshal(data []byte) error { if iNdEx >= l { return io.ErrUnexpectedEOF } - b := data[iNdEx] + b := dAtA[iNdEx] iNdEx++ - m.Deleted |= (int32(b) & 0x7F) << shift + m.Deleted |= int32(b&0x7F) << shift if b < 0x80 { break } } default: iNdEx = preIndex - skippy, err := skipDiff(data[iNdEx:]) + skippy, err := skipDiff(dAtA[iNdEx:]) if err != nil { return err } if skippy < 0 { return ErrInvalidLengthDiff } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthDiff + } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) iNdEx += skippy } } @@ -953,8 +1104,8 @@ func (m *Stat) Unmarshal(data []byte) error { } return nil } -func skipDiff(data []byte) (n int, err error) { - l := len(data) +func skipDiff(dAtA []byte) (n int, err error) { + l := len(dAtA) iNdEx := 0 for iNdEx < l { var wire uint64 @@ -965,7 +1116,7 @@ func skipDiff(data []byte) (n int, err error) { if iNdEx >= l { return 0, io.ErrUnexpectedEOF } - b := data[iNdEx] + b := dAtA[iNdEx] iNdEx++ wire |= (uint64(b) & 0x7F) << shift if b < 0x80 { @@ -983,7 +1134,7 @@ func skipDiff(data []byte) (n int, err error) { return 0, io.ErrUnexpectedEOF } iNdEx++ - if data[iNdEx-1] < 0x80 { + if dAtA[iNdEx-1] < 0x80 { break } } @@ -1000,17 +1151,20 @@ func skipDiff(data []byte) (n int, err error) { if iNdEx >= l { return 0, io.ErrUnexpectedEOF } - b := data[iNdEx] + b := dAtA[iNdEx] iNdEx++ length |= (int(b) & 0x7F) << shift if b < 0x80 { break } } - iNdEx += length if length < 0 { return 0, ErrInvalidLengthDiff } + iNdEx += length + if iNdEx < 0 { + return 0, ErrInvalidLengthDiff + } return iNdEx, nil case 3: for { @@ -1023,7 +1177,7 @@ func skipDiff(data []byte) (n int, err error) { if iNdEx >= l { return 0, io.ErrUnexpectedEOF } - b := data[iNdEx] + b := dAtA[iNdEx] iNdEx++ innerWire |= (uint64(b) & 0x7F) << shift if b < 0x80 { @@ -1034,11 +1188,14 @@ func skipDiff(data []byte) (n int, err error) { if innerWireType == 4 { break } - next, err := skipDiff(data[start:]) + next, err := skipDiff(dAtA[start:]) if err != nil { return 0, err } iNdEx = start + next + if iNdEx < 0 { + return 0, ErrInvalidLengthDiff + } } return iNdEx, nil case 4: diff --git a/diff/diff.proto b/diff/diff.proto index 8868970..f230c3b 100644 --- a/diff/diff.proto +++ b/diff/diff.proto @@ -2,7 +2,6 @@ syntax = "proto3"; package diff; import "github.com/gogo/protobuf/gogoproto/gogo.proto"; -import "sourcegraph.com/sqs/pbtypes/timestamp.proto"; option (gogoproto.goproto_getters_all) = false; option (gogoproto.unmarshaler_all) = true; @@ -20,13 +19,13 @@ message FileDiff { string OrigName = 1; // the original timestamp (nil if not present) - pbtypes.Timestamp OrigTime = 2; + bytes OrigTime = 2; // the new name of the file (often same as OrigName) string NewName = 3; // the new timestamp (nil if not present) - pbtypes.Timestamp NewTime = 4; + bytes NewTime = 4; // extended header lines (e.g., git's "new mode ", "rename from ", etc.) repeated string Extended = 5; diff --git a/diff/diff_test.go b/diff/diff_test.go index 6ce0571..8750bf5 100644 --- a/diff/diff_test.go +++ b/diff/diff_test.go @@ -10,7 +10,6 @@ import ( "time" "github.com/shurcooL/go-goon" - "sourcegraph.com/sqs/pbtypes" ) func init() { @@ -103,27 +102,33 @@ func TestParseFileDiffHeaders(t *testing.T) { filename: "sample_file.diff", wantDiff: &FileDiff{ OrigName: "oldname", - OrigTime: &pbtypes.Timestamp{Seconds: 1255273940}, + // Timestamp{Seconds: 1255273940} + OrigTime: []byte{1, 0, 0, 0, 14, 194, 99, 236, 212, 0, 0, 0, 0, 255, 255}, NewName: "newname", - NewTime: &pbtypes.Timestamp{Seconds: 1255273950}, + // Timestamp{Seconds: 1255273950} + NewTime: []byte{1, 0, 0, 0, 14, 194, 99, 236, 222, 0, 0, 0, 0, 255, 255}, }, }, { filename: "sample_file_no_fractional_seconds.diff", wantDiff: &FileDiff{ OrigName: "goyaml.go", - OrigTime: &pbtypes.Timestamp{Seconds: 1322164040}, + // Timestamp{Seconds: 1322164040} + OrigTime: []byte{1, 0, 0, 0, 14, 198, 96, 150, 72, 0, 0, 0, 0, 255, 255}, NewName: "goyaml.go", - NewTime: &pbtypes.Timestamp{Seconds: 1322486679}, + // Timestamp{Seconds: 1322486679} + NewTime: []byte{1, 0, 0, 0, 14, 198, 101, 130, 151, 0, 0, 0, 0, 255, 255}, }, }, { filename: "sample_file_extended.diff", wantDiff: &FileDiff{ OrigName: "oldname", - OrigTime: &pbtypes.Timestamp{Seconds: 1255273940}, + // Timestamp{Seconds: 1255273940} + OrigTime: []byte{1, 0, 0, 0, 14, 194, 99, 236, 212, 0, 0, 0, 0, 255, 255}, NewName: "newname", - NewTime: &pbtypes.Timestamp{Seconds: 1255273950}, + // Timestamp{Seconds: 1255273950} + NewTime: []byte{1, 0, 0, 0, 14, 194, 99, 236, 222, 0, 0, 0, 0, 255, 255}, Extended: []string{ "diff --git a/vcs/git_cmd.go b/vcs/git_cmd.go", "index aa4de15..7c048ab 100644", diff --git a/diff/parse.go b/diff/parse.go index 08cba66..13c3d48 100644 --- a/diff/parse.go +++ b/diff/parse.go @@ -9,8 +9,6 @@ import ( "strconv" "strings" "time" - - "sourcegraph.com/sqs/pbtypes" ) // ParseMultiFileDiff parses a multi-file unified diff. It returns an error if @@ -198,12 +196,18 @@ func (r *FileDiffReader) ReadAllHeaders() (*FileDiff, error) { return nil, err } if origTime != nil { - ts := pbtypes.NewTimestamp(*origTime) - fd.OrigTime = &ts + ts, err := origTime.MarshalBinary() + if err != nil { + return nil, err + } + fd.OrigTime = ts } if newTime != nil { - ts := pbtypes.NewTimestamp(*newTime) - fd.NewTime = &ts + ts, err := newTime.MarshalBinary() + if err != nil { + return nil, err + } + fd.NewTime = ts } return fd, nil @@ -293,7 +297,7 @@ func (r *FileDiffReader) readOneFileHeader(prefix []byte) (filename string, time type OverflowError string func (e OverflowError) Error() string { - return fmt.Sprintf("overflowed into next file: %s", e) + return fmt.Sprintf("overflowed into next file: %s", string(e)) } // ReadExtendedHeaders reads the extended header lines, if any, from a diff --git a/diff/print.go b/diff/print.go index d440cb9..25d2a1d 100644 --- a/diff/print.go +++ b/diff/print.go @@ -5,8 +5,6 @@ import ( "fmt" "io" "time" - - "sourcegraph.com/sqs/pbtypes" ) // PrintMultiFileDiff prints a multi-file diff in unified diff format. @@ -58,11 +56,15 @@ func PrintFileDiff(d *FileDiff) ([]byte, error) { return buf.Bytes(), nil } -func timePtr(ts *pbtypes.Timestamp) *time.Time { +func timePtr(ts []byte) *time.Time { if ts == nil { return nil } - t := ts.Time() + var t time.Time + err := t.UnmarshalBinary(ts) + if err != nil { + return nil + } return &t } diff --git a/go.mod b/go.mod index 53843ba..0920e30 100644 --- a/go.mod +++ b/go.mod @@ -6,5 +6,4 @@ require ( github.com/gogo/protobuf v1.1.1 github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e // indirect github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041 - sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4 ) From 43a7fe41f000a8c75132bc8f450c0295f77feaee Mon Sep 17 00:00:00 2001 From: sofiia-tesliuk Date: Tue, 18 Aug 2020 13:08:08 +0000 Subject: [PATCH 2/8] initialized byte arrays from timestamps in init; --- diff/diff_test.go | 33 +++++++++++++++++++++------------ diff/parse.go | 4 ++-- diff/print.go | 5 +++-- 3 files changed, 26 insertions(+), 16 deletions(-) diff --git a/diff/diff_test.go b/diff/diff_test.go index 8750bf5..6bd5394 100644 --- a/diff/diff_test.go +++ b/diff/diff_test.go @@ -12,6 +12,8 @@ import ( "github.com/shurcooL/go-goon" ) +var timestampsB [][]byte + func init() { // Diffs include times that by default are generated in the local // timezone. To ensure that tests behave the same in all timezones @@ -21,6 +23,19 @@ func init() { // This is safe to do in tests but should not (and need not) be // done for the main code. time.Local = time.UTC + + timestamps := []int64{ + 1255273940, // 2009-10-11 15:12:20 + 1255273950, // 2009-10-11 15:12:30 + 1322164040, // 2011-11-24 19:47:20 + 1322486679, // 2011-11-28 13:24:39 + } + for _, timestamp := range timestamps { + // Ignoring error here + if timeBytes, err := time.Unix(timestamp, 0).MarshalBinary(); err == nil { + timestampsB = append(timestampsB, timeBytes) + } + } } func TestParseHunkNoChunksize(t *testing.T) { @@ -102,33 +117,27 @@ func TestParseFileDiffHeaders(t *testing.T) { filename: "sample_file.diff", wantDiff: &FileDiff{ OrigName: "oldname", - // Timestamp{Seconds: 1255273940} - OrigTime: []byte{1, 0, 0, 0, 14, 194, 99, 236, 212, 0, 0, 0, 0, 255, 255}, + OrigTime: timestampsB[0], NewName: "newname", - // Timestamp{Seconds: 1255273950} - NewTime: []byte{1, 0, 0, 0, 14, 194, 99, 236, 222, 0, 0, 0, 0, 255, 255}, + NewTime: timestampsB[1], }, }, { filename: "sample_file_no_fractional_seconds.diff", wantDiff: &FileDiff{ OrigName: "goyaml.go", - // Timestamp{Seconds: 1322164040} - OrigTime: []byte{1, 0, 0, 0, 14, 198, 96, 150, 72, 0, 0, 0, 0, 255, 255}, + OrigTime: timestampsB[2], NewName: "goyaml.go", - // Timestamp{Seconds: 1322486679} - NewTime: []byte{1, 0, 0, 0, 14, 198, 101, 130, 151, 0, 0, 0, 0, 255, 255}, + NewTime: timestampsB[3], }, }, { filename: "sample_file_extended.diff", wantDiff: &FileDiff{ OrigName: "oldname", - // Timestamp{Seconds: 1255273940} - OrigTime: []byte{1, 0, 0, 0, 14, 194, 99, 236, 212, 0, 0, 0, 0, 255, 255}, + OrigTime: timestampsB[0], NewName: "newname", - // Timestamp{Seconds: 1255273950} - NewTime: []byte{1, 0, 0, 0, 14, 194, 99, 236, 222, 0, 0, 0, 0, 255, 255}, + NewTime: timestampsB[1], Extended: []string{ "diff --git a/vcs/git_cmd.go b/vcs/git_cmd.go", "index aa4de15..7c048ab 100644", diff --git a/diff/parse.go b/diff/parse.go index 13c3d48..9dc0ce3 100644 --- a/diff/parse.go +++ b/diff/parse.go @@ -198,14 +198,14 @@ func (r *FileDiffReader) ReadAllHeaders() (*FileDiff, error) { if origTime != nil { ts, err := origTime.MarshalBinary() if err != nil { - return nil, err + return nil, fmt.Errorf("marshalling timestamp %v: %v", origTime, err) } fd.OrigTime = ts } if newTime != nil { ts, err := newTime.MarshalBinary() if err != nil { - return nil, err + return nil, fmt.Errorf("marshalling timestamp %v: %v", newTime, err) } fd.NewTime = ts } diff --git a/diff/print.go b/diff/print.go index 25d2a1d..15e8e1a 100644 --- a/diff/print.go +++ b/diff/print.go @@ -61,8 +61,9 @@ func timePtr(ts []byte) *time.Time { return nil } var t time.Time - err := t.UnmarshalBinary(ts) - if err != nil { + // Since ts value is Marshaled before, it should successfully Unmarshal value here. + // Ignoring error message. + if t.UnmarshalBinary(ts) != nil { return nil } return &t From 1345afea30f53a7fadca662eed289d1a995784ca Mon Sep 17 00:00:00 2001 From: sofiia-tesliuk Date: Wed, 19 Aug 2020 15:15:17 +0000 Subject: [PATCH 3/8] removed .proto file and added standard Go structures to use instead; --- diff/diff.go | 60 ++- diff/diff.pb.go | 1216 --------------------------------------------- diff/diff_test.go | 31 +- diff/parse.go | 12 +- diff/print.go | 17 +- 5 files changed, 80 insertions(+), 1256 deletions(-) delete mode 100644 diff/diff.pb.go diff --git a/diff/diff.go b/diff/diff.go index 646602a..ce3af3e 100644 --- a/diff/diff.go +++ b/diff/diff.go @@ -1,10 +1,64 @@ package diff -import "bytes" +import ( + "bytes" + "time" +) -// NOTE: types are code-generated in diff.pb.go. +// A FileDiff represents a unified diff for a single file. +// +// A file unified diff has a header that resembles the following: +// +// --- oldname 2009-10-11 15:12:20.000000000 -0700 +// +++ newname 2009-10-11 15:12:30.000000000 -0700 +type FileDiff struct { + // the original name of the file + OrigName string + // the original timestamp (nil if not present) + OrigTime *time.Time + // the new name of the file (often same as OrigName) + NewName string + // the new timestamp (nil if not present) + NewTime *time.Time + // extended header lines (e.g., git's "new mode ", "rename from ", etc.) + Extended []string + // hunks that were changed from orig to new + Hunks []*Hunk +} -//go:generate protoc -I../../../.. -I ../../../../github.com/gogo/protobuf/protobuf -I. --gogo_out=. diff.proto +// A Hunk represents a series of changes (additions or deletions) in a file's +// unified diff. +type Hunk struct { + // starting line number in original file + OrigStartLine int32 + // number of lines the hunk applies to in the original file + OrigLines int32 + // if > 0, then the original file had a 'No newline at end of file' mark at this offset + OrigNoNewlineAt int32 + // starting line number in new file + NewStartLine int32 + // number of lines the hunk applies to in the new file + NewLines int32 + // optional section heading + Section string + // 0-indexed line offset in unified file diff (including section headers); this is + // only set when Hunks are read from entire file diff (i.e., when ReadAllHunks is + // called) This accounts for hunk headers, too, so the StartPosition of the first + // hunk will be 1. + StartPosition int32 + // hunk body (lines prefixed with '-', '+', or ' ') + Body []byte +} + +// A Stat is a diff stat that represents the number of lines added/changed/deleted. +type Stat struct { + // number of lines added + Added int32 + // number of lines changed + Changed int32 + // number of lines deleted + Deleted int32 +} // Stat computes the number of lines added/changed/deleted in all // hunks in this file's diff. diff --git a/diff/diff.pb.go b/diff/diff.pb.go deleted file mode 100644 index 9840148..0000000 --- a/diff/diff.pb.go +++ /dev/null @@ -1,1216 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: diff.proto - -package diff - -import ( - fmt "fmt" - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" - io "io" - math "math" - math_bits "math/bits" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package - -// A FileDiff represents a unified diff for a single file. -// -// A file unified diff has a header that resembles the following: -// -// --- oldname 2009-10-11 15:12:20.000000000 -0700 -// +++ newname 2009-10-11 15:12:30.000000000 -0700 -type FileDiff struct { - // the original name of the file - OrigName string `protobuf:"bytes,1,opt,name=OrigName,proto3" json:"OrigName,omitempty"` - // the original timestamp (nil if not present) - OrigTime []byte `protobuf:"bytes,2,opt,name=OrigTime,proto3" json:"OrigTime,omitempty"` - // the new name of the file (often same as OrigName) - NewName string `protobuf:"bytes,3,opt,name=NewName,proto3" json:"NewName,omitempty"` - // the new timestamp (nil if not present) - NewTime []byte `protobuf:"bytes,4,opt,name=NewTime,proto3" json:"NewTime,omitempty"` - // extended header lines (e.g., git's "new mode ", "rename from ", etc.) - Extended []string `protobuf:"bytes,5,rep,name=Extended,proto3" json:"Extended,omitempty"` - // hunks that were changed from orig to new - Hunks []*Hunk `protobuf:"bytes,6,rep,name=Hunks,proto3" json:"Hunks,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *FileDiff) Reset() { *m = FileDiff{} } -func (m *FileDiff) String() string { return proto.CompactTextString(m) } -func (*FileDiff) ProtoMessage() {} -func (*FileDiff) Descriptor() ([]byte, []int) { - return fileDescriptor_686521effc814b25, []int{0} -} -func (m *FileDiff) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *FileDiff) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_FileDiff.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalTo(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *FileDiff) XXX_Merge(src proto.Message) { - xxx_messageInfo_FileDiff.Merge(m, src) -} -func (m *FileDiff) XXX_Size() int { - return m.Size() -} -func (m *FileDiff) XXX_DiscardUnknown() { - xxx_messageInfo_FileDiff.DiscardUnknown(m) -} - -var xxx_messageInfo_FileDiff proto.InternalMessageInfo - -// A Hunk represents a series of changes (additions or deletions) in a file's -// unified diff. -type Hunk struct { - // starting line number in original file - OrigStartLine int32 `protobuf:"varint,1,opt,name=OrigStartLine,proto3" json:"OrigStartLine,omitempty"` - // number of lines the hunk applies to in the original file - OrigLines int32 `protobuf:"varint,2,opt,name=OrigLines,proto3" json:"OrigLines,omitempty"` - // if > 0, then the original file had a 'No newline at end of file' mark at this offset - OrigNoNewlineAt int32 `protobuf:"varint,3,opt,name=OrigNoNewlineAt,proto3" json:"OrigNoNewlineAt,omitempty"` - // starting line number in new file - NewStartLine int32 `protobuf:"varint,4,opt,name=NewStartLine,proto3" json:"NewStartLine,omitempty"` - // number of lines the hunk applies to in the new file - NewLines int32 `protobuf:"varint,5,opt,name=NewLines,proto3" json:"NewLines,omitempty"` - // optional section heading - Section string `protobuf:"bytes,6,opt,name=Section,proto3" json:"Section,omitempty"` - // 0-indexed line offset in unified file diff (including section headers); this is - // only set when Hunks are read from entire file diff (i.e., when ReadAllHunks is - // called) This accounts for hunk headers, too, so the StartPosition of the first - // hunk will be 1. - StartPosition int32 `protobuf:"varint,7,opt,name=StartPosition,proto3" json:"StartPosition,omitempty"` - // hunk body (lines prefixed with '-', '+', or ' ') - Body []byte `protobuf:"bytes,8,opt,name=Body,proto3" json:"Body,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Hunk) Reset() { *m = Hunk{} } -func (m *Hunk) String() string { return proto.CompactTextString(m) } -func (*Hunk) ProtoMessage() {} -func (*Hunk) Descriptor() ([]byte, []int) { - return fileDescriptor_686521effc814b25, []int{1} -} -func (m *Hunk) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Hunk) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Hunk.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalTo(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Hunk) XXX_Merge(src proto.Message) { - xxx_messageInfo_Hunk.Merge(m, src) -} -func (m *Hunk) XXX_Size() int { - return m.Size() -} -func (m *Hunk) XXX_DiscardUnknown() { - xxx_messageInfo_Hunk.DiscardUnknown(m) -} - -var xxx_messageInfo_Hunk proto.InternalMessageInfo - -// A Stat is a diff stat that represents the number of lines added/changed/deleted. -type Stat struct { - // number of lines added - Added int32 `protobuf:"varint,1,opt,name=Added,proto3" json:""` - // number of lines changed - Changed int32 `protobuf:"varint,2,opt,name=Changed,proto3" json:""` - // number of lines deleted - Deleted int32 `protobuf:"varint,3,opt,name=Deleted,proto3" json:""` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Stat) Reset() { *m = Stat{} } -func (m *Stat) String() string { return proto.CompactTextString(m) } -func (*Stat) ProtoMessage() {} -func (*Stat) Descriptor() ([]byte, []int) { - return fileDescriptor_686521effc814b25, []int{2} -} -func (m *Stat) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Stat) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Stat.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalTo(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Stat) XXX_Merge(src proto.Message) { - xxx_messageInfo_Stat.Merge(m, src) -} -func (m *Stat) XXX_Size() int { - return m.Size() -} -func (m *Stat) XXX_DiscardUnknown() { - xxx_messageInfo_Stat.DiscardUnknown(m) -} - -var xxx_messageInfo_Stat proto.InternalMessageInfo - -func init() { - proto.RegisterType((*FileDiff)(nil), "diff.FileDiff") - proto.RegisterType((*Hunk)(nil), "diff.Hunk") - proto.RegisterType((*Stat)(nil), "diff.Stat") -} - -func init() { proto.RegisterFile("diff.proto", fileDescriptor_686521effc814b25) } - -var fileDescriptor_686521effc814b25 = []byte{ - // 381 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x5c, 0x92, 0x5f, 0x4e, 0xf2, 0x50, - 0x10, 0xc5, 0x29, 0xb4, 0xfc, 0x99, 0x8f, 0x2f, 0x9a, 0xfb, 0xd4, 0x10, 0x53, 0x9b, 0xc6, 0x87, - 0xbe, 0x08, 0x89, 0xae, 0x00, 0x44, 0xe3, 0x83, 0xa9, 0xa6, 0xb8, 0x81, 0x96, 0x4e, 0xcb, 0x8d, - 0xd0, 0x6b, 0xe0, 0x92, 0xea, 0x0e, 0x5c, 0x90, 0x8b, 0xe0, 0xd1, 0x15, 0x18, 0xe5, 0xd1, 0x55, - 0x98, 0x3b, 0xb7, 0x85, 0xe0, 0xdb, 0x9c, 0xdf, 0xe9, 0xdc, 0x99, 0x33, 0x29, 0x40, 0xc2, 0xd3, - 0xb4, 0xff, 0xbc, 0x14, 0x52, 0x30, 0x53, 0xd5, 0xbd, 0xf3, 0x8c, 0xcb, 0xd9, 0x3a, 0xee, 0x4f, - 0xc5, 0x62, 0x90, 0x89, 0x4c, 0x0c, 0xc8, 0x8c, 0xd7, 0x29, 0x29, 0x12, 0x54, 0xe9, 0x26, 0xef, - 0xdd, 0x80, 0xf6, 0x0d, 0x9f, 0xe3, 0x98, 0xa7, 0x29, 0xeb, 0x41, 0xfb, 0x7e, 0xc9, 0xb3, 0x20, - 0x5a, 0xa0, 0x6d, 0xb8, 0x86, 0xdf, 0x09, 0x77, 0xba, 0xf2, 0x1e, 0xf9, 0x02, 0xed, 0xba, 0x6b, - 0xf8, 0xdd, 0x70, 0xa7, 0x99, 0x0d, 0xad, 0x00, 0x0b, 0x6a, 0x6b, 0x50, 0x5b, 0x25, 0x4b, 0x87, - 0x9a, 0x4c, 0x6a, 0xaa, 0xa4, 0x7a, 0xef, 0xfa, 0x45, 0x62, 0x9e, 0x60, 0x62, 0x5b, 0x6e, 0x43, - 0xcd, 0xaa, 0x34, 0x73, 0xc1, 0xba, 0x5d, 0xe7, 0x4f, 0x2b, 0xbb, 0xe9, 0x36, 0xfc, 0x7f, 0x17, - 0xd0, 0xa7, 0x94, 0x0a, 0x85, 0xda, 0xf0, 0xde, 0xea, 0x60, 0xaa, 0x8a, 0x9d, 0xc1, 0x7f, 0xb5, - 0xc6, 0x44, 0x46, 0x4b, 0x79, 0xc7, 0x73, 0xbd, 0xb7, 0x15, 0x1e, 0x42, 0x76, 0x02, 0x1d, 0x05, - 0x54, 0xbd, 0xa2, 0xed, 0xad, 0x70, 0x0f, 0x98, 0x0f, 0x47, 0x14, 0x53, 0x04, 0x58, 0xcc, 0x79, - 0x8e, 0x43, 0x49, 0x31, 0xac, 0xf0, 0x2f, 0x66, 0x1e, 0x74, 0x03, 0x2c, 0xf6, 0xc3, 0x4c, 0xfa, - 0xec, 0x80, 0xa9, 0x60, 0x01, 0x16, 0x7a, 0x94, 0x45, 0xfe, 0x4e, 0xab, 0x73, 0x4c, 0x70, 0x2a, - 0xb9, 0xc8, 0xed, 0xa6, 0x3e, 0x54, 0x29, 0x55, 0x0e, 0x7a, 0xe2, 0x41, 0xac, 0x38, 0xf9, 0x2d, - 0x9d, 0xe3, 0x00, 0x32, 0x06, 0xe6, 0x48, 0x24, 0xaf, 0x76, 0x9b, 0x6e, 0x49, 0xb5, 0x17, 0x83, - 0x39, 0x91, 0x91, 0x64, 0x3d, 0xb0, 0x86, 0x89, 0xba, 0x26, 0x5d, 0x60, 0x64, 0xfe, 0x7c, 0x9e, - 0xd6, 0x42, 0x8d, 0x98, 0x03, 0xad, 0xab, 0x59, 0x94, 0x67, 0x98, 0xe8, 0xf4, 0xa5, 0x5b, 0x41, - 0xe5, 0x8f, 0x71, 0x8e, 0x12, 0x13, 0x9d, 0xbc, 0xf2, 0x4b, 0x38, 0x3a, 0xde, 0x7c, 0x3b, 0xb5, - 0xcd, 0xd6, 0x31, 0x3e, 0xb6, 0x8e, 0xf1, 0xb5, 0x75, 0x8c, 0xb8, 0x49, 0xbf, 0xcf, 0xe5, 0x6f, - 0x00, 0x00, 0x00, 0xff, 0xff, 0xb1, 0x2f, 0x14, 0x9f, 0x81, 0x02, 0x00, 0x00, -} - -func (m *FileDiff) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *FileDiff) MarshalTo(dAtA []byte) (int, error) { - var i int - _ = i - var l int - _ = l - if len(m.OrigName) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintDiff(dAtA, i, uint64(len(m.OrigName))) - i += copy(dAtA[i:], m.OrigName) - } - if len(m.OrigTime) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintDiff(dAtA, i, uint64(len(m.OrigTime))) - i += copy(dAtA[i:], m.OrigTime) - } - if len(m.NewName) > 0 { - dAtA[i] = 0x1a - i++ - i = encodeVarintDiff(dAtA, i, uint64(len(m.NewName))) - i += copy(dAtA[i:], m.NewName) - } - if len(m.NewTime) > 0 { - dAtA[i] = 0x22 - i++ - i = encodeVarintDiff(dAtA, i, uint64(len(m.NewTime))) - i += copy(dAtA[i:], m.NewTime) - } - if len(m.Extended) > 0 { - for _, s := range m.Extended { - dAtA[i] = 0x2a - i++ - l = len(s) - for l >= 1<<7 { - dAtA[i] = uint8(uint64(l)&0x7f | 0x80) - l >>= 7 - i++ - } - dAtA[i] = uint8(l) - i++ - i += copy(dAtA[i:], s) - } - } - if len(m.Hunks) > 0 { - for _, msg := range m.Hunks { - dAtA[i] = 0x32 - i++ - i = encodeVarintDiff(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n - } - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil -} - -func (m *Hunk) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *Hunk) MarshalTo(dAtA []byte) (int, error) { - var i int - _ = i - var l int - _ = l - if m.OrigStartLine != 0 { - dAtA[i] = 0x8 - i++ - i = encodeVarintDiff(dAtA, i, uint64(m.OrigStartLine)) - } - if m.OrigLines != 0 { - dAtA[i] = 0x10 - i++ - i = encodeVarintDiff(dAtA, i, uint64(m.OrigLines)) - } - if m.OrigNoNewlineAt != 0 { - dAtA[i] = 0x18 - i++ - i = encodeVarintDiff(dAtA, i, uint64(m.OrigNoNewlineAt)) - } - if m.NewStartLine != 0 { - dAtA[i] = 0x20 - i++ - i = encodeVarintDiff(dAtA, i, uint64(m.NewStartLine)) - } - if m.NewLines != 0 { - dAtA[i] = 0x28 - i++ - i = encodeVarintDiff(dAtA, i, uint64(m.NewLines)) - } - if len(m.Section) > 0 { - dAtA[i] = 0x32 - i++ - i = encodeVarintDiff(dAtA, i, uint64(len(m.Section))) - i += copy(dAtA[i:], m.Section) - } - if m.StartPosition != 0 { - dAtA[i] = 0x38 - i++ - i = encodeVarintDiff(dAtA, i, uint64(m.StartPosition)) - } - if len(m.Body) > 0 { - dAtA[i] = 0x42 - i++ - i = encodeVarintDiff(dAtA, i, uint64(len(m.Body))) - i += copy(dAtA[i:], m.Body) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil -} - -func (m *Stat) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *Stat) MarshalTo(dAtA []byte) (int, error) { - var i int - _ = i - var l int - _ = l - if m.Added != 0 { - dAtA[i] = 0x8 - i++ - i = encodeVarintDiff(dAtA, i, uint64(m.Added)) - } - if m.Changed != 0 { - dAtA[i] = 0x10 - i++ - i = encodeVarintDiff(dAtA, i, uint64(m.Changed)) - } - if m.Deleted != 0 { - dAtA[i] = 0x18 - i++ - i = encodeVarintDiff(dAtA, i, uint64(m.Deleted)) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil -} - -func encodeVarintDiff(dAtA []byte, offset int, v uint64) int { - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return offset + 1 -} -func (m *FileDiff) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.OrigName) - if l > 0 { - n += 1 + l + sovDiff(uint64(l)) - } - l = len(m.OrigTime) - if l > 0 { - n += 1 + l + sovDiff(uint64(l)) - } - l = len(m.NewName) - if l > 0 { - n += 1 + l + sovDiff(uint64(l)) - } - l = len(m.NewTime) - if l > 0 { - n += 1 + l + sovDiff(uint64(l)) - } - if len(m.Extended) > 0 { - for _, s := range m.Extended { - l = len(s) - n += 1 + l + sovDiff(uint64(l)) - } - } - if len(m.Hunks) > 0 { - for _, e := range m.Hunks { - l = e.Size() - n += 1 + l + sovDiff(uint64(l)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Hunk) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.OrigStartLine != 0 { - n += 1 + sovDiff(uint64(m.OrigStartLine)) - } - if m.OrigLines != 0 { - n += 1 + sovDiff(uint64(m.OrigLines)) - } - if m.OrigNoNewlineAt != 0 { - n += 1 + sovDiff(uint64(m.OrigNoNewlineAt)) - } - if m.NewStartLine != 0 { - n += 1 + sovDiff(uint64(m.NewStartLine)) - } - if m.NewLines != 0 { - n += 1 + sovDiff(uint64(m.NewLines)) - } - l = len(m.Section) - if l > 0 { - n += 1 + l + sovDiff(uint64(l)) - } - if m.StartPosition != 0 { - n += 1 + sovDiff(uint64(m.StartPosition)) - } - l = len(m.Body) - if l > 0 { - n += 1 + l + sovDiff(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Stat) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Added != 0 { - n += 1 + sovDiff(uint64(m.Added)) - } - if m.Changed != 0 { - n += 1 + sovDiff(uint64(m.Changed)) - } - if m.Deleted != 0 { - n += 1 + sovDiff(uint64(m.Deleted)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func sovDiff(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozDiff(x uint64) (n int) { - return sovDiff(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *FileDiff) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowDiff - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: FileDiff: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: FileDiff: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field OrigName", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowDiff - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthDiff - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthDiff - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.OrigName = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field OrigTime", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowDiff - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthDiff - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthDiff - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.OrigTime = append(m.OrigTime[:0], dAtA[iNdEx:postIndex]...) - if m.OrigTime == nil { - m.OrigTime = []byte{} - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field NewName", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowDiff - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthDiff - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthDiff - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.NewName = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field NewTime", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowDiff - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthDiff - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthDiff - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.NewTime = append(m.NewTime[:0], dAtA[iNdEx:postIndex]...) - if m.NewTime == nil { - m.NewTime = []byte{} - } - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Extended", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowDiff - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthDiff - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthDiff - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Extended = append(m.Extended, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Hunks", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowDiff - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthDiff - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthDiff - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Hunks = append(m.Hunks, &Hunk{}) - if err := m.Hunks[len(m.Hunks)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipDiff(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthDiff - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthDiff - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Hunk) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowDiff - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: Hunk: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Hunk: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field OrigStartLine", wireType) - } - m.OrigStartLine = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowDiff - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.OrigStartLine |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field OrigLines", wireType) - } - m.OrigLines = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowDiff - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.OrigLines |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field OrigNoNewlineAt", wireType) - } - m.OrigNoNewlineAt = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowDiff - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.OrigNoNewlineAt |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field NewStartLine", wireType) - } - m.NewStartLine = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowDiff - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.NewStartLine |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 5: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field NewLines", wireType) - } - m.NewLines = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowDiff - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.NewLines |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Section", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowDiff - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthDiff - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthDiff - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Section = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 7: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field StartPosition", wireType) - } - m.StartPosition = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowDiff - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.StartPosition |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 8: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Body", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowDiff - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthDiff - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthDiff - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Body = append(m.Body[:0], dAtA[iNdEx:postIndex]...) - if m.Body == nil { - m.Body = []byte{} - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipDiff(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthDiff - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthDiff - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Stat) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowDiff - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: Stat: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Stat: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Added", wireType) - } - m.Added = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowDiff - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Added |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Changed", wireType) - } - m.Changed = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowDiff - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Changed |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Deleted", wireType) - } - m.Deleted = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowDiff - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Deleted |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipDiff(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthDiff - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthDiff - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipDiff(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowDiff - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowDiff - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - return iNdEx, nil - case 1: - iNdEx += 8 - return iNdEx, nil - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowDiff - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthDiff - } - iNdEx += length - if iNdEx < 0 { - return 0, ErrInvalidLengthDiff - } - return iNdEx, nil - case 3: - for { - var innerWire uint64 - var start int = iNdEx - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowDiff - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - innerWire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - innerWireType := int(innerWire & 0x7) - if innerWireType == 4 { - break - } - next, err := skipDiff(dAtA[start:]) - if err != nil { - return 0, err - } - iNdEx = start + next - if iNdEx < 0 { - return 0, ErrInvalidLengthDiff - } - } - return iNdEx, nil - case 4: - return iNdEx, nil - case 5: - iNdEx += 4 - return iNdEx, nil - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - } - panic("unreachable") -} - -var ( - ErrInvalidLengthDiff = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowDiff = fmt.Errorf("proto: integer overflow") -) diff --git a/diff/diff_test.go b/diff/diff_test.go index 6bd5394..95828f8 100644 --- a/diff/diff_test.go +++ b/diff/diff_test.go @@ -12,7 +12,7 @@ import ( "github.com/shurcooL/go-goon" ) -var timestampsB [][]byte +var timestampsT []time.Time func init() { // Diffs include times that by default are generated in the local @@ -31,10 +31,7 @@ func init() { 1322486679, // 2011-11-28 13:24:39 } for _, timestamp := range timestamps { - // Ignoring error here - if timeBytes, err := time.Unix(timestamp, 0).MarshalBinary(); err == nil { - timestampsB = append(timestampsB, timeBytes) - } + timestampsT = append(timestampsT, time.Unix(timestamp, 0)) } } @@ -117,27 +114,27 @@ func TestParseFileDiffHeaders(t *testing.T) { filename: "sample_file.diff", wantDiff: &FileDiff{ OrigName: "oldname", - OrigTime: timestampsB[0], + OrigTime: ×tampsT[0], NewName: "newname", - NewTime: timestampsB[1], + NewTime: ×tampsT[1], }, }, { filename: "sample_file_no_fractional_seconds.diff", wantDiff: &FileDiff{ OrigName: "goyaml.go", - OrigTime: timestampsB[2], + OrigTime: ×tampsT[2], NewName: "goyaml.go", - NewTime: timestampsB[3], + NewTime: ×tampsT[3], }, }, { filename: "sample_file_extended.diff", wantDiff: &FileDiff{ OrigName: "oldname", - OrigTime: timestampsB[0], + OrigTime: ×tampsT[0], NewName: "newname", - NewTime: timestampsB[1], + NewTime: ×tampsT[1], Extended: []string{ "diff --git a/vcs/git_cmd.go b/vcs/git_cmd.go", "index aa4de15..7c048ab 100644", @@ -241,8 +238,18 @@ func TestParseFileDiffHeaders(t *testing.T) { t.Fatalf("%s: got ParseFileDiff error %v", test.filename, err) } + got, want := diff, test.wantDiff + // reflect.DeepEqual will compare OrigTime and NewTime by pointers + // If time are equal by their value, assign same *time.Time from got to want object + if (got.OrigTime != nil) && (want.OrigTime != nil) && (*got).OrigTime.Equal(*want.OrigTime) { + want.OrigTime = got.OrigTime + } + if (got.NewTime != nil) && (want.NewTime != nil) && (*got).NewTime.Equal(*want.NewTime) { + want.NewTime = got.NewTime + } + // Ignore comparing of hunks diff.Hunks = nil - if got, want := diff, test.wantDiff; !reflect.DeepEqual(got, want) { + if !reflect.DeepEqual(got, want) { t.Errorf("%s:\n\ngot: %v\nwant: %v", test.filename, goon.Sdump(got), goon.Sdump(want)) } } diff --git a/diff/parse.go b/diff/parse.go index 9dc0ce3..65db17b 100644 --- a/diff/parse.go +++ b/diff/parse.go @@ -196,18 +196,10 @@ func (r *FileDiffReader) ReadAllHeaders() (*FileDiff, error) { return nil, err } if origTime != nil { - ts, err := origTime.MarshalBinary() - if err != nil { - return nil, fmt.Errorf("marshalling timestamp %v: %v", origTime, err) - } - fd.OrigTime = ts + fd.OrigTime = origTime } if newTime != nil { - ts, err := newTime.MarshalBinary() - if err != nil { - return nil, fmt.Errorf("marshalling timestamp %v: %v", newTime, err) - } - fd.NewTime = ts + fd.NewTime = newTime } return fd, nil diff --git a/diff/print.go b/diff/print.go index 15e8e1a..8dc8caf 100644 --- a/diff/print.go +++ b/diff/print.go @@ -38,10 +38,10 @@ func PrintFileDiff(d *FileDiff) ([]byte, error) { return buf.Bytes(), nil } - if err := printFileHeader(&buf, "--- ", d.OrigName, timePtr(d.OrigTime)); err != nil { + if err := printFileHeader(&buf, "--- ", d.OrigName, d.OrigTime); err != nil { return nil, err } - if err := printFileHeader(&buf, "+++ ", d.NewName, timePtr(d.NewTime)); err != nil { + if err := printFileHeader(&buf, "+++ ", d.NewName, d.NewTime); err != nil { return nil, err } @@ -56,19 +56,6 @@ func PrintFileDiff(d *FileDiff) ([]byte, error) { return buf.Bytes(), nil } -func timePtr(ts []byte) *time.Time { - if ts == nil { - return nil - } - var t time.Time - // Since ts value is Marshaled before, it should successfully Unmarshal value here. - // Ignoring error message. - if t.UnmarshalBinary(ts) != nil { - return nil - } - return &t -} - func printFileHeader(w io.Writer, prefix string, filename string, timestamp *time.Time) error { if _, err := fmt.Fprint(w, prefix, filename); err != nil { return err From 6d3a2d477bb09593418adcc7457e8ca7ee77ef7a Mon Sep 17 00:00:00 2001 From: sofiia-tesliuk Date: Mon, 31 Aug 2020 14:05:25 +0000 Subject: [PATCH 4/8] deleted diff.proto, used cmp.Equal() instead of reflect.DeepEqual(); --- diff/diff.proto | 80 ----------------------------------------------- diff/diff_test.go | 22 ++++--------- go.mod | 2 +- go.sum | 8 ++--- 4 files changed, 11 insertions(+), 101 deletions(-) delete mode 100644 diff/diff.proto diff --git a/diff/diff.proto b/diff/diff.proto deleted file mode 100644 index f230c3b..0000000 --- a/diff/diff.proto +++ /dev/null @@ -1,80 +0,0 @@ -syntax = "proto3"; -package diff; - -import "github.com/gogo/protobuf/gogoproto/gogo.proto"; - -option (gogoproto.goproto_getters_all) = false; -option (gogoproto.unmarshaler_all) = true; -option (gogoproto.marshaler_all) = true; -option (gogoproto.sizer_all) = true; - -// A FileDiff represents a unified diff for a single file. -// -// A file unified diff has a header that resembles the following: -// -// --- oldname 2009-10-11 15:12:20.000000000 -0700 -// +++ newname 2009-10-11 15:12:30.000000000 -0700 -message FileDiff { - // the original name of the file - string OrigName = 1; - - // the original timestamp (nil if not present) - bytes OrigTime = 2; - - // the new name of the file (often same as OrigName) - string NewName = 3; - - // the new timestamp (nil if not present) - bytes NewTime = 4; - - // extended header lines (e.g., git's "new mode ", "rename from ", etc.) - repeated string Extended = 5; - - // hunks that were changed from orig to new - repeated Hunk Hunks = 6; -} - - -// A Hunk represents a series of changes (additions or deletions) in a file's -// unified diff. -message Hunk { - // starting line number in original file - int32 OrigStartLine = 1; - - // number of lines the hunk applies to in the original file - int32 OrigLines = 2; - - // if > 0, then the original file had a 'No newline at end of file' mark at this offset - int32 OrigNoNewlineAt = 3; - - // starting line number in new file - int32 NewStartLine = 4; - - // number of lines the hunk applies to in the new file - int32 NewLines = 5; - - // optional section heading - string Section = 6; - - // 0-indexed line offset in unified file diff (including section headers); this is - // only set when Hunks are read from entire file diff (i.e., when ReadAllHunks is - // called) This accounts for hunk headers, too, so the StartPosition of the first - // hunk will be 1. - int32 StartPosition = 7; - - // hunk body (lines prefixed with '-', '+', or ' ') - bytes Body = 8; -} - -// A Stat is a diff stat that represents the number of lines added/changed/deleted. -message Stat { - // number of lines added - int32 Added = 1 [(gogoproto.jsontag) = ""]; - - // number of lines changed - int32 Changed = 2 [(gogoproto.jsontag) = ""]; - - // number of lines deleted - int32 Deleted = 3 [(gogoproto.jsontag) = ""]; -} - diff --git a/diff/diff_test.go b/diff/diff_test.go index 95828f8..9a7a331 100644 --- a/diff/diff_test.go +++ b/diff/diff_test.go @@ -4,11 +4,11 @@ import ( "bytes" "io/ioutil" "path/filepath" - "reflect" "strings" "testing" "time" + "github.com/google/go-cmp/cmp" "github.com/shurcooL/go-goon" ) @@ -58,7 +58,7 @@ func TestParseHunkNoChunksize(t *testing.T) { } h := diff[0] h.Body = nil // We're not testing the body. - if !reflect.DeepEqual(h, correct) { + if !cmp.Equal(h, correct) { t.Errorf("%s: Got %#v, want %#v", filename, h, correct) } } @@ -238,18 +238,8 @@ func TestParseFileDiffHeaders(t *testing.T) { t.Fatalf("%s: got ParseFileDiff error %v", test.filename, err) } - got, want := diff, test.wantDiff - // reflect.DeepEqual will compare OrigTime and NewTime by pointers - // If time are equal by their value, assign same *time.Time from got to want object - if (got.OrigTime != nil) && (want.OrigTime != nil) && (*got).OrigTime.Equal(*want.OrigTime) { - want.OrigTime = got.OrigTime - } - if (got.NewTime != nil) && (want.NewTime != nil) && (*got).NewTime.Equal(*want.NewTime) { - want.NewTime = got.NewTime - } - // Ignore comparing of hunks diff.Hunks = nil - if !reflect.DeepEqual(got, want) { + if got, want := diff, test.wantDiff; !cmp.Equal(got, want) { t.Errorf("%s:\n\ngot: %v\nwant: %v", test.filename, goon.Sdump(got), goon.Sdump(want)) } } @@ -531,7 +521,7 @@ func TestParseMultiFileDiffHeaders(t *testing.T) { for i := range diffs { diffs[i].Hunks = nil // This test focuses on things other than hunks, so don't compare them. } - if got, want := diffs, test.wantDiffs; !reflect.DeepEqual(got, want) { + if got, want := diffs, test.wantDiffs; !cmp.Equal(got, want) { t.Errorf("%s:\n\ngot: %v\nwant: %v", test.filename, goon.Sdump(got), goon.Sdump(want)) } } @@ -562,7 +552,7 @@ func TestParseFileDiffAndPrintFileDiff(t *testing.T) { t.Fatal(err) } diff, err := ParseFileDiff(diffData) - if !reflect.DeepEqual(err, test.wantParseErr) { + if !cmp.Equal(err, test.wantParseErr) { t.Errorf("%s: got ParseFileDiff err %v, want %v", test.filename, err, test.wantParseErr) continue } @@ -739,7 +729,7 @@ func TestFileDiff_Stat(t *testing.T) { for label, test := range tests { fdiff := &FileDiff{Hunks: test.hunks} stat := fdiff.Stat() - if !reflect.DeepEqual(stat, test.want) { + if !cmp.Equal(stat, test.want) { t.Errorf("%s: got diff stat %+v, want %+v", label, stat, test.want) continue } diff --git a/go.mod b/go.mod index 0920e30..7c43a1d 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/sourcegraph/go-diff go 1.14 require ( - github.com/gogo/protobuf v1.1.1 + github.com/google/go-cmp v0.5.2 github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e // indirect github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041 ) diff --git a/go.sum b/go.sum index f873681..d618a9a 100644 --- a/go.sum +++ b/go.sum @@ -1,8 +1,8 @@ -github.com/gogo/protobuf v1.1.1 h1:72R+M5VuhED/KujmZVcIquuo8mBgX4oVda//DQb3PXo= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e h1:MZM7FHLqUHYI0Y/mQAt3d2aYa0SiNms/hFqC9qJYolM= github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041 h1:llrF3Fs4018ePo4+G/HV/uQUqEI1HMDjCeOf2V6puPc= github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= -sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4 h1:JPJh2pk3+X4lXAkZIk2RuE/7/FoK9maXw+TNPJhVS/c= -sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= From 9b2c29040694f3d935fdfc42a677663ed8e8e871 Mon Sep 17 00:00:00 2001 From: sofiia-tesliuk Date: Mon, 31 Aug 2020 14:20:48 +0000 Subject: [PATCH 5/8] left reflect.DeepEqual() for error comparison; --- diff/diff_test.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/diff/diff_test.go b/diff/diff_test.go index 9a7a331..2849465 100644 --- a/diff/diff_test.go +++ b/diff/diff_test.go @@ -4,6 +4,7 @@ import ( "bytes" "io/ioutil" "path/filepath" + "reflect" "strings" "testing" "time" @@ -552,7 +553,7 @@ func TestParseFileDiffAndPrintFileDiff(t *testing.T) { t.Fatal(err) } diff, err := ParseFileDiff(diffData) - if !cmp.Equal(err, test.wantParseErr) { + if !reflect.DeepEqual(err, test.wantParseErr) { t.Errorf("%s: got ParseFileDiff err %v, want %v", test.filename, err, test.wantParseErr) continue } From 7fe48de4c9ab23b585469309975ed59cd7482d27 Mon Sep 17 00:00:00 2001 From: sofiia-tesliuk Date: Tue, 1 Sep 2020 15:29:55 +0000 Subject: [PATCH 6/8] removed pointer from ParseError; --- diff/diff_test.go | 6 +++--- diff/parse.go | 22 +++++++++++----------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/diff/diff_test.go b/diff/diff_test.go index 2849465..ccdbff6 100644 --- a/diff/diff_test.go +++ b/diff/diff_test.go @@ -2,9 +2,9 @@ package diff import ( "bytes" + "errors" "io/ioutil" "path/filepath" - "reflect" "strings" "testing" "time" @@ -544,7 +544,7 @@ func TestParseFileDiffAndPrintFileDiff(t *testing.T) { {filename: "sample_file_extended_empty_binary.diff"}, { filename: "empty.diff", - wantParseErr: &ParseError{0, 0, ErrExtendedHeadersEOF}, + wantParseErr: ParseError{0, 0, ErrExtendedHeadersEOF}, }, } for _, test := range tests { @@ -553,7 +553,7 @@ func TestParseFileDiffAndPrintFileDiff(t *testing.T) { t.Fatal(err) } diff, err := ParseFileDiff(diffData) - if !reflect.DeepEqual(err, test.wantParseErr) { + if !errors.Is(err, test.wantParseErr) { t.Errorf("%s: got ParseFileDiff err %v, want %v", test.filename, err, test.wantParseErr) continue } diff --git a/diff/parse.go b/diff/parse.go index 65db17b..3dc2598 100644 --- a/diff/parse.go +++ b/diff/parse.go @@ -56,7 +56,7 @@ func (r *MultiFileDiffReader) ReadFile() (*FileDiff, error) { fd, err := fr.ReadAllHeaders() if err != nil { switch e := err.(type) { - case *ParseError: + case ParseError: if e.Err == ErrNoFileHeader || e.Err == ErrExtendedHeadersEOF { return nil, io.EOF } @@ -88,7 +88,7 @@ func (r *MultiFileDiffReader) ReadFile() (*FileDiff, error) { r.line = fr.line r.offset = fr.offset if err != nil { - if e0, ok := err.(*ParseError); ok { + if e0, ok := err.(ParseError); ok { if e, ok := e0.Err.(*ErrBadHunkLine); ok { // This just means we finished reading the hunks for the // current file. See the ErrBadHunkLine doc for more info. @@ -177,7 +177,7 @@ func (r *FileDiffReader) ReadAllHeaders() (*FileDiff, error) { fd := &FileDiff{} fd.Extended, err = r.ReadExtendedHeaders() - if pe, ok := err.(*ParseError); ok && pe.Err == ErrExtendedHeadersEOF { + if pe, ok := err.(ParseError); ok && pe.Err == ErrExtendedHeadersEOF { wasEmpty := handleEmpty(fd) if wasEmpty { return fd, nil @@ -252,7 +252,7 @@ func (r *FileDiffReader) readOneFileHeader(prefix []byte) (filename string, time var err error line, err = readLine(r.reader) if err == io.EOF { - return "", nil, &ParseError{r.line, r.offset, ErrNoFileHeader} + return "", nil, ParseError{r.line, r.offset, ErrNoFileHeader} } else if err != nil { return "", nil, err } @@ -262,7 +262,7 @@ func (r *FileDiffReader) readOneFileHeader(prefix []byte) (filename string, time } if !bytes.HasPrefix(line, prefix) { - return "", nil, &ParseError{r.line, r.offset, ErrBadFileHeader} + return "", nil, ParseError{r.line, r.offset, ErrBadFileHeader} } r.offset += int64(len(line)) @@ -304,7 +304,7 @@ func (r *FileDiffReader) ReadExtendedHeaders() ([]string, error) { var err error line, err = readLine(r.reader) if err == io.EOF { - return xheaders, &ParseError{r.line, r.offset, ErrExtendedHeadersEOF} + return xheaders, ParseError{r.line, r.offset, ErrExtendedHeadersEOF} } else if err != nil { return xheaders, err } @@ -459,7 +459,7 @@ func (r *HunksReader) ReadHunk() (*Hunk, error) { if r.hunk == nil { // Check for presence of hunk header. if !bytes.HasPrefix(line, hunkPrefix) { - return nil, &ParseError{r.line, r.offset, ErrNoHunkHeader} + return nil, ParseError{r.line, r.offset, ErrNoHunkHeader} } // Parse hunk header. @@ -470,14 +470,14 @@ func (r *HunksReader) ReadHunk() (*Hunk, error) { } header, section, err := normalizeHeader(string(line)) if err != nil { - return nil, &ParseError{r.line, r.offset, err} + return nil, ParseError{r.line, r.offset, err} } n, err := fmt.Sscanf(header, hunkHeader, items...) if err != nil { return nil, err } if n < len(items) { - return nil, &ParseError{r.line, r.offset, &ErrBadHunkHeader{header: string(line)}} + return nil, ParseError{r.line, r.offset, &ErrBadHunkHeader{header: string(line)}} } r.hunk.Section = section @@ -502,7 +502,7 @@ func (r *HunksReader) ReadHunk() (*Hunk, error) { // diff, this may be the end of the current // file. Return a "rich" error that lets our caller // handle that case. - return r.hunk, &ParseError{r.line, r.offset, &ErrBadHunkLine{Line: line}} + return r.hunk, ParseError{r.line, r.offset, &ErrBadHunkLine{Line: line}} } if bytes.Equal(line, []byte(noNewlineMessage)) { if lastLineFromOrig { @@ -615,7 +615,7 @@ type ParseError struct { Err error // The actual error } -func (e *ParseError) Error() string { +func (e ParseError) Error() string { return fmt.Sprintf("line %d, char %d: %s", e.Line, e.Offset, e.Err) } From ba000a99a7f6a1c7bab445da3802cc14bd71ae27 Mon Sep 17 00:00:00 2001 From: sofiia-tesliuk Date: Tue, 1 Sep 2020 21:04:37 +0000 Subject: [PATCH 7/8] update version of Go in .travis.yml to match with version in go.mod; --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 1723120..175dedf 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,7 @@ sudo: false language: go go: - - "1.12.x" + - "1.14.x" script: - GO111MODULE=on go get -t -v ./... - diff -u <(echo -n) <(gofmt -d -s .) From c3d835fa1c8d69da0868c3cdb836f74f71d2effb Mon Sep 17 00:00:00 2001 From: sofiia-tesliuk Date: Fri, 4 Sep 2020 15:06:45 +0000 Subject: [PATCH 8/8] add back pointer to ParseError, using unix() for timestamps, using cmp.Diff for showing difference in errors; --- diff/diff_test.go | 50 ++++++++++++++++++++--------------------------- diff/parse.go | 22 ++++++++++----------- 2 files changed, 32 insertions(+), 40 deletions(-) diff --git a/diff/diff_test.go b/diff/diff_test.go index ccdbff6..99400ac 100644 --- a/diff/diff_test.go +++ b/diff/diff_test.go @@ -2,18 +2,20 @@ package diff import ( "bytes" - "errors" "io/ioutil" "path/filepath" + "reflect" "strings" "testing" "time" "github.com/google/go-cmp/cmp" - "github.com/shurcooL/go-goon" ) -var timestampsT []time.Time +func unix(sec int64) *time.Time { + t := time.Unix(sec, 0) + return &t +} func init() { // Diffs include times that by default are generated in the local @@ -24,16 +26,6 @@ func init() { // This is safe to do in tests but should not (and need not) be // done for the main code. time.Local = time.UTC - - timestamps := []int64{ - 1255273940, // 2009-10-11 15:12:20 - 1255273950, // 2009-10-11 15:12:30 - 1322164040, // 2011-11-24 19:47:20 - 1322486679, // 2011-11-28 13:24:39 - } - for _, timestamp := range timestamps { - timestampsT = append(timestampsT, time.Unix(timestamp, 0)) - } } func TestParseHunkNoChunksize(t *testing.T) { @@ -60,7 +52,7 @@ func TestParseHunkNoChunksize(t *testing.T) { h := diff[0] h.Body = nil // We're not testing the body. if !cmp.Equal(h, correct) { - t.Errorf("%s: Got %#v, want %#v", filename, h, correct) + t.Errorf("%s: got - want:\n%s", filename, cmp.Diff(correct, h)) } } @@ -101,7 +93,7 @@ func TestParseHunksAndPrintHunks(t *testing.T) { t.Errorf("%s: PrintHunks: %s", test.filename, err) } if !bytes.Equal(printed, diffData) { - t.Errorf("%s: printed diff hunks != original diff hunks\n\n# PrintHunks output:\n%s\n\n# Original:\n%s", test.filename, printed, diffData) + t.Errorf("%s: printed diff hunks != original diff hunks\n\n# PrintHunks output - Original:\n%s", test.filename, cmp.Diff(diffData, printed)) } } } @@ -115,27 +107,27 @@ func TestParseFileDiffHeaders(t *testing.T) { filename: "sample_file.diff", wantDiff: &FileDiff{ OrigName: "oldname", - OrigTime: ×tampsT[0], + OrigTime: unix(1255273940), // 2009-10-11 15:12:20 NewName: "newname", - NewTime: ×tampsT[1], + NewTime: unix(1255273950), // 2009-10-11 15:12:30 }, }, { filename: "sample_file_no_fractional_seconds.diff", wantDiff: &FileDiff{ OrigName: "goyaml.go", - OrigTime: ×tampsT[2], + OrigTime: unix(1322164040), // 2011-11-24 19:47:20 NewName: "goyaml.go", - NewTime: ×tampsT[3], + NewTime: unix(1322486679), // 2011-11-28 13:24:39 }, }, { filename: "sample_file_extended.diff", wantDiff: &FileDiff{ OrigName: "oldname", - OrigTime: ×tampsT[0], + OrigTime: unix(1255273940), // 2009-10-11 15:12:20 NewName: "newname", - NewTime: ×tampsT[1], + NewTime: unix(1255273950), // 2009-10-11 15:12:30 Extended: []string{ "diff --git a/vcs/git_cmd.go b/vcs/git_cmd.go", "index aa4de15..7c048ab 100644", @@ -241,7 +233,7 @@ func TestParseFileDiffHeaders(t *testing.T) { diff.Hunks = nil if got, want := diff, test.wantDiff; !cmp.Equal(got, want) { - t.Errorf("%s:\n\ngot: %v\nwant: %v", test.filename, goon.Sdump(got), goon.Sdump(want)) + t.Errorf("%s:\n\ngot - want:\n%s", test.filename, cmp.Diff(want, got)) } } } @@ -523,7 +515,7 @@ func TestParseMultiFileDiffHeaders(t *testing.T) { diffs[i].Hunks = nil // This test focuses on things other than hunks, so don't compare them. } if got, want := diffs, test.wantDiffs; !cmp.Equal(got, want) { - t.Errorf("%s:\n\ngot: %v\nwant: %v", test.filename, goon.Sdump(got), goon.Sdump(want)) + t.Errorf("%s:\n\ngot - want:\n%s", test.filename, cmp.Diff(want, got)) } } } @@ -544,7 +536,7 @@ func TestParseFileDiffAndPrintFileDiff(t *testing.T) { {filename: "sample_file_extended_empty_binary.diff"}, { filename: "empty.diff", - wantParseErr: ParseError{0, 0, ErrExtendedHeadersEOF}, + wantParseErr: &ParseError{0, 0, ErrExtendedHeadersEOF}, }, } for _, test := range tests { @@ -553,7 +545,7 @@ func TestParseFileDiffAndPrintFileDiff(t *testing.T) { t.Fatal(err) } diff, err := ParseFileDiff(diffData) - if !errors.Is(err, test.wantParseErr) { + if !reflect.DeepEqual(err, test.wantParseErr) { t.Errorf("%s: got ParseFileDiff err %v, want %v", test.filename, err, test.wantParseErr) continue } @@ -566,7 +558,7 @@ func TestParseFileDiffAndPrintFileDiff(t *testing.T) { t.Errorf("%s: PrintFileDiff: %s", test.filename, err) } if !bytes.Equal(printed, diffData) { - t.Errorf("%s: printed file diff != original file diff\n\n# PrintFileDiff output:\n%s\n\n# Original:\n%s", test.filename, printed, diffData) + t.Errorf("%s: printed file diff != original file diff\n\n# PrintFileDiff output - Original:\n%s", test.filename, cmp.Diff(diffData, printed)) } } } @@ -610,7 +602,7 @@ func TestParseMultiFileDiffAndPrintMultiFileDiff(t *testing.T) { t.Errorf("%s: PrintMultiFileDiff: %s", test.filename, err) } if !bytes.Equal(printed, diffData) { - t.Errorf("%s: printed multi-file diff != original multi-file diff\n\n# PrintMultiFileDiff output:\n%s\n\n# Original:\n%s", test.filename, printed, diffData) + t.Errorf("%s: printed multi-file diff != original multi-file diff\n\n# PrintMultiFileDiff output - Original:\n%s", test.filename, cmp.Diff(diffData, printed)) } } } @@ -671,7 +663,7 @@ func TestNoNewlineAtEnd(t *testing.T) { continue } if printed := string(printed); printed != test.diff { - t.Errorf("%s: printed diff hunks != original diff hunks\n\n# PrintHunks output:\n%s\n\n# Original:\n%s", label, printed, test.diff) + t.Errorf("%s: printed diff hunks != original diff hunks\n\n# PrintHunks output - Original:\n%s", label, cmp.Diff(test.diff, printed)) } } } @@ -731,7 +723,7 @@ func TestFileDiff_Stat(t *testing.T) { fdiff := &FileDiff{Hunks: test.hunks} stat := fdiff.Stat() if !cmp.Equal(stat, test.want) { - t.Errorf("%s: got diff stat %+v, want %+v", label, stat, test.want) + t.Errorf("%s: got - want diff stat\n%s", label, cmp.Diff(test.want, stat)) continue } } diff --git a/diff/parse.go b/diff/parse.go index 3dc2598..65db17b 100644 --- a/diff/parse.go +++ b/diff/parse.go @@ -56,7 +56,7 @@ func (r *MultiFileDiffReader) ReadFile() (*FileDiff, error) { fd, err := fr.ReadAllHeaders() if err != nil { switch e := err.(type) { - case ParseError: + case *ParseError: if e.Err == ErrNoFileHeader || e.Err == ErrExtendedHeadersEOF { return nil, io.EOF } @@ -88,7 +88,7 @@ func (r *MultiFileDiffReader) ReadFile() (*FileDiff, error) { r.line = fr.line r.offset = fr.offset if err != nil { - if e0, ok := err.(ParseError); ok { + if e0, ok := err.(*ParseError); ok { if e, ok := e0.Err.(*ErrBadHunkLine); ok { // This just means we finished reading the hunks for the // current file. See the ErrBadHunkLine doc for more info. @@ -177,7 +177,7 @@ func (r *FileDiffReader) ReadAllHeaders() (*FileDiff, error) { fd := &FileDiff{} fd.Extended, err = r.ReadExtendedHeaders() - if pe, ok := err.(ParseError); ok && pe.Err == ErrExtendedHeadersEOF { + if pe, ok := err.(*ParseError); ok && pe.Err == ErrExtendedHeadersEOF { wasEmpty := handleEmpty(fd) if wasEmpty { return fd, nil @@ -252,7 +252,7 @@ func (r *FileDiffReader) readOneFileHeader(prefix []byte) (filename string, time var err error line, err = readLine(r.reader) if err == io.EOF { - return "", nil, ParseError{r.line, r.offset, ErrNoFileHeader} + return "", nil, &ParseError{r.line, r.offset, ErrNoFileHeader} } else if err != nil { return "", nil, err } @@ -262,7 +262,7 @@ func (r *FileDiffReader) readOneFileHeader(prefix []byte) (filename string, time } if !bytes.HasPrefix(line, prefix) { - return "", nil, ParseError{r.line, r.offset, ErrBadFileHeader} + return "", nil, &ParseError{r.line, r.offset, ErrBadFileHeader} } r.offset += int64(len(line)) @@ -304,7 +304,7 @@ func (r *FileDiffReader) ReadExtendedHeaders() ([]string, error) { var err error line, err = readLine(r.reader) if err == io.EOF { - return xheaders, ParseError{r.line, r.offset, ErrExtendedHeadersEOF} + return xheaders, &ParseError{r.line, r.offset, ErrExtendedHeadersEOF} } else if err != nil { return xheaders, err } @@ -459,7 +459,7 @@ func (r *HunksReader) ReadHunk() (*Hunk, error) { if r.hunk == nil { // Check for presence of hunk header. if !bytes.HasPrefix(line, hunkPrefix) { - return nil, ParseError{r.line, r.offset, ErrNoHunkHeader} + return nil, &ParseError{r.line, r.offset, ErrNoHunkHeader} } // Parse hunk header. @@ -470,14 +470,14 @@ func (r *HunksReader) ReadHunk() (*Hunk, error) { } header, section, err := normalizeHeader(string(line)) if err != nil { - return nil, ParseError{r.line, r.offset, err} + return nil, &ParseError{r.line, r.offset, err} } n, err := fmt.Sscanf(header, hunkHeader, items...) if err != nil { return nil, err } if n < len(items) { - return nil, ParseError{r.line, r.offset, &ErrBadHunkHeader{header: string(line)}} + return nil, &ParseError{r.line, r.offset, &ErrBadHunkHeader{header: string(line)}} } r.hunk.Section = section @@ -502,7 +502,7 @@ func (r *HunksReader) ReadHunk() (*Hunk, error) { // diff, this may be the end of the current // file. Return a "rich" error that lets our caller // handle that case. - return r.hunk, ParseError{r.line, r.offset, &ErrBadHunkLine{Line: line}} + return r.hunk, &ParseError{r.line, r.offset, &ErrBadHunkLine{Line: line}} } if bytes.Equal(line, []byte(noNewlineMessage)) { if lastLineFromOrig { @@ -615,7 +615,7 @@ type ParseError struct { Err error // The actual error } -func (e ParseError) Error() string { +func (e *ParseError) Error() string { return fmt.Sprintf("line %d, char %d: %s", e.Line, e.Offset, e.Err) }