mirror of
https://github.com/aptly-dev/aptly.git
synced 2026-07-16 12:08:04 +00:00
Substraction of PackageRefLists.
This commit is contained in:
Vendored
+38
@@ -421,6 +421,44 @@ func (l *PackageRefList) ForEach(handler func([]byte) error) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Substract returns all packages in l that are not in r
|
||||||
|
func (l *PackageRefList) Substract(r *PackageRefList) *PackageRefList {
|
||||||
|
result := &PackageRefList{Refs: make([][]byte, 0, 128)}
|
||||||
|
|
||||||
|
// pointer to left and right reflists
|
||||||
|
il, ir := 0, 0
|
||||||
|
// length of reflists
|
||||||
|
ll, lr := l.Len(), r.Len()
|
||||||
|
|
||||||
|
for il < ll || ir < lr {
|
||||||
|
if il == ll {
|
||||||
|
// left list exhausted, we got the result
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if ir == lr {
|
||||||
|
// right list exhausted, append what is left to result
|
||||||
|
result.Refs = append(result.Refs, l.Refs[il:]...)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
rel := bytes.Compare(l.Refs[il], r.Refs[ir])
|
||||||
|
if rel == 0 {
|
||||||
|
// r contains entry from l, so we skip it
|
||||||
|
il++
|
||||||
|
ir++
|
||||||
|
} else if rel < 0 {
|
||||||
|
// item il is not in r, append
|
||||||
|
result.Refs = append(result.Refs, l.Refs[il])
|
||||||
|
il++
|
||||||
|
} else {
|
||||||
|
// skip over to next item in r
|
||||||
|
ir++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
// PackageDiff is a difference between two packages in a list.
|
// PackageDiff is a difference between two packages in a list.
|
||||||
//
|
//
|
||||||
// If left & right are present, difference is in package version
|
// If left & right are present, difference is in package version
|
||||||
|
|||||||
Vendored
+22
@@ -326,6 +326,28 @@ func (s *PackageListSuite) TestPackageRefListForeach(c *C) {
|
|||||||
c.Check(err, Equals, e)
|
c.Check(err, Equals, e)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *PackageListSuite) TestSubstract(c *C) {
|
||||||
|
r1 := []byte("r1")
|
||||||
|
r2 := []byte("r2")
|
||||||
|
r3 := []byte("r3")
|
||||||
|
r4 := []byte("r4")
|
||||||
|
r5 := []byte("r5")
|
||||||
|
|
||||||
|
empty := &PackageRefList{Refs: [][]byte{}}
|
||||||
|
l1 := &PackageRefList{Refs: [][]byte{r1, r2, r3, r4}}
|
||||||
|
l2 := &PackageRefList{Refs: [][]byte{r1, r3}}
|
||||||
|
l3 := &PackageRefList{Refs: [][]byte{r2, r4}}
|
||||||
|
l4 := &PackageRefList{Refs: [][]byte{r4, r5}}
|
||||||
|
l5 := &PackageRefList{Refs: [][]byte{r1, r2, r3}}
|
||||||
|
|
||||||
|
c.Check(l1.Substract(empty), DeepEquals, l1)
|
||||||
|
c.Check(l1.Substract(l2), DeepEquals, l3)
|
||||||
|
c.Check(l1.Substract(l3), DeepEquals, l2)
|
||||||
|
c.Check(l1.Substract(l4), DeepEquals, l5)
|
||||||
|
c.Check(empty.Substract(l1), DeepEquals, empty)
|
||||||
|
c.Check(l2.Substract(l3), DeepEquals, l2)
|
||||||
|
}
|
||||||
|
|
||||||
func (s *PackageListSuite) TestDiff(c *C) {
|
func (s *PackageListSuite) TestDiff(c *C) {
|
||||||
db, _ := database.OpenDB(c.MkDir())
|
db, _ := database.OpenDB(c.MkDir())
|
||||||
coll := NewPackageCollection(db)
|
coll := NewPackageCollection(db)
|
||||||
|
|||||||
Reference in New Issue
Block a user