Esempio n. 1
0
    def _async_waitpid_cb(self, *args, **kwargs):
        """
        Override _async_waitpid_cb to perform cleanup that is
        not necessarily idempotent.
        """
        SubProcess._async_waitpid_cb(self, *args, **kwargs)
        # self._raw_metadata is None when _start returns
        # early due to an unsupported EAPI
        if self.returncode == os.EX_OK and self._raw_metadata is not None:
            metadata_lines = _unicode_decode(
                b"".join(self._raw_metadata),
                encoding=_encodings["repo.content"],
                errors="replace",
            ).splitlines()
            metadata = {}
            metadata_valid = True
            for l in metadata_lines:
                if "=" not in l:
                    metadata_valid = False
                    break
                key, value = l.split("=", 1)
                metadata[key] = value

            if metadata_valid:
                parsed_eapi = self._eapi
                if parsed_eapi is None:
                    parsed_eapi = "0"
                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)
                    metadata_valid = False

            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)

                    # If called by egencache, this cache write is
                    # undesirable when metadata-transfer is disabled.
                    if self.write_auxdb is not False:
                        self.portdb._write_cache(self.cpv, self.repo_path,
                                                 metadata, self.ebuild_hash)
                else:
                    metadata = {"EAPI": metadata["EAPI"]}
                self.metadata = metadata
            else:
                self.returncode = 1
Esempio n. 2
0
    def _async_waitpid_cb(self, *args, **kwargs):
        """
		Override _async_waitpid_cb to perform cleanup that is
		not necessarily idempotent.
		"""
        SubProcess._async_waitpid_cb(self, *args, **kwargs)
        # self._raw_metadata is None when _start returns
        # early due to an unsupported EAPI
        if self.returncode == os.EX_OK and \
         self._raw_metadata is not None:
            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.
                metadata_valid = False
            else:
                metadata = dict(zip(portage.auxdbkeys, metadata_lines))
                parsed_eapi = self._eapi
                if parsed_eapi is None:
                    parsed_eapi = "0"
                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)
                    metadata_valid = False

            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)

                    if eapi_has_automatic_unpack_dependencies(
                            metadata["EAPI"]):
                        repo = self.portdb.repositories.get_name_for_location(
                            self.repo_path)
                        unpackers = self.settings.unpack_dependencies.get(
                            repo, {}).get(metadata["EAPI"], {})
                        unpack_dependencies = extract_unpack_dependencies(
                            metadata["SRC_URI"], unpackers)
                        if unpack_dependencies:
                            metadata["DEPEND"] += (" "
                                                   if metadata["DEPEND"] else
                                                   "") + unpack_dependencies

                    # If called by egencache, this cache write is
                    # undesirable when metadata-transfer is disabled.
                    if self.write_auxdb is not False:
                        self.portdb._write_cache(self.cpv, self.repo_path,
                                                 metadata, self.ebuild_hash)
                else:
                    metadata = {"EAPI": metadata["EAPI"]}
                self.metadata = metadata
            else:
                self.returncode = 1
Esempio n. 3
0
	def _async_waitpid_cb(self, *args, **kwargs):
		"""
		Override _async_waitpid_cb to perform cleanup that is
		not necessarily idempotent.
		"""
		SubProcess._async_waitpid_cb(self, *args, **kwargs)
		# self._raw_metadata is None when _start returns
		# early due to an unsupported EAPI
		if self.returncode == os.EX_OK and \
			self._raw_metadata is not None:
			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.
				metadata_valid = False
			else:
				metadata = dict(zip(portage.auxdbkeys, metadata_lines))
				parsed_eapi = self._eapi
				if parsed_eapi is None:
					parsed_eapi = "0"
				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)
					metadata_valid = False

			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)

					if eapi_has_automatic_unpack_dependencies(metadata["EAPI"]):
						repo = self.portdb.repositories.get_name_for_location(self.repo_path)
						unpackers = self.settings.unpack_dependencies.get(repo, {}).get(metadata["EAPI"], {})
						unpack_dependencies = extract_unpack_dependencies(metadata["SRC_URI"], unpackers)
						if unpack_dependencies:
							metadata["DEPEND"] += (" " if metadata["DEPEND"] else "") + unpack_dependencies

					# If called by egencache, this cache write is
					# undesirable when metadata-transfer is disabled.
					if self.write_auxdb is not False:
						self.portdb._write_cache(self.cpv,
							self.repo_path, metadata, self.ebuild_hash)
				else:
					metadata = {"EAPI": metadata["EAPI"]}
				self.metadata = metadata
			else:
				self.returncode = 1
Esempio n. 4
0
 def _async_waitpid_cb(self, *args, **kwargs):
     SubProcess._async_waitpid_cb(self, *args, **kwargs)
     if self.proc.returncode is None:
         # Suppress warning messages like this:
         # ResourceWarning: subprocess 1234 is still running
         self.proc.returncode = self.returncode