Skip to content

Commit e7ab41f

Browse files
committed
Handle diffs on windows
Running the standard diff tool on windows produces output with CRLF line endings. Stripping trailing CR in the line reader utility prevents errors in diff parsing.
1 parent 119ab63 commit e7ab41f

File tree

4 files changed

+143
-3
lines changed

4 files changed

+143
-3
lines changed

diff/diff_test.go

+38
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,44 @@ func TestParseMultiFileDiffHeaders(t *testing.T) {
375375
},
376376
},
377377
},
378+
{
379+
filename: "sample_multi_file_new_win.diff",
380+
wantDiffs: []*FileDiff{
381+
{
382+
OrigName: "/dev/null",
383+
OrigTime: nil,
384+
NewName: "b/_vendor/go/build/syslist_test.go",
385+
NewTime: nil,
386+
Extended: []string{
387+
"diff --git a/_vendor/go/build/syslist_test.go b/_vendor/go/build/syslist_test.go",
388+
"new file mode 100644",
389+
"index 0000000..3be2928",
390+
},
391+
},
392+
{
393+
OrigName: "/dev/null",
394+
OrigTime: nil,
395+
NewName: "b/_vendor/go/build/testdata/empty/dummy",
396+
NewTime: nil,
397+
Extended: []string{
398+
"diff --git a/_vendor/go/build/testdata/empty/dummy b/_vendor/go/build/testdata/empty/dummy",
399+
"new file mode 100644",
400+
"index 0000000..e69de29",
401+
},
402+
},
403+
{
404+
OrigName: "/dev/null",
405+
OrigTime: nil,
406+
NewName: "b/_vendor/go/build/testdata/multi/file.go",
407+
NewTime: nil,
408+
Extended: []string{
409+
"diff --git a/_vendor/go/build/testdata/multi/file.go b/_vendor/go/build/testdata/multi/file.go",
410+
"new file mode 100644",
411+
"index 0000000..ee946eb",
412+
},
413+
},
414+
},
415+
},
378416
}
379417
for _, test := range tests {
380418
diffData, err := ioutil.ReadFile(filepath.Join("testdata", test.filename))

diff/reader_util.go

+10-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package diff
22

33
import (
44
"bufio"
5-
"bytes"
65
"io"
76
)
87

@@ -25,6 +24,14 @@ func readLine(r *bufio.Reader) ([]byte, error) {
2524
} else if err != nil {
2625
return nil, err
2726
}
28-
line := bytes.TrimSuffix(line_, []byte{'\n'})
29-
return line, nil
27+
line := line_[0:len(line_)-1]
28+
return dropCR(line), nil
29+
}
30+
31+
// dropCR drops a terminal \r from the data.
32+
func dropCR(data []byte) []byte {
33+
if len(data) > 0 && data[len(data)-1] == '\r' {
34+
return data[0 : len(data)-1]
35+
}
36+
return data
3037
}

diff/reader_util_test.go

+68
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package diff
2+
3+
import (
4+
"reflect"
5+
"bufio"
6+
"io"
7+
"strings"
8+
"testing"
9+
)
10+
11+
func TestReadLine(t *testing.T) {
12+
tests := []struct {
13+
name string
14+
input string
15+
want []string
16+
}{
17+
{
18+
name: "empty",
19+
input: "",
20+
want: []string{},
21+
},
22+
{
23+
name: "single_line",
24+
input: "@@ -0,0 +1,62 @@",
25+
want: []string{"@@ -0,0 +1,62 @@"},
26+
},
27+
{
28+
name: "single_lf_terminated_line",
29+
input: "@@ -0,0 +1,62 @@\n",
30+
want: []string{"@@ -0,0 +1,62 @@"},
31+
},
32+
{
33+
name: "single_crlf_terminated_line",
34+
input: "@@ -0,0 +1,62 @@\r\n",
35+
want: []string{"@@ -0,0 +1,62 @@"},
36+
},
37+
{
38+
name: "multi_line",
39+
input: `diff --git a/test.go b/test.go
40+
new file mode 100644
41+
index 0000000..3be2928`,
42+
want: []string{
43+
"diff --git a/test.go b/test.go",
44+
"new file mode 100644",
45+
"index 0000000..3be2928",
46+
},
47+
},
48+
}
49+
for _, test := range tests {
50+
t.Run(test.name, func(t *testing.T){
51+
in := bufio.NewReader(strings.NewReader(test.input))
52+
out := []string{}
53+
for {
54+
l, err := readLine(in)
55+
if err == io.EOF {
56+
break
57+
}
58+
if err != nil {
59+
t.Fatal(err)
60+
}
61+
out = append(out, string(l))
62+
}
63+
if(!reflect.DeepEqual(test.want, out)){
64+
t.Errorf("read lines not equal: want %v, got %v", test.want, out)
65+
}
66+
})
67+
}
68+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
diff --git a/_vendor/go/build/syslist_test.go b/_vendor/go/build/syslist_test.go
2+
new file mode 100644
3+
index 0000000..3be2928
4+
--- /dev/null
5+
+++ b/_vendor/go/build/syslist_test.go
6+
@@ -0,0 +1,62 @@
7+
+func TestGoodOSArch(t *testing.T) {
8+
+ for _, test := range tests {
9+
+ if Default.goodOSArchFile(test.name, make(map[string]bool)) != test.result {
10+
+ t.Fatalf("goodOSArchFile(%q) != %v", test.name, test.result)
11+
+ }
12+
+ }
13+
+}
14+
diff --git a/_vendor/go/build/testdata/empty/dummy b/_vendor/go/build/testdata/empty/dummy
15+
new file mode 100644
16+
index 0000000..e69de29
17+
diff --git a/_vendor/go/build/testdata/multi/file.go b/_vendor/go/build/testdata/multi/file.go
18+
new file mode 100644
19+
index 0000000..ee946eb
20+
--- /dev/null
21+
+++ b/_vendor/go/build/testdata/multi/file.go
22+
@@ -0,0 +1,5 @@
23+
+// Test data - not compiled.
24+
+
25+
+package main
26+
+
27+
+func main() {}

0 commit comments

Comments
 (0)