mirror of
https://github.com/golang/go
synced 2024-11-16 19:54:55 -07:00
cmd/go: avoid setting variables for '/' and ':' in TestScript subprocess environments
Also simplify platform-dependent handling of the PATH variable, to make it more like the existing platform-dependent handling for HOME and TMPDIR. Fixes #53671. Change-Id: Ica2665d3f61988c66fb6982b9feb61ca48eced79 Reviewed-on: https://go-review.googlesource.com/c/go/+/416554 Reviewed-by: Ian Lance Taylor <iant@google.com> Run-TryBot: Bryan Mills <bcmills@google.com> TryBot-Result: Gopher Robot <gobot@golang.org>
This commit is contained in:
parent
180bcad33d
commit
5c1a13e7a4
@ -1363,6 +1363,15 @@ func tempEnvName() string {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func pathEnvName() string {
|
||||||
|
switch runtime.GOOS {
|
||||||
|
case "plan9":
|
||||||
|
return "path"
|
||||||
|
default:
|
||||||
|
return "PATH"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestDefaultGOPATH(t *testing.T) {
|
func TestDefaultGOPATH(t *testing.T) {
|
||||||
tg := testgo(t)
|
tg := testgo(t)
|
||||||
defer tg.cleanup()
|
defer tg.cleanup()
|
||||||
|
@ -163,7 +163,7 @@ func (ts *testScript) setup() {
|
|||||||
ts.cd = filepath.Join(ts.workdir, "gopath/src")
|
ts.cd = filepath.Join(ts.workdir, "gopath/src")
|
||||||
ts.env = []string{
|
ts.env = []string{
|
||||||
"WORK=" + ts.workdir, // must be first for ts.abbrev
|
"WORK=" + ts.workdir, // must be first for ts.abbrev
|
||||||
"PATH=" + testBin + string(filepath.ListSeparator) + os.Getenv("PATH"),
|
pathEnvName() + "=" + testBin + string(filepath.ListSeparator) + os.Getenv(pathEnvName()),
|
||||||
homeEnvName() + "=/no-home",
|
homeEnvName() + "=/no-home",
|
||||||
"CCACHE_DISABLE=1", // ccache breaks with non-existent HOME
|
"CCACHE_DISABLE=1", // ccache breaks with non-existent HOME
|
||||||
"GOARCH=" + runtime.GOARCH,
|
"GOARCH=" + runtime.GOARCH,
|
||||||
@ -187,8 +187,6 @@ func (ts *testScript) setup() {
|
|||||||
tempEnvName() + "=" + filepath.Join(ts.workdir, "tmp"),
|
tempEnvName() + "=" + filepath.Join(ts.workdir, "tmp"),
|
||||||
"devnull=" + os.DevNull,
|
"devnull=" + os.DevNull,
|
||||||
"goversion=" + goVersion(ts),
|
"goversion=" + goVersion(ts),
|
||||||
":=" + string(os.PathListSeparator),
|
|
||||||
"/=" + string(os.PathSeparator),
|
|
||||||
"CMDGO_TEST_RUN_MAIN=true",
|
"CMDGO_TEST_RUN_MAIN=true",
|
||||||
}
|
}
|
||||||
if testenv.Builder() != "" || os.Getenv("GIT_TRACE_CURL") == "1" {
|
if testenv.Builder() != "" || os.Getenv("GIT_TRACE_CURL") == "1" {
|
||||||
@ -203,10 +201,6 @@ func (ts *testScript) setup() {
|
|||||||
ts.env = append(ts.env, "TESTGONETWORK=panic", "TESTGOVCS=panic")
|
ts.env = append(ts.env, "TESTGONETWORK=panic", "TESTGOVCS=panic")
|
||||||
}
|
}
|
||||||
|
|
||||||
if runtime.GOOS == "plan9" {
|
|
||||||
ts.env = append(ts.env, "path="+testBin+string(filepath.ListSeparator)+os.Getenv("path"))
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, key := range extraEnvKeys {
|
for _, key := range extraEnvKeys {
|
||||||
if val := os.Getenv(key); val != "" {
|
if val := os.Getenv(key); val != "" {
|
||||||
ts.env = append(ts.env, key+"="+val)
|
ts.env = append(ts.env, key+"="+val)
|
||||||
@ -219,6 +213,10 @@ func (ts *testScript) setup() {
|
|||||||
ts.envMap[kv[:i]] = kv[i+1:]
|
ts.envMap[kv[:i]] = kv[i+1:]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Add entries for ${:} and ${/} to make it easier to write platform-independent
|
||||||
|
// environment variables.
|
||||||
|
ts.envMap["/"] = string(os.PathSeparator)
|
||||||
|
ts.envMap[":"] = string(os.PathListSeparator)
|
||||||
|
|
||||||
fmt.Fprintf(&ts.log, "# (%s)\n", time.Now().UTC().Format(time.RFC3339))
|
fmt.Fprintf(&ts.log, "# (%s)\n", time.Now().UTC().Format(time.RFC3339))
|
||||||
ts.mark = ts.log.Len()
|
ts.mark = ts.log.Len()
|
||||||
@ -1264,12 +1262,7 @@ func (ts *testScript) lookPath(command string) (string, error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pathName := "PATH"
|
for _, dir := range strings.Split(ts.envMap[pathEnvName()], string(filepath.ListSeparator)) {
|
||||||
if runtime.GOOS == "plan9" {
|
|
||||||
pathName = "path"
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, dir := range strings.Split(ts.envMap[pathName], string(filepath.ListSeparator)) {
|
|
||||||
if searchExt {
|
if searchExt {
|
||||||
ents, err := os.ReadDir(dir)
|
ents, err := os.ReadDir(dir)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
17
src/cmd/go/testdata/script/README
vendored
17
src/cmd/go/testdata/script/README
vendored
@ -41,12 +41,19 @@ Scripts also have access to these other environment variables:
|
|||||||
GODEBUG=<actual GODEBUG>
|
GODEBUG=<actual GODEBUG>
|
||||||
devnull=<value of os.DevNull>
|
devnull=<value of os.DevNull>
|
||||||
goversion=<current Go version; for example, 1.12>
|
goversion=<current Go version; for example, 1.12>
|
||||||
:=<OS-specific path list separator>
|
|
||||||
|
|
||||||
The scripts' supporting files are unpacked relative to $GOPATH/src (aka $WORK/gopath/src)
|
On Plan 9, the variables $path and $home are set instead of $PATH and $HOME.
|
||||||
and then the script begins execution in that directory as well. Thus the example above runs
|
On Windows, the variables $USERPROFILE and $TMP are set instead of
|
||||||
in $WORK/gopath/src with GOPATH=$WORK/gopath and $WORK/gopath/src/hello.go
|
$HOME and $TMPDIR.
|
||||||
containing the listed contents.
|
|
||||||
|
In addition, variables named ':' and '/' are expanded within script arguments
|
||||||
|
(expanding to the value of os.PathListSeparator and os.PathSeparator
|
||||||
|
respectively) but are not inherited in subprocess environments.
|
||||||
|
|
||||||
|
The scripts' supporting files are unpacked relative to $GOPATH/src
|
||||||
|
(aka $WORK/gopath/src) and then the script begins execution in that directory as
|
||||||
|
well. Thus the example above runs in $WORK/gopath/src with GOPATH=$WORK/gopath
|
||||||
|
and $WORK/gopath/src/hello.go containing the listed contents.
|
||||||
|
|
||||||
The lines at the top of the script are a sequence of commands to be executed
|
The lines at the top of the script are a sequence of commands to be executed
|
||||||
by a tiny script engine in ../../script_test.go (not the system shell).
|
by a tiny script engine in ../../script_test.go (not the system shell).
|
||||||
|
Loading…
Reference in New Issue
Block a user