mirror of
https://github.com/aptly-dev/aptly.git
synced 2026-05-08 22:30:41 +00:00
Fix package search missing duplicate packages. #225
Implement package list with duplicate entries, use it when initiating search from PackageCollection.
This commit is contained in:
+37
-7
@@ -36,6 +36,10 @@ type PackageList struct {
|
|||||||
packagesIndex []*Package
|
packagesIndex []*Package
|
||||||
// Map of packages for each virtual package (provides)
|
// Map of packages for each virtual package (provides)
|
||||||
providesIndex map[string][]*Package
|
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
|
// PackageConflictError means that package can't be added to the list due to error
|
||||||
@@ -49,9 +53,35 @@ var (
|
|||||||
_ PackageCatalog = &PackageList{}
|
_ 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 {
|
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
|
// NewPackageListFromRefList loads packages list from PackageRefList
|
||||||
@@ -61,7 +91,7 @@ func NewPackageListFromRefList(reflist *PackageRefList, collection *PackageColle
|
|||||||
return NewPackageList(), nil
|
return NewPackageList(), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
result := &PackageList{packages: make(map[string]*Package, reflist.Len())}
|
result := NewPackageListWithDuplicates(false, reflist.Len())
|
||||||
|
|
||||||
if progress != nil {
|
if progress != nil {
|
||||||
progress.InitBar(int64(reflist.Len()), false)
|
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
|
// Add appends package to package list, additionally checking for uniqueness
|
||||||
func (l *PackageList) Add(p *Package) error {
|
func (l *PackageList) Add(p *Package) error {
|
||||||
key := string(p.ShortKey(""))
|
key := l.keyFunc(p)
|
||||||
existing, ok := l.packages[key]
|
existing, ok := l.packages[key]
|
||||||
if ok {
|
if ok {
|
||||||
if !existing.Equals(p) {
|
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
|
// Remove removes package from the list, and updates index when required
|
||||||
func (l *PackageList) Remove(p *Package) {
|
func (l *PackageList) Remove(p *Package) {
|
||||||
delete(l.packages, string(p.ShortKey("")))
|
delete(l.packages, l.keyFunc(p))
|
||||||
if l.indexed {
|
if l.indexed {
|
||||||
for _, provides := range p.Provides {
|
for _, provides := range p.Provides {
|
||||||
for i, pkg := range l.providesIndex[provides] {
|
for i, pkg := range l.providesIndex[provides] {
|
||||||
@@ -365,7 +395,7 @@ func (l *PackageList) PrepareIndex() {
|
|||||||
|
|
||||||
// Scan searches package index using full scan
|
// Scan searches package index using full scan
|
||||||
func (l *PackageList) Scan(q PackageQuery) (result *PackageList) {
|
func (l *PackageList) Scan(q PackageQuery) (result *PackageList) {
|
||||||
result = NewPackageList()
|
result = NewPackageListWithDuplicates(l.duplicatesAllowed, 0)
|
||||||
for _, pkg := range l.packages {
|
for _, pkg := range l.packages {
|
||||||
if q.Matches(pkg) {
|
if q.Matches(pkg) {
|
||||||
result.Add(pkg)
|
result.Add(pkg)
|
||||||
@@ -382,7 +412,7 @@ func (l *PackageList) SearchSupported() bool {
|
|||||||
|
|
||||||
// SearchByKey looks up package by exact key reference
|
// SearchByKey looks up package by exact key reference
|
||||||
func (l *PackageList) SearchByKey(arch, name, version string) (result *PackageList) {
|
func (l *PackageList) SearchByKey(arch, name, version string) (result *PackageList) {
|
||||||
result = NewPackageList()
|
result = NewPackageListWithDuplicates(l.duplicatesAllowed, 0)
|
||||||
|
|
||||||
pkg := l.packages["P"+arch+" "+name+" "+version]
|
pkg := l.packages["P"+arch+" "+name+" "+version]
|
||||||
if pkg != nil {
|
if pkg != nil {
|
||||||
|
|||||||
@@ -282,7 +282,7 @@ func (collection *PackageCollection) DeleteByKey(key []byte) error {
|
|||||||
|
|
||||||
// Scan does full scan on all the packages
|
// Scan does full scan on all the packages
|
||||||
func (collection *PackageCollection) Scan(q PackageQuery) (result *PackageList) {
|
func (collection *PackageCollection) Scan(q PackageQuery) (result *PackageList) {
|
||||||
result = NewPackageList()
|
result = NewPackageListWithDuplicates(true, 0)
|
||||||
|
|
||||||
for _, key := range collection.db.KeysByPrefix([]byte("P")) {
|
for _, key := range collection.db.KeysByPrefix([]byte("P")) {
|
||||||
pkg, err := collection.ByKey(key)
|
pkg, err := collection.ByKey(key)
|
||||||
|
|||||||
@@ -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 <jsogo@debian.org>
|
||||||
|
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
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
Package: pyspi
|
||||||
|
Binary: python-at-spi
|
||||||
|
Version: 0.6.1-1.3
|
||||||
|
Maintainer: Jose Carlos Garcia Sogo <jsogo@debian.org>
|
||||||
|
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 <jsogo@debian.org>
|
||||||
|
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]
|
||||||
|
|
||||||
@@ -60,3 +60,17 @@ class ShowPackage6Test(BaseTest):
|
|||||||
]
|
]
|
||||||
outputMatchPrepare = lambda _, s: "\n".join(sorted(s.split("\n")))
|
outputMatchPrepare = lambda _, s: "\n".join(sorted(s.split("\n")))
|
||||||
runCmd = "aptly package show -with-references nginx-full_1.2.1-2.2+wheezy2_amd64"
|
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)\""
|
||||||
|
|||||||
Reference in New Issue
Block a user