From b37f3f6025060389723112b5bb7f0ca39353a51b Mon Sep 17 00:00:00 2001 From: youdie006 Date: Mon, 28 Sep 2026 22:02:00 +0900 Subject: [PATCH] fix/reverse: keep "Only in" entries when reversing An "Only in" line is parsed as OrigName=, NewName="", and the printer recognises it by the empty NewName. ReverseFileDiff swapped the names, so the reversed entry printed as nothing. GNU diff prints the same "Only in" line in both directions, so leave those names alone. --- diff/reverse.go | 4 ++++ diff/reverse_test.go | 4 ++++ .../sample_contains_added_deleted_files.reversed | 11 +++++++++++ 3 files changed, 19 insertions(+) create mode 100644 diff/testdata/sample_contains_added_deleted_files.reversed diff --git a/diff/reverse.go b/diff/reverse.go index 0c4d1b6..f492731 100644 --- a/diff/reverse.go +++ b/diff/reverse.go @@ -26,6 +26,10 @@ func ReverseFileDiff(fd *FileDiff) (*FileDiff, error) { NewTime: fd.OrigTime, Extended: extended, } + // "Only in" lines read the same in both directions. + if fd.NewName == "" { + reverse.OrigName, reverse.NewName = fd.OrigName, fd.NewName + } for _, hunk := range fd.Hunks { invHunk, err := reverseHunk(hunk) if err != nil { diff --git a/diff/reverse_test.go b/diff/reverse_test.go index d37c1aa..9ec2da6 100644 --- a/diff/reverse_test.go +++ b/diff/reverse_test.go @@ -116,6 +116,10 @@ func TestReverseMultiFileDiff(t *testing.T) { inputFile: "sample_multi_file.diff", wantFile: "sample_multi_file.reversed", }, + { + inputFile: "sample_contains_added_deleted_files.diff", + wantFile: "sample_contains_added_deleted_files.reversed", + }, } for _, test := range tests { inputData, err := os.ReadFile(filepath.Join("testdata", test.inputFile)) diff --git a/diff/testdata/sample_contains_added_deleted_files.reversed b/diff/testdata/sample_contains_added_deleted_files.reversed new file mode 100644 index 0000000..b27c539 --- /dev/null +++ b/diff/testdata/sample_contains_added_deleted_files.reversed @@ -0,0 +1,11 @@ +diff -u source_a/file_1.txt source_b/file_1.txt +--- source_b/file_1.txt ++++ source_a/file_1.txt +@@ -3,4 +2,3 @@ + To be, or not to be, that is the question: +-The slings and arrows of outrageous fortune, +-Or to take arms against a sea of troubles ++Whether 'tis nobler in the mind to suffer + And by opposing end them. To die—to sleep, +Only in source_a: file_2.txt +Only in source_b: file_3.txt