Gentoo Archives: gentoo-portage-dev

From: Zac Medico <zmedico@g.o>
To: gentoo-portage-dev@l.g.o
Cc: "Michał Górny" <mgorny@g.o>, Zac Medico <zmedico@g.o>
Subject: [gentoo-portage-dev] [PATCH 2/4] EbuildPhase: add PackagePhase class for PKG_INSTALL_MASK
Date: Tue, 27 Mar 2018 09:20:01
Message-Id: 20180327091348.4354-3-zmedico@gentoo.org
In Reply to: [gentoo-portage-dev] [PATCH 0/4] {,PKG_}INSTALL_MASK support for exclusions (bug 651214) by Zac Medico
1 The PackagePhase class will be a convient place to invoke
2 a python implementation of PKG_INSTALL_MASK.
3 ---
4 bin/misc-functions.sh | 23 ++++---------
5 pym/_emerge/EbuildPhase.py | 7 ++++
6 pym/_emerge/PackagePhase.py | 80 +++++++++++++++++++++++++++++++++++++++++++++
7 3 files changed, 93 insertions(+), 17 deletions(-)
8 create mode 100644 pym/_emerge/PackagePhase.py
9
10 diff --git a/bin/misc-functions.sh b/bin/misc-functions.sh
11 index 742ce40d2..4fe6ead17 100755
12 --- a/bin/misc-functions.sh
13 +++ b/bin/misc-functions.sh
14 @@ -497,29 +497,20 @@ preinst_selinux_labels() {
15 }
16
17 __dyn_package() {
18 - local PROOT
19
20 if ! ___eapi_has_prefix_variables; then
21 - local EPREFIX= ED=${D}
22 + local EPREFIX=
23 fi
24
25 # Make sure $PWD is not ${D} so that we don't leave gmon.out files
26 # in there in case any tools were built with -pg in CFLAGS.
27 -
28 cd "${T}" || die
29
30 if [[ -n ${PKG_INSTALL_MASK} ]] ; then
31 - PROOT=${T}/packaging/
32 - # make a temporary copy of ${D} so that any modifications we do that
33 - # are binpkg specific, do not influence the actual installed image.
34 - rm -rf "${PROOT}" || die "failed removing stale package tree"
35 - cp -pPR $(cp --help | grep -qs -e-l && echo -l) \
36 - "${D}" "${PROOT}" \
37 - || die "failed creating packaging tree"
38 -
39 - install_mask "${PROOT%/}${EPREFIX}/" "${PKG_INSTALL_MASK}"
40 - else
41 - PROOT=${D}
42 + # The caller makes ${D} refer to a temporary copy in this
43 + # case, so that this does not mask files from the normal
44 + # install image.
45 + install_mask "${D%/}${EPREFIX}/" "${PKG_INSTALL_MASK}"
46 fi
47
48 local tar_options=""
49 @@ -533,7 +524,7 @@ __dyn_package() {
50 mkdir -p "${PORTAGE_BINPKG_TMPFILE%/*}" || die "mkdir failed"
51 [ -z "${PORTAGE_COMPRESSION_COMMAND}" ] && \
52 die "PORTAGE_COMPRESSION_COMMAND is unset"
53 - tar $tar_options -cf - $PORTAGE_BINPKG_TAR_OPTS -C "${PROOT}" . | \
54 + tar $tar_options -cf - $PORTAGE_BINPKG_TAR_OPTS -C "${D}" . | \
55 $PORTAGE_COMPRESSION_COMMAND -c > "$PORTAGE_BINPKG_TMPFILE"
56 assert "failed to pack binary package: '$PORTAGE_BINPKG_TMPFILE'"
57 PYTHONPATH=${PORTAGE_PYTHONPATH:-${PORTAGE_PYM_PATH}} \
58 @@ -555,8 +546,6 @@ __dyn_package() {
59 echo ${md5_hash} > "${PORTAGE_BUILDDIR}"/build-info/BINPKGMD5
60 __vecho ">>> Done."
61
62 - # cleanup our temp tree
63 - [[ -n ${PKG_INSTALL_MASK} ]] && rm -rf "${PROOT}"
64 cd "${PORTAGE_BUILDDIR}"
65 >> "$PORTAGE_BUILDDIR/.packaged" || \
66 die "Failed to create $PORTAGE_BUILDDIR/.packaged"
67 diff --git a/pym/_emerge/EbuildPhase.py b/pym/_emerge/EbuildPhase.py
68 index d3fada622..3174cac1a 100644
69 --- a/pym/_emerge/EbuildPhase.py
70 +++ b/pym/_emerge/EbuildPhase.py
71 @@ -11,6 +11,7 @@ from _emerge.BinpkgEnvExtractor import BinpkgEnvExtractor
72 from _emerge.MiscFunctionsProcess import MiscFunctionsProcess
73 from _emerge.EbuildProcess import EbuildProcess
74 from _emerge.CompositeTask import CompositeTask
75 +from _emerge.PackagePhase import PackagePhase
76 from portage.package.ebuild.prepare_build_dirs import (_prepare_workdir,
77 _prepare_fake_distdir, _prepare_fake_filesdir)
78 from portage.util import writemsg
79 @@ -169,6 +170,12 @@ class EbuildPhase(CompositeTask):
80 return logfile
81
82 def _start_ebuild(self):
83 + if self.phase == "package":
84 + self._start_task(PackagePhase(actionmap=self.actionmap,
85 + background=self.background, fd_pipes=self.fd_pipes,
86 + logfile=self._get_log_path(), scheduler=self.scheduler,
87 + settings=self.settings), self._ebuild_exit)
88 + return
89
90 if self.phase == "unpack":
91 alist = self.settings.configdict["pkg"].get("A", "").split()
92 diff --git a/pym/_emerge/PackagePhase.py b/pym/_emerge/PackagePhase.py
93 new file mode 100644
94 index 000000000..083745059
95 --- /dev/null
96 +++ b/pym/_emerge/PackagePhase.py
97 @@ -0,0 +1,80 @@
98 +# Copyright 2018 Gentoo Foundation
99 +# Distributed under the terms of the GNU General Public License v2
100 +
101 +import io
102 +
103 +from _emerge.CompositeTask import CompositeTask
104 +from _emerge.EbuildProcess import EbuildProcess
105 +from _emerge.SpawnProcess import SpawnProcess
106 +
107 +import portage
108 +from portage import os
109 +from portage import _encodings
110 +from portage import _unicode_encode
111 +
112 +
113 +class PackagePhase(CompositeTask):
114 + """
115 + Invokes the package phase and handles PKG_INSTALL_MASK.
116 + """
117 +
118 + __slots__ = ("actionmap", "fd_pipes", "logfile", "settings",
119 + "_pkg_install_mask", "_proot")
120 +
121 + _shell_binary = portage.const.BASH_BINARY
122 +
123 + def _start(self):
124 + try:
125 + with io.open(_unicode_encode(
126 + os.path.join(self.settings["PORTAGE_BUILDDIR"],
127 + "build-info", "PKG_INSTALL_MASK"),
128 + encoding=_encodings['fs'], errors='strict'),
129 + mode='r', encoding=_encodings['repo.content'],
130 + errors='replace') as f:
131 + self._pkg_install_mask = f.read().split()
132 + except OSError:
133 + self._pkg_install_mask = None
134 + if self._pkg_install_mask:
135 + self._proot = os.path.join(self.settings['T'], 'packaging')
136 + self._start_task(SpawnProcess(
137 + args=[self._shell_binary, '-e', '-c', ('rm -rf {PROOT}; '
138 + 'cp -pPR $(cp --help | grep -q -- "^[[:space:]]*-l," && echo -l)'
139 + ' "${{D}}" {PROOT}').format(PROOT=portage._shell_quote(self._proot))],
140 + background=self.background, env=self.settings.environ(),
141 + scheduler=self.scheduler, logfile=self.logfile),
142 + self._copy_proot_exit)
143 + else:
144 + self._proot = self.settings['D']
145 + self._start_package_phase()
146 +
147 + def _copy_proot_exit(self, proc):
148 + if self._default_exit(proc) != os.EX_OK:
149 + self.wait()
150 + else:
151 + self._start_package_phase()
152 +
153 + def _start_package_phase(self):
154 + ebuild_process = EbuildProcess(actionmap=self.actionmap,
155 + background=self.background, fd_pipes=self.fd_pipes,
156 + logfile=self.logfile, phase="package",
157 + scheduler=self.scheduler, settings=self.settings)
158 +
159 + if self._pkg_install_mask:
160 + d_orig = self.settings["D"]
161 + try:
162 + self.settings["D"] = self._proot
163 + self._start_task(ebuild_process, self._pkg_install_mask_cleanup)
164 + finally:
165 + self.settings["D"] = d_orig
166 + else:
167 + self._start_task(ebuild_process, self._default_final_exit)
168 +
169 + def _pkg_install_mask_cleanup(self, proc):
170 + if self._default_exit(proc) != os.EX_OK:
171 + self.wait()
172 + else:
173 + self._start_task(SpawnProcess(
174 + args=['rm', '-rf', self._proot],
175 + background=self.background, env=self.settings.environ(),
176 + scheduler=self.scheduler, logfile=self.logfile),
177 + self._default_final_exit)
178 --
179 2.13.6