Skip to content

Commit 77cfa29

Browse files
samthanawallacherrymui
authored andcommitted
[release-branch.go1.21] cmd/go: download 1.X.0 instead of 1.X during toolchain upgrade.
This CL modifies the download behavior when downloading a toolchain for 1.21+. Previously, Go would attempt to download 1.X when upgrading the toolchain which would cause the download to fail for 1.21+ since 1.X is an invalid toolchain. We will attempt to download 1.X.0 since that's likely what the user intended. Additionally, we will also now provide a better error message when the user provides a language version instead of a toolchain version for 1.21+. For #66175 For #62278 Fixes #67235 Change-Id: I28f894290a19d8e3cd220e9d70aeca8f4447e5a1 Reviewed-on: https://go-review.googlesource.com/c/go/+/580217 Reviewed-by: Michael Matloob <[email protected]> LUCI-TryBot-Result: Go LUCI <[email protected]> (cherry picked from commit 27ed85d) Reviewed-on: https://go-review.googlesource.com/c/go/+/583797
1 parent 752b009 commit 77cfa29

File tree

2 files changed

+115
-0
lines changed

2 files changed

+115
-0
lines changed

src/cmd/go/internal/toolchain/select.go

+11
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,13 @@ func Select() {
183183
}
184184
if gover.Compare(goVers, minVers) > 0 {
185185
gotoolchain = "go" + goVers
186+
// Starting with Go 1.21, the first released version has a .0 patch version suffix.
187+
// Don't try to download a language version (sans patch component), such as go1.22.
188+
// Instead, use the first toolchain of that language version, such as 1.22.0.
189+
// See golang.org/issue/62278.
190+
if gover.IsLang(goVers) && gover.Compare(goVers, "1.21") >= 0 {
191+
gotoolchain += ".0"
192+
}
186193
gover.Startup.AutoGoVersion = goVers
187194
gover.Startup.AutoToolchain = "" // in case we are overriding it for being too old
188195
}
@@ -311,6 +318,10 @@ func Exec(gotoolchain string) {
311318
dir, err := modfetch.Download(context.Background(), m)
312319
if err != nil {
313320
if errors.Is(err, fs.ErrNotExist) {
321+
toolVers := gover.FromToolchain(gotoolchain)
322+
if gover.IsLang(toolVers) && gover.Compare(toolVers, "1.21") >= 0 {
323+
base.Fatalf("invalid toolchain: %s is a language version but not a toolchain version (%s.x)", gotoolchain, gotoolchain)
324+
}
314325
base.Fatalf("download %s for %s/%s: toolchain not available", gotoolchain, runtime.GOOS, runtime.GOARCH)
315326
}
316327
base.Fatalf("download %s: %v", gotoolchain, err)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
env TESTGO_VERSION=go1.14
2+
3+
# check for invalid toolchain in go.mod
4+
go mod init m
5+
go mod edit -go=1.14 -toolchain=go1.22
6+
! go version
7+
stderr 'go: invalid toolchain: go1.22 is a language version but not a toolchain version \(go1.22.x\)'
8+
9+
rm go.mod
10+
go mod init m
11+
go mod edit -go=1.14 -toolchain=go1.21
12+
! go version
13+
stderr 'go: invalid toolchain: go1.21 is a language version but not a toolchain version \(go1.21.x\)'
14+
15+
rm go.mod
16+
go mod init m
17+
go mod edit -go=1.14 -toolchain=go1.20
18+
! go version
19+
stderr 'go: downloading go1.20 '
20+
21+
22+
# check for invalid GOTOOLCHAIN
23+
env GOTOOLCHAIN=go1.14
24+
go version
25+
stdout 'go1.14'
26+
27+
env GOTOOLCHAIN=go1.20
28+
! go version
29+
stderr 'go: downloading go1.20 '
30+
31+
env GOTOOLCHAIN=go1.21
32+
! go version
33+
stderr 'go: invalid toolchain: go1.21 is a language version but not a toolchain version \(go1.21.x\)'
34+
35+
env GOTOOLCHAIN=go1.22
36+
! go version
37+
stderr 'go: invalid toolchain: go1.22 is a language version but not a toolchain version \(go1.22.x\)'
38+
39+
env GOTOOLCHAIN=go1.20+auto
40+
! go version
41+
stderr 'go: downloading go1.20 '
42+
43+
env GOTOOLCHAIN=go1.21+auto
44+
! go version
45+
stderr 'go: invalid toolchain: go1.21 is a language version but not a toolchain version \(go1.21.x\)'
46+
47+
env GOTOOLCHAIN=go1.22+auto
48+
! go version
49+
stderr 'go: invalid toolchain: go1.22 is a language version but not a toolchain version \(go1.22.x\)'
50+
51+
env GOTOOLCHAIN=go1.21rc3
52+
! go version
53+
stderr 'go: downloading go1.21rc3 '
54+
55+
env GOTOOLCHAIN=go1.22rc2
56+
! go version
57+
stderr 'go: downloading go1.22rc2 '
58+
59+
env GOTOOLCHAIN=go1.66
60+
! go version
61+
stderr 'go: invalid toolchain: go1.66 is a language version but not a toolchain version \(go1.66.x\)'
62+
63+
env GOTOOLCHAIN=go1.18beta2
64+
! go version
65+
stderr 'go: downloading go1.18beta2 '
66+
67+
# go1.X is okay for path lookups
68+
env GOTOOLCHAIN=go1.20+path
69+
! go version
70+
stderr 'go: cannot find "go1.20" in PATH'
71+
72+
env GOTOOLCHAIN=go1.21+path
73+
! go version
74+
stderr 'go: cannot find "go1.21" in PATH'
75+
76+
env GOTOOLCHAIN=go1.22+path
77+
! go version
78+
stderr 'go: cannot find "go1.22" in PATH'
79+
80+
# When a toolchain download takes place, download 1.X.0
81+
env GOTOOLCHAIN=auto
82+
rm go.mod
83+
go mod init m
84+
go mod edit -go=1.300 -toolchain=none
85+
! go version
86+
stderr 'go: downloading go1.300.0 '
87+
88+
rm go.mod
89+
go mod init m
90+
go mod edit -go=1.21 -toolchain=none
91+
! go version
92+
stderr 'go: downloading go1.21.0 '
93+
94+
rm go.mod
95+
go mod init m
96+
go mod edit -go=1.22 -toolchain=none
97+
! go version
98+
stderr 'go: downloading go1.22.0 '
99+
100+
rm go.mod
101+
go mod init m
102+
go mod edit -go=1.15 -toolchain=none
103+
! go version
104+
stderr 'go: downloading go1.15 '

0 commit comments

Comments
 (0)