From fb54abe9ce3cbec6d464c238406b05502cb34eeb Mon Sep 17 00:00:00 2001 From: Hiroshi Ioka Date: Tue, 19 Sep 2017 18:18:09 +0900 Subject: all: correct location of go tool In general, there are no guarantee that `go` command exist on $PATH. This CL tries to get `go` command from $GOROOT/bin instead. There are three kinds of code we should handle: For normal code, the CL implements goCmd() or goCmdName(). For unit tests, the CL uses testenv.GoTool() or testenv.GoToolPath(). For integration tests, the CL sets PATH=$GOROOT/bin:$PATH in cmd/dist. Note that make.bash sets PATH=$GOROOT/bin:$PATH in the build process. So this change is only useful when we use toolchain manually. Updates #21875 Change-Id: I963b9f22ea732dd735363ececde4cf94a5db5ca2 Reviewed-on: https://go-review.googlesource.com/64650 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/cmd/api/goapi.go | 14 +++++++++++++- src/cmd/api/goapi_test.go | 3 ++- src/cmd/api/run.go | 15 ++++++++++++++- 3 files changed, 29 insertions(+), 3 deletions(-) (limited to 'src/cmd/api') diff --git a/src/cmd/api/goapi.go b/src/cmd/api/goapi.go index 936f9e5511..8cc78c01ed 100644 --- a/src/cmd/api/goapi.go +++ b/src/cmd/api/goapi.go @@ -27,6 +27,18 @@ import ( "strings" ) +func goCmd() string { + var exeSuffix string + if runtime.GOOS == "windows" { + exeSuffix = ".exe" + } + path := filepath.Join(runtime.GOROOT(), "bin", "go"+exeSuffix) + if _, err := os.Stat(path); err == nil { + return path + } + return "go" +} + // Flags var ( checkFile = flag.String("c", "", "optional comma-separated filename(s) to check API against") @@ -127,7 +139,7 @@ func main() { if flag.NArg() > 0 { pkgNames = flag.Args() } else { - stds, err := exec.Command("go", "list", "std").Output() + stds, err := exec.Command(goCmd(), "list", "std").Output() if err != nil { log.Fatal(err) } diff --git a/src/cmd/api/goapi_test.go b/src/cmd/api/goapi_test.go index 0d00f6a297..3c4e50a21a 100644 --- a/src/cmd/api/goapi_test.go +++ b/src/cmd/api/goapi_test.go @@ -9,6 +9,7 @@ import ( "flag" "fmt" "go/build" + "internal/testenv" "io/ioutil" "os" "os/exec" @@ -163,7 +164,7 @@ func TestSkipInternal(t *testing.T) { } func BenchmarkAll(b *testing.B) { - stds, err := exec.Command("go", "list", "std").Output() + stds, err := exec.Command(testenv.GoToolPath(b), "list", "std").Output() if err != nil { b.Fatal(err) } diff --git a/src/cmd/api/run.go b/src/cmd/api/run.go index 20cddb704b..219776cae4 100644 --- a/src/cmd/api/run.go +++ b/src/cmd/api/run.go @@ -14,8 +14,21 @@ import ( "os" "os/exec" "path/filepath" + "runtime" ) +func goCmd() string { + var exeSuffix string + if runtime.GOOS == "windows" { + exeSuffix = ".exe" + } + path := filepath.Join(runtime.GOROOT(), "bin", "go"+exeSuffix) + if _, err := os.Stat(path); err == nil { + return path + } + return "go" +} + var goroot string func main() { @@ -25,7 +38,7 @@ func main() { log.Fatal("No $GOROOT set.") } - out, err := exec.Command("go", "tool", "api", + out, err := exec.Command(goCmd(), "tool", "api", "-c", file("go1", "go1.1", "go1.2", "go1.3", "go1.4", "go1.5", "go1.6", "go1.7", "go1.8", "go1.9"), "-next", file("next"), "-except", file("except")).CombinedOutput() -- cgit v1.3