diff options
Diffstat (limited to 'pym/_emerge/EbuildMetadataPhase.py')
-rw-r--r-- | pym/_emerge/EbuildMetadataPhase.py | 46 |
1 files changed, 32 insertions, 14 deletions
diff --git a/pym/_emerge/EbuildMetadataPhase.py b/pym/_emerge/EbuildMetadataPhase.py index 7f9bd3bf2..c2d3747f7 100644 --- a/pym/_emerge/EbuildMetadataPhase.py +++ b/pym/_emerge/EbuildMetadataPhase.py @@ -24,8 +24,8 @@ class EbuildMetadataPhase(SubProcess): used to extract metadata from the ebuild. """ - __slots__ = ("cpv", "ebuild_hash", "fd_pipes", - "metadata_callback", "metadata", "portdb", "repo_path", "settings") + \ + __slots__ = ("cpv", "eapi_supported", "ebuild_hash", "fd_pipes", + "metadata", "portdb", "repo_path", "settings") + \ ("_eapi", "_eapi_lineno", "_raw_metadata",) _file_names = ("ebuild",) @@ -33,8 +33,6 @@ class EbuildMetadataPhase(SubProcess): _metadata_fd = 9 def _start(self): - settings = self.settings - settings.setcpv(self.cpv) ebuild_path = self.ebuild_hash.location with io.open(_unicode_encode(ebuild_path, @@ -54,13 +52,15 @@ class EbuildMetadataPhase(SubProcess): self.wait() return - if not portage.eapi_is_supported(parsed_eapi): - self.metadata = self.metadata_callback(self.cpv, - self.repo_path, {'EAPI' : parsed_eapi}, self.ebuild_hash) + self.eapi_supported = portage.eapi_is_supported(parsed_eapi) + if not self.eapi_supported: + self.metadata = {"EAPI": parsed_eapi} self._set_returncode((self.pid, os.EX_OK << 8)) self.wait() return + settings = self.settings + settings.setcpv(self.cpv) settings.configdict['pkg']['EAPI'] = parsed_eapi debug = settings.get("PORTAGE_DEBUG") == "1" @@ -148,28 +148,46 @@ class EbuildMetadataPhase(SubProcess): metadata_lines = _unicode_decode(b''.join(self._raw_metadata), encoding=_encodings['repo.content'], errors='replace').splitlines() + metadata_valid = True if len(portage.auxdbkeys) != len(metadata_lines): # Don't trust bash's returncode if the # number of lines is incorrect. - self.returncode = 1 + metadata_valid = False else: - metadata_valid = True metadata = dict(zip(portage.auxdbkeys, metadata_lines)) parsed_eapi = self._eapi if parsed_eapi is None: parsed_eapi = "0" - if (not metadata["EAPI"] or - portage.eapi_is_supported(metadata["EAPI"])) and \ + self.eapi_supported = \ + portage.eapi_is_supported(metadata["EAPI"]) + if (not metadata["EAPI"] or self.eapi_supported) and \ metadata["EAPI"] != parsed_eapi: self._eapi_invalid(metadata) if 'parse-eapi-ebuild-head' in self.settings.features: metadata_valid = False - if metadata_valid: - self.metadata = self.metadata_callback(self.cpv, + if metadata_valid: + # Since we're supposed to be able to efficiently obtain the + # EAPI from _parse_eapi_ebuild_head, we don't write cache + # entries for unsupported EAPIs. + if self.eapi_supported: + + if metadata.get("INHERITED", False): + metadata["_eclasses_"] = \ + self.portdb.repositories.get_repo_for_location( + self.repo_path).eclass_db.get_eclass_data( + metadata["INHERITED"].split()) + else: + metadata["_eclasses_"] = {} + metadata.pop("INHERITED", None) + + self.portdb._write_cache(self.cpv, self.repo_path, metadata, self.ebuild_hash) else: - self.returncode = 1 + metadata = {"EAPI": metadata["EAPI"]} + self.metadata = metadata + else: + self.returncode = 1 def _eapi_invalid(self, metadata): repo_name = self.portdb.getRepositoryName(self.repo_path) |