1
0
mirror of https://github.com/golang/go synced 2024-09-30 00:24:29 -06:00

cmd/go: only add a 'go' directive on 'go mod tidy' or when a conversion occurs

If the go.mod file exists and is empty, we initialize it from any of
various formats supported by legacy dependency-management tools.

We also initialize the 'go' directive at that point: we know that the
go.mod file is incomplete, because it does not reflect the information
in the legacy configuration file, and since we know that the go.mod
file is incomplete, we should complete it with as much information as
we have — including the version of the language currently in use.

However, if there is no legacy configuration file present, then we
cannot infer that the go.mod file is incomplete: it may correctly
specify a module without external dependencies. In that case, we
should not initialize the 'go' directive either: the user will not be
expecting unnecessary edits to the go.mod file, and we generally do
not make unnecessary-but-helpful edits unless 'go mod tidy' is invoked
explicitly.

Fixes #30790
Fixes #31100

Change-Id: I05a7872bce54a917c10d910cd9a616cab52e2730
Reviewed-on: https://go-review.googlesource.com/c/go/+/169877
Run-TryBot: Bryan C. Mills <bcmills@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
This commit is contained in:
Bryan C. Mills 2019-03-28 13:18:37 -04:00
parent 9f9e17a82f
commit a1c481d851
4 changed files with 26 additions and 5 deletions

View File

@ -64,6 +64,7 @@ func runTidy(cmd *base.Command, args []string) {
} }
} }
modload.SetBuildList(keep) modload.SetBuildList(keep)
modload.AddGoStmt()
modTidyGoSum() // updates memory copy; WriteGoMod on next line flushes it out modTidyGoSum() // updates memory copy; WriteGoMod on next line flushes it out
modload.WriteGoMod() modload.WriteGoMod()
} }

View File

@ -408,10 +408,9 @@ func legacyModInit() {
fmt.Fprintf(os.Stderr, "go: creating new go.mod: module %s\n", path) fmt.Fprintf(os.Stderr, "go: creating new go.mod: module %s\n", path)
modFile = new(modfile.File) modFile = new(modfile.File)
modFile.AddModuleStmt(path) modFile.AddModuleStmt(path)
AddGoStmt()
} }
addGoStmt()
for _, name := range altConfigs { for _, name := range altConfigs {
cfg := filepath.Join(modRoot, name) cfg := filepath.Join(modRoot, name)
data, err := ioutil.ReadFile(cfg) data, err := ioutil.ReadFile(cfg)
@ -420,6 +419,7 @@ func legacyModInit() {
if convert == nil { if convert == nil {
return return
} }
AddGoStmt()
fmt.Fprintf(os.Stderr, "go: copying requirements from %s\n", base.ShortPath(cfg)) fmt.Fprintf(os.Stderr, "go: copying requirements from %s\n", base.ShortPath(cfg))
cfg = filepath.ToSlash(cfg) cfg = filepath.ToSlash(cfg)
if err := modconv.ConvertLegacyConfig(modFile, cfg, data); err != nil { if err := modconv.ConvertLegacyConfig(modFile, cfg, data); err != nil {
@ -434,8 +434,12 @@ func legacyModInit() {
} }
} }
// addGoStmt adds a go statement referring to the current version. // AddGoStmt adds a go directive to the go.mod file if it does not already include one.
func addGoStmt() { // The 'go' version added, if any, is the latest version supported by this toolchain.
func AddGoStmt() {
if modFile.Go != nil && modFile.Go.Version != "" {
return
}
tags := build.Default.ReleaseTags tags := build.Default.ReleaseTags
version := tags[len(tags)-1] version := tags[len(tags)-1]
if !strings.HasPrefix(version, "go") || !modfile.GoVersionRE.MatchString(version[2:]) { if !strings.HasPrefix(version, "go") || !modfile.GoVersionRE.MatchString(version[2:]) {

View File

@ -0,0 +1,16 @@
env GO111MODULE=on
env GOPATH=$devnull
go list -m
stdout '^example.com$'
go list
stdout '^example.com$'
-- go.mod --
module example.com
-- main.go --
package main
func main() {}

View File

@ -20,7 +20,7 @@ stdout ^vendor/golang.org/x/crypto # dep of .TestImports
# Modules outside the standard library should not use the packages vendored there... # Modules outside the standard library should not use the packages vendored there...
cd broken cd broken
! go build -mod=readonly ! go build -mod=readonly
stderr 'updates to go.mod needed' stderr 'disabled by -mod=readonly'
! go build -mod=vendor ! go build -mod=vendor
stderr 'cannot find package' stderr 'cannot find package'
stderr 'hpack' stderr 'hpack'