@@ -39,8 +39,7 @@ func LocksAreEq(l1, l2 Lock, checkHash bool) bool {
39
39
return false
40
40
}
41
41
42
- p1 = sortedLockedProjects (p1 )
43
- p2 = sortedLockedProjects (p2 )
42
+ p1 , p2 = sortLockedProjects (p1 ), sortLockedProjects (p2 )
44
43
45
44
for k , lp := range p1 {
46
45
if ! lp .Eq (p2 [k ]) {
@@ -50,8 +49,8 @@ func LocksAreEq(l1, l2 Lock, checkHash bool) bool {
50
49
return true
51
50
}
52
51
53
- // sortedLockedProjects returns a sorted copy of lps, or itself if already sorted.
54
- func sortedLockedProjects (lps []LockedProject ) []LockedProject {
52
+ // sortLockedProjects returns a sorted copy of lps, or itself if already sorted.
53
+ func sortLockedProjects (lps []LockedProject ) []LockedProject {
55
54
if len (lps ) <= 1 || sort .SliceIsSorted (lps , func (i , j int ) bool {
56
55
return lps [i ].Ident ().Less (lps [j ].Ident ())
57
56
}) {
@@ -69,7 +68,16 @@ func sortedLockedProjects(lps []LockedProject) []LockedProject {
69
68
// project's name, one or both of version and underlying revision, the network
70
69
// URI for accessing it, the path at which it should be placed within a vendor
71
70
// directory, and the packages that are used in it.
72
- type LockedProject struct {
71
+ type LockedProject interface {
72
+ Ident () ProjectIdentifier
73
+ Version () Version
74
+ Packages () []string
75
+ Eq (LockedProject ) bool
76
+ String () string
77
+ }
78
+
79
+ // lockedProject is the default implementation of LockedProject.
80
+ type lockedProject struct {
73
81
pi ProjectIdentifier
74
82
v UnpairedVersion
75
83
r Revision
@@ -109,7 +117,7 @@ func NewLockedProject(id ProjectIdentifier, v Version, pkgs []string) LockedProj
109
117
panic ("must provide a non-nil version to create a LockedProject" )
110
118
}
111
119
112
- lp := LockedProject {
120
+ lp := lockedProject {
113
121
pi : id ,
114
122
pkgs : pkgs ,
115
123
}
@@ -134,13 +142,13 @@ func NewLockedProject(id ProjectIdentifier, v Version, pkgs []string) LockedProj
134
142
// Ident returns the identifier describing the project. This includes both the
135
143
// local name (the root name by which the project is referenced in import paths)
136
144
// and the network name, where the upstream source lives.
137
- func (lp LockedProject ) Ident () ProjectIdentifier {
145
+ func (lp lockedProject ) Ident () ProjectIdentifier {
138
146
return lp .pi
139
147
}
140
148
141
149
// Version assembles together whatever version and/or revision data is
142
150
// available into a single Version.
143
- func (lp LockedProject ) Version () Version {
151
+ func (lp lockedProject ) Version () Version {
144
152
if lp .r == "" {
145
153
return lp .v
146
154
}
@@ -152,37 +160,53 @@ func (lp LockedProject) Version() Version {
152
160
return lp .v .Pair (lp .r )
153
161
}
154
162
155
- // Eq checks if two LockedProject instances are equal.
156
- func (lp LockedProject ) Eq (lp2 LockedProject ) bool {
157
- if lp .pi != lp2 .pi {
158
- return false
159
- }
160
-
161
- if lp .r != lp2 .r {
163
+ // Eq checks if two LockedProject instances are equal. The implementation
164
+ // assumes both Packages lists are already sorted lexicographically.
165
+ func (lp lockedProject ) Eq (lp2 LockedProject ) bool {
166
+ if lp .pi != lp2 .Ident () {
162
167
return false
163
168
}
164
169
165
- if len (lp .pkgs ) != len (lp2 .pkgs ) {
166
- return false
167
- }
168
-
169
- for k , v := range lp .pkgs {
170
- if lp2 .pkgs [k ] != v {
170
+ var uv UnpairedVersion
171
+ switch tv := lp2 .Version ().(type ) {
172
+ case Revision :
173
+ if lp .r != tv {
174
+ return false
175
+ }
176
+ case versionPair :
177
+ if lp .r != tv .r {
171
178
return false
172
179
}
180
+ uv = tv .v
181
+ case branchVersion , semVersion , plainVersion :
182
+ // For now, we're going to say that revisions must be present in order
183
+ // to indicate equality. We may need to change this later, as it may be
184
+ // more appropriate to enforce elsewhere.
185
+ return false
173
186
}
174
187
175
188
v1n := lp .v == nil
176
- v2n := lp2 . v == nil
189
+ v2n := uv == nil
177
190
178
191
if v1n != v2n {
179
192
return false
180
193
}
181
194
182
- if ! v1n && ! lp .v .Matches (lp2 .v ) {
195
+ if ! v1n && ! lp .v .Matches (uv ) {
196
+ return false
197
+ }
198
+
199
+ opkgs := lp2 .Packages ()
200
+ if len (lp .pkgs ) != len (opkgs ) {
183
201
return false
184
202
}
185
203
204
+ for k , v := range lp .pkgs {
205
+ if opkgs [k ] != v {
206
+ return false
207
+ }
208
+ }
209
+
186
210
return true
187
211
}
188
212
@@ -195,11 +219,11 @@ func (lp LockedProject) Eq(lp2 LockedProject) bool {
195
219
// safe to remove - it could contain C files, or other assets, that can't be
196
220
// safely removed.
197
221
// * The slice is not a copy. If you need to modify it, copy it first.
198
- func (lp LockedProject ) Packages () []string {
222
+ func (lp lockedProject ) Packages () []string {
199
223
return lp .pkgs
200
224
}
201
225
202
- func (lp LockedProject ) String () string {
226
+ func (lp lockedProject ) String () string {
203
227
return fmt .Sprintf ("%s@%s with packages: %v" ,
204
228
lp .Ident (), lp .Version (), lp .pkgs )
205
229
}
0 commit comments