aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/go/testdata/script/gotoolchain_local.txt
blob: 93f557008a64635064dbd65dffee5d03edbbdc12 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
# This test uses the fake toolchain switch support in cmd/go/internal/toolchain.Switch
# to exercise all the version selection logic without needing actual toolchains.
# See gotoolchain_net.txt and gotoolchain_path.txt for tests of network and PATH toolchains.

env TESTGO_VERSION=go1.500
env TESTGO_VERSION_SWITCH=switch

# GOTOOLCHAIN=auto runs default toolchain without a go.mod or go.work
env GOTOOLCHAIN=auto
go version
stdout go1.500

# GOTOOLCHAIN=path runs default toolchain without a go.mod or go.work
env GOTOOLCHAIN=path
go version
stdout go1.500

# GOTOOLCHAIN=asdf is a syntax error
env GOTOOLCHAIN=asdf
! go version
stderr '^go: invalid GOTOOLCHAIN "asdf"$'

# GOTOOLCHAIN=version is used directly.
env GOTOOLCHAIN=go1.600
go version
stdout go1.600

env GOTOOLCHAIN=go1.400
go version
stdout go1.400

# GOTOOLCHAIN=version+auto sets a minimum.
env GOTOOLCHAIN=go1.600+auto
go version
stdout go1.600

env GOTOOLCHAIN=go1.400.0+auto
go version
stdout go1.400.0

# GOTOOLCHAIN=version+path sets a minimum too.
env GOTOOLCHAIN=go1.600+path
go version
stdout go1.600

env GOTOOLCHAIN=go1.400+path
go version
stdout go1.400

# Create a go.mod file and test interactions with auto and path.

# GOTOOLCHAIN=auto uses go line if newer than local toolchain.
env GOTOOLCHAIN=auto
go mod init m
go mod edit -go=1.700 -toolchain=none
go version
stdout 1.700

go mod edit -go=1.300 -toolchain=none
go version
stdout 1.500 # local toolchain is newer

go mod edit -go=1.700 -toolchain=go1.300
go version
stdout go1.700 # toolchain too old, ignored

go mod edit -go=1.300 -toolchain=default
go version
stdout go1.500

go mod edit -go=1.700 -toolchain=default
go version
stdout go1.500 # toolchain local is like GOTOOLCHAIN=local and wins
! go build
stderr '^go: go.mod requires go >= 1.700 \(running go 1.500; go.mod sets toolchain default\)'

# GOTOOLCHAIN=path does the same.
env GOTOOLCHAIN=path
go mod edit -go=1.700 -toolchain=none
go version
stdout 1.700

go mod edit -go=1.300 -toolchain=none
go version
stdout 1.500 # local toolchain is newer

go mod edit -go=1.700 -toolchain=go1.300
go version
stdout go1.700 # toolchain too old, ignored

go mod edit -go=1.300 -toolchain=default
go version
stdout go1.500

go mod edit -go=1.700 -toolchain=default
go version
stdout go1.500 # toolchain default applies even if older than go line
! go build
stderr '^go: go.mod requires go >= 1.700 \(running go 1.500; GOTOOLCHAIN=path; go.mod sets toolchain default\)'

# GOTOOLCHAIN=min+auto with toolchain default uses min, not local

env GOTOOLCHAIN=go1.400+auto
go mod edit -go=1.300 -toolchain=default
go version
stdout 1.400 # not 1.500 local toolchain

env GOTOOLCHAIN=go1.600+auto
go mod edit -go=1.300 -toolchain=default
go version
stdout 1.600 # not 1.500 local toolchain

# GOTOOLCHAIN names can have -suffix
env GOTOOLCHAIN=go1.800-bigcorp
go version
stdout go1.800-bigcorp

env GOTOOLCHAIN=auto
go mod edit -go=1.999 -toolchain=go1.800-bigcorp
go version
stdout go1.999

go mod edit -go=1.777 -toolchain=go1.800-bigcorp
go version
stdout go1.800-bigcorp

# go.work takes priority over go.mod
go mod edit -go=1.700 -toolchain=go1.999-wrong
go work init
go work edit -go=1.400 -toolchain=go1.600-right
go version
stdout go1.600-right

go work edit -go=1.400 -toolchain=default
go version
stdout go1.500

# go.work misconfiguration does not break go work edit
# ('go 1.600 / toolchain local' forces use of 1.500 which can't normally load that go.work; allow work edit to fix it.)
go work edit -go=1.600 -toolchain=default
go version
stdout go1.500

go work edit -toolchain=none
go version
stdout go1.600

