Пример #1
0
	def _set_returncode(self, wait_retval):
		SubProcess._set_returncode(self, wait_retval)
		# 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
	def _set_returncode(self, wait_retval):
		SubProcess._set_returncode(self, wait_retval)
		if self.returncode == os.EX_OK:
			metadata_lines = ''.join(_unicode_decode(chunk,
				encoding=_encodings['repo.content'], errors='replace')
				for chunk in self._raw_metadata).splitlines()
			if len(portage.auxdbkeys) != len(metadata_lines):
				# Don't trust bash's returncode if the
				# number of lines is incorrect.
				self.returncode = 1
			else:
				metadata = zip(portage.auxdbkeys, metadata_lines)
				self.metadata = self.metadata_callback(self.cpv,
					self.ebuild_path, self.repo_path, metadata,
					self.ebuild_mtime)
	def _set_returncode(self, wait_retval):
		SubProcess._set_returncode(self, wait_retval)
		# self._raw_metadata is None when _start returns
		# early due to an unsupported EAPI detected with
		# FEATURES=parse-eapi-ebuild-head
		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()
			if len(portage.auxdbkeys) != len(metadata_lines):
				# Don't trust bash's returncode if the
				# number of lines is incorrect.
				self.returncode = 1
			else:
				metadata = zip(portage.auxdbkeys, metadata_lines)
				self.metadata = self.metadata_callback(self.cpv,
					self.repo_path, metadata, self.ebuild_hash)
Пример #4
0
 def _set_returncode(self, wait_retval):
     SubProcess._set_returncode(self, wait_retval)
     if self.returncode == os.EX_OK:
         metadata_lines = ''.join(
             _unicode_decode(chunk,
                             encoding=_encodings['repo.content'],
                             errors='replace')
             for chunk in self._raw_metadata).splitlines()
         if len(portage.auxdbkeys) != len(metadata_lines):
             # Don't trust bash's returncode if the
             # number of lines is incorrect.
             self.returncode = 1
         else:
             metadata = zip(portage.auxdbkeys, metadata_lines)
             self.metadata = self.metadata_callback(self.cpv,
                                                    self.ebuild_path,
                                                    self.repo_path,
                                                    metadata,
                                                    self.ebuild_mtime)
Пример #5
0
 def _set_returncode(self, wait_retval):
     SubProcess._set_returncode(self, wait_retval)
     # self._raw_metadata is None when _start returns
     # early due to an unsupported EAPI detected with
     # FEATURES=parse-eapi-ebuild-head
     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()
         if len(portage.auxdbkeys) != len(metadata_lines):
             # Don't trust bash's returncode if the
             # number of lines is incorrect.
             self.returncode = 1
         else:
             metadata = zip(portage.auxdbkeys, metadata_lines)
             self.metadata = self.metadata_callback(self.cpv,
                                                    self.repo_path,
                                                    metadata,
                                                    self.ebuild_hash)
Пример #6
0
    def _set_returncode(self, wait_retval):
        SubProcess._set_returncode(self, wait_retval)

        if self.cgroup:

            def get_pids(cgroup):
                try:
                    with open(os.path.join(cgroup, 'cgroup.procs'), 'r') as f:
                        return [int(p) for p in f.read().split()]
                except OSError:
                    # cgroup removed already?
                    return []

            def kill_all(pids, sig):
                for p in pids:
                    try:
                        os.kill(p, sig)
                    except OSError as e:
                        if e.errno == errno.EPERM:
                            # Reported with hardened kernel (bug #358211).
                            writemsg_level(
                                "!!! kill: (%i) - Operation not permitted\n" %
                                (p, ),
                                level=logging.ERROR,
                                noiselevel=-1)
                        elif e.errno != errno.ESRCH:
                            raise

            # step 1: kill all orphans
            pids = get_pids(self.cgroup)
            if pids:
                kill_all(pids, signal.SIGKILL)

            # step 2: remove the cgroup
            try:
                os.rmdir(self.cgroup)
            except OSError:
                # it may be removed already, or busy
                # we can't do anything good about it
                pass
Пример #7
0
	def _set_returncode(self, wait_retval):
		SubProcess._set_returncode(self, wait_retval)

		if self.cgroup:
			def get_pids(cgroup):
				try:
					with open(os.path.join(cgroup, 'cgroup.procs'), 'r') as f:
						return [int(p) for p in f.read().split()]
				except OSError:
					# cgroup removed already?
					return []

			def kill_all(pids, sig):
				for p in pids:
					try:
						os.kill(p, sig)
					except OSError as e:
						if e.errno == errno.EPERM:
							# Reported with hardened kernel (bug #358211).
							writemsg_level(
								"!!! kill: (%i) - Operation not permitted\n" %
								(p,), level=logging.ERROR,
								noiselevel=-1)
						elif e.errno != errno.ESRCH:
							raise

			# step 1: kill all orphans
			pids = get_pids(self.cgroup)
			if pids:
				kill_all(pids, signal.SIGKILL)

			# step 2: remove the cgroup
			try:
				os.rmdir(self.cgroup)
			except OSError:
				# it may be removed already, or busy
				# we can't do anything good about it
				pass
Пример #8
0
	def _set_returncode(self, wait_retval):
		SubProcess._set_returncode(self, wait_retval)
		if self.proc.returncode is None:
			# Suppress warning messages like this:
			# ResourceWarning: subprocess 1234 is still running
			self.proc.returncode = self.returncode
Пример #9
0
	def _set_returncode(self, wait_retval):
		SubProcess._set_returncode(self, wait_retval)
		self._cgroup_cleanup()
Пример #10
0
 def _set_returncode(self, wait_retval):
     SubProcess._set_returncode(self, wait_retval)
     self._cgroup_cleanup()