]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go: ignore stderr from tool version checks
authorRuss Cox <rsc@golang.org>
Sun, 5 Nov 2017 21:31:24 +0000 (16:31 -0500)
committerRuss Cox <rsc@golang.org>
Mon, 6 Nov 2017 20:17:17 +0000 (20:17 +0000)
There are multiple valid reasons a tool might print to stderr.
As long as we get the expected output on stdout, that's fine.

Fixes #22588.

Change-Id: I9c5d32da08288cb26dd575530a8257cd5f375367
Reviewed-on: https://go-review.googlesource.com/76017
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: David Crawshaw <crawshaw@golang.org>
src/cmd/go/go_test.go
src/cmd/go/internal/work/buildid.go

index a264daa710439b0f1d35e671126d25f5c4c9dedc..9ec2e0b0ee8d9dbc6ae8def6c345b0e9d4c715e9 100644 (file)
@@ -4740,6 +4740,21 @@ func TestBuildCache(t *testing.T) {
        tg.grepStderr(`[\\/]link|gccgo`, "did not run linker")
 }
 
+func TestIssue22588(t *testing.T) {
+       // Don't get confused by stderr coming from tools.
+       tg := testgo(t)
+       defer tg.cleanup()
+       tg.parallel()
+
+       if _, err := os.Stat("/usr/bin/time"); err != nil {
+               t.Skip(err)
+       }
+
+       tg.run("list", "-f={{.Stale}}", "runtime")
+       tg.run("list", "-toolexec=/usr/bin/time", "-f={{.Stale}}", "runtime")
+       tg.grepStdout("false", "incorrectly reported runtime as stale")
+}
+
 func TestIssue22531(t *testing.T) {
        if strings.Contains(os.Getenv("GODEBUG"), "gocacheverify") {
                t.Skip("GODEBUG gocacheverify")
index b9e1bab0a3e9b7fe27e64f4f5b4a8fc6c5488cea..d7cc7a263b20b59073227b0fc198796072c4e4cc 100644 (file)
@@ -5,6 +5,7 @@
 package work
 
 import (
+       "bytes"
        "fmt"
        "os"
        "os/exec"
@@ -175,12 +176,14 @@ func (b *Builder) toolID(name string) string {
        cmdline := str.StringList(cfg.BuildToolexec, base.Tool(name), "-V=full")
        cmd := exec.Command(cmdline[0], cmdline[1:]...)
        cmd.Env = base.EnvForDir(cmd.Dir, os.Environ())
-       out, err := cmd.CombinedOutput()
-       if err != nil {
-               base.Fatalf("go tool %s: %v\n%s", name, err, out)
+       var stdout, stderr bytes.Buffer
+       cmd.Stdout = &stdout
+       cmd.Stderr = &stderr
+       if err := cmd.Run(); err != nil {
+               base.Fatalf("go tool %s: %v\n%s%s", name, err, stdout.Bytes(), stderr.Bytes())
        }
 
-       line := string(out)
+       line := stdout.String()
        f := strings.Fields(line)
        if len(f) < 3 || f[0] != name || f[1] != "version" || f[2] == "devel" && !strings.HasPrefix(f[len(f)-1], "buildID=") {
                base.Fatalf("go tool %s -V=full: unexpected output:\n\t%s", name, line)