]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go: fix errors for commands run outside of modules
authorJay Conrod <jayconrod@google.com>
Thu, 6 Dec 2018 21:18:12 +0000 (16:18 -0500)
committerJay Conrod <jayconrod@google.com>
Mon, 10 Dec 2018 21:47:06 +0000 (21:47 +0000)
Since CL 148517, several commands (including list and get) work when
GO111MODULE=on even when no go.mod file is present. This broke an
assumption made by "fix" and "generate" which caused panics when run
with a list of .go files (whether or not the command was run inside a
module).

This change fixes those assumptions and adds test cases for other
commands run outside modules.

Fixes #29097

Change-Id: I7927559769c5d4617d73eb63f3b17e2f26d8c219
Reviewed-on: https://go-review.googlesource.com/c/153158
Reviewed-by: Bryan C. Mills <bcmills@google.com>
src/cmd/go/internal/fix/fix.go
src/cmd/go/internal/generate/generate.go
src/cmd/go/testdata/script/mod_outside.txt

index aab164148ff88a62424db7818d0584fb675c2daf..4d741df2b4f1a6a83c0a16705f69ef28f81163f2 100644 (file)
@@ -34,7 +34,7 @@ See also: go fmt, go vet.
 func runFix(cmd *base.Command, args []string) {
        printed := false
        for _, pkg := range load.Packages(args) {
-               if modload.Enabled() && !pkg.Module.Main {
+               if modload.Enabled() && pkg.Module != nil && !pkg.Module.Main {
                        if !printed {
                                fmt.Fprintf(os.Stderr, "go: not fixing packages in dependency modules\n")
                                printed = true
index 9482be98aefb5c716e0ef995829e69e206a1cfa6..7cbc448e6dd7c56d74055f17d94765df4b1fc5d4 100644 (file)
@@ -161,7 +161,7 @@ func runGenerate(cmd *base.Command, args []string) {
        // Even if the arguments are .go files, this loop suffices.
        printed := false
        for _, pkg := range load.Packages(args) {
-               if modload.Enabled() && !pkg.Module.Main {
+               if modload.Enabled() && pkg.Module != nil && !pkg.Module.Main {
                        if !printed {
                                fmt.Fprintf(os.Stderr, "go: not generating in packages in dependency modules\n")
                                printed = true
index cc99ed6b00cd347929fff0d7bd31b5e8b0bac18c..25013b6271cfdb601f7a214b26fa00ae63e0fdc5 100644 (file)
@@ -36,6 +36,9 @@ stdout '^cmd/go$'
 go list $GOROOT/src/fmt
 stdout '^fmt$'
 
+# 'go list' should work with file arguments.
+go list ./foo/foo.go
+stdout 'command-line-arguments'
 
 # 'go list -m' with an explicit version should resolve that version.
 go list -m example.com/version@latest
@@ -186,11 +189,27 @@ stdout 'path is \.$'
 stdout 'main is main \(devel\)'
 stdout 'using example.com/version v1.1.0'
 
+# 'go generate' should work with file arguments.
+[exec:touch] go generate ./foo/foo.go
+[exec:touch] exists ./foo/gen.txt
+
+# 'go install' should work with file arguments.
+go install ./foo/foo.go
+
+# 'go test' should work with file arguments.
+go test -v ./foo/foo_test.go
+stdout 'foo was tested'
+
+# 'go vet' should work with file arguments.
+go vet ./foo/foo.go
+
 
 -- README.txt --
 There is no go.mod file in the working directory.
 
 -- foo/foo.go --
+//go:generate touch gen.txt
+
 package main
 
 import (
@@ -212,3 +231,15 @@ func main() {
                fmt.Fprintf(os.Stdout, "using %s %s\n", m.Path, m.Version)
        }
 }
+
+-- foo/foo_test.go --
+package main
+
+import (
+       "fmt"
+       "testing"
+)
+
+func TestFoo(t *testing.T) {
+       fmt.Println("foo was tested")
+}