@@ -55,12 +55,19 @@ func (r *MultiFileDiffReader) ReadFile() (*FileDiff, error) {
55
55
56
56
d , err := fr .ReadAllHeaders ()
57
57
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 {
60
61
return nil , io .EOF
61
62
}
63
+
64
+ case OverflowError :
65
+ r .nextFileFirstLine = []byte (e )
66
+ return d , nil
67
+
68
+ default :
69
+ return nil , err
62
70
}
63
- return nil , err
64
71
}
65
72
66
73
// Before reading hunks, check to see if there are any. If there
@@ -171,7 +178,7 @@ func (r *FileDiffReader) ReadAllHeaders() (*FileDiff, error) {
171
178
172
179
fd .Extended , err = r .ReadExtendedHeaders ()
173
180
if err != nil {
174
- return nil , err
181
+ return fd , err
175
182
}
176
183
177
184
var origTime , newTime * time.Time
@@ -261,13 +268,20 @@ func (r *FileDiffReader) readOneFileHeader(prefix []byte) (filename string, time
261
268
return filename , timestamp , err
262
269
}
263
270
264
- var i = 0
271
+ // OverflowError is returned when we have overflowed into the start
272
+ // of the next file while reading extended headers.
273
+ type OverflowError string
274
+
275
+ func (e OverflowError ) Error () string {
276
+ return fmt .Sprintf ("overflowed into next file: %s" , e )
277
+ }
265
278
266
279
// ReadExtendedHeaders reads the extended header lines, if any, from a
267
280
// unified diff file (e.g., git's "diff --git a/foo.go b/foo.go", "new
268
281
// mode <mode>", "rename from <path>", etc.).
269
282
func (r * FileDiffReader ) ReadExtendedHeaders () ([]string , error ) {
270
283
var xheaders []string
284
+ firstLine := true
271
285
for {
272
286
var line []byte
273
287
if r .fileHeaderLine == nil {
@@ -283,6 +297,13 @@ func (r *FileDiffReader) ReadExtendedHeaders() ([]string, error) {
283
297
r .fileHeaderLine = nil
284
298
}
285
299
300
+ if bytes .HasPrefix (line , []byte ("diff --git" )) {
301
+ if firstLine {
302
+ firstLine = false
303
+ } else {
304
+ return xheaders , OverflowError (line )
305
+ }
306
+ }
286
307
if bytes .HasPrefix (line , []byte ("--- " )) {
287
308
// We've reached the file header.
288
309
r .fileHeaderLine = line // pass to readOneFileHeader (see fileHeaderLine field doc)
0 commit comments