Merged from trunk 8051:8058
authorFabian Groffen <grobian@gentoo.org>
Fri, 12 Oct 2007 09:07:41 +0000 (09:07 -0000)
committerFabian Groffen <grobian@gentoo.org>
Fri, 12 Oct 2007 09:07:41 +0000 (09:07 -0000)
   | 8052    | Split USE evaluation code out of binarytree.inject() so that |
   | zmedico | it can be reused in populate().                              |

   | 8053    | Sync code between binarytree.inject() and populate().        |
   | zmedico |                                                              |

   | 8054    | Pass default package metadata values into the PackageIndex   |
   | zmedico | constructor for optional things like EAPI and SLOT.          |

   | 8055    | Pass into the PackageIndex constructor a list of package     |
   | zmedico | metadata keys that inherit a default value from the header.  |

   | 8058    | Use writemsg() to send exception string to stderr.           |
   | zmedico |                                                              |

svn path=/main/branches/prefix/; revision=8077

pym/portage/dbapi/bintree.py
pym/portage/elog/mod_mail_summary.py
pym/portage/getbinpkg.py

index 75d3b0709b7d9fb5f66fcf44d39eb3dd213dca44..e29beeb267151f13531019977bb177feef096715 100644 (file)
@@ -144,9 +144,22 @@ class binarytree(object):
                        self._pkgindex_file = os.path.join(self.pkgdir, "Packages")
                        self._pkgindex_keys = self.dbapi._aux_cache_keys.copy()
                        self._pkgindex_keys.update(["CPV", "MTIME", "SIZE"])
+                       self._pkgindex_aux_keys = \
+                               ["CHOST", "DEPEND", "DESCRIPTION", "EAPI",
+                               "IUSE", "KEYWORDS", "LICENSE", "PDEPEND",
+                               "PROVIDE", "RDEPEND", "SLOT", "USE"]
+                       self._pkgindex_aux_keys = list(self._pkgindex_aux_keys)
                        self._pkgindex_header_keys = set(["ACCEPT_KEYWORDS", "CBUILD",
                                "CHOST", "CONFIG_PROTECT", "CONFIG_PROTECT_MASK", "FEATURES",
                                "GENTOO_MIRRORS", "INSTALL_MASK", "SYNC", "USE"])
+                       self._pkgindex_default_pkg_data = {
+                               "EAPI"    : "0",
+                               "IUSE"    : "",
+                               "PROVIDE" : "",
+                               "SLOT"    : "0",
+                               "USE"     : ""
+                       }
+                       self._pkgindex_inherited_keys = ["CHOST"]
 
        def move_ent(self, mylist):
                if not self.populated:
@@ -355,7 +368,7 @@ class binarytree(object):
                                dirs.remove("All")
                        dirs.sort()
                        dirs.insert(0, "All")
-                       pkgindex = portage.getbinpkg.PackageIndex()
+                       pkgindex = self._new_pkgindex()
                        pf_index = None
                        try:
                                f = open(self._pkgindex_file)
@@ -368,7 +381,7 @@ class binarytree(object):
                                        f.close()
                                        del f
                        if not self._pkgindex_version_supported(pkgindex):
-                               pkgindex = portage.getbinpkg.PackageIndex()
+                               pkgindex = self._new_pkgindex()
                        header = pkgindex.header
                        metadata = pkgindex.packages
                        update_pkgindex = False
@@ -499,15 +512,15 @@ class binarytree(object):
                                        d["MTIME"] = str(long(s.st_mtime))
                                        d["SIZE"] = str(s.st_size)
 
-                                       aux_keys = list(self.dbapi._aux_cache_keys)
-                                       d.update(izip(aux_keys,
-                                               self.dbapi.aux_get(mycpv, aux_keys)))
-
-                                       use = d["USE"].split()
-                                       iuse = set(d["IUSE"].split())
-                                       use = [f for f in use if f in iuse]
-                                       use.sort()
-                                       d["USE"] = " ".join(use)
+                                       d.update(izip(self._pkgindex_aux_keys,
+                                               self.dbapi.aux_get(mycpv, self._pkgindex_aux_keys)))
+                                       try:
+                                               self._eval_use_flags(mycpv, d)
+                                       except portage.exception.InvalidDependString:
+                                               writemsg("!!! Invalid binary package: '%s'\n" % \
+                                                       self.getname(mycpv), noiselevel=-1)
+                                               self.dbapi.cpv_remove(cpv)
+                                               del pkg_paths[mycpv]
 
                                        # record location if it's non-default
                                        if mypath != mycpv + ".tbz2":
@@ -551,7 +564,7 @@ class binarytree(object):
                        urldata = urlparse(base_url)
                        pkgindex_file = os.path.join(CACHE_PATH, "binhost",
                                urldata[1] + urldata[2], "Packages")
