@@ -68,10 +68,10 @@ type LockDiff struct {
68
68
Modify []LockedProjectDiff
69
69
}
70
70
71
- type LockDiff2 struct {
71
+ type LockDelta struct {
72
72
AddedImportInputs []string
73
73
RemovedImportInputs []string
74
- ProjectDiffs map [gps.ProjectRoot ]LockedProjectDiff2
74
+ ProjectDeltas map [gps.ProjectRoot ]LockedProjectDelta
75
75
}
76
76
77
77
// LockedProjectDiff contains the before and after snapshot of a project reference.
@@ -85,13 +85,13 @@ type LockedProjectDiff struct {
85
85
Packages []StringDiff
86
86
}
87
87
88
- type LockedProjectDiff2 struct {
88
+ type LockedProjectDelta struct {
89
89
Name gps.ProjectRoot
90
90
ProjectRemoved , ProjectAdded bool
91
- LockedProjectPartsDiff
91
+ LockedProjectPartsDelta
92
92
}
93
93
94
- type LockedProjectPartsDiff struct {
94
+ type LockedProjectPartsDelta struct {
95
95
PackagesAdded , PackagesRemoved []string
96
96
VersionBefore , VersionAfter gps.UnpairedVersion
97
97
RevisionBefore , RevisionAfter gps.Revision
@@ -100,13 +100,13 @@ type LockedProjectPartsDiff struct {
100
100
HashChanged , HashVersionChanged bool
101
101
}
102
102
103
- // DiffLocks compares two locks and identifies the differences between them.
104
- // Returns nil if there are no differences .
105
- func DiffLocks2 (l1 , l2 gps.Lock ) LockDiff2 {
103
+ // DiffLocks2 compares two locks and computes a semantically rich delta between
104
+ // them .
105
+ func DiffLocks2 (l1 , l2 gps.Lock ) LockDelta {
106
106
// Default nil locks to empty locks, so that we can still generate a diff
107
107
if l1 == nil {
108
108
if l2 == nil {
109
- return LockDiff2 {}
109
+ return LockDelta {}
110
110
}
111
111
l1 = gps.SimpleLock {}
112
112
}
@@ -119,16 +119,16 @@ func DiffLocks2(l1, l2 gps.Lock) LockDiff2 {
119
119
p1 = sortLockedProjects (p1 )
120
120
p2 = sortLockedProjects (p2 )
121
121
122
- diff := LockDiff2 {
123
- ProjectDiffs : make (map [gps.ProjectRoot ]LockedProjectDiff2 ),
122
+ diff := LockDelta {
123
+ ProjectDeltas : make (map [gps.ProjectRoot ]LockedProjectDelta ),
124
124
}
125
125
126
126
var i2next int
127
127
for i1 := 0 ; i1 < len (p1 ); i1 ++ {
128
128
lp1 := p1 [i1 ]
129
129
pr1 := lp1 .Ident ().ProjectRoot
130
130
131
- lpd := LockedProjectDiff2 {
131
+ lpd := LockedProjectDelta {
132
132
Name : pr1 ,
133
133
}
134
134
@@ -138,10 +138,10 @@ func DiffLocks2(l1, l2 gps.Lock) LockDiff2 {
138
138
139
139
switch strings .Compare (string (pr1 ), string (pr2 )) {
140
140
case 0 : // Found a matching project
141
- lpd .LockedProjectPartsDiff = DiffProjects2 (lp1 , lp2 )
141
+ lpd .LockedProjectPartsDelta = DiffProjects2 (lp1 , lp2 )
142
142
i2next = i2 + 1 // Don't visit this project again
143
143
case + 1 : // Found a new project
144
- diff .ProjectDiffs [pr2 ] = LockedProjectDiff2 {
144
+ diff .ProjectDeltas [pr2 ] = LockedProjectDelta {
145
145
Name : pr2 ,
146
146
ProjectAdded : true ,
147
147
}
@@ -154,14 +154,14 @@ func DiffLocks2(l1, l2 gps.Lock) LockDiff2 {
154
154
break // Done evaluating this project, move onto the next
155
155
}
156
156
157
- diff .ProjectDiffs [pr1 ] = lpd
157
+ diff .ProjectDeltas [pr1 ] = lpd
158
158
}
159
159
160
160
// Anything that still hasn't been evaluated are adds
161
161
for i2 := i2next ; i2 < len (p2 ); i2 ++ {
162
162
lp2 := p2 [i2 ]
163
163
pr2 := lp2 .Ident ().ProjectRoot
164
- diff .ProjectDiffs [pr2 ] = LockedProjectDiff2 {
164
+ diff .ProjectDeltas [pr2 ] = LockedProjectDelta {
165
165
Name : pr2 ,
166
166
ProjectAdded : true ,
167
167
}
@@ -205,8 +205,8 @@ func findAddedAndRemoved(l1, l2 []string) (add, remove []string) {
205
205
return add , remove
206
206
}
207
207
208
- func DiffProjects2 (lp1 , lp2 gps.LockedProject ) LockedProjectPartsDiff {
209
- ld := LockedProjectPartsDiff {
208
+ func DiffProjects2 (lp1 , lp2 gps.LockedProject ) LockedProjectPartsDelta {
209
+ ld := LockedProjectPartsDelta {
210
210
SourceBefore : lp1 .Ident ().Source ,
211
211
SourceAfter : lp2 .Ident ().Source ,
212
212
}
@@ -239,51 +239,118 @@ func DiffProjects2(lp1, lp2 gps.LockedProject) LockedProjectPartsDiff {
239
239
if ok1 && ok2 {
240
240
ld .PruneOptsBefore , ld .PruneOptsAfter = vp1 .PruneOpts , vp2 .PruneOpts
241
241
242
- // Only consider hashes for diffing if neither were the zero value.
243
- if ! vp1 .Digest .IsEmpty () && ! vp2 .Digest .IsEmpty () {
244
- if vp1 .Digest .HashVersion != vp2 .Digest .HashVersion {
245
- ld .HashVersionChanged = true
246
- }
247
- if ! bytes .Equal (vp1 .Digest .Digest , vp2 .Digest .Digest ) {
248
- ld .HashChanged = true
249
- }
242
+ if vp1 .Digest .HashVersion != vp2 .Digest .HashVersion {
243
+ ld .HashVersionChanged = true
244
+ }
245
+ if ! bytes .Equal (vp1 .Digest .Digest , vp2 .Digest .Digest ) {
246
+ ld .HashChanged = true
250
247
}
248
+ } else if ok1 {
249
+ ld .PruneOptsBefore = vp1 .PruneOpts
250
+ ld .HashVersionChanged = true
251
+ ld .HashChanged = true
252
+ } else if ok2 {
253
+ ld .PruneOptsAfter = vp2 .PruneOpts
254
+ ld .HashVersionChanged = true
255
+ ld .HashChanged = true
251
256
}
252
257
253
258
return ld
254
259
}
255
260
256
- func (ld LockDiff2 ) Changed () bool {
257
- if len (ld .AddedImportInputs ) > 0 || len (ld .RemovedImportInputs ) > 0 {
261
+ type DeltaDimension uint16
262
+
263
+ const (
264
+ InputImportsChanged DeltaDimension = 1 << iota
265
+ ProjectAdded
266
+ ProjectRemoved
267
+ SourceChanged
268
+ VersionChanged
269
+ RevisionChanged
270
+ PackagesChanged
271
+ PruneOptsChanged
272
+ HashVersionChanged
273
+ HashChanged
274
+ AnyChanged = (1 << iota ) - 1
275
+ )
276
+
277
+ func (ld LockDelta ) Changed (flags DeltaDimension ) bool {
278
+ if flags & InputImportsChanged != 0 && (len (ld .AddedImportInputs ) > 0 || len (ld .RemovedImportInputs ) > 0 ) {
258
279
return true
259
280
}
260
281
261
- for _ , ld := range ld .ProjectDiffs {
262
- if ld .Changed () {
282
+ for _ , ld := range ld .ProjectDeltas {
283
+ if ld .Changed (AnyChanged ) {
263
284
return true
264
285
}
265
286
}
266
287
267
288
return false
268
289
}
269
290
270
- func (ld LockedProjectDiff2 ) Changed () bool {
271
- return ld .WasRemoved () || ld .WasAdded () || ld .RevisionChanged () || ld .VersionChanged () || ld .SourceChanged () || ld .PackagesChanged () || ld .HashChanged || ld .HashVersionChanged
291
+ // Changed indicates whether the delta contains a change along the dimensions
292
+ // with their corresponding bits set.
293
+ //
294
+ // For example, if only the Revision changed, and this method is called with
295
+ // SourceChanged | VersionChanged, it will return false; if it is called with
296
+ // VersionChanged | RevisionChanged, it will return true.
297
+ func (ld LockedProjectDelta ) Changed (flags DeltaDimension ) bool {
298
+ if flags & ProjectAdded != 0 && ld .WasAdded () {
299
+ return true
300
+ }
301
+
302
+ if flags & ProjectRemoved != 0 && ld .WasRemoved () {
303
+ return true
304
+ }
305
+
306
+ return ld .LockedProjectPartsDelta .Changed (flags & ^ ProjectAdded & ^ ProjectRemoved )
272
307
}
273
308
274
- func (ld LockedProjectDiff2 ) WasRemoved () bool {
309
+ func (ld LockedProjectDelta ) WasRemoved () bool {
275
310
return ld .ProjectRemoved
276
311
}
277
312
278
- func (ld LockedProjectDiff2 ) WasAdded () bool {
313
+ func (ld LockedProjectDelta ) WasAdded () bool {
279
314
return ld .ProjectAdded
280
315
}
281
316
282
- func (ld LockedProjectPartsDiff ) SourceChanged () bool {
317
+ func (ld LockedProjectPartsDelta ) Changed (flags DeltaDimension ) bool {
318
+ if flags & SourceChanged != 0 && ld .SourceChanged () {
319
+ return true
320
+ }
321
+
322
+ if flags & RevisionChanged != 0 && ld .RevisionChanged () {
323
+ return true
324
+ }
325
+
326
+ if flags & PruneOptsChanged != 0 && ld .PruneOptsChanged () {
327
+ return true
328
+ }
329
+
330
+ if flags & HashChanged != 0 && ld .HashChanged {
331
+ return true
332
+ }
333
+
334
+ if flags & HashVersionChanged != 0 && ld .HashVersionChanged {
335
+ return true
336
+ }
337
+
338
+ if flags & VersionChanged != 0 && ld .VersionChanged () {
339
+ return true
340
+ }
341
+
342
+ if flags & PackagesChanged != 0 && ld .PackagesChanged () {
343
+ return true
344
+ }
345
+
346
+ return false
347
+ }
348
+
349
+ func (ld LockedProjectPartsDelta ) SourceChanged () bool {
283
350
return ld .SourceBefore != ld .SourceAfter
284
351
}
285
352
286
- func (ld LockedProjectPartsDiff ) VersionChanged () bool {
353
+ func (ld LockedProjectPartsDelta ) VersionChanged () bool {
287
354
if ld .VersionBefore == nil && ld .VersionAfter == nil {
288
355
return false
289
356
} else if (ld .VersionBefore == nil || ld .VersionAfter == nil ) || (ld .VersionBefore .Type () != ld .VersionAfter .Type ()) {
@@ -295,7 +362,7 @@ func (ld LockedProjectPartsDiff) VersionChanged() bool {
295
362
return false
296
363
}
297
364
298
- func (ld LockedProjectPartsDiff ) VersionTypeChanged () bool {
365
+ func (ld LockedProjectPartsDelta ) VersionTypeChanged () bool {
299
366
if ld .VersionBefore == nil && ld .VersionAfter == nil {
300
367
return false
301
368
} else if (ld .VersionBefore == nil || ld .VersionAfter == nil ) || (ld .VersionBefore .Type () != ld .VersionAfter .Type ()) {
@@ -305,15 +372,15 @@ func (ld LockedProjectPartsDiff) VersionTypeChanged() bool {
305
372
return false
306
373
}
307
374
308
- func (ld LockedProjectPartsDiff ) RevisionChanged () bool {
375
+ func (ld LockedProjectPartsDelta ) RevisionChanged () bool {
309
376
return ld .RevisionBefore != ld .RevisionAfter
310
377
}
311
378
312
- func (ld LockedProjectPartsDiff ) PackagesChanged () bool {
379
+ func (ld LockedProjectPartsDelta ) PackagesChanged () bool {
313
380
return len (ld .PackagesAdded ) > 0 || len (ld .PackagesRemoved ) > 0
314
381
}
315
382
316
- func (ld LockedProjectPartsDiff ) PruneOptsChanged () bool {
383
+ func (ld LockedProjectPartsDelta ) PruneOptsChanged () bool {
317
384
return ld .PruneOptsBefore != ld .PruneOptsAfter
318
385
}
319
386
@@ -518,3 +585,8 @@ func DiffProjects(lp1, lp2 gps.LockedProject) *LockedProjectDiff {
518
585
}
519
586
return & diff
520
587
}
588
+
589
+ type VendorDiff struct {
590
+ LockDelta LockDelta
591
+ VendorStatus map [string ]VendorStatus
592
+ }
0 commit comments