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