diff options
Diffstat (limited to 'lib/_emerge/PackagePhase.py')
-rw-r--r-- | lib/_emerge/PackagePhase.py | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/lib/_emerge/PackagePhase.py b/lib/_emerge/PackagePhase.py new file mode 100644 index 000000000..107e2ca36 --- /dev/null +++ b/lib/_emerge/PackagePhase.py @@ -0,0 +1,93 @@ +# Copyright 2018 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 + +import io + +from _emerge.CompositeTask import CompositeTask +from _emerge.EbuildProcess import EbuildProcess +from _emerge.SpawnProcess import SpawnProcess + +import portage +from portage import os +from portage import _encodings +from portage import _unicode_encode +from portage.util._async.AsyncFunction import AsyncFunction +from portage.util.install_mask import install_mask_dir, InstallMask + + +class PackagePhase(CompositeTask): + """ + Invokes the package phase and handles PKG_INSTALL_MASK. + """ + + __slots__ = ("actionmap", "fd_pipes", "logfile", "settings", + "_pkg_install_mask", "_proot") + + _shell_binary = portage.const.BASH_BINARY + + def _start(self): + try: + with io.open(_unicode_encode( + os.path.join(self.settings["PORTAGE_BUILDDIR"], + "build-info", "PKG_INSTALL_MASK"), + encoding=_encodings['fs'], errors='strict'), + mode='r', encoding=_encodings['repo.content'], + errors='replace') as f: + self._pkg_install_mask = InstallMask(f.read()) + except EnvironmentError: + self._pkg_install_mask = None + if self._pkg_install_mask: + self._proot = os.path.join(self.settings['T'], 'packaging') + self._start_task(SpawnProcess( + args=[self._shell_binary, '-e', '-c', ('rm -rf {PROOT}; ' + 'cp -pPR $(cp --help | grep -q -- "^[[:space:]]*-l," && echo -l)' + ' "${{D}}" {PROOT}').format(PROOT=portage._shell_quote(self._proot))], + background=self.background, env=self.settings.environ(), + scheduler=self.scheduler, logfile=self.logfile), + self._copy_proot_exit) + else: + self._proot = self.settings['D'] + self._start_package_phase() + + def _copy_proot_exit(self, proc): + if self._default_exit(proc) != os.EX_OK: + self.wait() + else: + self._start_task(AsyncFunction( + target=install_mask_dir, + args=(os.path.join(self._proot, + self.settings['EPREFIX'].lstrip(os.sep)), + self._pkg_install_mask)), + self._pkg_install_mask_exit) + + def _pkg_install_mask_exit(self, proc): + if self._default_exit(proc) != os.EX_OK: + self.wait() + else: + self._start_package_phase() + + def _start_package_phase(self): + ebuild_process = EbuildProcess(actionmap=self.actionmap, + background=self.background, fd_pipes=self.fd_pipes, + logfile=self.logfile, phase="package", + scheduler=self.scheduler, settings=self.settings) + + if self._pkg_install_mask: + d_orig = self.settings["D"] + try: + self.settings["D"] = self._proot + self._start_task(ebuild_process, self._pkg_install_mask_cleanup) + finally: + self.settings["D"] = d_orig + else: + self._start_task(ebuild_process, self._default_final_exit) + + def _pkg_install_mask_cleanup(self, proc): + if self._default_exit(proc) != os.EX_OK: + self.wait() + else: + self._start_task(SpawnProcess( + args=['rm', '-rf', self._proot], + background=self.background, env=self.settings.environ(), + scheduler=self.scheduler, logfile=self.logfile), + self._default_final_exit) |