[yum-cvs] yum/repomd packageSack.py,1.23,1.24
Seth Vidal
skvidal at linux.duke.edu
Tue Apr 11 21:33:16 UTC 2006
Update of /home/groups/yum/cvs/yum/repomd
In directory login1.linux.duke.edu:/tmp/cvs-serv21159/repomd
Modified Files:
packageSack.py
Log Message:
merge in Jbowes at redhat's first patch
Index: packageSack.py
===================================================================
RCS file: /home/groups/yum/cvs/yum/repomd/packageSack.py,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -r1.23 -r1.24
--- packageSack.py 11 Mar 2005 09:08:22 -0000 1.23
+++ packageSack.py 11 Apr 2006 21:33:14 -0000 1.24
@@ -18,7 +18,236 @@
from mdErrors import PackageSackError
import mdUtils
-class PackageSack:
+class PackageSackBase:
+ """Base class that provides the interface for PackageSacks."""
+ def __init__(self):
+ self.added = {}
+
+ def __len__(self):
+ return len(self.simplePkgList())
+
+ def __iter__(self):
+ if hasattr(self.returnPackages(), '__iter__'):
+ return self.returnPackages().__iter__()
+ else:
+ return iter(self.returnPackages())
+
+ def setCompatArchs(self, compatArchs):
+ raise NotImplementedError()
+
+ def populate(self, repo, with, callback, cacheOnly):
+ raise NotImplementedError()
+
+ def packagesByTuple(self, pkgtup):
+ """return a list of package objects by (n,a,e,v,r) tuple"""
+ raise NotImplementedError()
+
+ def searchNevra(self, name=None, epoch=None, ver=None, rel=None, arch=None):
+ """return list of pkgobjects matching the nevra requested"""
+ raise NotImplementedError()
+
+ def searchRequires(self, name):
+ """return list of package requiring the name (any evr and flag)"""
+ raise NotImplementedError()
+
+ def searchProvides(self, name):
+ """return list of package providing the name (any evr and flag)"""
+ raise NotImplementedError()
+
+ def searchConflicts(self, name):
+ """return list of package conflicting with the name (any evr and flag)"""
+ raise NotImplementedError()
+
+ def searchObsoletes(self, name):
+ """return list of package obsoleting the name (any evr and flag)"""
+ raise NotImplementedError()
+
+ def returnObsoletes(self):
+ """returns a dict of obsoletes dict[obsoleting pkgtuple] = [list of obs]"""
+ raise NotImplementedError()
+
+ def searchFiles(self, file):
+ """return list of packages by filename"""
+ raise NotImplementedError()
+
+ def addPackage(self, obj):
+ """add a pkgobject to the packageSack"""
+ raise NotImplementedError()
+
+ def buildIndexes(self):
+ """builds the useful indexes for searching/querying the packageSack
+ This should be called after all the necessary packages have been
+ added/deleted"""
+ raise NotImplementedError()
+
+ def delPackage(self, obj):
+ """delete a pkgobject"""
+ raise NotImplementedError()
+
+ def returnPackages(self):
+ """return list of all packages"""
+ raise NotImplementedError()
+
+ def returnNewestByNameArch(self, naTup=None):
+ """return list of newest packages based on name, arch matching
+ this means(in name.arch form): foo.i386 and foo.noarch are not
+ compared to each other for highest version only foo.i386 and
+ foo.i386 will be compared"""
+ raise NotImplementedError()
+
+ def returnNewestByName(self, name=None):
+ """return list of newest packages based on name matching
+ this means(in name.arch form): foo.i386 and foo.noarch will
+ be compared to each other for highest version"""
+ raise NotImplementedError()
+
+ def simplePkgList(self):
+ """returns a list of pkg tuples (n, a, e, v, r)"""
+ raise NotImplementedError()
+
+ def printPackages(self):
+ raise NotImplementedError()
+
+ def excludeArchs(self, archlist):
+ """exclude incompatible arches. archlist is a list of compatible arches"""
+ raise NotImplementedError()
+
+ def searchPackages(self, fields, criteria_re, callback):
+ raise NotImplementedError()
+
+
+class MetaSack(PackageSackBase):
+ """Represents the aggregate of multiple package sacks, such that they can
+ all be treated as one unified sack."""
+
+ def __init__(self):
+ PackageSackBase.__init__(self)
+ self.sacks = {}
+ self.compatarchs = None
+
+ def addSack(self, repoid, sack):
+ """Adds a repository's packageSack to this MetaSack."""
+ self.sacks[repoid] = sack
+
+ # Make sure the new sack follows the same rules we have been given.
+ sack.setCompatArchs(self.compatarchs)
+
+ def populate(self, repo, with, callback, cacheOnly):
+ self.sacks[repo.id].populate(repo, with, callback, cacheOnly)
+
+ def setCompatArchs(self, compatArchs):
+ for sack in self.sacks.values():
+ sack.setCompatArchs(compatArchs)
+
+ def packagesByTuple(self, pkgtup):
+ """return a list of package objects by (n,a,e,v,r) tuple"""
+ return self._computeAggregateListResult("packagesByTuple", pkgtup)
+
+ def searchNevra(self, name=None, epoch=None, ver=None, rel=None, arch=None):
+ """return list of pkgobjects matching the nevra requested"""
+ return self._computeAggregateListResult("searchNevra", name, epoch, ver, rel, arch)
+
+ def searchRequires(self, name):
+ """return list of package requiring the name (any evr and flag)"""
+ return self._computeAggregateListResult("searchRequires", name)
+
+ def searchProvides(self, name):
+ """return list of package providing the name (any evr and flag)"""
+ return self._computeAggregateListResult("searchProvides", name)
+
+ def searchConflicts(self, name):
+ """return list of package conflicting with the name (any evr and flag)"""
+ return self._computeAggregateListResult("searchConflicts", name)
+
+ def searchObsoletes(self, name):
+ """return list of package obsoleting the name (any evr and flag)"""
+ return self._computeAggregateListResult("searchObsoletes", name)
+
+ def returnObsoletes(self):
+ """returns a dict of obsoletes dict[obsoleting pkgtuple] = [list of obs]"""
+ return self._computeAggregateDictResult("returnObsoletes")
+
+ def searchFiles(self, file):
+ """return list of packages by filename"""
+ return self._computeAggregateListResult("searchFiles", file)
+
+ def addPackage(self, obj):
+ """Add a pkgobject to the packageSack. This is a meaningless operation
+ for the MetaSack."""
+ pass
+
+ def buildIndexes(self):
+ """builds the useful indexes for searching/querying the packageSack
+ This should be called after all the necessary packages have been
+ added/deleted"""
+ for sack in self.sacks.values():
+ sack.buildIndexes()
+
+ def delPackage(self, obj):
+ """Delete a pkgobject. This is a meaningless operation for MetaSack."""
+ pass
+
+ def returnPackages(self, repoid=None):
+ """return list of all packages, takes optional repoid"""
+ if not repoid:
+ return self._computeAggregateListResult("returnPackages")
+ return self.sacks[repoid].returnPackages()
+
+ def returnNewestByNameArch(self, naTup=None):
+ """return list of newest packages based on name, arch matching
+ this means(in name.arch form): foo.i386 and foo.noarch are not
+ compared to each other for highest version only foo.i386 and
+ foo.i386 will be compared"""
+ return self._computeAggregateListResult("returnNewestByNameArch", naTup)
+
+ def returnNewestByName(self, name=None):
+ """return list of newest packages based on name matching
+ this means(in name.arch form): foo.i386 and foo.noarch will
+ be compared to each other for highest version"""
+ return self._computeAggregateListResult("returnNewestByName", name)
+
+ def simplePkgList(self, repoid=None):
+ """returns a list of pkg tuples (n, a, e, v, r) optionally from a
+ single repoid"""
+ if not repoid:
+ return self._computeAggregateListResult("simplePkgList")
+ return self.sacks[repoid].simplePkgList()
+
+ def printPackages(self):
+ for sack in self.sacks.values():
+ sack.printPackages()
+
+ def excludeArchs(self, archlist):
+ """exclude incompatible arches. archlist is a list of compatible arches"""
+ for sack in self.sacks.values():
+ sack.excludeArchs(archlist)
+
+ def searchPackages(self, fields, criteria_re, callback):
+ return self._computeAggregateDictResult("searchPackages", fields, criteria_re, callback)
+
+ def _computeAggregateListResult(self, methodName, *args):
+ result = []
+ for sack in self.sacks.values():
+ if hasattr(sack, methodName):
+ method = getattr(sack, methodName)
+ sackResult = apply(method, args)
+ if sackResult:
+ result.extend(sackResult)
+ return result
+
+ def _computeAggregateDictResult(self, methodName, *args):
+ result = {}
+ for sack in self.sacks.values():
+ if hasattr(sack, methodName):
+ method = getattr(sack, methodName)
+ sackResult = apply(method, args)
+ if sackResult:
+ result.update(sackResult)
+ return result
+
+
+
+class PackageSack(PackageSackBase):
"""represents sets (sacks) of Package Objects"""
def __init__(self):
self.nevra = {} #nevra[(Name, Epoch, Version, Release, Arch)] = []
@@ -55,6 +284,9 @@
elif failure == 'build':
self.buildIndexes()
+ def setCompatArchs(self, compatarchs):
+ self.compatarchs = compatarchs
+
def packagesByTuple(self, pkgtup):
"""return a list of package objects by (n,a,e,v,r) tuple"""
(n,a,e,v,r) = pkgtup
@@ -68,15 +300,6 @@
else:
return []
-
- def searchID(self, pkgid):
- """return list of packages based on pkgid"""
- self._checkIndexes(failure='build')
- if self.pkgsByID.has_key(pkgid):
- return self.pkgsByID[pkgid]
- else:
- return []
-
def searchRequires(self, name):
"""return list of package requiring the name (any evr and flag)"""
self._checkIndexes(failure='build')
@@ -308,6 +531,21 @@
if pkg.arch not in archlist:
self.delPackage(pkg)
+ def searchPackages(self, fields, criteria_re, callback):
+ matches = {}
+
+ for po in self.returnPackages():
+ tmpvalues = []
+ for field in fields:
+ value = po.returnSimple(field)
+ if value and criteria_re.search(value):
+ tmpvalues.append(value)
+ if len(tmpvalues) > 0:
+ if callback:
+ callback(po, tmpvalues)
+ matches[po] = tmpvalues
+
+ return matches
# packageSack should be a base class
@@ -361,6 +599,14 @@
return 1
return 0
+ def __searchID(self, pkgid):
+ """return list of packages based on pkgid"""
+ self._checkIndexes(failure='build')
+ if self.pkgsByID.has_key(pkgid):
+ return self.pkgsByID[pkgid]
+ else:
+ return []
+
def loadPrimaryMD(self, reader, repoid, callback=None):
"""load all the data from the primary metadata xml file"""
@@ -411,7 +657,7 @@
if reader.NodeType() == 1 and reader.Name() == 'package':
if reader.HasAttributes():
pkgid = reader.GetAttribute('pkgid')
- pkgs = self.searchID(pkgid)
+ pkgs = self.__searchID(pkgid)
pkgmatch = 0
mydepth = reader.Depth()
current+=1
@@ -471,7 +717,7 @@
current+=1
if reader.HasAttributes():
pkgid = reader.GetAttribute('pkgid')
- pkgs = self.searchID(pkgid)
+ pkgs = self.__searchID(pkgid)
pkgmatch = 0
mydepth = reader.Depth()
#current+=1
More information about the Yum-cvs-commits
mailing list