mirror of
https://github.com/golang/go
synced 2024-09-30 11:18:33 -06:00
cmd/go: referee another vendor vs symlink fight
Avoid crash in the specific case reported in #15201 but also print more useful error message, avoiding slice panic. Fixes #15201. Fixes #16167. Fixes #16566. Change-Id: I66499621e9678a05bc9b12b0da77906cd7027bdd Reviewed-on: https://go-review.googlesource.com/31665 Run-TryBot: Russ Cox <rsc@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Quentin Smith <quentin@golang.org>
This commit is contained in:
parent
0eaa8fe03f
commit
a1813fcb83
@ -1759,6 +1759,27 @@ func TestSymlinksVendor(t *testing.T) {
|
||||
tg.run("install")
|
||||
}
|
||||
|
||||
// Issue 15201.
|
||||
func TestSymlinksVendor15201(t *testing.T) {
|
||||
switch runtime.GOOS {
|
||||
case "plan9", "windows":
|
||||
t.Skipf("skipping symlink test on %s", runtime.GOOS)
|
||||
}
|
||||
|
||||
tg := testgo(t)
|
||||
defer tg.cleanup()
|
||||
|
||||
tg.tempDir("gopath/src/x/y/_vendor/src/x")
|
||||
tg.must(os.Symlink("../../..", tg.path("gopath/src/x/y/_vendor/src/x/y")))
|
||||
tg.tempFile("gopath/src/x/y/w/w.go", "package w\nimport \"x/y/z\"\n")
|
||||
tg.must(os.Symlink("../_vendor/src", tg.path("gopath/src/x/y/w/vendor")))
|
||||
tg.tempFile("gopath/src/x/y/z/z.go", "package z\n")
|
||||
|
||||
tg.setenv("GOPATH", tg.path("gopath/src/x/y/_vendor")+string(filepath.ListSeparator)+tg.path("gopath"))
|
||||
tg.cd(tg.path("gopath/src"))
|
||||
tg.run("list", "./...")
|
||||
}
|
||||
|
||||
func TestSymlinksInternal(t *testing.T) {
|
||||
switch runtime.GOOS {
|
||||
case "plan9", "windows":
|
||||
|
@ -415,13 +415,26 @@ func vendoredImportPath(parent *Package, path string) (found string) {
|
||||
|
||||
dir := filepath.Clean(parent.Dir)
|
||||
root := filepath.Join(parent.Root, "src")
|
||||
if !hasFilePathPrefix(dir, root) {
|
||||
if !hasFilePathPrefix(dir, root) || parent.ImportPath != "command-line-arguments" && filepath.Join(root, parent.ImportPath) != dir {
|
||||
// Look for symlinks before reporting error.
|
||||
dir = expandPath(dir)
|
||||
root = expandPath(root)
|
||||
}
|
||||
if !hasFilePathPrefix(dir, root) || len(dir) <= len(root) || dir[len(root)] != filepath.Separator {
|
||||
fatalf("invalid vendoredImportPath: dir=%q root=%q separator=%q", dir, root, string(filepath.Separator))
|
||||
|
||||
if !hasFilePathPrefix(dir, root) || len(dir) <= len(root) || dir[len(root)] != filepath.Separator || parent.ImportPath != "command-line-arguments" && filepath.Join(root, parent.ImportPath) != dir {
|
||||
fatalf("unexpected directory layout:\n"+
|
||||
" import path: %s\n"+
|
||||
" root: %s\n"+
|
||||
" dir: %s\n"+
|
||||
" expand root: %s\n"+
|
||||
" expand dir: %s\n"+
|
||||
" separator: %s",
|
||||
parent.ImportPath,
|
||||
filepath.Join(parent.Root, "src"),
|
||||
filepath.Clean(parent.Dir),
|
||||
root,
|
||||
dir,
|
||||
string(filepath.Separator))
|
||||
}
|
||||
|
||||
vpath := "vendor/" + path
|
||||
|
Loading…
Reference in New Issue
Block a user