Bug #233253 - Implement a @downgrade set which selects packages for which
authorZac Medico <zmedico@gentoo.org>
Thu, 31 Jul 2008 12:47:17 +0000 (12:47 -0000)
committerZac Medico <zmedico@gentoo.org>
Thu, 31 Jul 2008 12:47:17 +0000 (12:47 -0000)
the highest visible ebuild version is lower than the currently installed
version. This is useful if you have installed packages from an overlay and
you want to downgrade to the highest visible after removing the overlay,
even though the packages that will be dowgraded are not necessarily masked
in any way.

svn path=/main/trunk/; revision=11299

cnf/sets.conf
doc/config/sets.docbook
pym/portage/sets/dbapi.py

index eda003f438f2a6a6111007ffb7b1e0e790cee155..b3dc132fa15a856479840c24e13191eaeacce72d 100644 (file)
@@ -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
index 16fe54107c6db3bc5d80475b12e3058910f022eb..7cccbbc93feaa1ca45e9f39caae8ac5a214fece6 100644 (file)
                </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>
        <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 
index 66c014272baa0240ee6450912c30c8496a989fd6..28632f43b3b701ad5fc8caa9352cd3a4186050ab 100644 (file)
@@ -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"]