-                       pkgindex = portage.getbinpkg.PackageIndex()
+                       pkgindex = self._new_pkgindex()
                        try:
                                f = open(pkgindex_file)
                                try:
@@ -563,7 +576,7 @@ class binarytree(object):
                                        raise
                        local_timestamp = pkgindex.header.get("TIMESTAMP", None)
                        import urllib, urlparse
-                       rmt_idx = portage.getbinpkg.PackageIndex()
+                       rmt_idx = self._new_pkgindex()
                        try:
                                f = urllib.urlopen(urlparse.urljoin(base_url, "Packages"))
                                try:
@@ -706,7 +719,7 @@ class binarytree(object):
                        if self._all_directory and \
                                self.getname(cpv).split(os.path.sep)[-2] == "All":
                                self._create_symlink(cpv)
-                       pkgindex = portage.getbinpkg.PackageIndex()
+                       pkgindex = self._new_pkgindex()
                        try:
                                f = open(self._pkgindex_file)
                        except EnvironmentError:
@@ -718,7 +731,7 @@ class binarytree(object):
                                        f.close()
                                        del f
                        if not self._pkgindex_version_supported(pkgindex):
-                               pkgindex = portage.getbinpkg.PackageIndex()
+                               pkgindex = self._new_pkgindex()
                        d = digests
                        d["CPV"] = cpv
                        d["SLOT"] = slot
@@ -728,39 +741,17 @@ class binarytree(object):
                        # record location if it's non-default
                        if rel_path != cpv + ".tbz2":
                                d["PATH"] = rel_path
-                       keys = ["USE", "IUSE", "DESCRIPTION", "EAPI", "LICENSE", "PROVIDE", \
-                               "RDEPEND", "DEPEND", "PDEPEND"]
                        from itertools import izip
-                       d.update(izip(keys, self.dbapi.aux_get(cpv, keys)))
-                       use = d["USE"].split()
-                       iuse = set(d["IUSE"].split())
-                       use = [f for f in use if f in iuse]
-                       if not iuse:
-                               del d["IUSE"]
-                       use.sort()
-                       d["USE"] = " ".join(use)
-                       d["DESC"] = d["DESCRIPTION"]
-                       del d["DESCRIPTION"]
-                       from portage.dep import paren_reduce, use_reduce, \
-                               paren_normalize, paren_enclose
-                       for k in "LICENSE", "RDEPEND", "DEPEND", "PDEPEND", "PROVIDE":
-                               try:
-                                       deps = paren_reduce(d[k])
-                                       deps = use_reduce(deps, uselist=use)
-                                       deps = paren_normalize(deps)
-                                       deps = paren_enclose(deps)
-                               except portage.exception.InvalidDependString, e:
-                                       writemsg("%s: %s\n" % (k, str(e)),
-                                               noiselevel=-1)
-                                       del e
-                                       writemsg("!!! Invalid binary package: '%s'\n" % \
-                                               self.getname(cpv), noiselevel=-1)
-                                       self.dbapi.cpv_remove(cpv)
-                                       return
-                               if deps:
-                                       d[k] = deps
-                               else:
-                                       del d[k]
+                       d.update(izip(self._pkgindex_aux_keys,
+                               self.dbapi.aux_get(cpv, self._pkgindex_aux_keys)))
+                       try:
+                               self._eval_use_flags(cpv, d)
+                       except portage.exception.InvalidDependString:
+                               writemsg("!!! Invalid binary package: '%s'\n" % \
+                                       self.getname(cpv), noiselevel=-1)
+                               self.dbapi.cpv_remove(cpv)
+                               del self._pkg_paths[cpv]
+                               return
                        pkgindex.packages[cpv] = d
                        self._update_pkgindex_header(pkgindex.header)
                        from portage.util import atomic_ofstream
@@ -773,6 +764,11 @@ class binarytree(object):
                        if pkgindex_lock:
                                unlockfile(pkgindex_lock)
 
+       def _new_pkgindex(self):
+               return portage.getbinpkg.PackageIndex(
+                       default_pkg_data=self._pkgindex_default_pkg_data,
+                       inherited_keys=self._pkgindex_inherited_keys)
+
        def _update_pkgindex_header(self, header):
                portdir = normalize_path(os.path.realpath(self.settings["PORTDIR"]))
                profiles_base = os.path.join(portdir, "profiles") + os.path.sep
@@ -803,6 +799,28 @@ class binarytree(object):
                                pass
                return False
 
