[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