]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go: handle relative temp dir
authorRuss Cox <rsc@golang.org>
Fri, 13 Jul 2018 19:55:50 +0000 (15:55 -0400)
committerRuss Cox <rsc@golang.org>
Mon, 16 Jul 2018 23:42:54 +0000 (23:42 +0000)
Most programs seem to accept a relative temp dir, as weird as that might be.

Also, the meaning of relative is a little more fluid on Windows:
TMP=\temp is relative (to the current drive) but will work well enough.

Also, Windows GetTempPath automatically converts a relative
%TMP% into an absolute path, so we'd be imposing different
behavior for GOTMPDIR vs TMP.

It seems easier and more consistent to just impose the obvious
meaning than to add an error we can only implement some of
the time.

Originally got here because "cmd/go:" should be"go:" in error message,
but the error message is gone now.

Fixes #23264.

Change-Id: I3c3fb801cbd5e652364f1f62bb3881e9317e3581
Reviewed-on: https://go-review.googlesource.com/123876
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/cmd/go/go_test.go
src/cmd/go/internal/work/action.go

index 6f5e0c86a961a49e0a7e956bca7459765b2f323d..7a15ce325672d35b193aa298ac58ff9529ab9082 100644 (file)
@@ -6390,15 +6390,14 @@ func TestNoRelativeTmpdir(t *testing.T) {
        tg.setenv("GOCACHE", "off")
        tg.setenv("GOPATH", tg.path("."))
        tg.setenv("GOTMPDIR", "tmp")
-       tg.runFail("build", "a")
-       tg.grepStderr("relative tmpdir", "wrong error")
-
-       if runtime.GOOS != "windows" && runtime.GOOS != "plan9" {
-               tg.unsetenv("GOTMPDIR")
-               tg.setenv("TMPDIR", "tmp")
-               tg.runFail("build", "a")
-               tg.grepStderr("relative tmpdir", "wrong error")
-       }
+       tg.run("build", "-work", "a")
+       tg.grepStderr("WORK=[^t]", "work should be absolute path")
+
+       tg.unsetenv("GOTMPDIR")
+       tg.setenv("TMP", "tmp")    // windows
+       tg.setenv("TMPDIR", "tmp") // unix
+       tg.run("build", "-work", "a")
+       tg.grepStderr("WORK=[^t]", "work should be absolute path")
 }
 
 // Issue 24704.
index 8ce68be15d188ecd822578b985b10c2c180675c8..9cbc89f32b82de138615ff5f3db1c3b86b662f34 100644 (file)
@@ -213,7 +213,6 @@ const (
 )
 
 func (b *Builder) Init() {
-       var err error
        b.Print = func(a ...interface{}) (int, error) {
                return fmt.Fprint(os.Stderr, a...)
        }
@@ -225,14 +224,19 @@ func (b *Builder) Init() {
        if cfg.BuildN {
                b.WorkDir = "$WORK"
        } else {
-               b.WorkDir, err = ioutil.TempDir(os.Getenv("GOTMPDIR"), "go-build")
+               tmp, err := ioutil.TempDir(os.Getenv("GOTMPDIR"), "go-build")
                if err != nil {
                        base.Fatalf("%s", err)
                }
-               if !filepath.IsAbs(b.WorkDir) {
-                       os.RemoveAll(b.WorkDir)
-                       base.Fatalf("cmd/go: relative tmpdir not supported")
+               if !filepath.IsAbs(tmp) {
+                       abs, err := filepath.Abs(tmp)
+                       if err != nil {
+                               os.RemoveAll(tmp)
+                               base.Fatalf("go: creating work dir: %v", err)
+                       }
+                       tmp = abs
                }
+               b.WorkDir = tmp
                if cfg.BuildX || cfg.BuildWork {
                        fmt.Fprintf(os.Stderr, "WORK=%s\n", b.WorkDir)
                }