From e1c9b13944cc3c74bd6e0b98b0f98c08c270b307 Mon Sep 17 00:00:00 2001 From: Zac Medico Date: Thu, 31 Jul 2008 12:47:17 +0000 Subject: Bug #233253 - Implement a @downgrade set which selects packages for which 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 --- pym/portage/sets/dbapi.py | 40 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) (limited to 'pym') 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"] -- cgit v1.2.3-1-g7c22