Skip to content

Commit 0b8bc7c

Browse files
alexbrainmanrsc
authored andcommitted
cmd/go: handle paths like \x.go on windows
Fixes #8130. LGTM=rsc R=golang-codereviews, rsc CC=golang-codereviews https://golang.org/cl/143200043
1 parent df781cc commit 0b8bc7c

File tree

2 files changed

+62
-2
lines changed

2 files changed

+62
-2
lines changed

Diff for: src/cmd/go/build.go

+7-2
Original file line numberDiff line numberDiff line change
@@ -505,8 +505,13 @@ func goFilesPackage(gofiles []string) *Package {
505505
}
506506
ctxt.ReadDir = func(string) ([]os.FileInfo, error) { return dirent, nil }
507507

508-
if !filepath.IsAbs(dir) {
509-
dir = filepath.Join(cwd, dir)
508+
var err error
509+
if dir == "" {
510+
dir = cwd
511+
}
512+
dir, err = filepath.Abs(dir)
513+
if err != nil {
514+
fatalf("%s", err)
510515
}
511516

512517
bp, err := ctxt.ImportDir(dir, 0)

Diff for: src/cmd/go/go_windows_test.go

+55
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
// Copyright 2014 The Go Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style
3+
// license that can be found in the LICENSE file.
4+
5+
package main
6+
7+
import (
8+
"io/ioutil"
9+
"os"
10+
"os/exec"
11+
"path/filepath"
12+
"strings"
13+
"testing"
14+
)
15+
16+
func TestAbsolutePath(t *testing.T) {
17+
tmp, err := ioutil.TempDir("", "TestAbsolutePath")
18+
if err != nil {
19+
t.Fatal(err)
20+
}
21+
defer os.RemoveAll(tmp)
22+
23+
file := filepath.Join(tmp, "a.go")
24+
err = ioutil.WriteFile(file, []byte{}, 0644)
25+
if err != nil {
26+
t.Fatal(err)
27+
}
28+
dir := filepath.Join(tmp, "dir")
29+
err = os.Mkdir(dir, 0777)
30+
if err != nil {
31+
t.Fatal(err)
32+
}
33+
34+
wd, err := os.Getwd()
35+
if err != nil {
36+
t.Fatal(err)
37+
}
38+
defer os.Chdir(wd)
39+
40+
// Chdir so current directory and a.go reside on the same drive.
41+
err = os.Chdir(dir)
42+
if err != nil {
43+
t.Fatal(err)
44+
}
45+
46+
noVolume := file[len(filepath.VolumeName(file)):]
47+
wrongPath := filepath.Join(dir, noVolume)
48+
output, err := exec.Command("go", "build", noVolume).CombinedOutput()
49+
if err == nil {
50+
t.Fatal("build should fail")
51+
}
52+
if strings.Contains(string(output), wrongPath) {
53+
t.Fatalf("wrong output found: %v %v", err, string(output))
54+
}
55+
}

0 commit comments

Comments
 (0)