aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'lib/_emerge/PackagePhase.py')
-rw-r--r--lib/_emerge/PackagePhase.py93
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)