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)