@@ -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
@@ -260,13 +267,20 @@ func (r *FileDiffReader) readOneFileHeader(prefix []byte) (filename string, time
260
267
return filename , timestamp , err
261
268
}
262
269
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
+ }
264
277
265
278
// ReadExtendedHeaders reads the extended header lines, if any, from a
266
279
// unified diff file (e.g., git's "diff --git a/foo.go b/foo.go", "new
267
280
// mode <mode>", "rename from <path>", etc.).
268
281
func (r * FileDiffReader ) ReadExtendedHeaders () ([]string , error ) {
269
282
var xheaders []string
283
+ firstLine := true
270
284
for {
271
285
var line []byte
272
286
if r .fileHeaderLine == nil {
@@ -282,6 +296,13 @@ func (r *FileDiffReader) ReadExtendedHeaders() ([]string, error) {
282
296
r .fileHeaderLine = nil
283
297
}
284
298
299
+ if bytes .HasPrefix (line , []byte ("diff --git" )) {
300
+ if firstLine {
301
+ firstLine = false
302
+ } else {
303
+ return xheaders , OverflowError (line )
304
+ }
305
+ }
285
306
if bytes .HasPrefix (line , []byte ("--- " )) {
286
307
// We've reached the file header.
287
308
r .fileHeaderLine = line // pass to readOneFileHeader (see fileHeaderLine field doc)
0 commit comments