Skip to content

Commit 8e20b00

Browse files
committed
Fix reflist diffs failing to compact when one of the inputs ends
The previous reflist logic would early-exit the loop body if one of the lists was empty, but that skips the compacting logic entirely. Instead of doing the early-exit, we can leave a list's ref as nil when the list end is reached and then flip the comparison result, which will essentially treat it as being greater than all others. This should preserve the general behavior without omitting the compaction. Signed-off-by: Ryan Gonzalez <ryan.gonzalez@collabora.com>
1 parent b100fb9 commit 8e20b00

2 files changed

Lines changed: 47 additions & 22 deletions

File tree

deb/reflist.go

Lines changed: 12 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -196,31 +196,21 @@ func (l *PackageRefList) Diff(r *PackageRefList, packageCollection *PackageColle
196196

197197
// until we reached end of both lists
198198
for il < ll || ir < lr {
199-
// if we've exhausted left list, pull the rest from the right
200-
if il == ll {
201-
pr, err = packageCollection.ByKey(r.Refs[ir])
202-
if err != nil {
203-
return nil, err
204-
}
205-
result = append(result, PackageDiff{Left: nil, Right: pr})
206-
ir++
207-
continue
199+
var rl, rr []byte
200+
if il < ll {
201+
rl = l.Refs[il]
208202
}
209-
// if we've exhausted right list, pull the rest from the left
210-
if ir == lr {
211-
pl, err = packageCollection.ByKey(l.Refs[il])
212-
if err != nil {
213-
return nil, err
214-
}
215-
result = append(result, PackageDiff{Left: pl, Right: nil})
216-
il++
217-
continue
203+
if ir < lr {
204+
rr = r.Refs[ir]
218205
}
219206

220-
// refs on both sides are present, load them
221-
rl, rr := l.Refs[il], r.Refs[ir]
222207
// compare refs
223208
rel := bytes.Compare(rl, rr)
209+
// an unset ref is less than all others, but since it represents the end
210+
// of a reflist, it should be *greater*, so flip the comparison result
211+
if rl == nil || rr == nil {
212+
rel = -rel
213+
}
224214

225215
if rel == 0 {
226216
// refs are identical, so are packages, advance pointer
@@ -229,14 +219,14 @@ func (l *PackageRefList) Diff(r *PackageRefList, packageCollection *PackageColle
229219
pl, pr = nil, nil
230220
} else {
231221
// load pl & pr if they haven't been loaded before
232-
if pl == nil {
222+
if pl == nil && rl != nil {
233223
pl, err = packageCollection.ByKey(rl)
234224
if err != nil {
235225
return nil, err
236226
}
237227
}
238228

239-
if pr == nil {
229+
if pr == nil && rr != nil {
240230
pr, err = packageCollection.ByKey(rr)
241231
if err != nil {
242232
return nil, err

deb/reflist_test.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,41 @@ func (s *PackageRefListSuite) TestDiff(c *C) {
237237

238238
}
239239

240+
func (s *PackageRefListSuite) TestDiffCompactsAtEnd(c *C) {
241+
db, _ := goleveldb.NewOpenDB(c.MkDir())
242+
coll := NewPackageCollection(db)
243+
244+
packages := []*Package{
245+
{Name: "app", Version: "1.1~bp1", Architecture: "i386"}, //0
246+
{Name: "app", Version: "1.1~bp2", Architecture: "i386"}, //1
247+
{Name: "app", Version: "1.1~bp2", Architecture: "amd64"}, //2
248+
}
249+
250+
for _, p := range packages {
251+
coll.Update(p)
252+
}
253+
254+
listA := NewPackageList()
255+
listA.Add(packages[0])
256+
257+
listB := NewPackageList()
258+
listB.Add(packages[1])
259+
listB.Add(packages[2])
260+
261+
reflistA := NewPackageRefListFromPackageList(listA)
262+
reflistB := NewPackageRefListFromPackageList(listB)
263+
264+
diffAB, err := reflistA.Diff(reflistB, coll)
265+
c.Check(err, IsNil)
266+
c.Check(diffAB, HasLen, 2)
267+
268+
c.Check(diffAB[0].Left, IsNil)
269+
c.Check(diffAB[0].Right.String(), Equals, "app_1.1~bp2_amd64")
270+
271+
c.Check(diffAB[1].Left.String(), Equals, "app_1.1~bp1_i386")
272+
c.Check(diffAB[1].Right.String(), Equals, "app_1.1~bp2_i386")
273+
}
274+
240275
func (s *PackageRefListSuite) TestMerge(c *C) {
241276
db, _ := goleveldb.NewOpenDB(c.MkDir())
242277
coll := NewPackageCollection(db)

0 commit comments

Comments
 (0)