cmd/go/internal/list: implement and test list -m -e for plain arguments
We were being lazy treating arguments like "foo" as a pattern.
That produced the weird output:
warning: pattern "foo" matched no module dependencies
Instead, non-pattern mismatches as actual errors, making
them available to template patterns and also making the list
command fail for bad module names.
Inspired by golang/go#24149, which is already fixed by
the new loader. Added a test for that case too.
Fixes golang/go#24149.
Change-Id: I4f4b24d44623d9604f365ec2247a99129c35a507
Reviewed-on: https://go-review.googlesource.com/122402
Reviewed-by: Bryan C. Mills <bcmills@google.com>
diff --git a/vendor/cmd/go/internal/list/list.go b/vendor/cmd/go/internal/list/list.go
index 727009c..565217d 100644
--- a/vendor/cmd/go/internal/list/list.go
+++ b/vendor/cmd/go/internal/list/list.go
@@ -374,9 +374,10 @@
if !*listE {
for _, m := range mods {
if m.Error != nil {
- base.Fatalf("go list -m %s: %v", m.Path, m.Error.Err)
+ base.Errorf("go list -m %s: %v", m.Path, m.Error.Err)
}
}
+ base.ExitIfErrors()
}
for _, m := range mods {
do(m)
diff --git a/vendor/cmd/go/internal/modload/list.go b/vendor/cmd/go/internal/modload/list.go
index 27d9667..54db550 100644
--- a/vendor/cmd/go/internal/modload/list.go
+++ b/vendor/cmd/go/internal/modload/list.go
@@ -73,10 +73,14 @@
// Module path or pattern.
var match func(string) bool
+ var literal bool
if arg == "all" {
match = func(string) bool { return true }
- } else {
+ } else if strings.Contains(arg, "...") {
match = search.MatchPattern(arg)
+ } else {
+ match = func(p string) bool { return arg == p }
+ literal = true
}
matched := false
for i, m := range buildList {
@@ -89,7 +93,16 @@
}
}
if !matched {
- fmt.Fprintf(os.Stderr, "warning: pattern %q matched no module dependencies\n", arg)
+ if literal {
+ mods = append(mods, &modinfo.ModulePublic{
+ Path: arg,
+ Error: &modinfo.ModuleError{
+ Err: fmt.Sprintf("module %q is not a known dependency", arg),
+ },
+ })
+ } else {
+ fmt.Fprintf(os.Stderr, "warning: pattern %q matched no module dependencies\n", arg)
+ }
}
}
diff --git a/vendor/cmd/go/mod_test.go b/vendor/cmd/go/mod_test.go
index 7883452..e723d4e 100644
--- a/vendor/cmd/go/mod_test.go
+++ b/vendor/cmd/go/mod_test.go
@@ -865,8 +865,24 @@
tg.run("list", "-m", "-f={{.Dir}}", "rsc.io/quote") // now module list should find it too
tg.grepStdout(`mod[\\/]rsc.io[\\/]quote@v1.2.0`, "expected cached copy of code")
- tg.run("list", "std")
+ // check that list std works; also check that rsc.io/quote/buggy is a listable package
+ tg.run("list", "std", "rsc.io/quote/buggy")
tg.grepStdout("^math/big", "expected standard library")
+
+ tg.run("list", "-m", "-e", "-f={{.Path}} {{.Error.Err}}", "nonexist", "rsc.io/quote/buggy")
+ tg.grepStdout(`^nonexist module "nonexist" is not a known dependency`, "expected error via template")
+ tg.grepStdout(`^rsc.io/quote/buggy module "rsc.io/quote/buggy" is not a known dependency`, "expected error via template")
+
+ tg.runFail("list", "-m", "nonexist", "rsc.io/quote/buggy")
+ tg.grepStderr(`go list -m nonexist: module "nonexist" is not a known dependency`, "expected error on stderr")
+ tg.grepStderr(`go list -m rsc.io/quote/buggy: module "rsc.io/quote/buggy" is not a known dependency`, "expected error on stderr")
+
+ // Check that module loader does not interfere with list -e (golang.org/issue/24149).
+ tg.run("list", "-e", "-f={{.ImportPath}} {{.Error.Err}}", "database")
+ tg.grepStdout(`^database no Go files in `, "expected error via template")
+ tg.runFail("list", "database")
+ tg.grepStderr(`package database: no Go files`, "expected error on stderr")
+
}
func TestModInitLegacy(t *testing.T) {