[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