]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go: quote command line arguments in debug output
authorVolker Dobler <dr.volker.dobler@gmail.com>
Fri, 12 Apr 2013 21:04:00 +0000 (14:04 -0700)
committerRob Pike <r@golang.org>
Fri, 12 Apr 2013 21:04:00 +0000 (14:04 -0700)
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

index 2b3513608157c8791cea77f541e3f70871d482b1..9b90728a72c960810cc19a9a967dc469d2beebe5 100644 (file)
@@ -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()