1 # Both example.net/ambiguous v0.1.0 and example.net/ambiguous/pkg v0.1.0 exist.
2 # 'go mod tidy' would arbitrarily choose the one with the longer path,
3 # but 'go mod tidy' also arbitrarily chooses the latest version.
4
5 cp go.mod go.mod.orig
6
7
8 # From a clean slate, 'go get' currently does the same thing as 'go mod tidy':
9 # it resolves the package from the module with the longest matching prefix.
10
11 go get example.net/ambiguous/nested/[email protected]
12 go list -m all
13 stdout '^example.net/ambiguous/nested v0.1.0$'
14 ! stdout '^example.net/ambiguous '
15
16
17 # From an initial state that already depends on the shorter path,
18 # the same 'go get' command should (somewhat arbitrarily) keep the
19 # existing path, since it is a valid interpretation of the command.
20
21 cp go.mod.orig go.mod
22 go mod edit -require=example.net/[email protected]
23
24 go get example.net/ambiguous/nested/[email protected]
25 go list -m all
26 stdout '^example.net/ambiguous v0.1.0$'
27 ! stdout '^example.net/ambiguous/nested '
28
29
30 # The user should be able to make the command unambiguous by explicitly
31 # upgrading the conflicting module...
32
33 go get example.net/[email protected] example.net/ambiguous/nested/[email protected]
34 go list -m all
35 stdout '^example.net/ambiguous/nested v0.1.0$'
36 stdout '^example.net/ambiguous v0.2.0$'
37
38
39 # ...or by explicitly NOT adding the conflicting module.
40
41 cp go.mod.orig go.mod
42 go mod edit -require=example.net/[email protected]
43
44 go get example.net/ambiguous/nested/[email protected] example.net/ambiguous/nested@none
45 go list -m all
46 ! stdout '^example.net/ambiguous/nested '
47 stdout '^example.net/ambiguous v0.1.0$'
48
49
50 # The user should also be able to fix it by *downgrading* the conflicting module
51 # away.
52
53 cp go.mod.orig go.mod
54 go mod edit -require=example.net/[email protected]
55
56 go get example.net/ambiguous@none example.net/ambiguous/nested/[email protected]
57 go list -m all
58 stdout '^example.net/ambiguous/nested v0.1.0$'
59 ! stdout '^example.net/ambiguous '
60
61
62 # In contrast, if we do the same thing tacking a wildcard pattern ('/...') on
63 # the end of the package path, we get different behaviors depending on the
64 # initial state, and no error. (This seems to contradict the “same meaning
65 # regardless of the initial state” point above, but maybe that's ok?)
66
67 cp go.mod.orig go.mod
68
69 go get example.net/ambiguous/nested/pkg/[email protected]
70 go list -m all
71 stdout '^example.net/ambiguous/nested v0.1.0$'
72 ! stdout '^example.net/ambiguous '
73
74
75 cp go.mod.orig go.mod
76 go mod edit -require=example.net/[email protected]
77
78 go get example.net/ambiguous/nested/pkg/[email protected]
79 go list -m all
80 ! stdout '^example.net/ambiguous/nested '
81 stdout '^example.net/ambiguous v0.1.0$'
82
83
84 -- go.mod --
85 module test
86
87 go 1.16
88
View as plain text