diff options
Diffstat (limited to 'src/cmd/go/main.go')
-rw-r--r-- | src/cmd/go/main.go | 26 |
1 files changed, 18 insertions, 8 deletions
diff --git a/src/cmd/go/main.go b/src/cmd/go/main.go index 61e629968..3180dbeed 100644 --- a/src/cmd/go/main.go +++ b/src/cmd/go/main.go @@ -393,16 +393,26 @@ func runOut(dir string, cmdargs ...interface{}) []byte { // child will be faster. func envForDir(dir string) []string { env := os.Environ() - for i, kv := range env { - if strings.HasPrefix(kv, "PWD=") { - env[i] = "PWD=" + dir - return env - } - } // Internally we only use rooted paths, so dir is rooted. // Even if dir is not rooted, no harm done. - env = append(env, "PWD="+dir) - return env + return mergeEnvLists([]string{"PWD=" + dir}, env) +} + +// mergeEnvLists merges the two environment lists such that +// variables with the same name in "in" replace those in "out". +func mergeEnvLists(in, out []string) []string { +NextVar: + for _, inkv := range in { + k := strings.SplitAfterN(inkv, "=", 2)[0] + for i, outkv := range out { + if strings.HasPrefix(outkv, k) { + out[i] = inkv + continue NextVar + } + } + out = append(out, inkv) + } + return out } // matchPattern(pattern)(name) reports whether |