wf.AddGoStmt(goVers)
- // We wrote a new go line. For reproducibility,
- // if the toolchain running right now is newer than the new toolchain line,
- // update the toolchain line to record the newer toolchain.
- // The user never sets the toolchain explicitly in a 'go work' command,
- // so this is only happening as a result of a go or toolchain line found
- // in a module.
- // If the toolchain running right now is a dev toolchain (like "go1.21")
- // writing 'toolchain go1.21' will not be useful, since that's not an actual
- // toolchain you can download and run. In that case fall back to at least
- // checking that the toolchain is new enough for the Go version.
- toolchain := "go" + old
- if wf.Toolchain != nil {
- toolchain = wf.Toolchain.Name
- }
- if gover.IsLang(gover.Local()) {
- toolchain = gover.ToolchainMax(toolchain, "go"+goVers)
- } else {
- toolchain = gover.ToolchainMax(toolchain, "go"+gover.Local())
+ if wf.Toolchain == nil {
+ return true
}
- // Drop the toolchain line if it is implied by the go line
+ // Drop the toolchain line if it is implied by the go line,
+ // if its version is older than the version in the go line,
// or if it is asking for a toolchain older than Go 1.21,
// which will not understand the toolchain line.
- if toolchain == "go"+goVers || gover.Compare(gover.FromToolchain(toolchain), gover.GoStrictVersion) < 0 {
+ // Previously, a toolchain line set to the local toolchain
+ // version was added so that future operations on the go file
+ // would use the same toolchain logic for reproducibility.
+ // This behavior seemed to cause user confusion without much
+ // benefit so it was removed. See #65847.
+ toolchain := wf.Toolchain.Name
+ toolVers := gover.FromToolchain(toolchain)
+ if toolchain == "go"+goVers || gover.Compare(toolVers, goVers) < 0 || gover.Compare(toolVers, gover.GoStrictVersion) < 0 {
wf.DropToolchainStmt()
- } else {
- wf.AddToolchainStmt(toolchain)
}
+
return true
}
toolchain = "go" + goVersion
}
- // For reproducibility, if we are writing a new go line,
- // and we're not explicitly modifying the toolchain line with 'go get toolchain@something',
- // and the go version is one that supports switching toolchains,
- // and the toolchain running right now is newer than the current toolchain line,
- // then update the toolchain line to record the newer toolchain.
- //
- // TODO(#57001): This condition feels too complicated. Can we simplify it?
- // TODO(#57001): Add more tests for toolchain lines.
toolVers := gover.FromToolchain(toolchain)
- if wroteGo && !opts.DropToolchain && !opts.ExplicitToolchain &&
- gover.Compare(goVersion, gover.GoStrictVersion) >= 0 &&
- (gover.Compare(gover.Local(), toolVers) > 0 && !gover.IsLang(gover.Local())) {
- toolchain = "go" + gover.Local()
- toolVers = gover.FromToolchain(toolchain)
- }
-
if opts.DropToolchain || toolchain == "go"+goVersion || (gover.Compare(toolVers, gover.GoStrictVersion) < 0 && !opts.ExplicitToolchain) {
// go get toolchain@none or toolchain matches go line or isn't valid; drop it.
// TODO(#57001): 'go get' should reject explicit toolchains below GoStrictVersion.
go get .
stderr '^go: module rsc.io/future@v1.0.0 requires go >= 1.999; switching to go1.999testmod$'
stderr '^go: upgraded go 1.21 => 1.999$'
-stderr '^go: added toolchain go1.999testmod$'
+! stderr '^go: added toolchain'
# Now, the various 'go mod' subcommands should succeed.
go 1.23
-toolchain go1.23.9
-
require rsc.io/needall v0.0.1
! stderr '\(running'
stderr '^go: added rsc.io/needall v0.0.1'
grep 'go 1.23' go.mod
-grep 'toolchain go1.23.9' go.mod
+! grep toolchain go.mod
# GOTOOLCHAIN=min+auto should run the newer toolchain
env GOTOOLCHAIN=go1.21+auto
! stderr '\(running'
stderr '^go: added rsc.io/needall v0.0.1'
grep 'go 1.23' go.mod
-grep 'toolchain go1.23.9' go.mod
+! grep toolchain go.mod
# GOTOOLCHAIN=go1.21 should NOT run the newer toolchain
env GOTOOLCHAIN=go1.21
go get go@1.22rc1
stderr '^go: updating go.mod requires go >= 1.22rc1; switching to go1.22.9$'
stderr '^go: upgraded go 1.1 => 1.22rc1$'
-stderr '^go: added toolchain go1.22.9$'
+! stderr '^go: added toolchain$'
# go get go@1.22.1 should use 1.22.1 exactly, not a later release.
env GOTOOLCHAIN=local
go get go@1.22.1
stderr '^go: updating go.mod requires go >= 1.22.1; switching to go1.22.9$'
stderr '^go: upgraded go 1.1 => 1.22.1$'
-stderr '^go: added toolchain go1.22.9$'
+! stderr '^go: added toolchain$'
# go get needgo122 (says 'go 1.22') should use 1.22.0, the earliest release we have available
# (ignoring prereleases).
go get rsc.io/needgo122
stderr '^go: upgraded go 1.1 => 1.22$'
stderr '^go: rsc.io/needgo122@v0.0.1 requires go >= 1.22; switching to go1.22.9$'
-stderr '^go: added toolchain go1.22.9$'
+! stderr '^go: added toolchain$'
# go get needgo1223 (says 'go 1.22.3') should use go 1.22.3
env GOTOOLCHAIN=local
go get rsc.io/needgo1223
stderr '^go: upgraded go 1.1 => 1.22.3$'
stderr '^go: rsc.io/needgo1223@v0.0.1 requires go >= 1.22.3; switching to go1.22.9$'
-stderr '^go: added toolchain go1.22.9$'
+! stderr '^go: added toolchain$'
# go get needgo124 (says 'go 1.24') should use go 1.24rc1, the only version available
env GOTOOLCHAIN=local
go get rsc.io/needgo124
stderr '^go: rsc.io/needgo124@v0.0.1 requires go >= 1.24; switching to go1.24rc1$'
stderr '^go: upgraded go 1.1 => 1.24$'
-stderr '^go: added toolchain go1.24rc1$'
+! stderr '^go: added toolchain$'
# The -C flag should not happen more than once due to switching.
mkdir dir dir/dir
go get -C dir rsc.io/needgo124
stderr '^go: rsc.io/needgo124@v0.0.1 requires go >= 1.24; switching to go1.24rc1$'
stderr '^go: upgraded go 1.1 => 1.24$'
-stderr '^go: added toolchain go1.24rc1$'
+! stderr '^go: added toolchain1$'
cmp go.mod.new go.mod
cmp go.mod.new dir/dir/go.mod
grep 'go 1.24$' dir/go.mod
go get go
stderr '^go: upgraded go 1.21 => 1.23.9$'
grep 'go 1.23.9' go.mod
-grep 'toolchain go1.99rc1' go.mod
+! grep toolchain go.mod
# go get go@1.23 should use the latest Go 1.23
cp go.mod.orig go.mod
go get go@1.23
stderr '^go: upgraded go 1.21 => 1.23.9$'
grep 'go 1.23.9' go.mod
-grep 'toolchain go1.99rc1' go.mod
+! grep toolchain go.mod
# go get go@1.22 should use the latest Go 1.22
cp go.mod.orig go.mod
go get go@1.22
stderr '^go: upgraded go 1.21 => 1.22.9$'
grep 'go 1.22.9' go.mod
-grep 'toolchain go1.99rc1' go.mod
+! grep toolchain1 go.mod
# go get go@patch should use the latest patch release
go get go@1.22.1
go get go@patch
stderr '^go: upgraded go 1.22.1 => 1.22.9$'
grep 'go 1.22.9' go.mod
-grep 'toolchain go1.99rc1' go.mod
+! grep toolchain go.mod
# go get go@1.24 does NOT find the release candidate
cp go.mod.orig go.mod
go get go@1.24rc1
stderr '^go: upgraded go 1.21 => 1.24rc1$'
grep 'go 1.24rc1' go.mod
-grep 'toolchain go1.99rc1' go.mod
+! grep toolchain go.mod
# go get go@latest finds the latest Go 1.23
cp go.mod.orig go.mod
go get go@latest
stderr '^go: upgraded go 1.21 => 1.23.9$'
grep 'go 1.23.9' go.mod
-grep 'toolchain go1.99rc1' go.mod
+! grep toolchain go.mod
# Again, with toolchains.
+go get toolchain@go1.99rc1
+stderr '^go: added toolchain go1.99rc1$'
+grep 'go 1.23.9' go.mod
+grep 'toolchain go1.99rc1' go.mod
+
# go get toolchain should find go1.999testmod.
go get toolchain
stderr '^go: upgraded toolchain go1.99rc1 => go1.999testmod$'
# This test verifies that 'go get' and 'go mod tidy' switch to a newer toolchain
-# if needed to process newly-reolved imports.
+# if needed to process newly-resolved imports.
env TESTGO_VERSION=go1.21.0
env TESTGO_VERSION_SWITCH=switch
go: accepting indirect upgrade from go@1.20 to 1.22.0
go: trying upgrade to example.net/c@v0.1.0
go: upgraded go 1.20 => 1.22.0
-go: added toolchain go1.22.9
go: added example.net/b v0.1.0
go: added example.net/c v0.1.0
go: added example.net/d v0.1.0
go: trying upgrade to example.net/d@v0.2.0
go: accepting indirect upgrade from go@1.22.0 to 1.23.0
go: upgraded go 1.20 => 1.23.0
-go: added toolchain go1.23.9
go: upgraded example.net/a v0.1.0 => v0.2.0
go: added example.net/b v0.1.0
go: added example.net/c v0.1.0
go 1.22.0
-toolchain go1.22.9
-
require (
example.net/a v0.1.0
example.net/b v0.1.0
go 1.23.0
-toolchain go1.23.9
-
require (
example.net/a v0.2.0
example.net/b v0.1.0
cp go.mod.117 go.mod
go mod tidy -go=1.21.0 # lower than $goversion
-cmpenv go.mod go.mod.121toolchain
+cmp go.mod go.mod.121toolchain
-- go.mod --
go 1.21.0
-toolchain $TESTGO_VERSION
-
require example.net/a v0.1.0
require (
go get go@1.22.3
stderr '^go: upgraded go 1.10 => 1.22.3$'
-stderr '^go: upgraded toolchain go1.22.1 => go1.100.0$'
+! stderr '^go: upgraded toolchain$'
grep 'go 1.22.3' go.mod
+go get toolchain@go1.100.0
+stderr '^go: added toolchain go1.100.0$'
+
go get go@1.22.3 toolchain@1.22.3
stderr '^go: removed toolchain go1.100.0$'
! grep toolchain go.mod
! stderr ' go 1'
grep 'go 1.23.5' go.mod
+go get toolchain@go1.23.0 go@1.22.0
+go get go@1.24.0
+! grep toolchain go.mod
+
-- go.mod --
module m
go 1.10
-# go get should update the go and toolchain lines in go.work
+# go get should update the go line in go.work
env TESTGO_VERSION=go1.21
env TESTGO_VERSION_SWITCH=switch
env GOTOOLCHAIN=auto
stderr '^go: added rsc.io/needall v0.0.1'
grep 'go 1.23$' go.mod
grep 'go 1.23$' go.work
-grep 'toolchain go1.23.9' go.mod
-grep 'toolchain go1.23.9' go.work
+! grep toolchain go.mod
+! grep toolchain go.work
-- go.mod.new --
module m
go work sync
stderr '^go: m1_22_1'${/}'go.mod requires go >= 1.22.1; switching to go1.22.9$'
grep '^go 1.22.1$' go.work
-grep '^toolchain go1.22.9$' go.work
+! grep toolchain go.work
# work sync with newer modules should update go 1.22.1 -> 1.24rc1 and drop toolchain
go work edit -use=./m1_24_rc0
stderr '^go: m1_24_rc0'${/}'go.mod requires go >= 1.24rc0; switching to go1.24rc1$'
cat go.work
grep '^go 1.24rc0$' go.work
-grep '^toolchain go1.24rc1$' go.work
+! grep toolchain go.work
go work use ./m1_22_0
stderr '^go: m1_22_0'${/}'go.mod requires go >= 1.22.0; switching to go1.22.9$'
grep '^go 1.22.0$' go.work
-grep '^toolchain go1.22.9$' go.work
+! grep toolchain go.work
# work use with an even newer module should bump go again.
go work use ./m1_22_1
-! stderr switching
+stderr '^go: m1_22_1'${/}'go.mod requires go >= 1.22.1; switching to go1.22.9$'
grep '^go 1.22.1$' go.work
-grep '^toolchain go1.22.9$' go.work # unchanged
+! grep toolchain go.work
# work use with an even newer module should bump go and toolchain again.
env GOTOOLCHAIN=go1.22.9
go work use ./m1_24_rc0
stderr '^go: m1_24_rc0'${/}'go.mod requires go >= 1.24rc0; switching to go1.24rc1$'
grep '^go 1.24rc0$' go.work
-grep '^toolchain go1.24rc1$' go.work
+! grep 'toolchain' go.work