From f3e47a486fca911cc3c8262e26d1cff6e153dc51 Mon Sep 17 00:00:00 2001 From: Billy Keyes Date: Tue, 7 Jan 2025 19:18:28 -0800 Subject: [PATCH] Parse binary headers with file paths Some patches may include one or more file paths as part of the binary header when there is no binary data. Git accounts for this by only checking the prefix and suffix of the line, but I missed that logic when implementing this originally. --- gitdiff/binary.go | 15 +++++++++++---- gitdiff/binary_test.go | 10 ++++++++++ 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/gitdiff/binary.go b/gitdiff/binary.go index c65a9a6..282e323 100644 --- a/gitdiff/binary.go +++ b/gitdiff/binary.go @@ -50,11 +50,11 @@ func (p *parser) ParseBinaryFragments(f *File) (n int, err error) { } func (p *parser) ParseBinaryMarker() (isBinary bool, hasData bool, err error) { - switch p.Line(0) { - case "GIT binary patch\n": + line := p.Line(0) + switch { + case line == "GIT binary patch\n": hasData = true - case "Binary files differ\n": - case "Files differ\n": + case isBinaryNoDataMarker(line): default: return false, false, nil } @@ -65,6 +65,13 @@ func (p *parser) ParseBinaryMarker() (isBinary bool, hasData bool, err error) { return true, hasData, nil } +func isBinaryNoDataMarker(line string) bool { + if strings.HasSuffix(line, " differ\n") { + return strings.HasPrefix(line, "Binary files ") || strings.HasPrefix(line, "Files ") + } + return false +} + func (p *parser) ParseBinaryFragmentHeader() (*BinaryFragment, error) { parts := strings.SplitN(strings.TrimSuffix(p.Line(0), "\n"), " ", 2) if len(parts) < 2 { diff --git a/gitdiff/binary_test.go b/gitdiff/binary_test.go index a31a0e0..64db243 100644 --- a/gitdiff/binary_test.go +++ b/gitdiff/binary_test.go @@ -25,6 +25,16 @@ func TestParseBinaryMarker(t *testing.T) { IsBinary: true, HasData: false, }, + "binaryFileNoPatchPaths": { + Input: "Binary files a/foo.bin and b/foo.bin differ\n", + IsBinary: true, + HasData: false, + }, + "fileNoPatch": { + Input: "Files differ\n", + IsBinary: true, + HasData: false, + }, "textFile": { Input: "@@ -10,14 +22,31 @@\n", IsBinary: false,