From: Fabian Groffen Date: Fri, 12 Oct 2007 09:07:41 +0000 (-0000) Subject: Merged from trunk 8051:8058 X-Git-Url: http://git.tremily.us/gitweb.cgi?a=commitdiff_plain;h=3d47084709c0952da034054e6e3b6614d196b653;p=portage.git Merged from trunk 8051:8058 | 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 --- diff --git a/pym/portage/dbapi/bintree.py b/pym/portage/dbapi/bintree.py index 75d3b0709..e29beeb26 100644 --- a/pym/portage/dbapi/bintree.py +++ b/pym/portage/dbapi/bintree.py @@ -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() diff --git a/pym/portage/elog/mod_mail_summary.py b/pym/portage/elog/mod_mail_summary.py index d0b2577ae..5b554a7bf 100644 --- a/pym/portage/elog/mod_mail_summary.py +++ b/pym/portage/elog/mod_mail_summary.py @@ -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 diff --git a/pym/portage/getbinpkg.py b/pym/portage/getbinpkg.py index e08c8b490..e3150d774 100644 --- a/pym/portage/getbinpkg.py +++ b/pym/portage/getbinpkg.py @@ -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]])