Merged from trunk -r11593:11602
authorFabian Groffen <grobian@gentoo.org>
Fri, 3 Oct 2008 16:53:25 +0000 (16:53 -0000)
committerFabian Groffen <grobian@gentoo.org>
Fri, 3 Oct 2008 16:53:25 +0000 (16:53 -0000)
   | 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
doc/config/sets.docbook
pym/_emerge/__init__.py
pym/portage/elog/messages.py
pym/portage/sets/__init__.py
pym/portage/sets/base.py
pym/portage/sets/dbapi.py

index b222d5a4b5a4587ddbc4355aadc767a9dc814302..22714fc01a6663b033c0cd0f9a731a3814cbac49 100755 (executable)
@@ -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
index 78546c4cb053a174bb38af9f7090243a2e32dd4e..d993024bd392151fe8caf13fe0b7673226e4f529 100644 (file)
                        [installed category packages]
                        class = portage.sets.dbapi.CategorySet
                        multiset = true
-                       repository = vartree
                        name_pattern = $category/*
+                       intersect = installed
                        </programlisting>
                        </para>
                        <!-- TODO: reference list of available set handler classes here -->
                        <listitem><varname>category</varname>: Required. The name of an existing ebuild
                                category which should be used to create the package set.
                        </listitem>
-                       <listitem><varname>repository</varname>: Optional, defaults to 
-                               <parameter>porttree</parameter>. It determines which repository class should
-                               be used to create the package set. Valid values for this option are:
-                               <parameter>porttree</parameter> (normal ebuild repository), 
-                               <parameter>vartree</parameter> (installed package repository)
-                               and <parameter>bintree</parameter> (local binary package repository).
-                       </listitem>
                        <listitem><varname>only_visible</varname>: Optional, defaults to <parameter>true</parameter>.
                                When set to <parameter>true</parameter> the set will only include visible packages, 
                                when set to <parameter>false</parameter> it will also include masked packages.
                values that must not be contained within the specified
                variable.
                </listitem>
+               <listitem><varname>metadata-source</varname>: Optional, defaults to
+               "vartree". Specifies the repository to use for getting the metadata
+               to check.</listitem>
                </itemizedlist>
                </para>
                </sect2>
index 752b2eb679eb5957794c36888fa5a6268977b97e..a4416cbd9566a576873c0e40aad79094533d0d55 100644 (file)
@@ -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 \
index 5455e17f4017bbc48394246bd7cfcda45af559a7..ad95c975dafe83a12c2303d4a10e0b23160e7b47 100644 (file)
@@ -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:
index 50ee455e60c77d867d24487bdce89db53160b808..7ac6502b756bd862fea5219a72fa1c07ddb6487d 100644 (file)
@@ -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):
index 4de3e847da0e9eddbfc8bcf0d29da1f2f1b894a2..370b03d45009148c70f3da1db5ba223d3961b90a 100644 (file)
@@ -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)
index 438c9e2ca82146de7faf5b1f9f01398def8104f2..4ab1252d6935c69bba044a7c550524208290d4de 100644 (file)
@@ -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