Skip to content

Commit

Permalink
cmd/go: error out of 'go mod tidy' if the go version is newer than su…
Browse files Browse the repository at this point in the history
…pported

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>
  • Loading branch information
Bryan C. Mills committed May 15, 2021
1 parent 02699f8 commit ce92a20
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 1 deletion.
8 changes: 7 additions & 1 deletion src/cmd/go/internal/modload/load.go
Original file line number Diff line number Diff line change
Expand Up @@ -922,14 +922,20 @@ 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
// and should use the latest semantics.)
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 {
Expand Down
57 changes: 57 additions & 0 deletions src/cmd/go/testdata/script/mod_tidy_too_new.txt
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit ce92a20

Please sign in to comment.