]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go: handle paths like \x.go on windows
authorAlex Brainman <alex.brainman@gmail.com>
Fri, 26 Sep 2014 18:36:49 +0000 (14:36 -0400)
committerRuss Cox <rsc@golang.org>
Fri, 26 Sep 2014 18:36:49 +0000 (14:36 -0400)
Fixes #8130.

LGTM=rsc
R=golang-codereviews, rsc
CC=golang-codereviews
https://golang.org/cl/143200043

src/cmd/go/build.go
src/cmd/go/go_windows_test.go [new file with mode: 0644]

index e2e17fd0367f5afc9181ede096da4482044e7632..23ad765ba7580fd9856a8d95db3b6feb34398f38 100644 (file)
@@ -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 (file)
index 0000000..53d695c
--- /dev/null
@@ -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))
+       }
+}