Diffing without overrideMatching.

This commit is contained in:
Andrey Smirnov
2014-02-11 17:26:18 +04:00
parent 8d72f1a959
commit 94616e1b06
2 changed files with 39 additions and 21 deletions

44
debian/list.go vendored
View File

@@ -357,6 +357,11 @@ var (
_ sort.Interface = &PackageRefList{}
)
// NewPackageRefList creates empty PackageRefList
func NewPackageRefList() *PackageRefList {
return &PackageRefList{}
}
// NewPackageRefListFromPackageList creates PackageRefList from PackageList
func NewPackageRefListFromPackageList(list *PackageList) *PackageRefList {
reflist := &PackageRefList{}
@@ -513,9 +518,9 @@ func (l *PackageRefList) Diff(r *PackageRefList, packageCollection *PackageColle
return
}
// Merge merges reflist r into current reflist. Merge replaces matching packages (by architecture/name)
// with reference from r.
func (l *PackageRefList) Merge(r *PackageRefList) (result *PackageRefList) {
// Merge merges reflist r into current reflist. If overrideMatching, merge replaces matching packages (by architecture/name)
// with reference from r, otherwise all packages are saved.
func (l *PackageRefList) Merge(r *PackageRefList, overrideMatching bool) (result *PackageRefList) {
// pointer to left and right reflists
il, ir := 0, 0
// length of reflists
@@ -548,28 +553,31 @@ func (l *PackageRefList) Merge(r *PackageRefList) (result *PackageRefList) {
il++
ir++
} else {
partsL := bytes.Split(rl, []byte(" "))
archL, nameL := partsL[0][1:], partsL[1]
if overrideMatching {
partsL := bytes.Split(rl, []byte(" "))
archL, nameL := partsL[0][1:], partsL[1]
partsR := bytes.Split(rr, []byte(" "))
archR, nameR := partsR[0][1:], partsR[1]
partsR := bytes.Split(rr, []byte(" "))
archR, nameR := partsR[0][1:], partsR[1]
if bytes.Compare(archL, archR) == 0 && bytes.Compare(nameL, nameR) == 0 {
// override with package from the right
result.Refs = append(result.Refs, r.Refs[ir])
il++
ir++
} else {
// otherwise append smallest of two
if rel < 0 {
result.Refs = append(result.Refs, l.Refs[il])
il++
} else {
if bytes.Compare(archL, archR) == 0 && bytes.Compare(nameL, nameR) == 0 {
// override with package from the right
result.Refs = append(result.Refs, r.Refs[ir])
il++
ir++
continue
}
}
// otherwise append smallest of two
if rel < 0 {
result.Refs = append(result.Refs, l.Refs[il])
il++
} else {
result.Refs = append(result.Refs, r.Refs[ir])
ir++
}
}
}

16
debian/list_test.go vendored
View File

@@ -280,6 +280,9 @@ func (s *PackageListSuite) TestNewPackageRefList(c *C) {
c.Check(reflist.Refs[1], DeepEquals, []byte(s.p6.Key()))
c.Check(reflist.Refs[2], DeepEquals, []byte(s.p5.Key()))
c.Check(reflist.Refs[3], DeepEquals, []byte(s.p3.Key()))
reflist = NewPackageRefList()
c.Check(reflist.Len(), Equals, 0)
}
func (s *PackageListSuite) TestPackageRefListEncodeDecode(c *C) {
@@ -431,9 +434,6 @@ func (s *PackageListSuite) TestMerge(c *C) {
reflistA := NewPackageRefListFromPackageList(listA)
reflistB := NewPackageRefListFromPackageList(listB)
mergeAB := reflistA.Merge(reflistB)
mergeBA := reflistB.Merge(reflistA)
toStrSlice := func(reflist *PackageRefList) (result []string) {
result = make([]string, reflist.Len())
for i, r := range reflist.Refs {
@@ -442,8 +442,18 @@ func (s *PackageListSuite) TestMerge(c *C) {
return
}
mergeAB := reflistA.Merge(reflistB, true)
mergeBA := reflistB.Merge(reflistA, true)
c.Check(toStrSlice(mergeAB), DeepEquals,
[]string{"Pall data 1.1~bp1", "Pamd64 app 1.1~bp2", "Pi386 app 1.1~bp2", "Pi386 dpkg 1.0", "Pi386 lib 1.0", "Psparc xyz 1.0"})
c.Check(toStrSlice(mergeBA), DeepEquals,
[]string{"Pall data 1.1~bp1", "Pamd64 app 1.1~bp2", "Pi386 app 1.1~bp1", "Pi386 dpkg 1.7", "Pi386 lib 1.0", "Psparc xyz 1.0"})
mergeABall := reflistA.Merge(reflistB, false)
mergeBAall := reflistB.Merge(reflistA, false)
c.Check(mergeABall, DeepEquals, mergeBAall)
c.Check(toStrSlice(mergeBAall), DeepEquals,
[]string{"Pall data 1.1~bp1", "Pamd64 app 1.1~bp2", "Pi386 app 1.1~bp1", "Pi386 app 1.1~bp2", "Pi386 dpkg 1.0", "Pi386 dpkg 1.7", "Pi386 lib 1.0", "Psparc xyz 1.0"})
}