cmd/go/internal/search: ignore submodules in ./... patterns
CL 117257 handled path patterns like ... or x/...
but not file system patterns like ./... or ./x/... .
Fixes golang/go#24605 again.
Change-Id: Ia5337a3490dfb3626b0af35199ae732fca0ed476
Reviewed-on: https://go-review.googlesource.com/122397
Reviewed-by: Bryan C. Mills <bcmills@google.com>
diff --git a/vendor/cmd/go/internal/cfg/cfg.go b/vendor/cmd/go/internal/cfg/cfg.go
index f4817b8..26db867 100644
--- a/vendor/cmd/go/internal/cfg/cfg.go
+++ b/vendor/cmd/go/internal/cfg/cfg.go
@@ -69,6 +69,11 @@
Goos = BuildContext.GOOS
ExeSuffix string
Gopath = filepath.SplitList(BuildContext.GOPATH)
+
+ // ModulesEnabled specifies whether the go command is running
+ // in module-aware mode (as opposed to GOPATH mode).
+ // It is equal to modload.Enabled, but not all packages can import modload.
+ ModulesEnabled bool
)
func init() {
diff --git a/vendor/cmd/go/internal/get/get.go b/vendor/cmd/go/internal/get/get.go
index 43aade2..76ba238 100644
--- a/vendor/cmd/go/internal/get/get.go
+++ b/vendor/cmd/go/internal/get/get.go
@@ -114,7 +114,7 @@
}
func runGet(cmd *base.Command, args []string) {
- if load.ModLookup != nil {
+ if cfg.ModulesEnabled {
// Should not happen: main.go should install the separate module-enabled get code.
base.Fatalf("go get: modules not implemented")
}
diff --git a/vendor/cmd/go/internal/load/pkg.go b/vendor/cmd/go/internal/load/pkg.go
index b57b273..0e5e758 100644
--- a/vendor/cmd/go/internal/load/pkg.go
+++ b/vendor/cmd/go/internal/load/pkg.go
@@ -454,7 +454,7 @@
var modErr error
if isLocal {
importPath = dirToImportPath(filepath.Join(srcDir, path))
- } else if ModLookup != nil {
+ } else if cfg.ModulesEnabled {
parentPath := ""
if parent != nil {
parentPath = parent.ImportPath
@@ -506,7 +506,7 @@
bp.ImportPath = importPath
if cfg.GOBIN != "" {
bp.BinDir = cfg.GOBIN
- } else if ModBinDir != nil {
+ } else if cfg.ModulesEnabled {
bp.BinDir = ModBinDir()
}
if modDir == "" && err == nil && !isLocal && bp.ImportComment != "" && bp.ImportComment != path &&
@@ -596,7 +596,7 @@
// If vendor expansion doesn't trigger, then the path is also subject to
// Go 1.11 module legacy conversion (golang.org/issue/25069).
func ResolveImportPath(parent *Package, path string) (found string) {
- if ModLookup != nil {
+ if cfg.ModulesEnabled {
parentPath := ""
if parent != nil {
parentPath = parent.ImportPath
@@ -1184,7 +1184,7 @@
// Install cross-compiled binaries to subdirectories of bin.
elem = full
}
- if p.Internal.Build.BinDir == "" && ModBinDir != nil {
+ if p.Internal.Build.BinDir == "" && cfg.ModulesEnabled {
p.Internal.Build.BinDir = ModBinDir()
}
if p.Internal.Build.BinDir != "" {
@@ -1438,7 +1438,7 @@
return
}
- if ModPackageModuleInfo != nil {
+ if cfg.ModulesEnabled {
p.Module = ModPackageModuleInfo(p.ImportPath)
if p.Name == "main" {
p.Internal.BuildInfo = ModPackageBuildInfo(p.ImportPath, p.Deps)
@@ -1722,7 +1722,7 @@
if cmdlineMatchers == nil {
SetCmdlinePatterns(search.CleanImportPaths(args))
}
- if ModImportPaths != nil {
+ if cfg.ModulesEnabled {
return ModImportPaths(args)
}
return search.ImportPaths(args)
@@ -1820,7 +1820,7 @@
}
ctxt.ReadDir = func(string) ([]os.FileInfo, error) { return dirent, nil }
- if ModImportFromFiles != nil {
+ if cfg.ModulesEnabled {
ModImportFromFiles(gofiles)
}
@@ -1852,7 +1852,7 @@
}
if cfg.GOBIN != "" {
pkg.Target = filepath.Join(cfg.GOBIN, exe)
- } else if ModBinDir != nil {
+ } else if cfg.ModulesEnabled {
pkg.Target = filepath.Join(ModBinDir(), exe)
}
}
diff --git a/vendor/cmd/go/internal/modload/init.go b/vendor/cmd/go/internal/modload/init.go
index 2b39a0e..5f9e72b 100644
--- a/vendor/cmd/go/internal/modload/init.go
+++ b/vendor/cmd/go/internal/modload/init.go
@@ -174,6 +174,7 @@
base.Fatalf("go: cannot use modules with build cache disabled")
}
+ cfg.ModulesEnabled = true
enabled = true
load.ModBinDir = BinDir
load.ModLookup = Lookup
diff --git a/vendor/cmd/go/internal/search/search.go b/vendor/cmd/go/internal/search/search.go
index 35f469f..0c34009 100644
--- a/vendor/cmd/go/internal/search/search.go
+++ b/vendor/cmd/go/internal/search/search.go
@@ -173,6 +173,7 @@
if err != nil || !fi.IsDir() {
return nil
}
+ top := false
if path == dir {
// filepath.Walk starts at dir and recurses. For the recursive case,
// the path is the result of filepath.Join, which calls filepath.Clean.
@@ -182,6 +183,7 @@
// "cd $GOROOT/src; go list ./io/..." would incorrectly skip the io
// package, because prepending the prefix "./" to the unclean path would
// result in "././io", and match("././io") returns false.
+ top = true
path = filepath.Clean(path)
}
@@ -192,6 +194,13 @@
return filepath.SkipDir
}
+ if !top && cfg.ModulesEnabled {
+ // Ignore other modules found in subdirectories.
+ if _, err := os.Stat(filepath.Join(path, "go.mod")); err == nil {
+ return filepath.SkipDir
+ }
+ }
+
name := prefix + filepath.ToSlash(path)
if !match(name) {
return nil
diff --git a/vendor/cmd/go/internal/work/exec.go b/vendor/cmd/go/internal/work/exec.go
index 6408d61..765247d 100644
--- a/vendor/cmd/go/internal/work/exec.go
+++ b/vendor/cmd/go/internal/work/exec.go
@@ -599,7 +599,7 @@
fmt.Fprintf(&icfg, "packagefile %s=%s\n", p1.ImportPath, a1.built)
}
- if p.Internal.BuildInfo != "" && load.ModInfoProg != nil {
+ if p.Internal.BuildInfo != "" && cfg.ModulesEnabled {
if err := b.writeFile(objdir+"_gomod_.go", load.ModInfoProg(p.Internal.BuildInfo)); err != nil {
return err
}
diff --git a/vendor/cmd/go/mod_test.go b/vendor/cmd/go/mod_test.go
index d5e63ec..fdea873 100644
--- a/vendor/cmd/go/mod_test.go
+++ b/vendor/cmd/go/mod_test.go
@@ -393,12 +393,14 @@
tg.must(ioutil.WriteFile(tg.path("x/y/z/w/w.go"), []byte(`package w`), 0666))
tg.cd(tg.path("x"))
- tg.run("list", "all")
- tg.grepStdout(`^m$`, "expected m")
- tg.grepStdout(`^m/vendor$`, "must see package named vendor")
- tg.grepStdoutNot(`vendor/`, "must not see vendored packages")
- tg.grepStdout(`^m/y$`, "expected m/y")
- tg.grepStdoutNot(`^m/y/z`, "should ignore submodule m/y/z...")
+ for _, pattern := range []string{"all", "m/...", "./..."} {
+ tg.run("list", pattern)
+ tg.grepStdout(`^m$`, "expected m")
+ tg.grepStdout(`^m/vendor$`, "must see package named vendor")
+ tg.grepStdoutNot(`vendor/`, "must not see vendored packages")
+ tg.grepStdout(`^m/y$`, "expected m/y")
+ tg.grepStdoutNot(`^m/y/z`, "should ignore submodule m/y/z...")
+ }
}
func TestModGetVersions(t *testing.T) {