[yum-commits] Branch 'yum-3_2_X' - 2 commits - cli.py yum/packageSack.py yum/rpmsack.py yumcommands.py
James Antill
james at osuosl.org
Thu May 21 21:29:47 UTC 2009
cli.py | 1
yum/packageSack.py | 35 +++++++++++++++++++++++++++
yum/rpmsack.py | 28 +++++++++++++++++++++-
yumcommands.py | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 130 insertions(+), 1 deletion(-)
New commits:
commit d0ee78add27c6b512d273af7085062cd70484515
Author: James Antill <james at and.org>
Date: Thu May 21 17:28:38 2009 -0400
Add from_repo and from_repo_rev, dito. avail. Use columns output.
diff --git a/yum/packageSack.py b/yum/packageSack.py
index 26ae8f9..34f0e06 100644
--- a/yum/packageSack.py
+++ b/yum/packageSack.py
@@ -25,6 +25,22 @@ import fnmatch
import misc
from packages import parsePackages
+class PackageSackVersion:
+ def __init__(self):
+ self._num = 0
+ self._chksum = misc.Checksums(['sha1'])
+
+ def __str__(self):
+ return "%u:%s" % (self._num, self._chksum.hexdigest())
+
+ def update(self, pkg, csum):
+ self._num += 1
+ self._chksum.update(str(pkg))
+ if csum is not None:
+ self._chksum.update(csum[0])
+ self._chksum.update(csum[1])
+
+
class PackageSackBase(object):
"""Base class that provides the interface for PackageSacks."""
def __init__(self):
@@ -150,15 +166,22 @@ class PackageSackBase(object):
def simpleVersion(self):
""" Return a simple version for all available packages. """
- chksum = misc.Checksums(['sha1'])
- num = 0
+ main = PackageSackVersion()
+ arepos = {}
for pkg in sorted(self.returnPackages()):
- num += 1
- chksum.update(str(pkg))
- for x in pkg.returnIdSum():
- chksum.update(x)
+ csum = pkg.returnIdSum()
+ main.update(pkg, csum)
+
+ arevs = arepos.setdefault(pkg.repoid, {})
+ rpsv = arevs.setdefault(None, PackageSackVersion())
+ rpsv.update(pkg, csum)
+
+ if pkg.repo.repoXML.revision is not None:
+ rev = pkg.repo.repoXML.revision
+ rpsv = arevs.setdefault(rev, PackageSackVersion())
+ rpsv.update(pkg, csum)
- return ["%u:%s" % (num, chksum.hexdigest())]
+ return [main, arepos]
def returnNewestByNameArch(self, naTup=None,
patterns=None, ignore_case=False):
diff --git a/yum/rpmsack.py b/yum/rpmsack.py
index 38b1e76..c5a5b77 100644
--- a/yum/rpmsack.py
+++ b/yum/rpmsack.py
@@ -25,7 +25,7 @@ from rpmUtils.transaction import initReadOnlyTransaction
import misc
import Errors
from packages import YumInstalledPackage, parsePackages
-from packageSack import PackageSackBase
+from packageSack import PackageSackBase, PackageSackVersion
# For returnPackages(patterns=)
import fnmatch
@@ -337,17 +337,29 @@ class RPMDBPackageSack(PackageSackBase):
def simpleVersion(self):
""" Return a simple version for all installed packages. """
- chksum = misc.Checksums(['sha1'])
- num = 0
+ main = PackageSackVersion()
+ irepos = {}
for pkg in sorted(self.returnPackages()):
- num += 1
- chksum.update(str(pkg))
- if 'checksum_type' in pkg.yumdb_info:
- chksum.update(pkg.yumdb_info.checksum_type)
- if 'checksum_data' in pkg.yumdb_info:
- chksum.update(pkg.yumdb_info.checksum_data)
-
- return ["%u:%s" % (num, chksum.hexdigest())]
+ ydbi = pkg.yumdb_info
+ csum = None
+ if 'checksum_type' in ydbi and 'checksum_data' in ydbi:
+ csum = (ydbi.checksum_type, ydbi.checksum_data)
+ main.update(pkg, csum)
+
+ repoid = 'installed'
+ rev = None
+ if 'from_repo' in pkg.yumdb_info:
+ repoid = '@' + pkg.yumdb_info.from_repo
+ if 'from_repo_revision' in pkg.yumdb_info:
+ rev = pkg.yumdb_info.from_repo_revision
+ irevs = irepos.setdefault(repoid, {})
+ rpsv = irevs.setdefault(None, PackageSackVersion())
+ rpsv.update(pkg, csum)
+ if rev is not None:
+ rpsv = irevs.setdefault(rev, PackageSackVersion())
+ rpsv.update(pkg, csum)
+
+ return [main, irepos]
@staticmethod
def _find_search_fields(fields, searchstrings, hdr):
diff --git a/yumcommands.py b/yumcommands.py
index 1696f44..aa17876 100644
--- a/yumcommands.py
+++ b/yumcommands.py
@@ -1058,18 +1058,50 @@ class VersionCommand(YumCommand):
if extcmds:
vcmd = extcmds[0]
+ def _append_repos(cols, repo_data):
+ for repoid in sorted(repo_data):
+ cur = repo_data[repoid]
+ if None in data[1][repoid]:
+ cols.append((" %s" % repoid, str(cur[None])))
+ for rev in sorted(cur):
+ if rev is None:
+ continue
+ cols.append((" %s/%s" % (repoid, rev), str(cur[rev])))
+
+ rel = base.yumvar['releasever']
+ ba = base.yumvar['basearch']
+ cols = []
if vcmd in ('installed', 'all'):
try:
data = base.rpmdb.simpleVersion()
- print "Installed:", data[0]
+ cols.append(("%s %s/%s" % (_("Installed:"), rel, ba),
+ str(data[0])))
+ if base.verbose_logger.isEnabledFor(logginglevels.DEBUG_3):
+ _append_repos(cols, data[1])
except yum.Errors.YumBaseError, e:
return 1, [str(e)]
if vcmd in ('available', 'all'):
try:
data = base.pkgSack.simpleVersion()
- print "Available:", data[0]
+ cols.append(("%s %s/%s" % (_("Available:"), rel, ba),
+ str(data[0])))
+ if base.verbose_logger.isEnabledFor(logginglevels.DEBUG_3):
+ _append_repos(cols, data[1])
except yum.Errors.YumBaseError, e:
return 1, [str(e)]
+
+ data = {'rid' : {}, 'ver' : {}}
+ for (rid, ver) in cols:
+ for (d, v) in (('rid', len(rid)), ('ver', len(ver))):
+ data[d].setdefault(v, 0)
+ data[d][v] += 1
+ data = [data['rid'], data['ver']]
+ columns = base.calcColumns(data)
+ columns = (-columns[0], columns[1])
+
+ for line in cols:
+ print base.fmtColumns(zip(line, columns))
+
return 0, []
def needTs(self, base, basecmd, extcmds):
commit 51aafe5e12cddb107e913b9b927b7a70d00a880f
Author: James Antill <james at and.org>
Date: Thu May 21 12:59:50 2009 -0400
First version of version, command
diff --git a/cli.py b/cli.py
index 7c4047a..1b5224f 100644
--- a/cli.py
+++ b/cli.py
@@ -99,6 +99,7 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
self.registerCommand(yumcommands.HelpCommand())
self.registerCommand(yumcommands.ReInstallCommand())
self.registerCommand(yumcommands.DowngradeCommand())
+ self.registerCommand(yumcommands.VersionCommand())
def registerCommand(self, command):
for name in command.getNames():
diff --git a/yum/packageSack.py b/yum/packageSack.py
index f405217..26ae8f9 100644
--- a/yum/packageSack.py
+++ b/yum/packageSack.py
@@ -148,6 +148,18 @@ class PackageSackBase(object):
"""return list of all packages"""
raise NotImplementedError()
+ def simpleVersion(self):
+ """ Return a simple version for all available packages. """
+ chksum = misc.Checksums(['sha1'])
+ num = 0
+ for pkg in sorted(self.returnPackages()):
+ num += 1
+ chksum.update(str(pkg))
+ for x in pkg.returnIdSum():
+ chksum.update(x)
+
+ return ["%u:%s" % (num, chksum.hexdigest())]
+
def returnNewestByNameArch(self, naTup=None,
patterns=None, ignore_case=False):
"""return list of newest packages based on name, arch matching
diff --git a/yum/rpmsack.py b/yum/rpmsack.py
index 66d8186..38b1e76 100644
--- a/yum/rpmsack.py
+++ b/yum/rpmsack.py
@@ -335,6 +335,20 @@ class RPMDBPackageSack(PackageSackBase):
pkgobjlist = pkgobjlist[0] + pkgobjlist[1]
return pkgobjlist
+ def simpleVersion(self):
+ """ Return a simple version for all installed packages. """
+ chksum = misc.Checksums(['sha1'])
+ num = 0
+ for pkg in sorted(self.returnPackages()):
+ num += 1
+ chksum.update(str(pkg))
+ if 'checksum_type' in pkg.yumdb_info:
+ chksum.update(pkg.yumdb_info.checksum_type)
+ if 'checksum_data' in pkg.yumdb_info:
+ chksum.update(pkg.yumdb_info.checksum_data)
+
+ return ["%u:%s" % (num, chksum.hexdigest())]
+
@staticmethod
def _find_search_fields(fields, searchstrings, hdr):
count = 0
diff --git a/yumcommands.py b/yumcommands.py
index 9b199ab..1696f44 100644
--- a/yumcommands.py
+++ b/yumcommands.py
@@ -1042,3 +1042,38 @@ class DowngradeCommand(YumCommand):
def needTs(self, base, basecmd, extcmds):
return False
+
+class VersionCommand(YumCommand):
+ def getNames(self):
+ return ['version']
+
+ def getUsage(self):
+ return "[all|installed|available]"
+
+ def getSummary(self):
+ return _("Display a version for the machine and/or available repos.")
+
+ def doCommand(self, base, basecmd, extcmds):
+ vcmd = 'installed'
+ if extcmds:
+ vcmd = extcmds[0]
+
+ if vcmd in ('installed', 'all'):
+ try:
+ data = base.rpmdb.simpleVersion()
+ print "Installed:", data[0]
+ except yum.Errors.YumBaseError, e:
+ return 1, [str(e)]
+ if vcmd in ('available', 'all'):
+ try:
+ data = base.pkgSack.simpleVersion()
+ print "Available:", data[0]
+ except yum.Errors.YumBaseError, e:
+ return 1, [str(e)]
+ return 0, []
+
+ def needTs(self, base, basecmd, extcmds):
+ vcmd = 'installed'
+ if extcmds:
+ vcmd = extcmds[0]
+ return vcmd in ('available', 'all')
More information about the Yum-commits
mailing list