From ff52d2655ab5ef501fead1d8d4ead2634d8caebb Mon Sep 17 00:00:00 2001 From: Andrey Smirnov Date: Tue, 15 Mar 2016 12:02:48 +0300 Subject: [PATCH] Fix package search missing duplicate packages. #225 Implement package list with duplicate entries, use it when initiating search from PackageCollection. --- deb/list.go | 44 +++++++++++++--- deb/package_collection.go | 2 +- .../pyspi_0.6.1-1.3.conflict.dsc | 12 +++++ .../ShowPackage7Test/pyspi_0.6.1.orig.tar.gz | 0 system/t11_package/ShowPackage7Test_gold | 51 +++++++++++++++++++ system/t11_package/show.py | 14 +++++ 6 files changed, 115 insertions(+), 8 deletions(-) create mode 100644 system/t11_package/ShowPackage7Test/pyspi_0.6.1-1.3.conflict.dsc create mode 100644 system/t11_package/ShowPackage7Test/pyspi_0.6.1.orig.tar.gz create mode 100644 system/t11_package/ShowPackage7Test_gold diff --git a/deb/list.go b/deb/list.go index dc59d232..3cfa3e74 100644 --- a/deb/list.go +++ b/deb/list.go @@ -36,6 +36,10 @@ type PackageList struct { packagesIndex []*Package // Map of packages for each virtual package (provides) providesIndex map[string][]*Package + // Package key generation function + keyFunc func(p *Package) string + // Allow duplicates? + duplicatesAllowed bool } // PackageConflictError means that package can't be added to the list due to error @@ -49,9 +53,35 @@ var ( _ PackageCatalog = &PackageList{} ) -// NewPackageList creates empty package list +func packageShortKey(p *Package) string { + return string(p.ShortKey("")) +} + +func packageFullKey(p *Package) string { + return string(p.Key("")) +} + +// NewPackageList creates empty package list without duplicate package func NewPackageList() *PackageList { - return &PackageList{packages: make(map[string]*Package, 1000)} + return NewPackageListWithDuplicates(false, 1000) +} + +func NewPackageListWithDuplicates(duplicates bool, capacity int) *PackageList { + if capacity == 0 { + capacity = 1000 + } + + result := &PackageList{ + packages: make(map[string]*Package, capacity), + duplicatesAllowed: duplicates, + keyFunc: packageShortKey, + } + + if duplicates { + result.keyFunc = packageFullKey + } + + return result } // NewPackageListFromRefList loads packages list from PackageRefList @@ -61,7 +91,7 @@ func NewPackageListFromRefList(reflist *PackageRefList, collection *PackageColle return NewPackageList(), nil } - result := &PackageList{packages: make(map[string]*Package, reflist.Len())} + result := NewPackageListWithDuplicates(false, reflist.Len()) if progress != nil { progress.InitBar(int64(reflist.Len()), false) @@ -91,7 +121,7 @@ func NewPackageListFromRefList(reflist *PackageRefList, collection *PackageColle // Add appends package to package list, additionally checking for uniqueness func (l *PackageList) Add(p *Package) error { - key := string(p.ShortKey("")) + key := l.keyFunc(p) existing, ok := l.packages[key] if ok { if !existing.Equals(p) { @@ -170,7 +200,7 @@ func (l *PackageList) Append(pl *PackageList) error { // Remove removes package from the list, and updates index when required func (l *PackageList) Remove(p *Package) { - delete(l.packages, string(p.ShortKey(""))) + delete(l.packages, l.keyFunc(p)) if l.indexed { for _, provides := range p.Provides { for i, pkg := range l.providesIndex[provides] { @@ -365,7 +395,7 @@ func (l *PackageList) PrepareIndex() { // Scan searches package index using full scan func (l *PackageList) Scan(q PackageQuery) (result *PackageList) { - result = NewPackageList() + result = NewPackageListWithDuplicates(l.duplicatesAllowed, 0) for _, pkg := range l.packages { if q.Matches(pkg) { result.Add(pkg) @@ -382,7 +412,7 @@ func (l *PackageList) SearchSupported() bool { // SearchByKey looks up package by exact key reference func (l *PackageList) SearchByKey(arch, name, version string) (result *PackageList) { - result = NewPackageList() + result = NewPackageListWithDuplicates(l.duplicatesAllowed, 0) pkg := l.packages["P"+arch+" "+name+" "+version] if pkg != nil { diff --git a/deb/package_collection.go b/deb/package_collection.go index 56a5e5a2..1a3a0db4 100644 --- a/deb/package_collection.go +++ b/deb/package_collection.go @@ -282,7 +282,7 @@ func (collection *PackageCollection) DeleteByKey(key []byte) error { // Scan does full scan on all the packages func (collection *PackageCollection) Scan(q PackageQuery) (result *PackageList) { - result = NewPackageList() + result = NewPackageListWithDuplicates(true, 0) for _, key := range collection.db.KeysByPrefix([]byte("P")) { pkg, err := collection.ByKey(key) diff --git a/system/t11_package/ShowPackage7Test/pyspi_0.6.1-1.3.conflict.dsc b/system/t11_package/ShowPackage7Test/pyspi_0.6.1-1.3.conflict.dsc new file mode 100644 index 00000000..21a67a86 --- /dev/null +++ b/system/t11_package/ShowPackage7Test/pyspi_0.6.1-1.3.conflict.dsc @@ -0,0 +1,12 @@ +Format: 1.0 +Source: pyspi +Binary: python-at-spi +Architecture: any +Version: 0.6.1-1.3 +Maintainer: Jose Carlos Garcia Sogo +Homepage: http://people.redhat.com/zcerza/dogtail +Standards-Version: 3.7.3 +Vcs-Svn: svn://svn.tribulaciones.org/srv/svn/pyspi/trunk +Build-Depends: debhelper (>= 5), cdbs, libatspi-dev, python-pyrex, python-support (>= 0.4), python-all-dev, libx11-dev +Files: + d41d8cd98f00b204e9800998ecf8427e 0 pyspi_0.6.1.orig.tar.gz diff --git a/system/t11_package/ShowPackage7Test/pyspi_0.6.1.orig.tar.gz b/system/t11_package/ShowPackage7Test/pyspi_0.6.1.orig.tar.gz new file mode 100644 index 00000000..e69de29b diff --git a/system/t11_package/ShowPackage7Test_gold b/system/t11_package/ShowPackage7Test_gold new file mode 100644 index 00000000..bdc51093 --- /dev/null +++ b/system/t11_package/ShowPackage7Test_gold @@ -0,0 +1,51 @@ +Package: pyspi +Binary: python-at-spi +Version: 0.6.1-1.3 +Maintainer: Jose Carlos Garcia Sogo +Build-Depends: debhelper (>= 5), cdbs, libatspi-dev, python-pyrex, python-support (>= 0.4), python-all-dev, libx11-dev +Architecture: any +Standards-Version: 3.7.3 +Format: 1.0 +Files: + 22ff26db69b73d3438fdde21ab5ba2f1 3456 pyspi_0.6.1-1.3.diff.gz + b72cb94699298a117b7c82641c68b6fd 1782 pyspi_0.6.1-1.3.dsc + def336bd566ea688a06ec03db7ccf1f4 29063 pyspi_0.6.1.orig.tar.gz +Homepage: http://people.redhat.com/zcerza/dogtail +Checksums-Sha256: + 2e770b28df948f3197ed0b679bdea99f3f2bf745e9ddb440c677df9c3aeaee3c 3456 pyspi_0.6.1-1.3.diff.gz + d494aaf526f1ec6b02f14c2f81e060a5722d6532ddc760ec16972e45c2625989 1782 pyspi_0.6.1-1.3.dsc + 64069ee828c50b1c597d10a3fefbba279f093a4723965388cdd0ac02f029bfb9 29063 pyspi_0.6.1.orig.tar.gz +Checksums-Sha1: + 95a2468e4bbce730ba286f2211fa41861b9f1d90 3456 pyspi_0.6.1-1.3.diff.gz + 56c8a9b1f4ab636052be8966690998cbe865cd6c 1782 pyspi_0.6.1-1.3.dsc + 9694b80acc171c0a5bc99f707933864edfce555e 29063 pyspi_0.6.1.orig.tar.gz +Vcs-Svn: svn://svn.tribulaciones.org/srv/svn/pyspi/trunk +Checksums-Sha512: + fde06b7dc5762a04986d0669420822f6a1e82b195322ae9cbd2dae40bda557c57ad77fe3546007ea645f801c4cd30ef4eb0e96efb2dee6b71c4c9a187d643683 1782 pyspi_0.6.1-1.3.dsc + +References to package: + local repo [a] + +Package: pyspi +Binary: python-at-spi +Version: 0.6.1-1.3 +Maintainer: Jose Carlos Garcia Sogo +Build-Depends: debhelper (>= 5), cdbs, libatspi-dev, python-pyrex, python-support (>= 0.4), python-all-dev, libx11-dev +Architecture: any +Standards-Version: 3.7.3 +Format: 1.0 +Files: + d95c4fb8bf5066968b524e04f35c6d34 458 pyspi_0.6.1-1.3.conflict.dsc + d41d8cd98f00b204e9800998ecf8427e 0 pyspi_0.6.1.orig.tar.gz +Vcs-Svn: svn://svn.tribulaciones.org/srv/svn/pyspi/trunk +Checksums-Sha512: + ec9b3ea45d9a14f341c947bfd4b4d70ee508f9ffe9374ff2eceaa5df45ee48e3103f67d0af57d62308fee62957dae2b60c4ff5649543ea6dbfef1bccf151b27e 458 pyspi_0.6.1-1.3.conflict.dsc +Checksums-Sha256: + 33dc6feab9ff1cf863b27f4d622985fe0114252d157a744dcc3d575bf7cfaad8 458 pyspi_0.6.1-1.3.conflict.dsc +Checksums-Sha1: + 4d94f5e09bc745af159ddf9ce7a13a84ac3434d0 458 pyspi_0.6.1-1.3.conflict.dsc +Homepage: http://people.redhat.com/zcerza/dogtail + +References to package: + local repo [b] + diff --git a/system/t11_package/show.py b/system/t11_package/show.py index e1365fa0..eb4ec759 100644 --- a/system/t11_package/show.py +++ b/system/t11_package/show.py @@ -60,3 +60,17 @@ class ShowPackage6Test(BaseTest): ] outputMatchPrepare = lambda _, s: "\n".join(sorted(s.split("\n"))) runCmd = "aptly package show -with-references nginx-full_1.2.1-2.2+wheezy2_amd64" + + +class ShowPackage7Test(BaseTest): + """ + show package: with duplicates + """ + fixtureCmds = [ + "aptly repo create a", + "aptly repo create b", + "aptly repo add a ${files}", + "aptly repo add b ${testfiles}" + ] + outputMatchPrepare = lambda _, s: "\n".join(sorted(s.split("\n"))) + runCmd = "aptly package show -with-references \"pyspi (0.6.1-1.3)\""