# This test verifies that 'go get' and 'go mod tidy' switch to a newer toolchain # if needed to process newly-reolved imports. env TESTGO_VERSION=go1.21.0 env TESTGO_VERSION_SWITCH=switch cp go.mod go.mod.orig # tidy reports needing 1.22.0 for b1 env GOTOOLCHAIN=local ! go mod tidy stderr '^go: example imports\n\texample.net/b: module ./b1 requires go >= 1.22.0 \(running go 1.21.0; GOTOOLCHAIN=local\)$' env GOTOOLCHAIN=auto go mod tidy cmp stderr tidy-stderr.want cmp go.mod go.mod.tidy cp go.mod.orig go.mod env GOTOOLCHAIN=local ! go get -v . stderr '^go: example.net/b@v0.1.0: module ./b1 requires go >= 1.22.0 \(running go 1.21.0; GOTOOLCHAIN=local\)$' env GOTOOLCHAIN=auto go get -v . cmp stderr get-v-stderr.want cmp go.mod go.mod.tidy cp go.mod.orig go.mod env GOTOOLCHAIN=local ! go get -u -v . stderr '^go: example.net/a@v0.2.0: module ./a2 requires go >= 1.22.0 \(running go 1.21.0; GOTOOLCHAIN=local\)$' env GOTOOLCHAIN=auto go get -u -v . cmp stderr get-u-v-stderr.want cmp go.mod go.mod.upgraded -- tidy-stderr.want -- go: found example.net/b in example.net/b v0.1.0 go: module ./b1 requires go >= 1.22.0; switching to go1.22.9 go: found example.net/b in example.net/b v0.1.0 go: found example.net/c in example.net/c v0.1.0 -- get-v-stderr.want -- go: trying upgrade to example.net/b@v0.1.0 go: module ./b1 requires go >= 1.22.0; switching to go1.22.9 go: trying upgrade to example.net/b@v0.1.0 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 -- get-u-v-stderr.want -- go: trying upgrade to example.net/a@v0.2.0 go: trying upgrade to example.net/b@v0.1.0 go: module ./a2 requires go >= 1.22.0; switching to go1.22.9 go: trying upgrade to example.net/a@v0.2.0 go: trying upgrade to example.net/b@v0.1.0 go: accepting indirect upgrade from go@1.20 to 1.22.0 go: trying upgrade to example.net/c@v0.1.0 go: trying upgrade to example.net/d@v0.2.0 go: module ./d2 requires go >= 1.23.0; switching to go1.23.9 go: trying upgrade to example.net/a@v0.2.0 go: trying upgrade to example.net/b@v0.1.0 go: accepting indirect upgrade from go@1.20 to 1.22.0 go: trying upgrade to example.net/c@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: added example.net/d v0.2.0 -- go.mod -- module example go 1.20 require example.net/a v0.1.0 replace ( example.net/a v0.1.0 => ./a1 example.net/a v0.2.0 => ./a2 example.net/b v0.1.0 => ./b1 example.net/c v0.1.0 => ./c1 example.net/d v0.1.0 => ./d1 example.net/d v0.2.0 => ./d2 ) -- go.mod.tidy -- module example go 1.22.0 toolchain go1.22.9 require ( example.net/a v0.1.0 example.net/b v0.1.0 ) require ( example.net/c v0.1.0 // indirect example.net/d v0.1.0 // indirect ) replace ( example.net/a v0.1.0 => ./a1 example.net/a v0.2.0 => ./a2 example.net/b v0.1.0 => ./b1 example.net/c v0.1.0 => ./c1 example.net/d v0.1.0 => ./d1 example.net/d v0.2.0 => ./d2 ) -- go.mod.upgraded -- module example go 1.23.0 toolchain go1.23.9 require ( example.net/a v0.2.0 example.net/b v0.1.0 ) require ( example.net/c v0.1.0 // indirect example.net/d v0.2.0 // indirect ) replace ( example.net/a v0.1.0 => ./a1 example.net/a v0.2.0 => ./a2 example.net/b v0.1.0 => ./b1 example.net/c v0.1.0 => ./c1 example.net/d v0.1.0 => ./d1 example.net/d v0.2.0 => ./d2 ) -- example.go -- package example import ( _ "example.net/a" _ "example.net/b" ) -- a1/go.mod -- module example.net/a go 1.20 -- a1/a.go -- package a -- a2/go.mod -- module example.net/a go 1.22.0 toolchain go1.23.0 -- a2/a.go -- package a -- b1/go.mod -- module example.net/b go 1.22.0 toolchain go1.23.0 -- b1/b.go -- package b import _ "example.net/c" // Note: module b is intentionally untidy, as if due to a bad git merge -- c1/go.mod -- module example.net/c go 1.22.0 require example.net/d v0.1.0 -- c1/c.go -- package c import _ "example.net/d" -- d1/go.mod -- module example.net/d go 1.22.0 -- d1/d.go -- package d -- d2/go.mod -- module example.net/d go 1.23.0 -- d2/d.go -- package d