MCPcopy Index your code
hub / github.com/aptly-dev/aptly / Diff

Method Diff

deb/reflist.go:190–265  ·  view source on GitHub ↗

Diff calculates difference between two reflists

(r *PackageRefList, packageCollection *PackageCollection)

Source from the content-addressed store, hash-verified

188
189// Diff calculates difference between two reflists
190func (l *PackageRefList) Diff(r *PackageRefList, packageCollection *PackageCollection) (result PackageDiffs, err error) {
191 result = make(PackageDiffs, 0, 128)
192
193 // pointer to left and right reflists
194 il, ir := 0, 0
195 // length of reflists
196 ll, lr := l.Len(), r.Len()
197 // cached loaded packages on the left & right
198 pl, pr := (*Package)(nil), (*Package)(nil)
199
200 // until we reached end of both lists
201 for il < ll || ir < lr {
202 var rl, rr []byte
203 if il < ll {
204 rl = l.Refs[il]
205 }
206 if ir < lr {
207 rr = r.Refs[ir]
208 }
209
210 // compare refs
211 rel := bytes.Compare(rl, rr)
212 // an unset ref is less than all others, but since it represents the end
213 // of a reflist, it should be *greater*, so flip the comparison result
214 if rl == nil || rr == nil {
215 rel = -rel
216 }
217
218 if rel == 0 {
219 // refs are identical, so are packages, advance pointer
220 il++
221 ir++
222 pl, pr = nil, nil
223 } else {
224 // load pl & pr if they haven't been loaded before
225 if pl == nil && rl != nil {
226 pl, err = packageCollection.ByKey(rl)
227 if err != nil {
228 return nil, err
229 }
230 }
231
232 if pr == nil && rr != nil {
233 pr, err = packageCollection.ByKey(rr)
234 if err != nil {
235 return nil, err
236 }
237 }
238
239 // otherwise pl or pr is missing on one of the sides
240 if rel < 0 {
241 // compaction: +(,A) -(B,) --> !(A,B)
242 if len(result) > 0 && result[len(result)-1].Left == nil && result[len(result)-1].Right.Name == pl.Name &&
243 result[len(result)-1].Right.Architecture == pl.Architecture {
244 result[len(result)-1] = PackageDiff{Left: pl, Right: result[len(result)-1].Right}
245 } else {
246 result = append(result, PackageDiff{Left: pl, Right: nil})
247 }

Callers 4

TestDiffMethod · 0.80
TestDiffCompactsAtEndMethod · 0.80
aptlySnapshotDiffFunction · 0.80
apiSnapshotsDiffFunction · 0.80

Calls 2

LenMethod · 0.95
ByKeyMethod · 0.80

Tested by 2

TestDiffMethod · 0.64
TestDiffCompactsAtEndMethod · 0.64