Skip to content

Commit 27ed85d

Browse files
committed
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+. Fixes #66175 Fixes #62278 Change-Id: I28f894290a19d8e3cd220e9d70aeca8f4447e5a1 Cq-Include-Trybots: luci.golang.try:gotip-linux-amd64-longtest,gotip-windows-amd64-longtest Reviewed-on: https://go-review.googlesource.com/c/go/+/580217 Reviewed-by: Michael Matloob <[email protected]> LUCI-TryBot-Result: Go LUCI <[email protected]>
1 parent 55a06f7 commit 27ed85d

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
@@ -196,6 +196,13 @@ func Select() {
196196
}
197197
if gover.Compare(goVers, minVers) > 0 {
198198
gotoolchain = "go" + goVers
199+
// Starting with Go 1.21, the first released version has a .0 patch version suffix.
200+
// Don't try to download a language version (sans patch component), such as go1.22.
201+
// Instead, use the first toolchain of that language version, such as 1.22.0.
202+
// See golang.org/issue/62278.
203+
if gover.IsLang(goVers) && gover.Compare(goVers, "1.21") >= 0 {
204+
gotoolchain += ".0"
205+
}
199206
gover.Startup.AutoGoVersion = goVers
200207
gover.Startup.AutoToolchain = "" // in case we are overriding it for being too old
201208
}
@@ -327,6 +334,10 @@ func Exec(gotoolchain string) {
327334
dir, err := modfetch.Download(context.Background(), m)
328335
if err != nil {
329336
if errors.Is(err, fs.ErrNotExist) {
337+
toolVers := gover.FromToolchain(gotoolchain)
338+
if gover.IsLang(toolVers) && gover.Compare(toolVers, "1.21") >= 0 {
339+
base.Fatalf("invalid toolchain: %s is a language version but not a toolchain version (%s.x)", gotoolchain, gotoolchain)
340+
}
330341
base.Fatalf("download %s for %s/%s: toolchain not available", gotoolchain, runtime.GOOS, runtime.GOARCH)
331342
}
332343
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)