go/packages: initialize config.Env with os.Environ when unset

This makes Load use the value of GOPACKAGESDRIVER in the current
process's environment if the loader's environment wasn't explicitly
set.

Note that if GOPACKAGESDRIVER is not set, we'll still search PATH in
the current process, regardless of whether PATH is set in the loader's
environment. This has not changed.

Change-Id: I3081a6cb0876a21ccd4d87b4b8d082aa47911b75
Reviewed-on: https://go-review.googlesource.com/131016
Reviewed-by: Michael Matloob <matloob@golang.org>
Reviewed-by: Alan Donovan <adonovan@google.com>
This commit is contained in:
Jay Conrod 2018-08-23 10:47:20 -04:00
parent 0bd7993ac0
commit ff6c8c104a
2 changed files with 85 additions and 0 deletions

View File

@ -365,6 +365,9 @@ func newLoader(cfg *Config) *loader {
if cfg != nil {
ld.Config = *cfg
}
if ld.Config.Env == nil {
ld.Config.Env = os.Environ()
}
if ld.Context == nil {
ld.Context = context.Background()
}

View File

@ -1319,6 +1319,88 @@ func TestJSON(t *testing.T) {
}
}
func TestConfigDefaultEnv(t *testing.T) {
if runtime.GOOS == "windows" {
// TODO(jayconrod): write an equivalent batch script for windows.
// Hint: "type" can be used to read a file to stdout.
t.Skip("test requires sh")
}
tmp, cleanup := makeTree(t, map[string]string{
"bin/gopackagesdriver": `#!/bin/sh
cat - <<'EOF'
{
"Roots": ["gopackagesdriver"],
"Packages": [{"ID": "gopackagesdriver", "Name": "gopackagesdriver"}]
}
EOF
`,
"src/golist/golist.go": "package golist",
})
defer cleanup()
if err := os.Chmod(filepath.Join(tmp, "bin", "gopackagesdriver"), 0755); err != nil {
t.Fatal(err)
}
path, ok := os.LookupEnv("PATH")
var pathWithDriver string
if ok {
pathWithDriver = filepath.Join(tmp, "bin") + string(os.PathListSeparator) + path
} else {
pathWithDriver = filepath.Join(tmp, "bin")
}
for _, test := range []struct {
desc string
env []string
wantIDs string
}{
{
desc: "driver_off",
env: []string{"PATH", pathWithDriver, "GOPATH", tmp, "GOPACKAGESDRIVER", "off"},
wantIDs: "[golist]",
}, {
desc: "driver_unset",
env: []string{"PATH", pathWithDriver, "GOPATH", "", "GOPACKAGESDRIVER", ""},
wantIDs: "[gopackagesdriver]",
}, {
desc: "driver_set",
env: []string{"GOPACKAGESDRIVER", filepath.Join(tmp, "bin", "gopackagesdriver")},
wantIDs: "[gopackagesdriver]",
},
} {
t.Run(test.desc, func(t *testing.T) {
for i := 0; i < len(test.env); i += 2 {
key, value := test.env[i], test.env[i+1]
old, ok := os.LookupEnv(key)
if value == "" {
os.Unsetenv(key)
} else {
os.Setenv(key, value)
}
if ok {
defer os.Setenv(key, old)
} else {
defer os.Unsetenv(key)
}
}
pkgs, err := packages.Load(nil, "golist")
if err != nil {
t.Fatal(err)
}
gotIds := make([]string, len(pkgs))
for i, pkg := range pkgs {
gotIds[i] = pkg.ID
}
if fmt.Sprint(pkgs) != test.wantIDs {
t.Errorf("got %v; want %v", gotIds, test.wantIDs)
}
})
}
}
func errorMessages(errors []error) []string {
var msgs []string
for _, err := range errors {