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 |