40 lines
1.0 KiB
Go
40 lines
1.0 KiB
Go
|
// Copyright 2013 The Go Authors. All rights reserved.
|
||
|
// Use of this source code is governed by a BSD-style
|
||
|
// license that can be found in the LICENSE file.
|
||
|
|
||
|
package vcs
|
||
|
|
||
|
import (
|
||
|
"os"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
// envForDir returns a copy of the environment
|
||
|
// suitable for running in the given directory.
|
||
|
// The environment is the current process's environment
|
||
|
// but with an updated $PWD, so that an os.Getwd in the
|
||
|
// child will be faster.
|
||
|
func envForDir(dir string) []string {
|
||
|
env := os.Environ()
|
||
|
// Internally we only use rooted paths, so dir is rooted.
|
||
|
// Even if dir is not rooted, no harm done.
|
||
|
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
|
||
|
}
|