Commit 68395a66 authored by Jay Conrod's avatar Jay Conrod

cmd/go: forbid module pattern 'all' when outside a module

Also, in cmd/doc, avoid calling 'go list -m all' when in module mode
outside a module since it's now an error.

Fixes #32027

Change-Id: I7224c7fdf7e950bce6c058ab2a5837c27ba3b899
Reviewed-on: https://go-review.googlesource.com/c/go/+/200297
Run-TryBot: Jay Conrod <jayconrod@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarBryan C. Mills <bcmills@google.com>
parent 46b75578
...@@ -162,7 +162,15 @@ func findCodeRoots() []Dir { ...@@ -162,7 +162,15 @@ func findCodeRoots() []Dir {
// Check for use of modules by 'go env GOMOD', // Check for use of modules by 'go env GOMOD',
// which reports a go.mod file path if modules are enabled. // which reports a go.mod file path if modules are enabled.
stdout, _ := exec.Command("go", "env", "GOMOD").Output() stdout, _ := exec.Command("go", "env", "GOMOD").Output()
usingModules = len(bytes.TrimSpace(stdout)) > 0 gomod := string(bytes.TrimSpace(stdout))
usingModules = len(gomod) > 0
if gomod == os.DevNull {
// Modules are enabled, but the working directory is outside any module.
// We can still access std, cmd, and packages specified as source files
// on the command line, but there are no module roots.
// Avoid 'go list -m all' below, since it will not work.
return list
}
} }
if !usingModules { if !usingModules {
......
...@@ -358,6 +358,10 @@ func runGet(cmd *base.Command, args []string) { ...@@ -358,6 +358,10 @@ func runGet(cmd *base.Command, args []string) {
// upgrade golang.org/x/tools. // upgrade golang.org/x/tools.
case path == "all": case path == "all":
// If there is no main module, "all" is not meaningful.
if !modload.HasModRoot() {
base.Errorf(`go get %s: cannot match "all": working directory is not part of a module`, arg)
}
// Don't query modules until we load packages. We'll automatically // Don't query modules until we load packages. We'll automatically
// look up any missing modules. // look up any missing modules.
......
...@@ -55,6 +55,9 @@ func listModules(args []string, listVersions bool) []*modinfo.ModulePublic { ...@@ -55,6 +55,9 @@ func listModules(args []string, listVersions bool) []*modinfo.ModulePublic {
if search.IsRelativePath(arg) { if search.IsRelativePath(arg) {
base.Fatalf("go: cannot use relative path %s to specify module", arg) base.Fatalf("go: cannot use relative path %s to specify module", arg)
} }
if !HasModRoot() && arg == "all" {
base.Fatalf(`go: cannot match "all": working directory is not part of a module`)
}
if i := strings.Index(arg, "@"); i >= 0 { if i := strings.Index(arg, "@"); i >= 0 {
path := arg[:i] path := arg[:i]
vers := arg[i+1:] vers := arg[i+1:]
......
...@@ -25,8 +25,6 @@ stderr 'cannot find main module' ...@@ -25,8 +25,6 @@ stderr 'cannot find main module'
go list all go list all
! stdout . ! stdout .
stderr 'warning: "all" matched no packages' stderr 'warning: "all" matched no packages'
go list -m all
stderr 'warning: pattern "all" matched no module dependencies'
# 'go list' on standard-library packages should work, since they do not depend # 'go list' on standard-library packages should work, since they do not depend
# on the contents of any module. # on the contents of any module.
...@@ -49,10 +47,13 @@ stdout 'example.com/version v1.1.0' ...@@ -49,10 +47,13 @@ stdout 'example.com/version v1.1.0'
go list -m -versions example.com/version go list -m -versions example.com/version
stdout 'v1.0.0\s+v1.0.1\s+v1.1.0' stdout 'v1.0.0\s+v1.0.1\s+v1.1.0'
# 'go list -m <mods> all' does not include the dependencies of <mods> in the computation of 'all'. # 'go list -m all' should fail. "all" is not meaningful outside of a module.
go list -m example.com/printversion@v1.0.0 all ! go list -m all
stdout 'example.com/printversion v1.0.0' stderr 'go: cannot match "all": working directory is not part of a module'
stderr 'warning: pattern "all" matched no module dependencies'
# 'go list -m <mods> all' should also fail.
! go list -m example.com/printversion@v1.0.0 all
stderr 'go: cannot match "all": working directory is not part of a module'
! stdout 'example.com/version' ! stdout 'example.com/version'
...@@ -87,6 +88,10 @@ go mod download example.com/printversion@v1.0.0 ...@@ -87,6 +88,10 @@ go mod download example.com/printversion@v1.0.0
exists $GOPATH/pkg/mod/cache/download/example.com/printversion/@v/v1.0.0.zip exists $GOPATH/pkg/mod/cache/download/example.com/printversion/@v/v1.0.0.zip
! exists $GOPATH/pkg/mod/cache/download/example.com/version/@v/v1.0.0.zip ! exists $GOPATH/pkg/mod/cache/download/example.com/version/@v/v1.0.0.zip
# 'go mod download all' should fail. "all" is not meaningful outside of a module.
! go mod download all
stderr 'go: cannot match "all": working directory is not part of a module'
# 'go mod vendor' should fail: it starts by clearing the existing vendor # 'go mod vendor' should fail: it starts by clearing the existing vendor
# directory, and we don't know where that is. # directory, and we don't know where that is.
! go mod vendor ! go mod vendor
...@@ -109,9 +114,8 @@ stderr 'cannot find main module' ...@@ -109,9 +114,8 @@ stderr 'cannot find main module'
# 'go get -u all' upgrades the transitive import graph of the main module, # 'go get -u all' upgrades the transitive import graph of the main module,
# which is empty. # which is empty.
go get -u all ! go get -u all
! stdout . stderr 'go get all: cannot match "all": working directory is not part of a module'
stderr 'warning: "all" matched no packages'
# 'go get' should check the proposed module graph for consistency, # 'go get' should check the proposed module graph for consistency,
# even though we won't write it anywhere. # even though we won't write it anywhere.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment