[yum-commits] Branch 'yum-3_2_X' - docs/yum.8 etc/Makefile etc/version-groups.conf yumcommands.py yum/config.py yum/packageSack.py yum/rpmsack.py yum.spec

James Antill james at osuosl.org
Thu Sep 24 20:09:09 UTC 2009


 docs/yum.8              |    6 ++-
 etc/Makefile            |    6 ++-
 etc/version-groups.conf |   11 ++++++
 yum.spec                |    1 
 yum/config.py           |   19 +++++++++++
 yum/packageSack.py      |   35 +++++++++++++++-----
 yum/rpmsack.py          |   32 ++++++++++++++----
 yumcommands.py          |   82 +++++++++++++++++++++++++++++++++++++++---------
 8 files changed, 159 insertions(+), 33 deletions(-)

New commits:
commit 3083ec67b45bb96e81abd6ab1fdaefef818c133e
Author: James Antill <james at and.org>
Date:   Wed Sep 23 17:10:18 2009 -0400

     Add verison groups, for the version command.
    
     Config. file is /etc/yum/version-groups.conf
    
     Allows you to track subsets of packages to version.

diff --git a/docs/yum.8 b/docs/yum.8
index d0dfb79..9cd68dd 100644
--- a/docs/yum.8
+++ b/docs/yum.8
@@ -67,7 +67,7 @@ gnome\-packagekit application\&.
 .br
 .I \fR * repolist [all|enabled|disabled] 
 .br
-.I \fR * version [all] 
+.I \fR * version [all|installed|available|group-*|grouplist|groupinfo]
 .br
 .I \fR * history [info|list|summary|redo|undo|new] 
 .br
@@ -231,7 +231,8 @@ listed.
 .IP
 .IP "\fBversion\fP"
 Produces a "version" of the rpmdb, and of the enabled repositories if "all" is
-given as the first argument. If you pass \-v, for verbose mode, more
+given as the first argument. You can also specify version groups in the
+version-groups config. file. If you pass \-v, for verbose mode, more
 information is listed. The version is calculated by taking a sha1 hash of the
 packages (in sorted order), and the checksum_type/checksum_data entries from
 the yumdb. Note that this rpmdb version is now also used significantly within
@@ -474,6 +475,7 @@ configuration options.
 .SH "FILES"
 .nf
 /etc/yum/yum.conf
+/etc/yum/version-groups.conf
 /etc/yum/repos.d/
 /etc/yum/pluginconf.d/
 /var/cache/yum/
diff --git a/etc/Makefile b/etc/Makefile
index 1ba5a1f..7a083f7 100644
--- a/etc/Makefile
+++ b/etc/Makefile
@@ -1,3 +1,5 @@
+YUMETC=$(DESTDIR)/etc/yum
+
 all:
 	echo "Nothing to do"
 
@@ -8,7 +10,9 @@ install:
 	mkdir -p $(DESTDIR)/etc/yum/
 	mkdir -p $(DESTDIR)/etc/yum/repos.d
 
-	install -m 644 yum.conf $(DESTDIR)/etc/yum/yum.conf
+	install -m 644 yum.conf $(YUMETC)/yum.conf
+
+	install -m 644 version-groups.conf $(YUMETC)/version-groups.conf
 
 	mkdir -p $(DESTDIR)/etc/logrotate.d
 	install -m 644 yum.logrotate $(DESTDIR)/etc/logrotate.d/yum
diff --git a/etc/version-groups.conf b/etc/version-groups.conf
new file mode 100644
index 0000000..57d97dd
--- /dev/null
+++ b/etc/version-groups.conf
@@ -0,0 +1,11 @@
+#  This file allows you to create "groups" of package names, which are used by
+# the version command.
+
+[yum]
+#  These are the top level things to do with yum, we don't list Eg. libselinux
+# even though that's require by rpm(-libs).
+run_with_packages = true
+pkglist = glibc, sqlite, libcurl, nss,
+          rpm, rpm-libs, rpm-python, 
+          python,
+          python-iniparse, python-urlgrabber, python-pycurl 
diff --git a/yum.spec b/yum.spec
index 5145061..5652586 100644
--- a/yum.spec
+++ b/yum.spec
@@ -78,6 +78,7 @@ exit 0
 %defattr(-, root, root)
 %doc README AUTHORS COPYING TODO INSTALL ChangeLog PLUGINS
 %config(noreplace) %{_sysconfdir}/yum/yum.conf
+%config(noreplace) %{_sysconfdir}/yum/version-groups.conf
 %dir %{_sysconfdir}/%{name}
 %dir %{_sysconfdir}/yum/repos.d
 %config %{_sysconfdir}/logrotate.d/%{name}
diff --git a/yum/config.py b/yum/config.py
index 0d7bc38..63b3d17 100644
--- a/yum/config.py
+++ b/yum/config.py
@@ -765,6 +765,11 @@ class RepoConf(BaseConfig):
     sslclientkey = Inherit(YumConf.sslclientkey)
 
     
+class VersionGroupConf(BaseConfig):
+    pkglist = ListOption()
+    run_with_packages = BoolOption(False)
+
+
 def readStartupConfig(configfile, root):
     '''
     Parse Yum's main configuration file and return a StartupConf instance.
@@ -851,6 +856,20 @@ def readMainConfig(startupconf):
     
     return yumconf
 
+def readVersionGroupsConfig(configfile="/etc/yum/version-groups.conf"):
+    parser = ConfigParser()
+    confpp_obj = ConfigPreProcessor(configfile)
+    try:
+        parser.readfp(confpp_obj)
+    except ParsingError, e:
+        raise Errors.ConfigError("Parsing file failed: %s" % e)
+    ret = {}
+    for section in parser.sections():
+        ret[section] = VersionGroupConf()
+        ret[section].populate(parser, section)
+    return ret
+
+
 def getOption(conf, section, name, option):
     '''Convenience function to retrieve a parsed and converted value from a
     ConfigParser.
diff --git a/yum/packageSack.py b/yum/packageSack.py
index cc26d03..45e4e2d 100644
--- a/yum/packageSack.py
+++ b/yum/packageSack.py
@@ -184,23 +184,42 @@ class PackageSackBase(object):
             then it's still not a huge wart. """
         raise NotImplementedError()
 
-    def simpleVersion(self):
+    def simpleVersion(self, main_only=False, groups={}):
         """ Return a simple version for all available packages. """
+        def _up_revs(arepos, repoid, rev, pkg, csum):
+            arevs = arepos.setdefault(repoid, {})
+            rpsv = arevs.setdefault(None, PackageSackVersion())
+            rpsv.update(pkg, csum)
+            if rev is not None:
+                rpsv = arevs.setdefault(rev, PackageSackVersion())
+                rpsv.update(pkg, csum)
+
         main = PackageSackVersion()
         arepos = {}
+        main_grps = {}
+        arepos_grps = {}
         for pkg in sorted(self.returnPackages()):
             csum = pkg.returnIdSum()
             main.update(pkg, csum)
 
-            arevs = arepos.setdefault(pkg.repoid, {})
-            rpsv = arevs.setdefault(None, PackageSackVersion())
-            rpsv.update(pkg, csum)
+            for group in groups:
+                if pkg.name in groups[group]:
+                    if group not in main_grps:
+                        main_grps[group] = PackageSackVersion()
+                        arepos_grps[group] = {}
+                    main_grps[group].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)
+            if main_only:
+                continue
+
+            rev = pkg.repo.repoXML.revision
+            _up_revs(arepos, pkg.repoid, rev, pkg, csum)
+            for group in groups:
+                if pkg.name in groups[group]:
+                    _up_revs(arepos_grps[group], pkg.repoid, rev, pkg, csum)
 
+        if groups:
+            return [main, arepos, main_grps, arepos_grps]
         return [main, arepos]
 
     def returnNewestByNameArch(self, naTup=None,
diff --git a/yum/rpmsack.py b/yum/rpmsack.py
index 8368d52..fd05f9b 100644
--- a/yum/rpmsack.py
+++ b/yum/rpmsack.py
@@ -339,10 +339,20 @@ class RPMDBPackageSack(PackageSackBase):
             pkgobjlist = pkgobjlist[0] + pkgobjlist[1]
         return pkgobjlist
 
-    def simpleVersion(self, main_only=False):
+    def simpleVersion(self, main_only=False, groups={}):
         """ Return a simple version for all installed packages. """
+        def _up_revs(irepos, repoid, rev, pkg, csum):
+            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)
+
         main = PackageSackVersion()
         irepos = {}
+        main_grps = {}
+        irepos_grps = {}
         for pkg in sorted(self.returnPackages()):
             ydbi = pkg.yumdb_info
             csum = None
@@ -350,6 +360,13 @@ class RPMDBPackageSack(PackageSackBase):
                 csum = (ydbi.checksum_type, ydbi.checksum_data)
             main.update(pkg, csum)
 
+            for group in groups:
+                if pkg.name in groups[group]:
+                    if group not in main_grps:
+                        main_grps[group] = PackageSackVersion()
+                        irepos_grps[group] = {}
+                    main_grps[group].update(pkg, csum)
+
             if main_only:
                 continue
 
@@ -359,13 +376,14 @@ class RPMDBPackageSack(PackageSackBase):
                 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)
 
+            _up_revs(irepos, repoid, rev, pkg, csum)
+            for group in groups:
+                if pkg.name in groups[group]:
+                    _up_revs(irepos_grps[group], repoid, rev, pkg, csum)
+
+        if groups:
+            return [main, irepos, main_grps, irepos_grps]
         return [main, irepos]
 
     @staticmethod
diff --git a/yumcommands.py b/yumcommands.py
index f6c4e19..82c679b 100644
--- a/yumcommands.py
+++ b/yumcommands.py
@@ -30,6 +30,8 @@ import fnmatch
 import time
 from yum.i18n import utf8_width, utf8_width_fill, to_unicode
 
