]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go: in 'go mod init', suggest running 'go mod tidy'
authorJay Conrod <jayconrod@google.com>
Fri, 23 Oct 2020 15:10:10 +0000 (11:10 -0400)
committerJay Conrod <jayconrod@google.com>
Fri, 23 Oct 2020 20:54:25 +0000 (20:54 +0000)
When 'go mod init' is run in an existing project, it may import
requirements from a vendor configuration file, but the requirements
may not be complete, and go.sum won't contain sums for module
zips. With -mod=readonly, the next build command is likely to fail.

'go mod init' will now suggest running 'go mod tidy' if there are .go
files or subdirectories in the current directory.

We could potentially run 'go mod tidy' automatically within
'go mod init', but it seems better to guide users to using 'go mod tidy'
as a separate command to fix missing dependencies.

For #41712
Updates #40278

Change-Id: Iaece607f291244588a732ef4c5d576108965ca91
Reviewed-on: https://go-review.googlesource.com/c/go/+/264622
Trust: Jay Conrod <jayconrod@google.com>
Run-TryBot: Jay Conrod <jayconrod@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Bryan C. Mills <bcmills@google.com>
src/cmd/go/internal/modload/init.go
src/cmd/go/testdata/script/mod_init_tidy.txt [new file with mode: 0644]

index 7a8d826994f925ca477f75e5af62b9df60afa34f..f5aac4b2206ff9b4b7db4cb985fbd8d40a251616 100644 (file)
@@ -435,6 +435,29 @@ func CreateModFile(ctx context.Context, modPath string) {
 
        modFileToBuildList()
        WriteGoMod()
+
+       // Suggest running 'go mod tidy' unless the project is empty. Even if we
+       // imported all the correct requirements above, we're probably missing
+       // some sums, so the next build command in -mod=readonly will likely fail.
+       //
+       // We look for non-hidden .go files or subdirectories to determine whether
+       // this is an existing project. Walking the tree for packages would be more
+       // accurate, but could take much longer.
+       empty := true
+       fis, _ := ioutil.ReadDir(modRoot)
+       for _, fi := range fis {
+               name := fi.Name()
+               if strings.HasPrefix(name, ".") || strings.HasPrefix(name, "_") {
+                       continue
+               }
+               if strings.HasSuffix(name, ".go") || fi.IsDir() {
+                       empty = false
+                       break
+               }
+       }
+       if !empty {
+               fmt.Fprintf(os.Stderr, "go: run 'go mod tidy' to add module requirements and sums\n")
+       }
 }
 
 // checkModulePathLax checks that the path meets some minimum requirements
diff --git a/src/cmd/go/testdata/script/mod_init_tidy.txt b/src/cmd/go/testdata/script/mod_init_tidy.txt
new file mode 100644 (file)
index 0000000..6a37edd
--- /dev/null
@@ -0,0 +1,30 @@
+# 'go mod init' should not recommend 'go mod tidy' in an empty directory
+# (one that contains no non-hidden .go files or subdirectories).
+cd empty
+go mod init m
+! stderr tidy
+cd ..
+
+# 'go mod init' should recommend 'go mod tidy' if the directory has a .go file.
+cd pkginroot
+go mod init m
+stderr '^go: run ''go mod tidy'' to add module requirements and sums$'
+cd ..
+
+# 'go mod init' should recommend 'go mod tidy' if the directory has a
+# subdirectory. We don't walk the tree to see if it has .go files.
+cd subdir
+go mod init m
+stderr '^go: run ''go mod tidy'' to add module requirements and sums$'
+cd ..
+
+-- empty/empty.txt --
+Not a .go file. Still counts as an empty project.
+-- empty/.hidden/empty.go --
+File in hidden directory. Still as an empty project.
+-- empty/_hidden/empty.go --
+File in hidden directory. Still as an empty project.
+-- pkginroot/hello.go --
+package vendorimport
+-- subdir/sub/empty.txt --
+Subdirectory doesn't need to contain a package.