+       def _eval_use_flags(self, cpv, metadata):
+               metadata["DESC"] = metadata["DESCRIPTION"]
+               del metadata["DESCRIPTION"]
+               use = metadata["USE"].split()
+               iuse = set(metadata["IUSE"].split())
+               use = [f for f in use if f in iuse]
+               use.sort()
+               metadata["USE"] = " ".join(use)
+               from portage.dep import paren_reduce, use_reduce, \
+                       paren_normalize, paren_enclose
+               for k in "LICENSE", "RDEPEND", "DEPEND", "PDEPEND", "PROVIDE":
+                       try:
+                               deps = paren_reduce(metadata[k])
+                               deps = use_reduce(deps, uselist=use)
+                               deps = paren_normalize(deps)
+                               deps = paren_enclose(deps)
+                       except portage.exception.InvalidDependString, e:
+                               writemsg("%s: %s\n" % (k, str(e)),
+                                       noiselevel=-1)
+                               raise
+                       metadata[k] = deps
+
        def exists_specific(self, cpv):
                if not self.populated:
                        self.populate()
index d0b2577ae056afa0462485d975e7ce8e64ebb26d..5b554a7bf240de1eaa677f397f587dec71565338 100644 (file)
@@ -5,6 +5,7 @@
 
 import portage.mail, socket, os, time
 from portage.exception import PortageException
+from portage.util import writemsg
 from email.MIMEText import MIMEText as TextMessage
 
 _items = {}
@@ -52,6 +53,6 @@ def _finalize(mysettings, items):
        try:
                portage.mail.send_mail(mysettings, mymessage)
        except PortageException, e:
-               print str(e)
+               writemsg("%s\n" % str(e), noiselevel=-1)
 
        return
index e08c8b49018d64b23608690b5e768fbcd1bfc8dd..e3150d774fefdcfb3cd2f08ef6d0986cd1fbd715 100644 (file)
@@ -665,7 +665,9 @@ def writepkgindex(pkgfile, items):
 
 class PackageIndex(object):
 
-       def __init__(self):
+       def __init__(self, default_pkg_data=None, inherited_keys=None):
+               self._default_pkg_data = default_pkg_data
+               self._inherited_keys = inherited_keys
                self.header = {}
                self.packages = {}
                self.modified = True
@@ -678,7 +680,6 @@ class PackageIndex(object):
                self.header.update(readpkgindex(pkgfile))
 
        def readBody(self, pkgfile):
-               header_chost = self.header.get("CHOST")
                while True:
                        d = readpkgindex(pkgfile)
                        if not d:
@@ -686,13 +687,14 @@ class PackageIndex(object):
                        mycpv = d.get("CPV")
                        if not mycpv:
                                continue
-                       d.setdefault("EAPI", "0")
-                       d.setdefault("IUSE", "")
-                       d.setdefault("PROVIDE", "")
-                       d.setdefault("SLOT", "0")
-                       d.setdefault("USE", "")
-                       if header_chost:
-                               d.setdefault("CHOST", header_chost)
+                       if self._default_pkg_data:
+                               for k, v in self._default_pkg_data.iteritems():
+                                       d.setdefault(k, v)
+                       if self._inherited_keys:
+                               for k in self._inherited_keys:
+                                       v = self.header.get(k)
+                                       if v is not None:
+                                               d.setdefault(k, v)
                        self.packages[mycpv] = d
 
        def write(self, pkgfile):
@@ -704,21 +706,18 @@ class PackageIndex(object):
                keys = self.header.keys()
                keys.sort()
                writepkgindex(pkgfile, [(k, self.header[k]) for k in keys])
-               header_chost = self.header.get("CHOST")
                for cpv in cpv_all:
                        metadata = self.packages[cpv].copy()
-                       if metadata.get("CHOST") == header_chost:
-                               del metadata["CHOST"]
-                       if metadata.get("EAPI") == "0":
-                               del metadata["EAPI"]
-                       if metadata.get("IUSE") == "":
-                               del metadata["IUSE"]
-                       if metadata.get("PROVIDE") == "":
-                               del metadata["PROVIDE"]
-                       if metadata.get("SLOT") == "0":
-                               del metadata["SLOT"]
-                       if metadata.get("USE") == "":
-                               del metadata["USE"]
+                       if self._inherited_keys:
+                               for k in self._inherited_keys:
+                                       v = self.header.get(k)
+                                       if v is not None and v == metadata.get(k):
+                                               del metadata[k]
+                       if self._default_pkg_data:
+                               for k, v in self._default_pkg_data.iteritems():
+                                       if metadata.get(k) == v:
+                                               metadata.pop(k, None)
                        keys = metadata.keys()
                        keys.sort()
-                       writepkgindex(pkgfile, [(k, metadata[k]) for k in keys])
+                       writepkgindex(pkgfile,
+                               [(k, metadata[k]) for k in keys if metadata[k]])