| # 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, |
| ) |