-
Notifications
You must be signed in to change notification settings - Fork 44
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
cmd/go: add yet another test case for ambiguous arguments to 'go get'
For #37438 Change-Id: Ie40971ff677d36ddadbf9834bba2d366a0fc34d0 Reviewed-on: https://go-review.googlesource.com/c/go/+/256922 Trust: Bryan C. Mills <[email protected]> Trust: Jay Conrod <[email protected]> Run-TryBot: Bryan C. Mills <[email protected]> TryBot-Result: Go Bot <[email protected]> Reviewed-by: Michael Matloob <[email protected]> Reviewed-by: Jay Conrod <[email protected]>
- Loading branch information
Bryan C. Mills
committed
Sep 30, 2020
1 parent
1eeaff7
commit bb9b319
Showing
5 changed files
with
161 additions
and
4 deletions.
There are no files selected for viewing
19 changes: 19 additions & 0 deletions
19
src/cmd/go/testdata/mod/example.net_ambiguous_nested_v0.1.0.txt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
Written by hand. | ||
|
||
Test module containing a package that is also provided by a nested module tagged | ||
with the same version. | ||
|
||
-- .mod -- | ||
module example.net/ambiguous/nested | ||
|
||
go 1.16 | ||
-- .info -- | ||
{"Version": "v0.1.0"} | ||
-- go.mod -- | ||
module example.net/ambiguous/nested | ||
|
||
go 1.16 | ||
-- pkg/pkg.go -- | ||
// Package pkg exists in both example.net/ambiguous v0.1.0 | ||
// and example.net/ambiguous/nested v0.1.0 | ||
package pkg |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
Written by hand. | ||
|
||
Test module containing a package that is also provided by a nested module tagged | ||
with the same version. | ||
|
||
-- .mod -- | ||
module example.net/ambiguous | ||
|
||
go 1.16 | ||
-- .info -- | ||
{"Version": "v0.1.0"} | ||
-- go.mod -- | ||
module example.net/ambiguous | ||
|
||
go 1.16 | ||
-- nested/pkg/pkg.go -- | ||
// Package pkg exists in both example.net/ambiguous v0.1.0 | ||
// and example.net/ambiguous/nested v0.1.0 | ||
package pkg |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
Written by hand. | ||
|
||
Test module containing a package that is also provided by a nested module tagged | ||
with the same version. | ||
|
||
-- .mod -- | ||
module example.net/ambiguous | ||
|
||
go 1.16 | ||
-- .info -- | ||
{"Version": "v0.2.0"} | ||
-- go.mod -- | ||
module example.net/ambiguous | ||
|
||
go 1.16 | ||
-- nested/pkg/README.txt -- | ||
// Package pkg no longer exists in this module at v0.2.0. | ||
// Find it in module example.net/ambiguous/nested instead. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,101 @@ | ||
# Both example.net/ambiguous v0.1.0 and example.net/ambiguous/pkg v0.1.0 exist. | ||
# 'go mod tidy' would arbitrarily choose the one with the longer path, | ||
# but 'go mod tidy' also arbitrarily chooses the latest version. | ||
|
||
cp go.mod go.mod.orig | ||
|
||
|
||
# From a clean slate, 'go get' currently does the same thing as 'go mod tidy': | ||
# it resolves the package from the module with the longest matching prefix. | ||
|
||
go get -d example.net/ambiguous/nested/[email protected] | ||
go list -m all | ||
stdout '^example.net/ambiguous/nested v0.1.0$' | ||
! stdout '^example.net/ambiguous ' | ||
|
||
|
||
# From an initial state that already depends on the shorter path, | ||
# the same 'go get' command attempts to add the longer path and fails. | ||
# | ||
# TODO(bcmills): What should really happen here? | ||
# Should we match the versioned package path against the existing package | ||
# (reducing unexpected errors), or give it the same meaning regardless of the | ||
# initial state? | ||
|
||
cp go.mod.orig go.mod | ||
go mod edit -require=example.net/[email protected] | ||
|
||
! go get -d example.net/ambiguous/nested/[email protected] | ||
stderr '^go get example.net/ambiguous/nested/[email protected]: ambiguous import: found package example.net/ambiguous/nested/pkg in multiple modules:\n\texample.net/ambiguous v0.1.0 \(.*\)\n\texample.net/ambiguous/nested v0.1.0 \(.*\)\n\z' | ||
|
||
|
||
# The user should be able to fix the aforementioned failure by explicitly | ||
# upgrading the conflicting module. | ||
|
||
go get -d example.net/[email protected] example.net/ambiguous/nested/[email protected] | ||
go list -m all | ||
stdout '^example.net/ambiguous/nested v0.1.0$' | ||
stdout '^example.net/ambiguous v0.2.0$' | ||
|
||
|
||
# ...or by explicitly NOT adding the conflicting module. | ||
# | ||
# BUG(#37438): Today, this does not work: explicit module version constraints do | ||
# not affect the package-to-module mapping during package upgrades, so the | ||
# arguments are interpreted as specifying conflicting versions of the longer | ||
# module path. | ||
|
||
cp go.mod.orig go.mod | ||
go mod edit -require=example.net/[email protected] | ||
|
||
! go get -d example.net/ambiguous/nested/[email protected] example.net/ambiguous/nested@none | ||
stderr '^go get: conflicting versions for module example.net/ambiguous/nested: v0.1.0 and none$' | ||
|
||
# go list -m all | ||
# ! stdout '^example.net/ambiguous/nested ' | ||
# stdout '^example.net/ambiguous v0.1.0$' | ||
|
||
|
||
# The user should also be able to fix it by *downgrading* the conflicting module | ||
# away. | ||
# | ||
# BUG(#37438): Today, this does not work: the "ambiguous import" error causes | ||
# 'go get' to fail before applying the requested downgrade. | ||
|
||
cp go.mod.orig go.mod | ||
go mod edit -require=example.net/[email protected] | ||
|
||
! go get -d example.net/ambiguous@none example.net/ambiguous/nested/[email protected] | ||
stderr '^go get example.net/ambiguous/nested/[email protected]: ambiguous import: found package example.net/ambiguous/nested/pkg in multiple modules:\n\texample.net/ambiguous v0.1.0 \(.*\)\n\texample.net/ambiguous/nested v0.1.0 \(.*\)\n\z' | ||
|
||
# go list -m all | ||
# stdout '^example.net/ambiguous/nested v0.1.0$' | ||
# !stdout '^example.net/ambiguous ' | ||
|
||
|
||
# In contrast, if we do the same thing tacking a wildcard pattern ('/...') on | ||
# the end of the package path, we get different behaviors depending on the | ||
# initial state, and no error. (This seems to contradict the “same meaning | ||
# regardless of the initial state” point above, but maybe that's ok?) | ||
|
||
cp go.mod.orig go.mod | ||
|
||
go get -d example.net/ambiguous/nested/pkg/[email protected] | ||
go list -m all | ||
stdout '^example.net/ambiguous/nested v0.1.0$' | ||
! stdout '^example.net/ambiguous ' | ||
|
||
|
||
cp go.mod.orig go.mod | ||
go mod edit -require=example.net/[email protected] | ||
|
||
go get -d example.net/ambiguous/nested/pkg/[email protected] | ||
go list -m all | ||
! stdout '^example.net/ambiguous/nested ' | ||
stdout '^example.net/ambiguous v0.1.0$' | ||
|
||
|
||
-- go.mod -- | ||
module test | ||
|
||
go 1.16 |