# Copyright 1999-2018 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 import functools from _emerge.CompositeTask import CompositeTask from portage import os from portage.dbapi._MergeProcess import MergeProcess from portage.util._async.AsyncTaskFuture import AsyncTaskFuture class EbuildMerge(CompositeTask): __slots__ = ("exit_hook", "find_blockers", "logger", "ldpath_mtimes", "pkg", "pkg_count", "pkg_path", "postinst_failure", "pretend", "settings", "tree", "world_atom") def _start(self): root_config = self.pkg.root_config settings = self.settings mycat = settings["CATEGORY"] mypkg = settings["PF"] pkgloc = settings["D"] infloc = os.path.join(settings["PORTAGE_BUILDDIR"], "build-info") myebuild = settings["EBUILD"] mydbapi = root_config.trees[self.tree].dbapi vartree = root_config.trees["vartree"] background = (settings.get('PORTAGE_BACKGROUND') == '1') logfile = settings.get('PORTAGE_LOG_FILE') merge_task = MergeProcess( mycat=mycat, mypkg=mypkg, settings=settings, treetype=self.tree, vartree=vartree, scheduler=self.scheduler, background=background, blockers=self.find_blockers, pkgloc=pkgloc, infloc=infloc, myebuild=myebuild, mydbapi=mydbapi, prev_mtimes=self.ldpath_mtimes, logfile=logfile) self._start_task(merge_task, self._merge_exit) def _merge_exit(self, merge_task): if self._final_exit(merge_task) != os.EX_OK: self._start_exit_hook(self.returncode) return self.postinst_failure = merge_task.postinst_failure pkg = self.pkg self.world_atom(pkg) pkg_count = self.pkg_count pkg_path = self.pkg_path logger = self.logger if "noclean" not in self.settings.features: short_msg = "emerge: (%s of %s) %s Clean Post" % \ (pkg_count.curval, pkg_count.maxval, pkg.cpv) logger.log((" === (%s of %s) " + \ "Post-Build Cleaning (%s::%s)") % \ (pkg_count.curval, pkg_count.maxval, pkg.cpv, pkg_path), short_msg=short_msg) logger.log(" ::: completed emerge (%s of %s) %s to %s" % \ (pkg_count.curval, pkg_count.maxval, pkg.cpv, pkg.root)) self._start_exit_hook(self.returncode) def _start_exit_hook(self, returncode): """ Start the exit hook, and set returncode after it completes. """ # The returncode will be set after exit hook is complete. self.returncode = None self._start_task( AsyncTaskFuture(future=self.exit_hook(self)), functools.partial(self._exit_hook_exit, returncode)) def _exit_hook_exit(self, returncode, task): self._assert_current(task) self.returncode = returncode self._async_wait()