]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go: error out of 'go mod tidy' if the go version is newer than supported
authorBryan C. Mills <bcmills@google.com>
Thu, 13 May 2021 13:48:40 +0000 (09:48 -0400)
committerBryan C. Mills <bcmills@google.com>
Sat, 15 May 2021 02:39:08 +0000 (02:39 +0000)
Fixes #46142

Change-Id: Ib7a0a159e53cbe476be6aa9a050add10cc750dec
Reviewed-on: https://go-review.googlesource.com/c/go/+/319669
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/load.go
src/cmd/go/testdata/script/mod_tidy_too_new.txt [new file with mode: 0644]

index f30ac6e0c8bf77f4fb964c5e8f58de46c2efd9bf..83fc7c09c37ad07c2a3d686dd3c774205ad699ee 100644 (file)
@@ -922,7 +922,8 @@ func loadFromRoots(ctx context.Context, params loaderParams) *loader {
        }
 
        if params.GoVersion != "" {
-               if semver.Compare("v"+params.GoVersion, narrowAllVersionV) < 0 && !ld.UseVendorAll {
+               goVersionV := "v" + params.GoVersion
+               if semver.Compare(goVersionV, narrowAllVersionV) < 0 && !ld.UseVendorAll {
                        // The module's go version explicitly predates the change in "all" for lazy
                        // loading, so continue to use the older interpretation.
                        // (If params.GoVersion is empty, we are probably not in any module at all
@@ -930,6 +931,11 @@ func loadFromRoots(ctx context.Context, params loaderParams) *loader {
                        ld.allClosesOverTests = true
                }
 
+               if ld.Tidy && semver.Compare(goVersionV, "v"+latestGoVersion()) > 0 {
+                       ld.errorf("go mod tidy: go.mod file indicates go %s, but maximum supported version is %s\n", params.GoVersion, latestGoVersion())
+                       base.ExitIfErrors()
+               }
+
                var err error
                ld.requirements, err = convertDepth(ctx, ld.requirements, modDepthFromGoVersion(params.GoVersion))
                if err != nil {
diff --git a/src/cmd/go/testdata/script/mod_tidy_too_new.txt b/src/cmd/go/testdata/script/mod_tidy_too_new.txt
new file mode 100644 (file)
index 0000000..b9c53b5
--- /dev/null
@@ -0,0 +1,57 @@
+# https://golang.org/issue/46142: 'go mod tidy' should error out if the version
+# in the go.mod file is newer than the most recent supported version.
+
+cp go.mod go.mod.orig
+
+
+# If the go.mod file specifies an unsupported Go version, 'go mod tidy' should
+# refuse to edit it: we don't know what a tidy go.mod file for that version
+# would look like.
+
+! go mod tidy
+stderr 'go mod tidy: go.mod file indicates go 2000.0, but maximum supported version is '$goversion'$'
+cmp go.mod go.mod.orig
+
+
+# The -e flag should push past the error and edit the file anyway,
+# but preserve the too-high version.
+
+cp go.mod.orig go.mod
+go mod tidy -e
+stderr 'go mod tidy: go.mod file indicates go 2000.0, but maximum supported version is '$goversion'$'
+cmp go.mod go.mod.tidy
+
+
+# Explicitly switching to a supported version should suppress the error completely.
+
+cp go.mod.orig go.mod
+go mod tidy -go=1.17
+! stderr 'maximum supported version'
+go mod edit -go=1.17 go.mod.tidy
+cmp go.mod go.mod.tidy
+
+
+-- go.mod --
+module example.net/from/the/future
+
+go 2000.0
+
+replace example.net/m v0.0.0 => ./m
+-- go.mod.tidy --
+module example.net/from/the/future
+
+go 2000.0
+
+replace example.net/m v0.0.0 => ./m
+
+require example.net/m v0.0.0
+-- x.go --
+package x
+
+import "example.net/m"
+-- m/go.mod --
+module example.net/m
+
+go 1.17
+-- m/m.go --
+package m