From: Bryan C. Mills Date: Tue, 15 Sep 2020 21:33:48 +0000 (-0400) Subject: cmd/go: test the behavior of 'go get' in module mode with package vs. module arguments X-Git-Tag: go1.16beta1~999 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=c47ba5fbfb86edbf49450b8b7b173ab2d188f41f;p=gostls13.git cmd/go: test the behavior of 'go get' in module mode with package vs. module arguments Updates #37438 Change-Id: I5beb380b37532571768a92bea50003f6ff1757e1 Reviewed-on: https://go-review.googlesource.com/c/go/+/255054 Trust: Bryan C. Mills Run-TryBot: Bryan C. Mills TryBot-Result: Go Bot Reviewed-by: Michael Matloob Reviewed-by: Jay Conrod --- diff --git a/src/cmd/go/testdata/script/mod_get_ambiguous_arg.txt b/src/cmd/go/testdata/script/mod_get_ambiguous_arg.txt new file mode 100644 index 0000000000..7729f29ced --- /dev/null +++ b/src/cmd/go/testdata/script/mod_get_ambiguous_arg.txt @@ -0,0 +1,124 @@ +go mod tidy +cp go.mod go.mod.orig + +# If there is no sensible *package* meaning for 'm/p', perhaps it should refer +# to *module* m/p? +# Today, it still seems to refer to the package. + +! go get -d m/p@v0.1.0 +stderr 'go get m/p@v0.1.0: module m/p@latest found \(v0.1.0, replaced by ./mp01\), but does not contain package m/p' +cmp go.mod.orig go.mod + + +# TODO(#37438): If we add v0.2.0 before this point, we end up (somehow!) +# resolving m/p@v0.1.0 as *both* a module and a package. + +cp go.mod.orig go.mod +go mod edit -replace=m@v0.2.0=./m02 +go mod edit -replace=m/p@v0.2.0=./mp02 + +# The argument 'm/p' in 'go get m/p' refers to *package* m/p, +# which is in module m. +# +# (It only refers to *module* m/p if there is no such package at the +# requested version.) + +go get -d m/p@v0.2.0 +go list -m all +stdout '^m v0.2.0 ' +stdout '^m/p v0.1.0 ' + +# Repeating the above with module m/p already in the module graph does not +# change its meaning. + +go get -d m/p@v0.2.0 +go list -m all +stdout '^m v0.2.0 ' +stdout '^m/p v0.1.0 ' + + +# TODO(#37438): If we add v0.3.0 before this point, we get a totally bogus error +# today, because 'go get' ends up attempting to resolve package 'm/p' without a +# specific version and can't find it if module m no longer contains v0.3.0. + +cp go.mod.orig go.mod +go mod edit -replace=m@v0.3.0=./m03 +go mod edit -replace=m/p@v0.3.0=./mp03 + +! go get -d m/p@v0.2.0 +stderr 'go get m/p@v0.2.0: module m/p@latest found \(v0.3.0, replaced by ./mp03\), but does not contain package m/p$' + +# If there is no sensible package meaning for 'm/p', perhaps it should refer +# to *module* m/p? +# Today, it still seems to refer to the package. + +! go get -d m/p@v0.3.0 +stderr '^go get m/p@v0.3.0: module m/p@latest found \(v0\.3\.0, replaced by \./mp03\), but does not contain package m/p$' + + +-- go.mod -- +module example.com + +go 1.16 + +replace ( + m v0.1.0 => ./m01 + m/p v0.1.0 => ./mp01 +) +-- m01/go.mod -- +module m + +go 1.16 +-- m01/README.txt -- +Module m at v0.3.0 does not yet contain package p. + +-- m02/go.mod -- +module m + +go 1.16 + +require m/p v0.1.0 +-- m02/p/p.go -- +// Package p is present in module m, but not module m/p. +package p + +-- m03/go.mod -- +module m + +go 1.16 + +require m/p v0.1.0 +-- m03/README.txt -- +Module m at v0.3.0 no longer contains package p. + +-- mv2/go.mod -- +module m/v2 + +go 1.16 +-- mv2/README.txt -- +This module is m/v2. It doesn't actually need to exist, +but it explains how module m could plausibly exist +and still contain package p at 'latest' even when module +m/p also exists. + +-- mp01/go.mod -- +module m/p + +go 1.16 +-- mp01/README.txt -- +This module is m/p. +Package m/p no longer exists. +-- mp02/go.mod -- +module m/p + +go 1.16 +-- mp02/README.txt -- +This module is m/p. +Package m/p no longer exists. +-- mp03/go.mod -- +module m/p + +go 1.16 +-- mp03/README.txt -- +This module is m/p. +Package m/p no longer exists.