diff --git a/common/os.go b/common/os.go index 8af6cd22e4f..6b591ce59a6 100644 --- a/common/os.go +++ b/common/os.go @@ -13,11 +13,15 @@ import ( "syscall" ) -var ( - GoPath = gopath() -) +var gopath string + +// GoPath returns GOPATH env variable value. If it is not set, this function +// will try to call `go env GOPATH` subcommand. +func GoPath() string { + if gopath != "" { + return gopath + } -func gopath() string { path := os.Getenv("GOPATH") if len(path) == 0 { goCmd := exec.Command("go", "env", "GOPATH") @@ -27,6 +31,7 @@ func gopath() string { } path = string(out) } + gopath = path return path } diff --git a/common/os_test.go b/common/os_test.go index 168eb438cb5..126723aa606 100644 --- a/common/os_test.go +++ b/common/os_test.go @@ -39,14 +39,31 @@ func TestGoPath(t *testing.T) { if err != nil { t.Fatal(err) } - path = gopath() + path = GoPath() if path != "~/testgopath" { - t.Fatalf("gopath should return GOPATH env var if set, got %v", path) + t.Fatalf("should get GOPATH env var value, got %v", path) } os.Unsetenv("GOPATH") - path = gopath() - if path == "~/testgopath" || path == "" { - t.Fatalf("gopath should return go env GOPATH result if env var does not exist, got %v", path) + path = GoPath() + if path != "~/testgopath" { + t.Fatalf("subsequent calls should return the same value, got %v", path) + } +} + +func TestGoPathWithoutEnvVar(t *testing.T) { + // restore original gopath upon exit + path := os.Getenv("GOPATH") + defer func() { + _ = os.Setenv("GOPATH", path) + }() + + os.Unsetenv("GOPATH") + // reset cache + gopath = "" + + path = GoPath() + if path == "" || path == "~/testgopath" { + t.Fatalf("should get nonempty result of calling go env GOPATH, got %v", path) } }