mirror of
https://github.com/aptly-dev/aptly.git
synced 2026-05-06 22:18:28 +00:00
When merging reflists, never allow duplicate (name, version, arch) tuples. #154
Even for conficting packages.
This commit is contained in:
+16
-6
@@ -285,13 +285,23 @@ func (l *PackageRefList) Merge(r *PackageRefList, overrideMatching bool) (result
|
|||||||
overridenName = nil
|
overridenName = nil
|
||||||
overriddenArch = nil
|
overriddenArch = nil
|
||||||
} else {
|
} else {
|
||||||
|
partsL := bytes.Split(rl, []byte(" "))
|
||||||
|
archL, nameL, versionL := partsL[0][1:], partsL[1], partsL[2]
|
||||||
|
|
||||||
|
partsR := bytes.Split(rr, []byte(" "))
|
||||||
|
archR, nameR, versionR := partsR[0][1:], partsR[1], partsR[2]
|
||||||
|
|
||||||
|
if bytes.Equal(archL, archR) && bytes.Equal(nameL, nameR) && bytes.Equal(versionL, versionR) {
|
||||||
|
// conflicting duplicates with same arch, name, version, but different file hash
|
||||||
|
result.Refs = append(result.Refs, r.Refs[ir])
|
||||||
|
il++
|
||||||
|
ir++
|
||||||
|
overridenName = nil
|
||||||
|
overriddenArch = nil
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
if overrideMatching {
|
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]
|
|
||||||
|
|
||||||
if bytes.Equal(archL, overriddenArch) && bytes.Equal(nameL, overridenName) {
|
if bytes.Equal(archL, overriddenArch) && bytes.Equal(nameL, overridenName) {
|
||||||
// this package has already been overriden on the right
|
// this package has already been overriden on the right
|
||||||
il++
|
il++
|
||||||
|
|||||||
+41
-11
@@ -240,17 +240,20 @@ func (s *PackageRefListSuite) TestMerge(c *C) {
|
|||||||
coll := NewPackageCollection(db)
|
coll := NewPackageCollection(db)
|
||||||
|
|
||||||
packages := []*Package{
|
packages := []*Package{
|
||||||
&Package{Name: "lib", Version: "1.0", Architecture: "i386"}, //0
|
&Package{Name: "lib", Version: "1.0", Architecture: "i386"}, //0
|
||||||
&Package{Name: "dpkg", Version: "1.7", Architecture: "i386"}, //1
|
&Package{Name: "dpkg", Version: "1.7", Architecture: "i386"}, //1
|
||||||
&Package{Name: "data", Version: "1.1~bp1", Architecture: "all"}, //2
|
&Package{Name: "data", Version: "1.1~bp1", Architecture: "all"}, //2
|
||||||
&Package{Name: "app", Version: "1.1~bp1", Architecture: "i386"}, //3
|
&Package{Name: "app", Version: "1.1~bp1", Architecture: "i386"}, //3
|
||||||
&Package{Name: "app", Version: "1.1~bp2", Architecture: "i386"}, //4
|
&Package{Name: "app", Version: "1.1~bp2", Architecture: "i386"}, //4
|
||||||
&Package{Name: "app", Version: "1.1~bp2", Architecture: "amd64"}, //5
|
&Package{Name: "app", Version: "1.1~bp2", Architecture: "amd64"}, //5
|
||||||
&Package{Name: "dpkg", Version: "1.0", Architecture: "i386"}, //6
|
&Package{Name: "dpkg", Version: "1.0", Architecture: "i386"}, //6
|
||||||
&Package{Name: "xyz", Version: "1.0", Architecture: "sparc"}, //7
|
&Package{Name: "xyz", Version: "1.0", Architecture: "sparc"}, //7
|
||||||
|
&Package{Name: "dpkg", Version: "1.0", Architecture: "i386", FilesHash: 0x34445}, //8
|
||||||
|
&Package{Name: "app", Version: "1.1~bp2", Architecture: "i386", FilesHash: 0x44}, //9
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, p := range packages {
|
for _, p := range packages {
|
||||||
|
p.V06Plus = true
|
||||||
coll.Update(p)
|
coll.Update(p)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -268,23 +271,50 @@ func (s *PackageRefListSuite) TestMerge(c *C) {
|
|||||||
listB.Add(packages[5])
|
listB.Add(packages[5])
|
||||||
listB.Add(packages[6])
|
listB.Add(packages[6])
|
||||||
|
|
||||||
|
listC := NewPackageList()
|
||||||
|
listC.Add(packages[0])
|
||||||
|
listC.Add(packages[8])
|
||||||
|
listC.Add(packages[9])
|
||||||
|
|
||||||
reflistA := NewPackageRefListFromPackageList(listA)
|
reflistA := NewPackageRefListFromPackageList(listA)
|
||||||
reflistB := NewPackageRefListFromPackageList(listB)
|
reflistB := NewPackageRefListFromPackageList(listB)
|
||||||
|
reflistC := NewPackageRefListFromPackageList(listC)
|
||||||
|
|
||||||
mergeAB := reflistA.Merge(reflistB, true)
|
mergeAB := reflistA.Merge(reflistB, true)
|
||||||
mergeBA := reflistB.Merge(reflistA, true)
|
mergeBA := reflistB.Merge(reflistA, true)
|
||||||
|
mergeAC := reflistA.Merge(reflistC, true)
|
||||||
|
mergeBC := reflistB.Merge(reflistC, true)
|
||||||
|
mergeCB := reflistC.Merge(reflistB, true)
|
||||||
|
|
||||||
c.Check(toStrSlice(mergeAB), DeepEquals,
|
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"})
|
[]string{"Pall data 1.1~bp1 00000000", "Pamd64 app 1.1~bp2 00000000", "Pi386 app 1.1~bp2 00000000", "Pi386 dpkg 1.0 00000000", "Pi386 lib 1.0 00000000", "Psparc xyz 1.0 00000000"})
|
||||||
c.Check(toStrSlice(mergeBA), DeepEquals,
|
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"})
|
[]string{"Pall data 1.1~bp1 00000000", "Pamd64 app 1.1~bp2 00000000", "Pi386 app 1.1~bp1 00000000", "Pi386 dpkg 1.7 00000000", "Pi386 lib 1.0 00000000", "Psparc xyz 1.0 00000000"})
|
||||||
|
c.Check(toStrSlice(mergeAC), DeepEquals,
|
||||||
|
[]string{"Pall data 1.1~bp1 00000000", "Pi386 app 1.1~bp2 00000044", "Pi386 dpkg 1.0 00034445", "Pi386 lib 1.0 00000000", "Psparc xyz 1.0 00000000"})
|
||||||
|
c.Check(toStrSlice(mergeBC), DeepEquals,
|
||||||
|
[]string{"Pall data 1.1~bp1 00000000", "Pamd64 app 1.1~bp2 00000000", "Pi386 app 1.1~bp2 00000044", "Pi386 dpkg 1.0 00034445", "Pi386 lib 1.0 00000000"})
|
||||||
|
c.Check(toStrSlice(mergeCB), DeepEquals,
|
||||||
|
[]string{"Pall data 1.1~bp1 00000000", "Pamd64 app 1.1~bp2 00000000", "Pi386 app 1.1~bp2 00000000", "Pi386 dpkg 1.0 00000000", "Pi386 lib 1.0 00000000"})
|
||||||
|
|
||||||
mergeABall := reflistA.Merge(reflistB, false)
|
mergeABall := reflistA.Merge(reflistB, false)
|
||||||
mergeBAall := reflistB.Merge(reflistA, false)
|
mergeBAall := reflistB.Merge(reflistA, false)
|
||||||
|
mergeACall := reflistA.Merge(reflistC, false)
|
||||||
|
mergeBCall := reflistB.Merge(reflistC, false)
|
||||||
|
mergeCBall := reflistC.Merge(reflistB, false)
|
||||||
|
|
||||||
c.Check(mergeABall, DeepEquals, mergeBAall)
|
c.Check(mergeABall, DeepEquals, mergeBAall)
|
||||||
c.Check(toStrSlice(mergeBAall), DeepEquals,
|
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"})
|
[]string{"Pall data 1.1~bp1 00000000", "Pamd64 app 1.1~bp2 00000000", "Pi386 app 1.1~bp1 00000000", "Pi386 app 1.1~bp2 00000000",
|
||||||
|
"Pi386 dpkg 1.0 00000000", "Pi386 dpkg 1.7 00000000", "Pi386 lib 1.0 00000000", "Psparc xyz 1.0 00000000"})
|
||||||
|
|
||||||
|
c.Check(mergeBCall, Not(DeepEquals), mergeCBall)
|
||||||
|
c.Check(toStrSlice(mergeACall), DeepEquals,
|
||||||
|
[]string{"Pall data 1.1~bp1 00000000", "Pi386 app 1.1~bp1 00000000", "Pi386 app 1.1~bp2 00000044", "Pi386 dpkg 1.0 00034445",
|
||||||
|
"Pi386 dpkg 1.7 00000000", "Pi386 lib 1.0 00000000", "Psparc xyz 1.0 00000000"})
|
||||||
|
c.Check(toStrSlice(mergeBCall), DeepEquals,
|
||||||
|
[]string{"Pall data 1.1~bp1 00000000", "Pamd64 app 1.1~bp2 00000000", "Pi386 app 1.1~bp2 00000044", "Pi386 dpkg 1.0 00034445",
|
||||||
|
"Pi386 lib 1.0 00000000"})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *PackageRefListSuite) TestFilterLatestRefs(c *C) {
|
func (s *PackageRefListSuite) TestFilterLatestRefs(c *C) {
|
||||||
|
|||||||
Reference in New Issue
Block a user