|
6 | 6 | "errors"
|
7 | 7 | "fmt"
|
8 | 8 | "io"
|
| 9 | + "strconv" |
9 | 10 | "strings"
|
10 | 11 | "time"
|
11 | 12 |
|
@@ -234,6 +235,15 @@ func (r *FileDiffReader) ReadFileHeaders() (origName, newName string, origTimest
|
234 | 235 | return "", "", nil, nil, err
|
235 | 236 | }
|
236 | 237 |
|
| 238 | + unquotedOrigName, err := strconv.Unquote(origName) |
| 239 | + if err == nil { |
| 240 | + origName = unquotedOrigName |
| 241 | + } |
| 242 | + unquotedNewName, err := strconv.Unquote(newName) |
| 243 | + if err == nil { |
| 244 | + newName = unquotedNewName |
| 245 | + } |
| 246 | + |
237 | 247 | return origName, newName, origTimestamp, newTimestamp, nil
|
238 | 248 | }
|
239 | 249 |
|
@@ -329,30 +339,49 @@ func (r *FileDiffReader) ReadExtendedHeaders() ([]string, error) {
|
329 | 339 | // handleEmpty detects when FileDiff was an empty diff and will not have any hunks
|
330 | 340 | // that follow. It updates fd fields from the parsed extended headers.
|
331 | 341 | func handleEmpty(fd *FileDiff) (wasEmpty bool) {
|
| 342 | + var err error |
332 | 343 | switch {
|
333 | 344 | case (len(fd.Extended) == 3 || len(fd.Extended) == 4 && strings.HasPrefix(fd.Extended[3], "Binary files ")) &&
|
334 | 345 | strings.HasPrefix(fd.Extended[1], "new file mode ") && strings.HasPrefix(fd.Extended[0], "diff --git "):
|
335 | 346 |
|
336 | 347 | names := strings.SplitN(fd.Extended[0][len("diff --git "):], " ", 2)
|
337 | 348 | fd.OrigName = "/dev/null"
|
338 |
| - fd.NewName = names[1] |
| 349 | + fd.NewName, err = strconv.Unquote(names[1]) |
| 350 | + if err != nil { |
| 351 | + fd.NewName = names[1] |
| 352 | + } |
339 | 353 | return true
|
340 | 354 | case (len(fd.Extended) == 3 || len(fd.Extended) == 4 && strings.HasPrefix(fd.Extended[3], "Binary files ")) &&
|
341 | 355 | strings.HasPrefix(fd.Extended[1], "deleted file mode ") && strings.HasPrefix(fd.Extended[0], "diff --git "):
|
342 | 356 |
|
343 | 357 | names := strings.SplitN(fd.Extended[0][len("diff --git "):], " ", 2)
|
344 |
| - fd.OrigName = names[0] |
| 358 | + fd.OrigName, err = strconv.Unquote(names[0]) |
| 359 | + if err != nil { |
| 360 | + fd.OrigName = names[0] |
| 361 | + } |
345 | 362 | fd.NewName = "/dev/null"
|
346 | 363 | return true
|
347 | 364 | 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 "):
|
348 | 365 | names := strings.SplitN(fd.Extended[0][len("diff --git "):], " ", 2)
|
349 |
| - fd.OrigName = names[0] |
350 |
| - fd.NewName = names[1] |
| 366 | + fd.OrigName, err = strconv.Unquote(names[0]) |
| 367 | + if err != nil { |
| 368 | + fd.OrigName = names[0] |
| 369 | + } |
| 370 | + fd.NewName, err = strconv.Unquote(names[1]) |
| 371 | + if err != nil { |
| 372 | + fd.NewName = names[1] |
| 373 | + } |
351 | 374 | return true
|
352 | 375 | case len(fd.Extended) == 3 && strings.HasPrefix(fd.Extended[2], "Binary files ") && strings.HasPrefix(fd.Extended[0], "diff --git "):
|
353 | 376 | names := strings.SplitN(fd.Extended[0][len("diff --git "):], " ", 2)
|
354 |
| - fd.OrigName = names[0] |
355 |
| - fd.NewName = names[1] |
| 377 | + fd.OrigName, err = strconv.Unquote(names[0]) |
| 378 | + if err != nil { |
| 379 | + fd.OrigName = names[0] |
| 380 | + } |
| 381 | + fd.NewName, err = strconv.Unquote(names[1]) |
| 382 | + if err != nil { |
| 383 | + fd.NewName = names[1] |
| 384 | + } |
356 | 385 | return true
|
357 | 386 | default:
|
358 | 387 | return false
|
|
0 commit comments