diff --git a/gitdiff/parser.go b/gitdiff/parser.go index a3e02d8..9707c9c 100644 --- a/gitdiff/parser.go +++ b/gitdiff/parser.go @@ -376,7 +376,7 @@ func (p *parser) ParseBinaryMarker() (isBinary bool, hasData bool, err error) { } func (p *parser) ParseBinaryFragmentHeader() (*BinaryFragment, error) { - parts := strings.SplitN(p.Line(0), " ", 2) + parts := strings.SplitN(strings.TrimSuffix(p.Line(0), "\n"), " ", 2) if len(parts) < 2 { return nil, nil } diff --git a/gitdiff/parser_binary_test.go b/gitdiff/parser_binary_test.go index 322f11d..d53ca6c 100644 --- a/gitdiff/parser_binary_test.go +++ b/gitdiff/parser_binary_test.go @@ -2,6 +2,7 @@ package gitdiff import ( "io" + "reflect" "testing" ) @@ -35,7 +36,7 @@ func TestParseBinaryMarker(t *testing.T) { isBinary, hasData, err := p.ParseBinaryMarker() if test.Err { - if err != nil || err == io.EOF { + if err == nil || err == io.EOF { t.Fatalf("expected error parsing binary marker, but got %v", err) } return @@ -52,3 +53,58 @@ func TestParseBinaryMarker(t *testing.T) { }) } } + +func TestParseBinaryFragmentHeader(t *testing.T) { + tests := map[string]struct { + Input string + Output *BinaryFragment + Err bool + }{ + "delta": { + Input: "delta 1234\n", + Output: &BinaryFragment{ + Method: BinaryPatchDelta, + Size: 1234, + }, + }, + "literal": { + Input: "literal 1234\n", + Output: &BinaryFragment{ + Method: BinaryPatchLiteral, + Size: 1234, + }, + }, + "unknownMethod": { + Input: "compressed 1234\n", + Output: nil, + }, + "notAHeader": { + Input: "Binary files differ\n", + Output: nil, + }, + "invalidSize": { + Input: "delta 123abc\n", + Err: true, + }, + } + + for name, test := range tests { + t.Run(name, func(t *testing.T) { + p := newTestParser(test.Input, true) + + frag, err := p.ParseBinaryFragmentHeader() + if test.Err { + if err == nil || err == io.EOF { + t.Fatalf("expected error parsing binary header, but got %v", err) + } + return + } + if err != nil { + t.Fatalf("unexpected error parsing binary header: %v", err) + } + if !reflect.DeepEqual(test.Output, frag) { + t.Errorf("incorrect binary fragment\nexpected: %+v\n actual: %+v", test.Output, frag) + } + }) + } +}