Skip to content

Commit d635afe

Browse files
author
Gabriel Aszalos
committed
patch: Fixed a bug where file diffs headers were merged for only
renames with similarity index 100%.
1 parent f1b23f2 commit d635afe

File tree

1 file changed

+26
-5
lines changed

1 file changed

+26
-5
lines changed

diff/parse.go

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,12 +55,19 @@ func (r *MultiFileDiffReader) ReadFile() (*FileDiff, error) {
5555

5656
d, err := fr.ReadAllHeaders()
5757
if err != nil {
58-
if e0, ok := err.(*ParseError); ok {
59-
if e0.Err == ErrNoFileHeader || e0.Err == ErrExtendedHeadersEOF {
58+
switch e := err.(type) {
59+
case *ParseError:
60+
if e.Err == ErrNoFileHeader || e.Err == ErrExtendedHeadersEOF {
6061
return nil, io.EOF
6162
}
63+
64+
case OverflowError:
65+
r.nextFileFirstLine = []byte(e)
66+
return d, nil
67+
68+
default:
69+
return nil, err
6270
}
63-
return nil, err
6471
}
6572

6673
// Before reading hunks, check to see if there are any. If there
@@ -171,7 +178,7 @@ func (r *FileDiffReader) ReadAllHeaders() (*FileDiff, error) {
171178

172179
fd.Extended, err = r.ReadExtendedHeaders()
173180
if err != nil {
174-
return nil, err
181+
return fd, err
175182
}
176183

177184
var origTime, newTime *time.Time
@@ -260,13 +267,20 @@ func (r *FileDiffReader) readOneFileHeader(prefix []byte) (filename string, time
260267
return filename, timestamp, err
261268
}
262269

263-
var i = 0
270+
// OverflowError is returned when we have overflowed into the start
271+
// of the next file while reading extended headers.
272+
type OverflowError string
273+
274+
func (e OverflowError) Error() string {
275+
return fmt.Sprintf("overflowed into next file: %s", e)
276+
}
264277

265278
// ReadExtendedHeaders reads the extended header lines, if any, from a
266279
// unified diff file (e.g., git's "diff --git a/foo.go b/foo.go", "new
267280
// mode <mode>", "rename from <path>", etc.).
268281
func (r *FileDiffReader) ReadExtendedHeaders() ([]string, error) {
269282
var xheaders []string
283+
firstLine := true
270284
for {
271285
var line []byte
272286
if r.fileHeaderLine == nil {
@@ -282,6 +296,13 @@ func (r *FileDiffReader) ReadExtendedHeaders() ([]string, error) {
282296
r.fileHeaderLine = nil
283297
}
284298

299+
if bytes.HasPrefix(line, []byte("diff --git")) {
300+
if firstLine {
301+
firstLine = false
302+
} else {
303+
return xheaders, OverflowError(line)
304+
}
305+
}
285306
if bytes.HasPrefix(line, []byte("--- ")) {
286307
// We've reached the file header.
287308
r.fileHeaderLine = line // pass to readOneFileHeader (see fileHeaderLine field doc)

0 commit comments

Comments
 (0)