diff options
-rw-r--r-- | cnf/sets.conf | 6 | ||||
-rw-r--r-- | doc/config/sets.docbook | 10 | ||||
-rw-r--r-- | pym/portage/sets/dbapi.py | 40 |
3 files changed, 55 insertions, 1 deletions
diff --git a/cnf/sets.conf b/cnf/sets.conf index eda003f43..b3dc132fa 100644 --- a/cnf/sets.conf +++ b/cnf/sets.conf @@ -53,3 +53,9 @@ inherits = cvs darcs git mercurial subversion class = portage.sets.dbapi.OwnerSet world-candidate = False files = /lib/modules + +# Installed packages for which the highest visible ebuild +# version is lower than the currently installed version. +[downgrade] +class = portage.sets.dbapi.DowngradeSet +world-candidate = False diff --git a/doc/config/sets.docbook b/doc/config/sets.docbook index 16fe54107..7cccbbc93 100644 --- a/doc/config/sets.docbook +++ b/doc/config/sets.docbook @@ -479,6 +479,15 @@ </itemizedlist> </para> </sect2> + <sect2 id='config-set-classes-DowngradeSet'> + <title>portage.sets.dbapi.DowngradeSet</title> + <para> + Package set which contains all packages + for which the highest visible ebuild version is lower than + the currently installed version. + This class doesn't support any extra options. + </para> + </sect2> <sect2 id='config-set-classes-PreservedLibraryConsumerSet'> <title>portage.sets.libs.PreservedLibraryConsumerSet</title> <para> @@ -518,6 +527,7 @@ <listitem><varname>preserved-rebuild</varname>: uses <classname>PreservedLibraryConsumerSet</classname></listitem> <listitem><varname>live-rebuild</varname>: uses <classname>InheritSet</classname></listitem> <listitem><varname>module-rebuild</varname>: uses <classname>OwnerSet</classname></listitem> + <listitem><varname>downgrade</varname>: uses <classname>DowngradeSet</classname></listitem> </itemizedlist> Additionally the default configuration includes a multi set section based on the <classname>StaticFileSet</classname> defaults that creates a set for each diff --git a/pym/portage/sets/dbapi.py b/pym/portage/sets/dbapi.py index 66c014272..28632f43b 100644 --- a/pym/portage/sets/dbapi.py +++ b/pym/portage/sets/dbapi.py @@ -2,7 +2,7 @@ # Distributed under the terms of the GNU General Public License v2 # $Id$ -from portage.versions import catpkgsplit, catsplit +from portage.versions import catpkgsplit, catsplit, pkgcmp from portage.sets.base import PackageSet from portage.sets import SetConfigError, get_boolean @@ -105,6 +105,44 @@ class InheritSet(PackageSet): singleBuilder = classmethod(singleBuilder) +class DowngradeSet(PackageSet): + + _operations = ["merge", "unmerge"] + + description = "Package set which contains all packages " + \ + "for which the highest visible ebuild version is lower than " + \ + "the currently installed version." + + def __init__(self, portdb=None, vardb=None): + super(DowngradeSet, self).__init__() + self._portdb = portdb + self._vardb = vardb + + def load(self): + atoms = [] + xmatch = self._portdb.xmatch + xmatch_level = "bestmatch-visible" + cp_list = self._vardb.cp_list + aux_get = self._vardb.aux_get + aux_keys = ["SLOT"] + for cp in self._vardb.cp_all(): + for cpv in cp_list(cp): + slot, = aux_get(cpv, aux_keys) + slot_atom = "%s:%s" % (cp, slot) + ebuild = xmatch(xmatch_level, slot_atom) + ebuild_split = catpkgsplit(ebuild)[1:] + installed_split = catpkgsplit(cpv)[1:] + if pkgcmp(installed_split, ebuild_split) > 0: + atoms.append(slot_atom) + + self._setAtoms(atoms) + + def singleBuilder(cls, options, settings, trees): + return cls(portdb=trees["porttree"].dbapi, + vardb=trees["vartree"].dbapi) + + singleBuilder = classmethod(singleBuilder) + class CategorySet(PackageSet): _operations = ["merge", "unmerge"] |