Skip to content

Commit 8c3ae63

Browse files
authored
Add support for special characters in file names (#45)
1 parent adde711 commit 8c3ae63

File tree

3 files changed

+56
-6
lines changed

3 files changed

+56
-6
lines changed

diff/diff_test.go

+13
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,19 @@ func TestParseFileDiffHeaders(t *testing.T) {
203203
},
204204
},
205205
},
206+
{
207+
filename: "quoted_filename.diff",
208+
wantDiff: &FileDiff{
209+
OrigName: "a/商品详情.txt",
210+
OrigTime: nil,
211+
NewName: "b/商品详情.txt",
212+
NewTime: nil,
213+
Extended: []string{
214+
"diff --git \"a/\\345\\225\\206\\345\\223\\201\\350\\257\\246\\346\\203\\205.txt\" \"b/\\345\\225\\206\\345\\223\\201\\350\\257\\246\\346\\203\\205.txt\"",
215+
"index e69de29..c67479b 100644",
216+
},
217+
},
218+
},
206219
}
207220
for _, test := range tests {
208221
diffData, err := ioutil.ReadFile(filepath.Join("testdata", test.filename))

diff/parse.go

+35-6
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"errors"
77
"fmt"
88
"io"
9+
"strconv"
910
"strings"
1011
"time"
1112

@@ -234,6 +235,15 @@ func (r *FileDiffReader) ReadFileHeaders() (origName, newName string, origTimest
234235
return "", "", nil, nil, err
235236
}
236237

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+
237247
return origName, newName, origTimestamp, newTimestamp, nil
238248
}
239249

@@ -329,30 +339,49 @@ func (r *FileDiffReader) ReadExtendedHeaders() ([]string, error) {
329339
// handleEmpty detects when FileDiff was an empty diff and will not have any hunks
330340
// that follow. It updates fd fields from the parsed extended headers.
331341
func handleEmpty(fd *FileDiff) (wasEmpty bool) {
342+
var err error
332343
switch {
333344
case (len(fd.Extended) == 3 || len(fd.Extended) == 4 && strings.HasPrefix(fd.Extended[3], "Binary files ")) &&
334345
strings.HasPrefix(fd.Extended[1], "new file mode ") && strings.HasPrefix(fd.Extended[0], "diff --git "):
335346

336347
names := strings.SplitN(fd.Extended[0][len("diff --git "):], " ", 2)
337348
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+
}
339353
return true
340354
case (len(fd.Extended) == 3 || len(fd.Extended) == 4 && strings.HasPrefix(fd.Extended[3], "Binary files ")) &&
341355
strings.HasPrefix(fd.Extended[1], "deleted file mode ") && strings.HasPrefix(fd.Extended[0], "diff --git "):
342356

343357
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+
}
345362
fd.NewName = "/dev/null"
346363
return true
347364
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 "):
348365
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+
}
351374
return true
352375
case len(fd.Extended) == 3 && strings.HasPrefix(fd.Extended[2], "Binary files ") && strings.HasPrefix(fd.Extended[0], "diff --git "):
353376
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+
}
356385
return true
357386
default:
358387
return false

diff/testdata/quoted_filename.diff

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
diff --git "a/\345\225\206\345\223\201\350\257\246\346\203\205.txt" "b/\345\225\206\345\223\201\350\257\246\346\203\205.txt"
2+
index e69de29..c67479b 100644
3+
--- "a/\345\225\206\345\223\201\350\257\246\346\203\205.txt"
4+
+++ "b/\345\225\206\345\223\201\350\257\246\346\203\205.txt"
5+
@@ -0,0 +1,3 @@
6+
+some
7+
+test
8+
+file

0 commit comments

Comments
 (0)