[yum-git] 2 commits - cli.py yum/__init__.py yum/packageSack.py yum/rpmsack.py yum/sqlitesack.py
James Antill
james at linux.duke.edu
Wed Jan 23 20:55:42 UTC 2008
cli.py | 2 -
yum/__init__.py | 18 +++++++--------
yum/packageSack.py | 38 +++++++++++++++++----------------
yum/rpmsack.py | 4 +--
yum/sqlitesack.py | 61 +++++++++++++++++++++++++++++++++++++++++------------
5 files changed, 80 insertions(+), 43 deletions(-)
New commits:
commit e9e1271747e59e88c8999baed2308bb8d26d429a
Author: James Antill <james at and.org>
Date: Wed Jan 23 15:55:30 2008 -0500
Add the patterns arg to the other list/info commands
diff --git a/yum/__init__.py b/yum/__init__.py
index cb271b4..8b198da 100644
--- a/yum/__init__.py
+++ b/yum/__init__.py
@@ -1245,15 +1245,15 @@ class YumBase(depsolve.Depsolve):
# installed only
elif pkgnarrow == 'installed':
- installed = self.rpmdb.returnPackages()
+ installed = self.rpmdb.returnPackages(patterns=patterns)
# available in a repository
elif pkgnarrow == 'available':
if self.conf.showdupesfromrepos:
- avail = self.pkgSack.returnPackages()
+ avail = self.pkgSack.returnPackages(patterns=patterns)
else:
- avail = self.pkgSack.returnNewestByNameArch()
+ avail = self.pkgSack.returnNewestByNameArch(patterns=patterns)
self.rpmdb._make_header_dict()
for pkg in avail:
@@ -1265,7 +1265,7 @@ class YumBase(depsolve.Depsolve):
elif pkgnarrow == 'extras':
# we must compare the installed set versus the repo set
# anything installed but not in a repo is an extra
- avail = self.pkgSack.simplePkgList()
+ avail = self.pkgSack.simplePkgList(patterns=patterns)
for po in self.rpmdb:
if po.pkgtup not in avail:
extras.append(po)
@@ -1288,9 +1288,9 @@ class YumBase(depsolve.Depsolve):
recentlimit = now-(self.conf.recent*86400)
ftimehash = {}
if self.conf.showdupesfromrepos:
- avail = self.pkgSack.returnPackages()
+ avail = self.pkgSack.returnPackages(patterns=patterns)
else:
- avail = self.pkgSack.returnNewestByNameArch()
+ avail = self.pkgSack.returnNewestByNameArch(patterns=patterns)
for po in avail:
ftime = int(po.filetime)
diff --git a/yum/packageSack.py b/yum/packageSack.py
index d9a95b7..316485b 100644
--- a/yum/packageSack.py
+++ b/yum/packageSack.py
@@ -143,7 +143,7 @@ class PackageSackBase(object):
be compared to each other for highest version"""
raise NotImplementedError()
- def simplePkgList(self):
+ def simplePkgList(self, patterns=None):
"""returns a list of pkg tuples (n, a, e, v, r)"""
raise NotImplementedError()
@@ -346,9 +346,9 @@ class MetaSack(PackageSackBase):
bestofeach.addList(self._computeAggregateListResult("returnNewestByName", name))
return bestofeach.returnNewestByName(name)
- def simplePkgList(self):
+ def simplePkgList(self, patterns=None):
"""returns a list of pkg tuples (n, a, e, v, r)"""
- return self._computeAggregateListResult("simplePkgList")
+ return self._computeAggregateListResult("simplePkgList", patterns)
def printPackages(self):
for sack in self.sacks.values():
commit 41ee72ec08dd7fce2aa2d2523163e650ab49921a
Author: James Antill <james at and.org>
Date: Wed Jan 23 15:23:10 2008 -0500
Move the SQL all the way down for list/info commands too.
diff --git a/cli.py b/cli.py
index 62e433b..ea43e5b 100644
--- a/cli.py
+++ b/cli.py
@@ -637,7 +637,7 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
if extcmds[0] in special:
pkgnarrow = extcmds.pop(0)
- ypl = self.doPackageLists(pkgnarrow=pkgnarrow)
+ ypl = self.doPackageLists(pkgnarrow=pkgnarrow, patterns=extcmds)
# rework the list output code to know about:
# obsoletes output
diff --git a/yum/__init__.py b/yum/__init__.py
index 403a3a4..cb271b4 100644
--- a/yum/__init__.py
+++ b/yum/__init__.py
@@ -1198,7 +1198,7 @@ class YumBase(depsolve.Depsolve):
msg = '%d %s files removed' % (removed, filetype)
return 0, [msg]
- def doPackageLists(self, pkgnarrow='all'):
+ def doPackageLists(self, pkgnarrow='all', patterns=None):
"""generates lists of packages, un-reduced, based on pkgnarrow option"""
ygh = misc.GenericHolder()
@@ -1219,9 +1219,9 @@ class YumBase(depsolve.Depsolve):
installed = dinst.values()
if self.conf.showdupesfromrepos:
- avail = self.pkgSack.returnPackages()
+ avail = self.pkgSack.returnPackages(patterns=patterns)
else:
- avail = self.pkgSack.returnNewestByNameArch()
+ avail = self.pkgSack.returnNewestByNameArch(patterns=patterns)
for pkg in avail:
if not dinst.has_key(pkg.pkgtup):
diff --git a/yum/packageSack.py b/yum/packageSack.py
index b5d3aa8..d9a95b7 100644
--- a/yum/packageSack.py
+++ b/yum/packageSack.py
@@ -126,11 +126,11 @@ class PackageSackBase(object):
"""delete a pkgobject"""
raise NotImplementedError()
- def returnPackages(self):
+ def returnPackages(self, patterns=None):
"""return list of all packages"""
raise NotImplementedError()
- def returnNewestByNameArch(self, naTup=None):
+ def returnNewestByNameArch(self, naTup=None, patterns=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
@@ -318,21 +318,23 @@ class MetaSack(PackageSackBase):
obj.repo.sack.delPackage(obj)
- def returnPackages(self, repoid=None):
+ def returnPackages(self, repoid=None, patterns=None):
"""return list of all packages, takes optional repoid"""
if not repoid:
- return self._computeAggregateListResult("returnPackages")
- return self.sacks[repoid].returnPackages()
+ return self._computeAggregateListResult("returnPackages",
+ None, patterns)
+ return self.sacks[repoid].returnPackages(patterns=patterns)
- def returnNewestByNameArch(self, naTup=None):
+ def returnNewestByNameArch(self, naTup=None, patterns=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"""
bestofeach = ListPackageSack()
- bestofeach.addList(self._computeAggregateListResult("returnNewestByNameArch", naTup))
+ calr = self._computeAggregateListResult
+ bestofeach.addList(calr("returnNewestByNameArch", naTup, patterns))
- return bestofeach.returnNewestByNameArch(naTup)
+ return bestofeach.returnNewestByNameArch(naTup, patterns)
def returnNewestByName(self, name=None):
@@ -680,7 +682,7 @@ class PackageSack(PackageSackBase):
if self.indexesBuilt:
self._delPackageFromIndex(obj)
- def returnPackages(self, repoid=None):
+ def returnPackages(self, repoid=None, patterns=None):
"""return list of all packages, takes optional repoid"""
returnList = []
if repoid is None:
@@ -695,7 +697,7 @@ class PackageSack(PackageSackBase):
return returnList
- def returnNewestByNameArch(self, naTup=None):
+ def returnNewestByNameArch(self, naTup=None, patterns=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
@@ -709,7 +711,7 @@ class PackageSack(PackageSackBase):
if (not where):
raise PackageSackError, 'No Package Matching %s.%s' % naTup
else:
- where = self.returnPackages()
+ where = self.returnPackages(patterns=patterns)
for pkg in where:
if not highdict.has_key((pkg.name, pkg.arch)):
@@ -727,12 +729,12 @@ class PackageSack(PackageSackBase):
return highdict.values()
- def returnNewestByName(self, name=None):
+ def returnNewestByName(self, name=None, patterns=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"""
highdict = {}
- for pkg in self.returnPackages():
+ for pkg in self.returnPackages(patterns=patterns):
if not highdict.has_key(pkg.name):
highdict[pkg.name] = []
highdict[pkg.name].append(pkg)
@@ -757,11 +759,11 @@ class PackageSack(PackageSackBase):
return returnlist
- def simplePkgList(self):
+ def simplePkgList(self, patterns=None):
"""returns a list of pkg tuples (n, a, e, v, r) optionally from a single repoid"""
# Don't cache due to excludes
- return [pkg.pkgtup for pkg in self.returnPackages()]
+ return [pkg.pkgtup for pkg in self.returnPackages(patterns=patterns)]
def printPackages(self):
for pkg in self.returnPackages():
diff --git a/yum/rpmsack.py b/yum/rpmsack.py
index 9e049c6..c715764 100644
--- a/yum/rpmsack.py
+++ b/yum/rpmsack.py
@@ -178,7 +178,7 @@ class RPMDBPackageSack(PackageSackBase):
installed = PackageSackBase.contains
- def returnNewestByNameArch(self, naTup=None):
+ def returnNewestByNameArch(self, naTup=None, patterns=None):
#FIXME - should this (or any packagesack) be returning tuples?
if not naTup:
@@ -206,7 +206,7 @@ class RPMDBPackageSack(PackageSackBase):
return misc.newestInList(allpkg)
- def returnPackages(self, repoid=None):
+ def returnPackages(self, repoid=None, patterns=None):
return [ self._makePackageObject(hdr, idx)
for hdr, idx in self._all_packages() ]
diff --git a/yum/sqlitesack.py b/yum/sqlitesack.py
index 405d2c6..0c53da9 100644
--- a/yum/sqlitesack.py
+++ b/yum/sqlitesack.py
@@ -758,12 +758,13 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack):
return y
@catchSqliteException
- def returnNewestByNameArch(self, naTup=None):
+ def returnNewestByNameArch(self, naTup=None, patterns=None):
# If naTup is set do it from the database otherwise use our parent's
# returnNewestByNameArch
if (not naTup):
- return yumRepo.YumPackageSack.returnNewestByNameArch(self, naTup)
+ return yumRepo.YumPackageSack.returnNewestByNameArch(self, naTup,
+ patterns)
# First find all packages that fulfill naTup
allpkg = []
@@ -833,16 +834,32 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack):
return exactmatch, matched, unmatched
@catchSqliteException
- def _buildPkgObjList(self, repoid=None):
+ def _buildPkgObjList(self, repoid=None, patterns=None):
"""Builds a list of packages, only containing nevra information. No
excludes are done at this stage. """
+
+ if patterns is None:
+ patterns = []
returnList = []
for (repo,cache) in self.primarydb.items():
if (repoid == None or repoid == repo.id):
cur = cache.cursor()
-
- executeSQL(cur, "select pkgId, pkgKey, name,epoch,version,release,arch from packages")
+
+ qsql = """select pkgId, pkgKey, name,epoch,version,release,arch
+ from packages"""
+
+ pat_sqls = []
+ pat_data = []
+ for pattern in patterns:
+ for field in ['name', 'sql_nameArch', 'sql_nameVerRelArch',
+ 'sql_nameVer', 'sql_nameVerRel',
+ 'sql_envra', 'sql_nevra']:
+ pat_sqls.append("%s GLOB ?" % field)
+ pat_data.append(pattern)
+ if pat_sqls:
+ qsql = _FULL_PARSE_QUERY_BEG + " OR ".join(pat_sqls)
+ executeSQL(cur, qsql, pat_data)
for x in cur:
if self._key2pkg.get(repo, {}).has_key(x['pkgKey']):
po = self._key2pkg[repo][x['pkgKey']]
@@ -850,12 +867,15 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack):
po = self.pc(repo,x)
self._key2pkg.setdefault(repo, {})[po.pkgKey] = po
returnList.append(po)
- self.pkgobjlist = returnList
+ if not patterns:
+ self.pkgobjlist = returnList
+ return returnList
- def returnPackages(self, repoid=None):
+ def returnPackages(self, repoid=None, patterns=None):
"""Returns a list of packages, only containing nevra information. The
- packages are processed for excludes. """
-
+ packages are processed for excludes. Note that patterns is just
+ a hint, we are free it ignore it. """
+
# Skip unused repos completely, Eg. *-source
skip_all = True
for repo in self.added:
@@ -865,11 +885,13 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack):
if skip_all:
return []
- returnList = []
- if not hasattr(self, 'pkgobjlist'):
- self._buildPkgObjList(repoid)
+ if hasattr(self, 'pkgobjlist'):
+ pkgobjlist = self.pkgobjlist
+ else:
+ pkgobjlist = self._buildPkgObjList(repoid, patterns)
- for po in self.pkgobjlist:
+ returnList = []
+ for po in pkgobjlist:
if self._pkgExcluded(po):
continue
returnList.append(po)
@@ -978,3 +1000,16 @@ where name %(op)s '%(q)s'
or epoch || ':' || name || '-' || version || '-' || release || '.' || arch %(op)s '%(q)s'
or name || '-' || epoch || ':' || version || '-' || release || '.' || arch %(op)s '%(q)s'
"""
+
+# This is roughly the same as above, and used by _buildPkgObjList()
+_FULL_PARSE_QUERY_BEG = """
+SELECT pkgId,pkgKey,name,epoch,version,release,arch,
+ name || '.' || arch AS sql_nameArch,
+ name || '-' || version || '-' || release || '.' || arch AS sql_nameVerRelArch,
+ name || '-' || version AS sql_nameVer,
+ name || '-' || version || '-' || release AS sql_nameVerRel,
+ epoch || ':' || name || '-' || version || '-' || release || '.' || arch AS sql_envra,
+ name || '-' || epoch || ':' || version || '-' || release || '.' || arch AS sql_nevra
+ FROM packages
+ WHERE
+"""
More information about the Yum-cvs-commits
mailing list