rm go.work

# go.mod misconfiguration does not break go mod edit
go mod edit -go=1.600 -toolchain=default
go version
stdout go1.500

go mod edit -toolchain=none
go version
stdout go1.600

# toolchain built with a custom version should know how it compares to others

env TESTGO_VERSION=go1.500-bigcorp
go mod edit -go=1.499 -toolchain=none
go version
stdout go1.500-bigcorp

go mod edit -go=1.500 -toolchain=none
go version
stdout go1.500-bigcorp

go mod edit -go=1.501 -toolchain=none
go version
stdout go1.501

env TESTGO_VERSION='go1.500 (bigcorp)'
go mod edit -go=1.499 -toolchain=none
go version
stdout 'go1.500 \(bigcorp\)'

go mod edit -go=1.500 -toolchain=none
go version
stdout 'go1.500 \(bigcorp\)'

go mod edit -go=1.501 -toolchain=none
go version
stdout go1.501

# go install m@v and go run m@v should ignore go.mod and use m@v
env TESTGO_VERSION=go1.2.3
go mod edit -go=1.999 -toolchain=go1.998

! go install rsc.io/fortune/nonexist@v0.0.1
stderr '^go: rsc.io/fortune@v0.0.1 requires go >= 1.21rc999; switching to go1.22.9$'
stderr '^go: rsc.io/fortune/nonexist@v0.0.1: module rsc.io/fortune@v0.0.1 found, but does not contain package rsc.io/fortune/nonexist'

! go run rsc.io/fortune/nonexist@v0.0.1
stderr '^go: rsc.io/fortune@v0.0.1 requires go >= 1.21rc999; switching to go1.22.9$'
stderr '^go: rsc.io/fortune/nonexist@v0.0.1: module rsc.io/fortune@v0.0.1 found, but does not contain package rsc.io/fortune/nonexist'

# go install should handle unknown flags to find m@v
! go install -unknownflag rsc.io/fortune/nonexist@v0.0.1
stderr '^go: rsc.io/fortune@v0.0.1 requires go >= 1.21rc999; switching to go1.22.9$'
stderr '^flag provided but not defined: -unknownflag'

! go install -unknownflag arg rsc.io/fortune/nonexist@v0.0.1
stderr '^go: rsc.io/fortune@v0.0.1 requires go >= 1.21rc999; switching to go1.22.9$'
stderr '^flag provided but not defined: -unknownflag'

# go run cannot handle unknown boolean flags
! go run -unknownflag rsc.io/fortune/nonexist@v0.0.1
! stderr switching
stderr '^flag provided but not defined: -unknownflag'

! go run -unknownflag oops rsc.io/fortune/nonexist@v0.0.1
! stderr switching
stderr '^flag provided but not defined: -unknownflag'

# go run can handle unknown flag with argument.
! go run -unknown=flag rsc.io/fortune/nonexist@v0.0.1
stderr '^go: rsc.io/fortune@v0.0.1 requires go >= 1.21rc999; switching to go1.22.9$'
stderr '^flag provided but not defined: -unknown'

# go install m@v should handle queries
! go install rsc.io/fortune/nonexist@v0.0
stderr '^go: rsc.io/fortune@v0.0.1 requires go >= 1.21rc999; switching to go1.22.9$'
stderr '^go: rsc.io/fortune/nonexist@v0.0: module rsc.io/fortune@v0.0 found \(v0.0.1\), but does not contain package rsc.io/fortune/nonexist'

# go run m@v should handle queries
! go install rsc.io/fortune/nonexist@v0
stderr '^go: rsc.io/fortune@v0.0.1 requires go >= 1.21rc999; switching to go1.22.9$'
stderr '^go: rsc.io/fortune/nonexist@v0: module rsc.io/fortune@v0 found \(v0.0.1\), but does not contain package rsc.io/fortune/nonexist'

# go install m@v should use local toolchain if not upgrading
! go install rsc.io/fortune/nonexist@v1
! stderr go1.22.9
! stderr switching
stderr '^go: downloading rsc.io/fortune v1.0.0$'
stderr '^go: rsc.io/fortune/nonexist@v1: module rsc.io/fortune@v1 found \(v1.0.0\), but does not contain package rsc.io/fortune/nonexist'

# go run m@v should use local toolchain if not upgrading
! go run rsc.io/fortune/nonexist@v1
! stderr go1.22.9
! stderr switching
stderr '^go: rsc.io/fortune/nonexist@v1: module rsc.io/fortune@v1 found \(v1.0.0\), but does not contain package rsc.io/fortune/nonexist'