@@ -177,59 +177,16 @@ func (r *FileDiffReader) ReadAllHeaders() (*FileDiff, error) {
177
177
fd := & FileDiff {}
178
178
179
179
fd .Extended , err = r .ReadExtendedHeaders ()
180
- if err , ok := err .(* ParseError ); ok && err .Err == ErrExtendedHeadersEOF {
181
- // TODO: Clean up.
182
- if len (fd .Extended ) == 3 && strings .HasPrefix (fd .Extended [1 ], "new file mode " ) && strings .HasPrefix (fd .Extended [0 ], "diff --git " ) {
183
- names := strings .SplitN (fd .Extended [0 ][len ("diff --git " ):], " " , 2 )
184
- fd .OrigName = "/dev/null"
185
- fd .NewName = names [1 ]
186
- fd .Empty = true
187
- return fd , nil
188
- } else if len (fd .Extended ) == 3 && strings .HasPrefix (fd .Extended [1 ], "deleted file mode " ) && strings .HasPrefix (fd .Extended [0 ], "diff --git " ) {
189
- names := strings .SplitN (fd .Extended [0 ][len ("diff --git " ):], " " , 2 )
190
- fd .OrigName = names [0 ]
191
- fd .NewName = "/dev/null"
192
- fd .Empty = true
193
- return fd , nil
194
- } else if len (fd .Extended ) == 4 && strings .HasPrefix (fd .Extended [2 ], "rename from " ) && strings .HasPrefix (fd .Extended [3 ], "rename to " ) && strings .HasPrefix (fd .Extended [0 ], "diff --git " ) {
195
- names := strings .SplitN (fd .Extended [0 ][len ("diff --git " ):], " " , 2 )
196
- fd .OrigName = names [0 ]
197
- fd .NewName = names [1 ]
198
- fd .Empty = true
199
- return fd , nil
200
- } else if len (fd .Extended ) == 3 && strings .HasPrefix (fd .Extended [2 ], "Binary files " ) && strings .HasPrefix (fd .Extended [0 ], "diff --git " ) {
201
- names := strings .SplitN (fd .Extended [0 ][len ("diff --git " ):], " " , 2 )
202
- fd .OrigName = names [0 ]
203
- fd .NewName = names [1 ]
204
- fd .Empty = true
180
+ if pe , ok := err .(* ParseError ); ok && pe .Err == ErrExtendedHeadersEOF {
181
+ wasEmpty := handleEmpty (fd )
182
+ if wasEmpty {
205
183
return fd , nil
206
184
}
207
- }
208
- if _ , ok := err .(OverflowError ); ok {
209
- // TODO: Clean up, deduplicate.
210
- if len (fd .Extended ) == 3 && strings .HasPrefix (fd .Extended [1 ], "new file mode " ) && strings .HasPrefix (fd .Extended [0 ], "diff --git " ) {
211
- names := strings .SplitN (fd .Extended [0 ][len ("diff --git " ):], " " , 2 )
212
- fd .OrigName = "/dev/null"
213
- fd .NewName = names [1 ]
214
- fd .Empty = true
215
- } else if len (fd .Extended ) == 3 && strings .HasPrefix (fd .Extended [1 ], "deleted file mode " ) && strings .HasPrefix (fd .Extended [0 ], "diff --git " ) {
216
- names := strings .SplitN (fd .Extended [0 ][len ("diff --git " ):], " " , 2 )
217
- fd .OrigName = names [0 ]
218
- fd .NewName = "/dev/null"
219
- fd .Empty = true
220
- } else if len (fd .Extended ) == 4 && strings .HasPrefix (fd .Extended [2 ], "rename from " ) && strings .HasPrefix (fd .Extended [3 ], "rename to " ) && strings .HasPrefix (fd .Extended [0 ], "diff --git " ) {
221
- names := strings .SplitN (fd .Extended [0 ][len ("diff --git " ):], " " , 2 )
222
- fd .OrigName = names [0 ]
223
- fd .NewName = names [1 ]
224
- fd .Empty = true
225
- } else if len (fd .Extended ) == 3 && strings .HasPrefix (fd .Extended [2 ], "Binary files " ) && strings .HasPrefix (fd .Extended [0 ], "diff --git " ) {
226
- names := strings .SplitN (fd .Extended [0 ][len ("diff --git " ):], " " , 2 )
227
- fd .OrigName = names [0 ]
228
- fd .NewName = names [1 ]
229
- fd .Empty = true
230
- }
231
- }
232
- if err != nil {
185
+ return fd , err
186
+ } else if _ , ok := err .(OverflowError ); ok {
187
+ handleEmpty (fd )
188
+ return fd , err
189
+ } else if err != nil {
233
190
return fd , err
234
191
}
235
192
@@ -368,6 +325,35 @@ func (r *FileDiffReader) ReadExtendedHeaders() ([]string, error) {
368
325
}
369
326
}
370
327
328
+ // handleEmpty detects when FileDiff was an empty diff and will not have any hunks
329
+ // that follow. It updates fd fields from the parsed extended headers.
330
+ func handleEmpty (fd * FileDiff ) (wasEmpty bool ) {
331
+ switch {
332
+ case len (fd .Extended ) == 3 && strings .HasPrefix (fd .Extended [1 ], "new file mode " ) && strings .HasPrefix (fd .Extended [0 ], "diff --git " ):
333
+ names := strings .SplitN (fd .Extended [0 ][len ("diff --git " ):], " " , 2 )
334
+ fd .OrigName = "/dev/null"
335
+ fd .NewName = names [1 ]
336
+ return true
337
+ case len (fd .Extended ) == 3 && strings .HasPrefix (fd .Extended [1 ], "deleted file mode " ) && strings .HasPrefix (fd .Extended [0 ], "diff --git " ):
338
+ names := strings .SplitN (fd .Extended [0 ][len ("diff --git " ):], " " , 2 )
339
+ fd .OrigName = names [0 ]
340
+ fd .NewName = "/dev/null"
341
+ return true
342
+ case len (fd .Extended ) == 4 && strings .HasPrefix (fd .Extended [2 ], "rename from " ) && strings .HasPrefix (fd .Extended [3 ], "rename to " ) && strings .HasPrefix (fd .Extended [0 ], "diff --git " ):
343
+ names := strings .SplitN (fd .Extended [0 ][len ("diff --git " ):], " " , 2 )
344
+ fd .OrigName = names [0 ]
345
+ fd .NewName = names [1 ]
346
+ return true
347
+ case len (fd .Extended ) == 3 && strings .HasPrefix (fd .Extended [2 ], "Binary files " ) && strings .HasPrefix (fd .Extended [0 ], "diff --git " ):
348
+ names := strings .SplitN (fd .Extended [0 ][len ("diff --git " ):], " " , 2 )
349
+ fd .OrigName = names [0 ]
350
+ fd .NewName = names [1 ]
351
+ return true
352
+ default :
353
+ return false
354
+ }
355
+ }
356
+
371
357
var (
372
358
// ErrNoFileHeader is when a file unified diff has no file header
373
359
// (i.e., the lines that begin with "---" and "+++").
0 commit comments