diff --git a/deb/reflist.go b/deb/reflist.go index d921be77..db5721db 100644 --- a/deb/reflist.go +++ b/deb/reflist.go @@ -285,13 +285,23 @@ func (l *PackageRefList) Merge(r *PackageRefList, overrideMatching bool) (result overridenName = nil overriddenArch = nil } 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 { - 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) { // this package has already been overriden on the right il++ diff --git a/deb/reflist_test.go b/deb/reflist_test.go index 21051d17..2b89e934 100644 --- a/deb/reflist_test.go +++ b/deb/reflist_test.go @@ -240,17 +240,20 @@ func (s *PackageRefListSuite) TestMerge(c *C) { coll := NewPackageCollection(db) packages := []*Package{ - &Package{Name: "lib", Version: "1.0", Architecture: "i386"}, //0 - &Package{Name: "dpkg", Version: "1.7", Architecture: "i386"}, //1 - &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~bp2", Architecture: "i386"}, //4 - &Package{Name: "app", Version: "1.1~bp2", Architecture: "amd64"}, //5 - &Package{Name: "dpkg", Version: "1.0", Architecture: "i386"}, //6 - &Package{Name: "xyz", Version: "1.0", Architecture: "sparc"}, //7 + &Package{Name: "lib", Version: "1.0", Architecture: "i386"}, //0 + &Package{Name: "dpkg", Version: "1.7", Architecture: "i386"}, //1 + &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~bp2", Architecture: "i386"}, //4 + &Package{Name: "app", Version: "1.1~bp2", Architecture: "amd64"}, //5 + &Package{Name: "dpkg", Version: "1.0", Architecture: "i386"}, //6 + &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 { + p.V06Plus = true coll.Update(p) } @@ -268,23 +271,50 @@ func (s *PackageRefListSuite) TestMerge(c *C) { listB.Add(packages[5]) listB.Add(packages[6]) + listC := NewPackageList() + listC.Add(packages[0]) + listC.Add(packages[8]) + listC.Add(packages[9]) + reflistA := NewPackageRefListFromPackageList(listA) reflistB := NewPackageRefListFromPackageList(listB) + reflistC := NewPackageRefListFromPackageList(listC) mergeAB := reflistA.Merge(reflistB, 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, - []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, - []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) 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(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) {