Skip to content

Commit fe252ed

Browse files
committed
Fix inconsistencies in patch format
Add "a/" and "b/" prefixes to names on "---" and "+++" lines. Reorder lines to match Git. Only print mode lines when the mode is changing.
1 parent debe110 commit fe252ed

File tree

1 file changed

+31
-20
lines changed

1 file changed

+31
-20
lines changed

gitdiff/gitdiff.go

Lines changed: 31 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -67,34 +67,18 @@ func (f *File) String() string {
6767
writeQuotedName(&diff, "b/"+bName)
6868
diff.WriteByte('\n')
6969

70-
diff.WriteString("--- ")
71-
if f.OldName == "" {
72-
diff.WriteString("/dev/null")
73-
} else {
74-
writeQuotedName(&diff, f.OldName)
75-
}
76-
diff.WriteByte('\n')
77-
78-
diff.WriteString("+++ ")
79-
if f.NewName == "" {
80-
diff.WriteString("/dev/null")
81-
} else {
82-
writeQuotedName(&diff, f.NewName)
83-
}
84-
diff.WriteByte('\n')
85-
8670
if f.OldMode != 0 {
8771
if f.IsDelete {
8872
fmt.Fprintf(&diff, "deleted file mode %o\n", f.OldMode)
89-
} else {
73+
} else if f.NewMode != 0 {
9074
fmt.Fprintf(&diff, "old mode %o\n", f.OldMode)
9175
}
9276
}
9377

9478
if f.NewMode != 0 {
9579
if f.IsNew {
9680
fmt.Fprintf(&diff, "new file mode %o\n", f.NewMode)
97-
} else {
81+
} else if f.OldMode != 0 {
9882
fmt.Fprintf(&diff, "new mode %o\n", f.NewMode)
9983
}
10084
}
@@ -135,12 +119,31 @@ func (f *File) String() string {
135119

136120
if f.OldOIDPrefix != "" && f.NewOIDPrefix != "" {
137121
fmt.Fprintf(&diff, "index %s..%s", f.OldOIDPrefix, f.NewOIDPrefix)
138-
if f.OldMode != 0 {
122+
if f.OldMode != 0 && !f.IsDelete {
139123
fmt.Fprintf(&diff, " %o", f.OldMode)
140124
}
141125
diff.WriteByte('\n')
142126
}
143127

128+
// The "---" and "+++" lines only appear for patches with fragments
129+
if len(f.TextFragments) > 0 || f.BinaryFragment != nil {
130+
diff.WriteString("--- ")
131+
if f.OldName == "" {
132+
diff.WriteString("/dev/null")
133+
} else {
134+
writeQuotedName(&diff, "a/"+f.OldName)
135+
}
136+
diff.WriteByte('\n')
137+
138+
diff.WriteString("+++ ")
139+
if f.NewName == "" {
140+
diff.WriteString("/dev/null")
141+
} else {
142+
writeQuotedName(&diff, "b/"+f.NewName)
143+
}
144+
diff.WriteByte('\n')
145+
}
146+
144147
if f.IsBinary {
145148
// TODO(bkeyes): add string method for BinaryFragments
146149
} else {
@@ -192,7 +195,15 @@ func (f *TextFragment) String() string {
192195
// Header returns a git diff header of this fragment. See [File.String] for
193196
// more details on this format.
194197
func (f *TextFragment) Header() string {
195-
return fmt.Sprintf("@@ -%d,%d +%d,%d @@ %s", f.OldPosition, f.OldLines, f.NewPosition, f.NewLines, f.Comment)
198+
var hdr strings.Builder
199+
200+
fmt.Fprintf(&hdr, "@@ -%d,%d +%d,%d @@", f.OldPosition, f.OldLines, f.NewPosition, f.NewLines)
201+
if f.Comment != "" {
202+
hdr.WriteByte(' ')
203+
hdr.WriteString(f.Comment)
204+
}
205+
206+
return hdr.String()
196207
}
197208

198209
// Validate checks that the fragment is self-consistent and appliable. Validate

0 commit comments

Comments
 (0)