]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go: require a module root in 'go list -m' with an unversioned path
authorBryan C. Mills <bcmills@google.com>
Fri, 5 Mar 2021 04:12:22 +0000 (23:12 -0500)
committerBryan C. Mills <bcmills@google.com>
Fri, 5 Mar 2021 16:02:44 +0000 (16:02 +0000)
Fixes #44803

Change-Id: Ie6ee2e3bca1809c91ecedec75d2c6620da914b29
Reviewed-on: https://go-review.googlesource.com/c/go/+/298752
Trust: Bryan C. Mills <bcmills@google.com>
Run-TryBot: Bryan C. Mills <bcmills@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Jay Conrod <jayconrod@google.com>
src/cmd/go/internal/modload/list.go
src/cmd/go/testdata/script/mod_outside.txt
src/cmd/go/testdata/script/mod_retract_versions.txt

index c7ef8c9fb7a5e41c2ccfa0fc6589223ec5d2f478..44803e960baedf4ab88a4885ee2ba6d03c142234 100644 (file)
@@ -72,8 +72,13 @@ func listModules(ctx context.Context, args []string, listVersions, listRetracted
                if search.IsRelativePath(arg) {
                        base.Fatalf("go: cannot use relative path %s to specify module", arg)
                }
-               if !HasModRoot() && (arg == "all" || strings.Contains(arg, "...")) {
-                       base.Fatalf("go: cannot match %q: %v", arg, ErrNoModRoot)
+               if !HasModRoot() {
+                       if arg == "all" || strings.Contains(arg, "...") {
+                               base.Fatalf("go: cannot match %q: %v", arg, ErrNoModRoot)
+                       }
+                       if !listVersions && !strings.Contains(arg, "@") {
+                               base.Fatalf("go: cannot match %q without -versions or an explicit version: %v", arg, ErrNoModRoot)
+                       }
                }
                if i := strings.Index(arg, "@"); i >= 0 {
                        path := arg[:i]
index 9d4c22c77b84f61ee0cba2599765b17115b534bf..7c57db9f7cb6b1a30dc7e894f46013f170a3cf8b 100644 (file)
@@ -61,6 +61,11 @@ stderr 'go: cannot match "all": go.mod file not found in current directory or an
 stderr 'go: cannot match "all": go.mod file not found in current directory or any parent directory; see ''go help modules''$'
 ! stdout 'example.com/version'
 
+# 'go list -m <mods>' should fail if any of the mods lacks an explicit version.
+! go list -m example.com/printversion
+stderr 'go: cannot match "example.com/printversion" without -versions or an explicit version: go.mod file not found in current directory or any parent directory; see ''go help modules''$'
+! stdout 'example.com/version'
+
 # 'go list -m' with wildcards should fail. Wildcards match modules in the
 # build list, so they aren't meaningful outside a module.
 ! go list -m ...
index 961a0a1fa3b19cafcbbcbfbd0dea120860e76b6a..012fa15f420c8678e74448e6ffa1919c8dcce8d9 100644 (file)
@@ -15,3 +15,8 @@ stdout '^example.com/retract/self/pseudo ""$'
 
 go list -m -e -f $FMT --versions example.com/retract/self/pseudo@latest
 stdout '^example.com/retract/self/pseudo: "module example.com/retract/self/pseudo: no matching versions for query \\"latest\\"" "latest"$'
+
+-- go.mod --
+module test
+
+go 1.17