commit:     9a41593d4245c4b4b867015b5e3d91d8ef71feb2
Author:     Zac Medico <zmedico <AT> gentoo <DOT> org>
AuthorDate: Sun Mar 25 06:29:24 2018 +0000
Commit:     Zac Medico <zmedico <AT> gentoo <DOT> org>
CommitDate: Wed Mar 28 06:03:19 2018 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=9a41593d

EbuildPhase: add PackagePhase class for PKG_INSTALL_MASK

The PackagePhase class will be a convient place to invoke
a python implementation of PKG_INSTALL_MASK.

 bin/misc-functions.sh       | 23 ++++---------
 pym/_emerge/EbuildPhase.py  |  7 ++++
 pym/_emerge/PackagePhase.py | 80 +++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 93 insertions(+), 17 deletions(-)

diff --git a/bin/misc-functions.sh b/bin/misc-functions.sh
index ee65450f2..3c01280c7 100755
--- a/bin/misc-functions.sh
+++ b/bin/misc-functions.sh
@@ -503,29 +503,20 @@ preinst_selinux_labels() {
 }
 
 __dyn_package() {
-       local PROOT
 
        if ! ___eapi_has_prefix_variables; then
-               local EPREFIX= ED=${D}
+               local EPREFIX=
        fi
 
        # Make sure $PWD is not ${D} so that we don't leave gmon.out files
        # in there in case any tools were built with -pg in CFLAGS.
-
        cd "${T}" || die
 
        if [[ -n ${PKG_INSTALL_MASK} ]] ; then
-               PROOT=${T}/packaging/
-               # make a temporary copy of ${D} so that any modifications we do 
that
-               # are binpkg specific, do not influence the actual installed 
image.
-               rm -rf "${PROOT}" || die "failed removing stale package tree"
-               cp -pPR $(cp --help | grep -qs -e-l && echo -l) \
-                       "${D}" "${PROOT}" \
-                       || die "failed creating packaging tree"
-
-               install_mask "${PROOT%/}${EPREFIX}/" "${PKG_INSTALL_MASK}"
-       else
-               PROOT=${D}
+               # The caller makes ${D} refer to a temporary copy in this
+               # case, so that this does not mask files from the normal
+               # install image.
+               install_mask "${D%/}${EPREFIX}/" "${PKG_INSTALL_MASK}"
        fi
 
        local tar_options=""
@@ -539,7 +530,7 @@ __dyn_package() {
        mkdir -p "${PORTAGE_BINPKG_TMPFILE%/*}" || die "mkdir failed"
        [ -z "${PORTAGE_COMPRESSION_COMMAND}" ] && \
         die "PORTAGE_COMPRESSION_COMMAND is unset"
-       tar $tar_options -cf - $PORTAGE_BINPKG_TAR_OPTS -C "${PROOT}" . | \
+       tar $tar_options -cf - $PORTAGE_BINPKG_TAR_OPTS -C "${D}" . | \
                $PORTAGE_COMPRESSION_COMMAND -c > "$PORTAGE_BINPKG_TMPFILE"
        assert "failed to pack binary package: '$PORTAGE_BINPKG_TMPFILE'"
        PYTHONPATH=${PORTAGE_PYTHONPATH:-${PORTAGE_PYM_PATH}} \
@@ -561,8 +552,6 @@ __dyn_package() {
                echo ${md5_hash} > "${PORTAGE_BUILDDIR}"/build-info/BINPKGMD5
        __vecho ">>> Done."
 
-       # cleanup our temp tree
-       [[ -n ${PKG_INSTALL_MASK} ]] && rm -rf "${PROOT}"
        cd "${PORTAGE_BUILDDIR}"
        >> "$PORTAGE_BUILDDIR/.packaged" || \
                die "Failed to create $PORTAGE_BUILDDIR/.packaged"

diff --git a/pym/_emerge/EbuildPhase.py b/pym/_emerge/EbuildPhase.py
index d3fada622..3174cac1a 100644
--- a/pym/_emerge/EbuildPhase.py
+++ b/pym/_emerge/EbuildPhase.py
@@ -11,6 +11,7 @@ from _emerge.BinpkgEnvExtractor import BinpkgEnvExtractor
 from _emerge.MiscFunctionsProcess import MiscFunctionsProcess
 from _emerge.EbuildProcess import EbuildProcess
 from _emerge.CompositeTask import CompositeTask
+from _emerge.PackagePhase import PackagePhase
 from portage.package.ebuild.prepare_build_dirs import (_prepare_workdir,
                _prepare_fake_distdir, _prepare_fake_filesdir)
 from portage.util import writemsg
@@ -169,6 +170,12 @@ class EbuildPhase(CompositeTask):
                return logfile
 
        def _start_ebuild(self):
+               if self.phase == "package":
+                       self._start_task(PackagePhase(actionmap=self.actionmap,
+                               background=self.background, 
fd_pipes=self.fd_pipes,
+                               logfile=self._get_log_path(), 
scheduler=self.scheduler,
+                               settings=self.settings), self._ebuild_exit)
+                       return
 
                if self.phase == "unpack":
                        alist = self.settings.configdict["pkg"].get("A", 
"").split()

diff --git a/pym/_emerge/PackagePhase.py b/pym/_emerge/PackagePhase.py
new file mode 100644
index 000000000..ed8256ee0
--- /dev/null
+++ b/pym/_emerge/PackagePhase.py
@@ -0,0 +1,80 @@
+# 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
+
+
+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 = 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_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)

Reply via email to