1 # https://golang.org/issue/46141: 'go mod tidy' for a Go 1.17 module should by
2 # default preserve enough checksums for the module to be used by Go 1.16.
3 #
4 # We don't have a copy of Go 1.16 handy, but we can simulate it by editing the
5 # 'go' version in the go.mod file to 1.16, without actually updating the
6 # requirements to match.
7
8 [short] skip
9
10 env MODFMT='{{with .Module}}{{.Path}} {{.Version}}{{end}}'
11
12
13 # For this module, Go 1.17 produces an error for one module, and Go 1.16
14 # produces a different error for a different module.
15
16 cp go.mod go.mod.orig
17
18 ! go mod tidy
19
20 stderr '^go: example\.com/m imports\n\texample\.net/added: module example\.net/added@latest found \(v0\.3\.0, replaced by \./a1\), but does not contain package example\.net/added$'
21
22 cmp go.mod go.mod.orig
23
24 # Make sure that -diff behaves the same as tidy.
25 [exec:patch] cp go.mod.orig go.mod
26 [exec:patch] ! exists go.sum
27 [exec:patch] ! go mod tidy -diff
28 [exec:patch] ! stdout .
29 [exec:patch] stderr '^go: example\.com/m imports\n\texample\.net/added: module example\.net/added@latest found \(v0\.3\.0, replaced by \./a1\), but does not contain package example\.net/added$'
30
31 # When we run 'go mod tidy -e', we should proceed past the first error and follow
32 # it with a second error describing the version discrepancy.
33 #
34 # We should not provide advice on how to push past the version discrepancy,
35 # because the '-e' flag should already do that, writing out an otherwise-tidied
36 # go.mod file.
37
38 go mod tidy -e
39
40 stderr '^go: example\.com/m imports\n\texample\.net/added: module example\.net/added@latest found \(v0\.3\.0, replaced by \./a1\), but does not contain package example\.net/added\ngo: example\.net/added failed to load from any module,\n\tbut go 1\.16 would load it from example\.net/added@v0\.2\.0$'
41
42 ! stderr '\n\tgo mod tidy'
43
44 cmp go.mod go.mod.tidy
45
46 # Make sure that -diff behaves the same as tidy.
47 [exec:patch] cp go.mod go.mod.tidyResult
48 [exec:patch] ! exists go.sum
49 [exec:patch] cp go.mod.orig go.mod
50 [exec:patch] ! go mod tidy -e -diff
51 [exec:patch] stdout 'diff current/go.mod tidy/go.mod'
52 [exec:patch] stderr '^go: example\.com/m imports\n\texample\.net/added: module example\.net/added@latest found \(v0\.3\.0, replaced by \./a1\), but does not contain package example\.net/added\ngo: example\.net/added failed to load from any module,\n\tbut go 1\.16 would load it from example\.net/added@v0\.2\.0$'
53 [exec:patch] ! stderr '\n\tgo mod tidy'
54 [exec:patch] cp stdout diff.patch
55 [exec:patch] exec patch -p1 -i diff.patch
56 [exec:patch] go mod tidy -e -diff
57 [exec:patch] ! stdout .
58 [exec:patch] cmp go.mod go.mod.tidyResult
59 [exec:patch] ! exists go.sum
60
61 -- go.mod --
62 module example.com/m
63
64 go 1.17
65
66 replace (
67 example.net/added v0.1.0 => ./a1
68 example.net/added v0.2.0 => ./a2
69 example.net/added v0.3.0 => ./a1
70 example.net/lazy v0.1.0 => ./lazy
71 example.net/pruned v0.1.0 => ./pruned
72 )
73
74 require (
75 example.net/added v0.1.0
76 example.net/lazy v0.1.0
77 )
78 -- go.mod.tidy --
79 module example.com/m
80
81 go 1.17
82
83 replace (
84 example.net/added v0.1.0 => ./a1
85 example.net/added v0.2.0 => ./a2
86 example.net/added v0.3.0 => ./a1
87 example.net/lazy v0.1.0 => ./lazy
88 example.net/pruned v0.1.0 => ./pruned
89 )
90
91 require example.net/lazy v0.1.0
92 -- m.go --
93 package m
94
95 import (
96 _ "example.net/added"
97 _ "example.net/lazy"
98 )
99
100 -- a1/go.mod --
101 module example.net/added
102
103 go 1.17
104 -- a2/go.mod --
105 module example.net/added
106
107 go 1.17
108 -- a2/added.go --
109 package added
110
111 -- lazy/go.mod --
112 module example.net/lazy
113
114 go 1.17
115
116 require example.net/pruned v0.1.0
117 -- lazy/lazy.go --
118 package lazy
119
120 -- pruned/go.mod --
121 module example.net/pruned
122
123 go 1.17
124
125 require example.net/added v0.2.0
126
View as plain text