]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go: emit go list error for local non-existant packages
authorJay Conrod <jayconrod@google.com>
Wed, 28 Nov 2018 21:33:23 +0000 (16:33 -0500)
committerJay Conrod <jayconrod@google.com>
Tue, 4 Dec 2018 00:19:55 +0000 (00:19 +0000)
In CL 129061, a check was added for patterns that reference
nonexistent local directories. While this prevented unnecessary
network lookups (fixing #26874), it caused "go list -e" to exit with
an error instead of listing packages with error messages.

This change avoids the network lookup and does not exit for these
kinds of packages. Errors are still reported by
internal/load.LoadImport for packages that don't exist.

Fixes #28023

Change-Id: I0a648269e437aed3a95bfb05461a397264f3793f
Reviewed-on: https://go-review.googlesource.com/c/151800
Run-TryBot: Jay Conrod <jayconrod@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Bryan C. Mills <bcmills@google.com>
src/cmd/go/internal/modload/load.go
src/cmd/go/testdata/script/mod_fs_patterns.txt
src/cmd/go/testdata/script/mod_list_dir.txt

index dd1a370825e730c933425c86766f5ec66dd8d6aa..5bb943dd6decb88f5f24c6c8d59c3614055c9a25 100644 (file)
@@ -90,7 +90,7 @@ func ImportPaths(patterns []string) []*search.Match {
                                // the exact version of a particular module increases during
                                // the loader iterations.
                                m.Pkgs = str.StringList(fsDirs[i])
-                               for i, pkg := range m.Pkgs {
+                               for j, pkg := range m.Pkgs {
                                        dir := pkg
                                        if !filepath.IsAbs(dir) {
                                                dir = filepath.Join(cwd, pkg)
@@ -124,19 +124,15 @@ func ImportPaths(patterns []string) []*search.Match {
                                        }
                                        info, err := os.Stat(dir)
                                        if err != nil || !info.IsDir() {
-                                               // If the directory does not exist,
-                                               // don't turn it into an import path
-                                               // that will trigger a lookup.
-                                               pkg = ""
-                                               if !iterating {
-                                                       if err != nil {
-                                                               base.Errorf("go: no such directory %v", m.Pattern)
-                                                       } else {
-                                                               base.Errorf("go: %s is not a directory", m.Pattern)
-                                                       }
+                                               // If the directory is local but does not exist, don't return it
+                                               // while loader is iterating, since this would trigger a fetch.
+                                               // After loader is done iterating, we still need to return the
+                                               // path, so that "go list -e" produces valid output.
+                                               if iterating {
+                                                       pkg = ""
                                                }
                                        }
-                                       m.Pkgs[i] = pkg
+                                       m.Pkgs[j] = pkg
                                }
 
                        case strings.Contains(m.Pattern, "..."):
index d7d3e0321b53d499fa770a018fc2da67e8b49673..9341a1d08305f83d95a6a89064f5106a59f559b0 100644 (file)
@@ -34,11 +34,11 @@ stderr 'import lookup disabled'
 
 ! go build -mod=readonly ./nonexist
 ! stderr 'import lookup disabled'
-stderr '^go: no such directory ./nonexist'
+stderr 'unknown import path "m/nonexist": cannot find package'
 
 ! go build -mod=readonly ./go.mod
 ! stderr 'import lookup disabled'
-stderr '^go: ./go.mod is not a directory'
+stderr 'unknown import path "m/go.mod": cannot find package'
 
 -- x/go.mod --
 module m
index 800f2775591a895e2a20aa2fb76381ba1e52e613..903651c9d58fd5b4dfb870826cb71753f2c47082 100644 (file)
@@ -10,7 +10,9 @@ stdout ^math$
 go list -f '{{.ImportPath}}' .
 stdout ^x$
 ! go list -f '{{.ImportPath}}' $GOPATH/pkg/mod/rsc.io/quote@v1.5.2
-stderr '^go: no such directory.*quote@v1.5.2'
+stderr 'unknown import path "rsc.io/quote": cannot find package'
+go list -e -f '{{with .Error}}{{.}}{{end}}' $GOPATH/pkg/mod/rsc.io/quote@v1.5.2
+stdout 'unknown import path "rsc.io/quote": cannot find package'
 go mod download rsc.io/quote@v1.5.2
 go list -f '{{.ImportPath}}' $GOPATH/pkg/mod/rsc.io/quote@v1.5.2
 stdout '^rsc.io/quote$'