diff options
author | Alex Brainman <alex.brainman@gmail.com> | 2014-09-26 14:36:49 -0400 |
---|---|---|
committer | Alex Brainman <alex.brainman@gmail.com> | 2014-09-26 14:36:49 -0400 |
commit | 70667bf508fb3864fc72bc791d5949ff81d9cc7f (patch) | |
tree | b497445eaca60cc9ca43a7c3440e21d831fdf917 | |
parent | 8756f605b8e890a155eb7bd4046c3f2330dde0d8 (diff) | |
download | go-70667bf508fb3864fc72bc791d5949ff81d9cc7f.tar.gz |
cmd/go: handle paths like \x.go on windows
Fixes issue 8130.
LGTM=rsc
R=golang-codereviews, rsc
CC=golang-codereviews
https://codereview.appspot.com/143200043
Committer: Russ Cox <rsc@golang.org>
-rw-r--r-- | src/cmd/go/build.go | 9 | ||||
-rw-r--r-- | src/cmd/go/go_windows_test.go | 55 |
2 files changed, 62 insertions, 2 deletions
diff --git a/src/cmd/go/build.go b/src/cmd/go/build.go index e2e17fd03..23ad765ba 100644 --- a/src/cmd/go/build.go +++ b/src/cmd/go/build.go @@ -505,8 +505,13 @@ func goFilesPackage(gofiles []string) *Package { } ctxt.ReadDir = func(string) ([]os.FileInfo, error) { return dirent, nil } - if !filepath.IsAbs(dir) { - dir = filepath.Join(cwd, dir) + var err error + if dir == "" { + dir = cwd + } + dir, err = filepath.Abs(dir) + if err != nil { + fatalf("%s", err) } bp, err := ctxt.ImportDir(dir, 0) diff --git a/src/cmd/go/go_windows_test.go b/src/cmd/go/go_windows_test.go new file mode 100644 index 000000000..53d695ccc --- /dev/null +++ b/src/cmd/go/go_windows_test.go @@ -0,0 +1,55 @@ +// Copyright 2014 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 main + +import ( + "io/ioutil" + "os" + "os/exec" + "path/filepath" + "strings" + "testing" +) + +func TestAbsolutePath(t *testing.T) { + tmp, err := ioutil.TempDir("", "TestAbsolutePath") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(tmp) + + file := filepath.Join(tmp, "a.go") + err = ioutil.WriteFile(file, []byte{}, 0644) + if err != nil { + t.Fatal(err) + } + dir := filepath.Join(tmp, "dir") + err = os.Mkdir(dir, 0777) + if err != nil { + t.Fatal(err) + } + + wd, err := os.Getwd() + if err != nil { + t.Fatal(err) + } + defer os.Chdir(wd) + + // Chdir so current directory and a.go reside on the same drive. + err = os.Chdir(dir) + if err != nil { + t.Fatal(err) + } + + noVolume := file[len(filepath.VolumeName(file)):] + wrongPath := filepath.Join(dir, noVolume) + output, err := exec.Command("go", "build", noVolume).CombinedOutput() + if err == nil { + t.Fatal("build should fail") + } + if strings.Contains(string(output), wrongPath) { + t.Fatalf("wrong output found: %v %v", err, string(output)) + } +} |