Gentoo Archives: gentoo-commits

From: Zac Medico <zmedico@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] proj/portage:master commit in: bin/, pym/_emerge/
Date: Wed, 28 Mar 2018 06:52:52
Message-Id: 1522216999.9a41593d4245c4b4b867015b5e3d91d8ef71feb2.zmedico@gentoo
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)