blob: bedea902daa935d9d5852cb015f535ff3f083301 [file] [log] [blame]
# 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()