@@ -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
@@ -261,13 +268,20 @@ func (r *FileDiffReader) readOneFileHeader(prefix []byte) (filename string, time
261268 return filename , timestamp , err
262269}
263270
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+ }
265278
266279// ReadExtendedHeaders reads the extended header lines, if any, from a
267280// unified diff file (e.g., git's "diff --git a/foo.go b/foo.go", "new
268281// mode <mode>", "rename from <path>", etc.).
269282func (r * FileDiffReader ) ReadExtendedHeaders () ([]string , error ) {
270283 var xheaders []string
284+ firstLine := true
271285 for {
272286 var line []byte
273287 if r .fileHeaderLine == nil {
@@ -283,6 +297,13 @@ func (r *FileDiffReader) ReadExtendedHeaders() ([]string, error) {
283297 r .fileHeaderLine = nil
284298 }
285299
300+ if bytes .HasPrefix (line , []byte ("diff --git" )) {
301+ if firstLine {
302+ firstLine = false
303+ } else {
304+ return xheaders , OverflowError (line )
305+ }
306+ }
286307 if bytes .HasPrefix (line , []byte ("--- " )) {
287308 // We've reached the file header.
288309 r .fileHeaderLine = line // pass to readOneFileHeader (see fileHeaderLine field doc)
0 commit comments