From 8ee6745f21fda185971cc3079971a17911e2c656 Mon Sep 17 00:00:00 2001 From: Fabian Groffen Date: Fri, 3 Oct 2008 16:53:25 +0000 Subject: [PATCH] Merged from trunk -r11593:11602 | 11594 | For compatibility with long-standing --columns behavior, do | | zmedico | not display "uninstall" or satsified "blocks" nodes in the | | | merge list when --columns is enabled. Thanks to solar for | | | the suggestion. | | 11595 | make sure that cli-defined sets aren't added to @world | | genone | | | 11596 | allow selection of metadata source for VariableSet | | genone | | | 11597 | remove the 'repository' option from CategorySet in favor of | | genone | the generic 'intersect' option | | 11598 | Add a new DummyPackageSet handler to make set operators | | genone | easier to use | | 11599 | allow the portage.sets. prefix to be omitted in 'class' | | genone | options of set definitions | | 11600 | Bug #239006 - In FakeVartree._aux_get_wrapper(), fall back | | zmedico | to vdb metadata if the live ebuild's EAPI is unsupported. | | 11601 | Now that elog_base() uses 'echo -e' to expand escape codes | | zmedico | prior to using 'read' to split on newlines, it's safe to use | | | newlines as delimiters in the log file since 'read' is | | | guaranteed to split any newlines contained in the arguments. | | 11602 | Handle InvalidDependString from portdbapi.getFetchMap() | | zmedico | inside search.output(). Thanks to agaffney for reporting. | svn path=/main/branches/prefix/; revision=11615 --- bin/isolated-functions.sh | 6 +----- doc/config/sets.docbook | 12 ++++-------- pym/_emerge/__init__.py | 25 +++++++++++++++++++------ pym/portage/elog/messages.py | 2 +- pym/portage/sets/__init__.py | 8 ++++++-- pym/portage/sets/base.py | 13 +++++++++++++ pym/portage/sets/dbapi.py | 29 ++++++++++++----------------- 7 files changed, 56 insertions(+), 39 deletions(-) diff --git a/bin/isolated-functions.sh b/bin/isolated-functions.sh index b222d5a4b..22714fc01 100755 --- a/bin/isolated-functions.sh +++ b/bin/isolated-functions.sh @@ -177,12 +177,8 @@ elog_base() { return 1 ;; esac - # Note: Even though the message is split on $'\n' here, it's still - # not entirely safe to use it as a delimiter in the log file since - # there can still be escaped newlines that will be expanded due to - # the echo -e parameter. echo -e "$@" | while read line ; do - echo -ne "${messagetype} ${line}\n\0" >> \ + echo "${messagetype} ${line}" >> \ "${T}/logging/${EBUILD_PHASE:-other}" done return 0 diff --git a/doc/config/sets.docbook b/doc/config/sets.docbook index 78546c4cb..d993024bd 100644 --- a/doc/config/sets.docbook +++ b/doc/config/sets.docbook @@ -123,8 +123,8 @@ [installed category packages] class = portage.sets.dbapi.CategorySet multiset = true - repository = vartree name_pattern = $category/* + intersect = installed @@ -437,13 +437,6 @@ category: Required. The name of an existing ebuild category which should be used to create the package set. - repository: Optional, defaults to - porttree. It determines which repository class should - be used to create the package set. Valid values for this option are: - porttree (normal ebuild repository), - vartree (installed package repository) - and bintree (local binary package repository). - only_visible: Optional, defaults to true. When set to true the set will only include visible packages, when set to false it will also include masked packages. @@ -523,6 +516,9 @@ values that must not be contained within the specified variable. + metadata-source: Optional, defaults to + "vartree". Specifies the repository to use for getting the metadata + to check. diff --git a/pym/_emerge/__init__.py b/pym/_emerge/__init__.py index 752b2eb67..a4416cbd9 100644 --- a/pym/_emerge/__init__.py +++ b/pym/_emerge/__init__.py @@ -699,12 +699,18 @@ class search(object): from portage import manifest mf = manifest.Manifest( pkgdir, self.settings["DISTDIR"]) - fetchlist = self.portdb.getFetchMap(mycpv) try: - mysum[0] = mf.getDistfilesSize(fetchlist) - except KeyError, e: - file_size_str = "Unknown (missing digest for %s)" % \ - str(e) + uri_map = self.portdb.getFetchMap(mycpv) + except portage.exception.InvalidDependString, e: + file_size_str = "Unknown (%s)" % (e,) + del e + else: + try: + mysum[0] = mf.getDistfilesSize(uri_map) + except KeyError, e: + file_size_str = "Unknown (missing " + \ + "digest for %s)" % (e,) + del e available = False for db in self._dbs: @@ -1117,7 +1123,7 @@ class FakeVartree(portage.vartree): self._match = self.dbapi.match self.dbapi.match = self._match_wrapper self._aux_get_history = set() - self._portdb_keys = ["DEPEND", "RDEPEND", "PDEPEND"] + self._portdb_keys = ["EAPI", "DEPEND", "RDEPEND", "PDEPEND"] self._portdb = portdb self._global_updates = None @@ -1143,6 +1149,8 @@ class FakeVartree(portage.vartree): # Use the live ebuild metadata if possible. live_metadata = dict(izip(self._portdb_keys, self._portdb.aux_get(pkg, self._portdb_keys))) + if not portage.eapi_is_supported(live_metadata["EAPI"]): + raise KeyError(pkg) self.dbapi.aux_update(pkg, live_metadata) except (KeyError, portage.exception.PortageException): if self._global_updates is None: @@ -6729,6 +6737,7 @@ class depgraph(object): favorites_set = InternalPackageSet(favorites) oneshot = "--oneshot" in self.myopts or \ "--onlydeps" in self.myopts + columns = "--columns" in self.myopts changelogs=[] p=[] blockers = [] @@ -7004,6 +7013,8 @@ class depgraph(object): addl += colorize(blocker_style, " (is blocking %s)") % block_parents if isinstance(x, Blocker) and x.satisfied: + if columns: + continue p.append(addl) else: blockers.append(addl) @@ -7396,6 +7407,8 @@ class depgraph(object): (pkgprint(pkg_type), addl, indent, pkgprint(pkg.cpv), myoldbest) + if columns and pkg.operation == "uninstall": + continue p.append((myprint, verboseadd, repoadd)) if "--tree" not in self.myopts and \ diff --git a/pym/portage/elog/messages.py b/pym/portage/elog/messages.py index 5455e17f4..ad95c975d 100644 --- a/pym/portage/elog/messages.py +++ b/pym/portage/elog/messages.py @@ -35,7 +35,7 @@ def collect_ebuild_messages(path): logentries[msgfunction] = [] lastmsgtype = None msgcontent = [] - for l in open(filename, "r").read().split("\0"): + for l in open(filename, "rb"): if not l: continue try: diff --git a/pym/portage/sets/__init__.py b/pym/portage/sets/__init__.py index 50ee455e6..7ac6502b7 100644 --- a/pym/portage/sets/__init__.py +++ b/pym/portage/sets/__init__.py @@ -37,6 +37,7 @@ class SetConfig(SafeConfigParser): self.errors = [] if not setname in self.psets: options["name"] = setname + options["world-candidate"] = "False" # for the unlikely case that there is already a section with the requested setname import random @@ -69,8 +70,11 @@ class SetConfig(SafeConfigParser): try: setclass = load_mod(classname) except (ImportError, AttributeError): - self.errors.append("Could not import '%s' for section '%s'" % (classname, sname)) - continue + try: + setclass = load_mod("portage.sets."+classname) + except (ImportError, AttributeError): + self.errors.append("Could not import '%s' for section '%s'" % (classname, sname)) + continue # prepare option dict for the current section optdict = {} for oname in self.options(sname): diff --git a/pym/portage/sets/base.py b/pym/portage/sets/base.py index 4de3e847d..370b03d45 100644 --- a/pym/portage/sets/base.py +++ b/pym/portage/sets/base.py @@ -219,3 +219,16 @@ class InternalPackageSet(EditablePackageSet): def write(self): pass +class DummyPackageSet(PackageSet): + def __init__(self, atoms=None): + super(DummyPackageSet, self).__init__() + if atoms: + self._setAtoms(atoms) + + def load(self): + pass + + def singleBuilder(cls, options, settings, trees): + atoms = options.get("packages", "").split() + return DummyPackageSet(atoms=atoms) + singleBuilder = classmethod(singleBuilder) diff --git a/pym/portage/sets/dbapi.py b/pym/portage/sets/dbapi.py index 438c9e2ca..4ab1252d6 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, pkgcmp +from portage.versions import catpkgsplit, catsplit, pkgcmp, best from portage.dep import Atom from portage.sets.base import PackageSet from portage.sets import SetConfigError, get_boolean @@ -96,18 +96,18 @@ class VariableSet(EverythingSet): description = "Package set which contains all packages " + \ "that match specified values of a specified variable." - def __init__(self, vardb, portdb=None, variable=None, includes=None, excludes=None): + def __init__(self, vardb, metadatadb=None, variable=None, includes=None, excludes=None): super(VariableSet, self).__init__(vardb) - self._portdb = portdb + self._metadatadb = metadatadb self._variable = variable self._includes = includes self._excludes = excludes def _filter(self, atom): - ebuild = self._portdb.xmatch("bestmatch-visible", atom) + ebuild = best(self._metadatadb.match(atom)) if not ebuild: return False - values, = self._portdb.aux_get(ebuild, [self._variable]) + values, = self._metadatadb.aux_get(ebuild, [self._variable]) values = values.split() if self._includes and not self._includes.intersection(values): return False @@ -126,9 +126,13 @@ class VariableSet(EverythingSet): if not (includes or excludes): raise SetConfigError("no includes or excludes given") + + metadatadb = options.get("metadata-source", "vartree") + if not metadatadb in trees.keys(): + raise SetConfigError("invalid value '%s' for option metadata-source" % metadatadb) return cls(trees["vartree"].dbapi, - portdb=trees["porttree"].dbapi, + metadatadb=trees[metadatadb].dbapi, excludes=frozenset(excludes.split()), includes=frozenset(includes.split()), variable=variable) @@ -197,13 +201,6 @@ class CategorySet(PackageSet): myatoms.append(cp) self._setAtoms(myatoms) - def _builderGetRepository(cls, options, repositories): - repository = options.get("repository", "porttree") - if not repository in repositories: - raise SetConfigError("invalid repository class '%s'" % repository) - return repository - _builderGetRepository = classmethod(_builderGetRepository) - def _builderGetVisible(cls, options): return get_boolean(options, "only_visible", True) _builderGetVisible = classmethod(_builderGetVisible) @@ -216,10 +213,9 @@ class CategorySet(PackageSet): if not category in settings.categories: raise SetConfigError("invalid category name '%s'" % category) - repository = cls._builderGetRepository(options, trees.keys()) visible = cls._builderGetVisible(options) - return CategorySet(category, dbapi=trees[repository].dbapi, only_visible=visible) + return CategorySet(category, dbapi=trees["porttree"].dbapi, only_visible=visible) singleBuilder = classmethod(singleBuilder) def multiBuilder(cls, options, settings, trees): @@ -233,7 +229,6 @@ class CategorySet(PackageSet): else: categories = settings.categories - repository = cls._builderGetRepository(options, trees.keys()) visible = cls._builderGetVisible(options) name_pattern = options.get("name_pattern", "$category/*") @@ -241,7 +236,7 @@ class CategorySet(PackageSet): raise SetConfigError("name_pattern doesn't include $category placeholder") for cat in categories: - myset = CategorySet(cat, trees[repository].dbapi, only_visible=visible) + myset = CategorySet(cat, trees["porttree"].dbapi, only_visible=visible) myname = name_pattern.replace("$category", cat) myname = myname.replace("${category}", cat) rValue[myname] = myset -- 2.26.2