Skip to content

Commit

Permalink
cmd/go: add yet another test case for ambiguous arguments to 'go get'
Browse files Browse the repository at this point in the history
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
Show file tree
Hide file tree
Showing 5 changed files with 161 additions and 4 deletions.
19 changes: 19 additions & 0 deletions src/cmd/go/testdata/mod/example.net_ambiguous_nested_v0.1.0.txt
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
19 changes: 19 additions & 0 deletions src/cmd/go/testdata/mod/example.net_ambiguous_v0.1.0.txt
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
18 changes: 18 additions & 0 deletions src/cmd/go/testdata/mod/example.net_ambiguous_v0.2.0.txt
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.
8 changes: 4 additions & 4 deletions src/cmd/go/testdata/script/mod_get_ambiguous_arg.txt
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ module m

go 1.16
-- m01/README.txt --
Module m at v0.3.0 does not yet contain package p.
Module m at v0.1.0 does not yet contain package p.

-- m02/go.mod --
module m
Expand Down Expand Up @@ -107,18 +107,18 @@ module m/p
go 1.16
-- mp01/README.txt --
This module is m/p.
Package m/p no longer exists.
Package m/p does not exist in this module.
-- mp02/go.mod --
module m/p

go 1.16
-- mp02/README.txt --
This module is m/p.
Package m/p no longer exists.
Package m/p does not exist in this module.
-- mp03/go.mod --
module m/p

go 1.16
-- mp03/README.txt --
This module is m/p.
Package m/p no longer exists.
Package m/p does not exist in this module.
101 changes: 101 additions & 0 deletions src/cmd/go/testdata/script/mod_get_ambiguous_pkg.txt
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

0 comments on commit bb9b319

Please sign in to comment.