aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Pike <r@golang.org>2014-12-15 15:00:56 +1100
committerAndrew Gerrand <adg@golang.org>2015-02-17 06:48:22 +0000
commitb64f8f8764e975b98e2c5e0d77a424601ed75c29 (patch)
tree1902ec3f9688ac61d1d24753fdcfa9c28752da40
parent15ce943f150d31ef6ba784725321e9032da2e2a1 (diff)
downloadgo-b64f8f8764e975b98e2c5e0d77a424601ed75c29.tar.gz
go-b64f8f8764e975b98e2c5e0d77a424601ed75c29.zip
[release-branch.go1.4] cmd/go: handle \r in input text
Remove carriage returns from //go:generate lines. Carriage returns are the predecessor of BOMs and still live on Windows. Fixes #9264 Change-Id: I637748c74335c696b3630f52f2100061153fcdb4 Reviewed-on: https://go-review.googlesource.com/1564 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Reviewed-by: Andrew Gerrand <adg@golang.org> (cherry picked from commit fde3ab843faaf4ba7a741bfdc192dbb5f2ddf209) Reviewed-on: https://go-review.googlesource.com/4999 Reviewed-by: David Symonds <dsymonds@golang.org>
-rw-r--r--src/cmd/go/generate.go4
-rw-r--r--src/cmd/go/generate_test.go6
2 files changed, 10 insertions, 0 deletions
diff --git a/src/cmd/go/generate.go b/src/cmd/go/generate.go
index 8991fb6af2..3c0af8760b 100644
--- a/src/cmd/go/generate.go
+++ b/src/cmd/go/generate.go
@@ -256,6 +256,10 @@ func (g *Generator) split(line string) []string {
// Parse line, obeying quoted strings.
var words []string
line = line[len("//go:generate ") : len(line)-1] // Drop preamble and final newline.
+ // There may still be a carriage return.
+ if len(line) > 0 && line[len(line)-1] == '\r' {
+ line = line[:len(line)-1]
+ }
// One (possibly quoted) word per iteration.
Words:
for {
diff --git a/src/cmd/go/generate_test.go b/src/cmd/go/generate_test.go
index 660ebabbe8..2ec548630a 100644
--- a/src/cmd/go/generate_test.go
+++ b/src/cmd/go/generate_test.go
@@ -40,9 +40,15 @@ func TestGenerateCommandParse(t *testing.T) {
}
g.setShorthand([]string{"-command", "yacc", "go", "tool", "yacc"})
for _, test := range splitTests {
+ // First with newlines.
got := g.split("//go:generate " + test.in + "\n")
if !reflect.DeepEqual(got, test.out) {
t.Errorf("split(%q): got %q expected %q", test.in, got, test.out)
}
+ // Then with CRLFs, thank you Windows.
+ got = g.split("//go:generate " + test.in + "\r\n")
+ if !reflect.DeepEqual(got, test.out) {
+ t.Errorf("split(%q): got %q expected %q", test.in, got, test.out)
+ }
}
}