From fa5dbd06e57475a6b788ebf0468c132ec9cd77fc Mon Sep 17 00:00:00 2001 From: Leonardo Comelli Date: Tue, 19 Mar 2019 03:53:04 +0000 Subject: [PATCH] cmd: ignore the directory named go.mod The existing implementation does not check in all cases whether go.mod is a regular file. Fixes #30788 Change-Id: I6d140545c3cfada651612efd5bee2fbdcb747ca7 GitHub-Last-Rev: 4a9b251e378d9d7cc8768d395c360d3542fc9bc6 GitHub-Pull-Request: golang/go#30830 Reviewed-on: https://go-review.googlesource.com/c/go/+/167393 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Bryan C. Mills --- src/cmd/go/internal/modload/import.go | 4 ++-- src/cmd/go/internal/modload/search.go | 2 +- src/cmd/go/internal/search/search.go | 2 +- src/cmd/go/testdata/script/mod_dir.txt | 20 ++++++++++++++++++++ 4 files changed, 24 insertions(+), 4 deletions(-) create mode 100644 src/cmd/go/testdata/script/mod_dir.txt diff --git a/src/cmd/go/internal/modload/import.go b/src/cmd/go/internal/modload/import.go index db3e1a9e5b..83ef0e0b4f 100644 --- a/src/cmd/go/internal/modload/import.go +++ b/src/cmd/go/internal/modload/import.go @@ -233,8 +233,8 @@ func dirInModule(path, mpath, mdir string, isLocal bool) (dir string, haveGoFile if isLocal { for d := dir; d != mdir && len(d) > len(mdir); { haveGoMod := haveGoModCache.Do(d, func() interface{} { - _, err := os.Stat(filepath.Join(d, "go.mod")) - return err == nil + fi, err := os.Stat(filepath.Join(d, "go.mod")) + return err == nil && !fi.IsDir() }).(bool) if haveGoMod { diff --git a/src/cmd/go/internal/modload/search.go b/src/cmd/go/internal/modload/search.go index 753b3be6de..3af39747c6 100644 --- a/src/cmd/go/internal/modload/search.go +++ b/src/cmd/go/internal/modload/search.go @@ -76,7 +76,7 @@ func matchPackages(pattern string, tags map[string]bool, useStd bool, modules [] } // Stop at module boundaries. if path != root { - if _, err := os.Stat(filepath.Join(path, "go.mod")); err == nil { + if fi, err := os.Stat(filepath.Join(path, "go.mod")); err == nil && !fi.IsDir() { return filepath.SkipDir } } diff --git a/src/cmd/go/internal/search/search.go b/src/cmd/go/internal/search/search.go index 0ca60e7349..20e8f0ad1e 100644 --- a/src/cmd/go/internal/search/search.go +++ b/src/cmd/go/internal/search/search.go @@ -190,7 +190,7 @@ func MatchPackagesInFS(pattern string) *Match { if !top && cfg.ModulesEnabled { // Ignore other modules found in subdirectories. - if _, err := os.Stat(filepath.Join(path, "go.mod")); err == nil { + if fi, err := os.Stat(filepath.Join(path, "go.mod")); err == nil && !fi.IsDir() { return filepath.SkipDir } } diff --git a/src/cmd/go/testdata/script/mod_dir.txt b/src/cmd/go/testdata/script/mod_dir.txt new file mode 100644 index 0000000000..05548f6366 --- /dev/null +++ b/src/cmd/go/testdata/script/mod_dir.txt @@ -0,0 +1,20 @@ +# The directory named go.mod should be ignored + +env GO111MODULE=on + +cd $WORK/sub + +go list . +stdout 'x/sub' + +mkdir go.mod +exists go.mod + +go list . +stdout 'x/sub' + +-- $WORK/go.mod -- +module x + +-- $WORK/sub/x.go -- +package x \ No newline at end of file -- 2.50.0