From bf23e4b0fe2ba5abce6ec3dca8ee8cb4c42250e8 Mon Sep 17 00:00:00 2001 From: Keegan Smith Date: Thu, 10 Sep 2026 07:19:51 +0000 Subject: [PATCH] fix/reverse: make unsupported copies detectable Callers need a stable way to distinguish the valid-but-unsupported Git copy case from other reversal failures. Exposing and returning a sentinel preserves the existing behavior while making that condition programmatically detectable. Amp-Thread-ID: https://ampcode.com/threads/T-01a08a2d-a5f9-726c-bf53-aab80421f8ef Co-authored-by: Amp --- diff/reverse.go | 5 ++++- diff/reverse_test.go | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/diff/reverse.go b/diff/reverse.go index edbd32d..5dd8424 100644 --- a/diff/reverse.go +++ b/diff/reverse.go @@ -7,6 +7,9 @@ import ( "strings" ) +// ErrCannotReverseCopy is returned when a Git copy diff cannot be reversed. +var ErrCannotReverseCopy = errors.New("cannot reverse a git copy diff") + // ReverseFileDiff takes a diff.FileDiff and returns the reverse operation. // This is a FileDiff that undoes the edit of the original. Git copy diffs // cannot be reversed because they do not contain enough information to delete @@ -50,7 +53,7 @@ func reverseExtendedHeaders(headers []string) ([]string, error) { case strings.HasPrefix(header, "index "): reversed[i] = reverseIndexHeader(header) case strings.HasPrefix(header, "copy from "), strings.HasPrefix(header, "copy to "): - return nil, errors.New("cannot reverse a git copy diff") + return nil, ErrCannotReverseCopy } } swapHeaderValues(reversed, "old mode ", "new mode ") diff --git a/diff/reverse_test.go b/diff/reverse_test.go index 3cc3962..b621dee 100644 --- a/diff/reverse_test.go +++ b/diff/reverse_test.go @@ -290,8 +290,8 @@ func TestReverseFileDiffRejectsCopy(t *testing.T) { if err != nil { t.Fatal(err) } - if _, err := ReverseFileDiff(fd); err == nil { - t.Fatal("ReverseFileDiff succeeded for a copy diff") + if _, err := ReverseFileDiff(fd); err != ErrCannotReverseCopy { + t.Fatalf("ReverseFileDiff error = %v, want ErrCannotReverseCopy", err) } }