From ce64f7365ff814087fc843bcaa8267e236692939 Mon Sep 17 00:00:00 2001 From: Volker Dobler Date: Fri, 12 Apr 2013 14:04:00 -0700 Subject: [PATCH] cmd/go: quote command line arguments in debug output Debug output from go test -x may contain empty arguments. This CL quotes arguments if needed. E.g. the output of go test -x is now .../6g -o ./_go_.6 -p testmain -complete -D "" -I . -I $WORK ./_testmain.go which is easier to grasp. R=golang-dev, bradfitz, minux.ma, r CC=golang-dev https://golang.org/cl/8633043 --- src/cmd/go/build.go | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/cmd/go/build.go b/src/cmd/go/build.go index 2b35136081..9b90728a72 100644 --- a/src/cmd/go/build.go +++ b/src/cmd/go/build.go @@ -1237,7 +1237,7 @@ func (b *builder) processOutput(out []byte) string { func (b *builder) runOut(dir string, desc string, env []string, cmdargs ...interface{}) ([]byte, error) { cmdline := stringList(cmdargs...) if buildN || buildX { - b.showcmd(dir, "%s", strings.Join(cmdline, " ")) + b.showcmd(dir, "%s", joinUnambiguously(cmdline)) if buildN { return nil, nil } @@ -1304,6 +1304,24 @@ func (b *builder) runOut(dir string, desc string, env []string, cmdargs ...inter } } +// joinUnambiguously prints the slice, quoting where necessary to make the +// output unambiguous. +func joinUnambiguously(a []string) string { + var buf bytes.Buffer + for i, s := range a { + if i > 0 { + buf.WriteByte(' ') + } + q := strconv.Quote(s) + if s == "" || strings.Contains(s, " ") || len(q) > len(s)+2 { + buf.WriteString(q) + } else { + buf.WriteString(s) + } + } + return buf.String() +} + // mkdir makes the named directory. func (b *builder) mkdir(dir string) error { b.exec.Lock()