From fde3ab843faaf4ba7a741bfdc192dbb5f2ddf209 Mon Sep 17 00:00:00 2001 From: Rob Pike Date: Mon, 15 Dec 2014 15:00:56 +1100 Subject: [PATCH] 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 Reviewed-by: Andrew Gerrand --- src/cmd/go/generate.go | 4 ++++ src/cmd/go/generate_test.go | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/src/cmd/go/generate.go b/src/cmd/go/generate.go index baf4d2b55c1..8c1e3ee230a 100644 --- a/src/cmd/go/generate.go +++ b/src/cmd/go/generate.go @@ -255,6 +255,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 660ebabbe84..2ec548630ac 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) + } } }