+import yum.config
+
 def checkRootUID(base):
     """
     Verify that the program is being run by the root user.
@@ -1096,33 +1098,80 @@ class VersionCommand(YumCommand):
                     cols.append(("    %s" % repoid, str(cur[None])))
                 cols.extend(ncols)
 
+        verbose = base.verbose_logger.isEnabledFor(logginglevels.DEBUG_3)
+        groups = {}
+        gconf = yum.config.readVersionGroupsConfig()
+        for group in gconf:
+            groups[group] = set(gconf[group].pkglist)
+            if gconf[group].run_with_packages:
+                groups[group].update(base.run_with_package_names)
+
+        if vcmd in ('grouplist'):
+            print _(" Yum version groups:")
+            for group in sorted(groups):
+                print "   ", group
+
+            return 0, ['version grouplist']
+
+        if vcmd in ('groupinfo'):
+            for group in groups:
+                if group not in extcmds[1:]:
+                    continue
+                print _(" Group   :"), group
+                print _(" Packages:")
+                if not verbose:
+                    for pkgname in sorted(groups[group]):
+                        print "   ", pkgname
+                else:
+                    data = {'envra' : {}, 'rid' : {}}
+                    pkg_names = groups[group]
+                    pkg_names2pkgs = base._group_names2aipkgs(pkg_names)
+                    base._calcDataPkgColumns(data, pkg_names, pkg_names2pkgs)
+                    data = [data['envra'], data['rid']]
+                    columns = base.calcColumns(data)
+                    columns = (-columns[0], -columns[1])
+                    base._displayPkgsFromNames(pkg_names, True, pkg_names2pkgs,
+                                               columns=columns)
+
+            return 0, ['version groupinfo']
+
         rel = base.yumvar['releasever']
         ba  = base.yumvar['basearch']
         cols = []
-        if vcmd in ('installed', 'all'):
+        if vcmd in ('installed', 'all', 'group-installed', 'group-all'):
             try:
-                main_only = True
-                if base.verbose_logger.isEnabledFor(logginglevels.DEBUG_3):
-                    main_only = False
-                data = base.rpmdb.simpleVersion(main_only)
+                data = base.rpmdb.simpleVersion(not verbose, groups=groups)
                 lastdbv = base.history.last()
                 if lastdbv is not None:
                     lastdbv = lastdbv.end_rpmdbversion
                 if lastdbv is not None and data[0] != lastdbv:
                     errstring = _('Warning: RPMDB has been altered since the last yum transaction.')
                     base.logger.warning(errstring)
-                cols.append(("%s %s/%s" % (_("Installed:"), rel, ba),
-                             str(data[0])))
-                _append_repos(cols, data[1])
+                if vcmd not in ('group-installed', 'group-all'):
+                    cols.append(("%s %s/%s" % (_("Installed:"), rel, ba),
+                                 str(data[0])))
+                    _append_repos(cols, data[1])
+                if groups:
+                    for grp in sorted(data[2]):
+                        cols.append(("%s %s" % (_("Group-Installed:"), grp),
+                                     str(data[2][grp])))
+                        _append_repos(cols, data[3][grp])
             except yum.Errors.YumBaseError, e:
                 return 1, [str(e)]
-        if vcmd in ('available', 'all'):
+        if vcmd in ('available', 'all', 'group-available', 'group-all'):
             try:
-                data = base.pkgSack.simpleVersion()
-                cols.append(("%s %s/%s" % (_("Available:"), rel, ba),
-                             str(data[0])))
-                if base.verbose_logger.isEnabledFor(logginglevels.DEBUG_3):
-                    _append_repos(cols, data[1])
+                data = base.pkgSack.simpleVersion(not verbose, groups=groups)
+                if vcmd not in ('group-available', 'group-all'):
+                    cols.append(("%s %s/%s" % (_("Available:"), rel, ba),
+                                 str(data[0])))
+                    if verbose:
+                        _append_repos(cols, data[1])
+                if groups:
+                    for grp in sorted(data[2]):
+                        cols.append(("%s %s" % (_("Group-Available:"), grp),
+                                     str(data[2][grp])))
+                        if verbose:
+                            _append_repos(cols, data[3][grp])
             except yum.Errors.YumBaseError, e:
                 return 1, [str(e)]
 
@@ -1144,7 +1193,10 @@ class VersionCommand(YumCommand):
         vcmd = 'installed'
         if extcmds:
             vcmd = extcmds[0]
-        return vcmd in ('available', 'all')
+        verbose = base.verbose_logger.isEnabledFor(logginglevels.DEBUG_3)
+        if vcmd == 'groupinfo' and verbose:
+            return True
+        return vcmd in ('available', 'all', 'group-available', 'group-all')
 
 
 class HistoryCommand(YumCommand):


More information about the Yum-commits mailing list