diff options
author | Bryan C. Mills <bcmills@google.com> | 2021-05-13 09:48:40 -0400 |
---|---|---|
committer | Carlos Amedee <carlos@golang.org> | 2021-06-02 19:01:28 +0000 |
commit | fbf844b46d147c442a6016aa9c6bef51c309257b (patch) | |
tree | c12e0c83b9dea30c1b5ceb1a4db3a4acbc0a4f03 /src/cmd/go/internal/modload/load.go | |
parent | d9cffabed288ebece50ece29d44eff283e5cc485 (diff) | |
download | go-fbf844b46d147c442a6016aa9c6bef51c309257b.tar.gz go-fbf844b46d147c442a6016aa9c6bef51c309257b.zip |
[release-branch.go1.15] cmd/go: error out of 'go mod tidy' if the go version is newer than supported
This backports the test from CL 319669, but — because of extensive
changes to the module loader during the Go 1.16 and 1.17 cycles — the
implementation is entirely different. (This implementation is based on
the addGoStmt function already present in init.go.)
Fixes #46143
Updates #46142
Change-Id: Ib7a0a159e53cbe476be6aa9a050add10cc750dec
Reviewed-on: https://go-review.googlesource.com/c/go/+/319710
Trust: Bryan C. Mills <bcmills@google.com>
Run-TryBot: Bryan C. Mills <bcmills@google.com>
Reviewed-by: Jay Conrod <jayconrod@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Diffstat (limited to 'src/cmd/go/internal/modload/load.go')
-rw-r--r-- | src/cmd/go/internal/modload/load.go | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/src/cmd/go/internal/modload/load.go b/src/cmd/go/internal/modload/load.go index e5ea1a6c23..0dea6ee636 100644 --- a/src/cmd/go/internal/modload/load.go +++ b/src/cmd/go/internal/modload/load.go @@ -24,7 +24,9 @@ import ( "sort" "strings" + "golang.org/x/mod/modfile" "golang.org/x/mod/module" + "golang.org/x/mod/semver" ) // buildList is the list of modules to use for building packages. @@ -478,6 +480,31 @@ func SetBuildList(list []module.Version) { buildList = append([]module.Version{}, list...) } +// CheckTidyVersion reports an error to stderr if the Go version indicated by +// the go.mod file is not supported by this version of the 'go' command. +// +// If allowError is false, such an error terminates the program. +func CheckTidyVersion() { + InitMod() + mf := ModFile() + if mf.Go == nil || mf.Go.Version == "" { + return + } + goVersionV := "v" + mf.Go.Version + + tags := build.Default.ReleaseTags + maxGo := tags[len(tags)-1] + if !strings.HasPrefix(maxGo, "go") || !modfile.GoVersionRE.MatchString(maxGo[2:]) { + base.Fatalf("go: unrecognized go version %q", maxGo) + } + max := maxGo[2:] + + if semver.Compare(goVersionV, "v"+max) > 0 { + have := goVersionV[1:] + base.Fatalf("go mod tidy: go.mod file indicates go %s, but maximum supported version is %s\n", have, max) + } +} + // TidyBuildList trims the build list to the minimal requirements needed to // retain the same versions of all packages from the preceding Load* or // ImportPaths* call. |