commit: 61210cd17364416da121e0daab57082f79b0b68d
Author: Fabian Groffen <grobian <AT> gentoo <DOT> org>
AuthorDate: Mon Apr 18 07:36:24 2016 +0000
Commit: Fabian Groffen <grobian <AT> gentoo <DOT> org>
CommitDate: Mon Apr 18 07:36:24 2016 +0000
URL: https://gitweb.gentoo.org/repo/proj/prefix.git/commit/?id=61210cd1
sys-apps/portage: add non-applying prefix-chaining patch, bug #509136
Package-Manager: portage-2.2.28-prefix
sys-apps/portage/Manifest | 1 -
.../files/portage-2.2.14-prefix-chaining.patch | 873 +++++++++++++++++++++
sys-apps/portage/metadata.xml | 26 +-
sys-apps/portage/portage-2.2.20.ebuild | 583 --------------
sys-apps/portage/portage-2.2.28.ebuild | 2 +
5 files changed, 892 insertions(+), 593 deletions(-)
diff --git a/sys-apps/portage/Manifest b/sys-apps/portage/Manifest
index 6043692..ec3802d 100644
--- a/sys-apps/portage/Manifest
+++ b/sys-apps/portage/Manifest
@@ -1,3 +1,2 @@
-DIST prefix-portage-2.2.20.tar.bz2 1205876 SHA256
8c32e08af042384e7793a4580cbde892a66ec9ea2ad3bae739b2a9e476ac10cc SHA512
e219ca4b0dcfc6f6a4d221ebfb7e951f6676b739609e8f2d6651ac120d250797eb6fa8bde16ee0fd373403d09a7fd1c59b7e9de7b001da83300492d953ccd1a2
WHIRLPOOL
4ec1fca787e587097088009950165a1117e425365583e6f6952cabc2587bea8c7d8bb88ed8a038be41ffb33cba1a374e99d2e01707a5749449d4a246a43be1b4
DIST prefix-portage-2.2.27.tar.bz2 1230727 SHA256
51bf3f427b23dfd1d050a2071895b5134cf7f515eb00612e0f57adf645a38299 SHA512
bb528ee059c7fc06702882eaa9aad33962ad2eff7e468aa51a8b185e8b3e4ba3eaf88b2ee0f61df9c38493f0f37028e471ba2cc766fa53086ad6b975ead9b332
WHIRLPOOL
b0601462462d6dd322ffd9e806c92fd425483fc769a8c6b36c5874a4a28e21e250386ce16479e238577754ab4b194ce700bca7a0407dca919d59fd6ada87970c
DIST prefix-portage-2.2.28.tar.bz2 1187416 SHA256
e4bb6c08a65252cfb3faf777ff9bb6aab162174766202f811154c0bbe301b45e SHA512
ea0661783d421d204272b9a210745aa2040a18ea347299b3d768588e10ca8dd2e24b46975249bf30010bf565514aea640f4edb9db2ca064312c899304a8c1f42
WHIRLPOOL
d2d3feab14c4b0dc706db9336e08637897d963d0cbd7e1995431701c8c1914f6f42f57917470a2c89cdc8596d2ed8183c80f3814eba7512b5216611595da38a1
diff --git a/sys-apps/portage/files/portage-2.2.14-prefix-chaining.patch
b/sys-apps/portage/files/portage-2.2.14-prefix-chaining.patch
new file mode 100644
index 0000000..5c38795
--- /dev/null
+++ b/sys-apps/portage/files/portage-2.2.14-prefix-chaining.patch
@@ -0,0 +1,873 @@
+diff -ru prefix-portage-2.2.14.orig/bin/install-qa-check.d/05prefix
prefix-portage-2.2.14/bin/install-qa-check.d/05prefix
+--- prefix-portage-2.2.14.orig/bin/install-qa-check.d/05prefix 2014-09-28
19:31:20.000000000 +0200
++++ prefix-portage-2.2.14/bin/install-qa-check.d/05prefix 2015-06-17
10:08:15.074682823 +0200
+@@ -79,16 +79,42 @@
+ # unprefixed shebang, is the script directly in $PATH or an init
+ # script?
+ if [[ ":${PATH}:${EPREFIX}/etc/init.d:" == *":${fp}:"* ]] ; then
+- if [[ -e ${EROOT}${line[0]} || -e ${ED}${line[0]} ]] ;
then
++
all_epfs="$PORTAGE_READONLY_EPREFIXES:$EPREFIX:$EROOT:$ED"
++ save_IFS=$IFS
++ IFS=:
++ epfs=( $all_epfs )
++ IFS=$save_IFS
++
++ found=
++ for x in "${epfs[@]}"; do
++ [[ -z "${x}" ]] && continue
++ check="${x}${line[0]}"
++
++ # might already contain a prefix
++ if [[ "${line[0]}" == "${x}"* ]]; then
++ check="${line[0]}"
++ fi
++
++ if [[ -e ${check} ]]; then
++ found="${check}"
++ fi
++ done
++
++ if [[ -n ${found} ]] ; then
+ # is it unprefixed, but we can just fix it
because a
+ # prefixed variant exists
+ eqawarn "prefixing shebang of ${fn#${D}}"
++
++ if [[ ${found} == "${ED}"* || ${found} ==
"${EROOT}"* ]]; then
++ found="${EPREFIX}${line[0]}"
++ fi
++
+ # statement is made idempotent on purpose,
because
+ # symlinks may point to the same target, and
hence the
+ # same real file may be sedded multiple times
since we
+ # read the shebangs in one go upfront for
performance
+ # reasons
+- sed -i -e '1s:^#!
\?'"${line[0]}"':#!'"${EPREFIX}"${line[0]}':' "${rf}"
++ sed -i -e '1s:^#!
\?'"${line[0]}"':#!'"${found}"':' "${rf}"
+ continue
+ else
+ # this is definitely wrong: script in $PATH and
invalid shebang
+diff -ru prefix-portage-2.2.14.orig/bin/phase-helpers.sh
prefix-portage-2.2.14/bin/phase-helpers.sh
+--- prefix-portage-2.2.14.orig/bin/phase-helpers.sh 2014-09-28
19:12:31.000000000 +0200
++++ prefix-portage-2.2.14/bin/phase-helpers.sh 2015-06-17 10:24:28.997164214
+0200
+@@ -758,6 +758,10 @@
+ "${PORTAGE_BIN_PATH}/ebuild-helpers/portageq" has_version
"${eroot}" "${atom}"
+ fi
+ local retval=$?
++ if [[ ${retval} -eq 1 && -n ${READONLY_EPREFIX} ]]; then
++ ${SHELL} -c "EPREFIX='${READONLY_EPREFIX%:*}' EPYTHON=
'${READONLY_EPREFIX%:*}'/usr/lib/portage/bin/portageq has_version
'${READONLY_EPREFIX%:*}' '${atom}'"
++ retval=$?
++ fi
+ case "${retval}" in
+ 0|1)
+ return ${retval}
+@@ -817,6 +821,10 @@
+ "${PORTAGE_BIN_PATH}/ebuild-helpers/portageq" best_version
"${eroot}" "${atom}"
+ fi
+ local retval=$?
++ if [[ ${retval} -eq 1 && -n ${READONLY_EPREFIX} ]]; then
++ ${SHELL} -c "EPREFIX='${READONLY_EPREFIX%:*}' EPYTHON=
'${READONLY_EPREFIX%:*}'/usr/lib/portage/bin/portageq best_version
'${READONLY_EPREFIX%:*}' '${atom}'"
++ retval=$?
++ fi
+ case "${retval}" in
+ 0|1)
+ return ${retval}
+@@ -846,6 +854,10 @@
+ output=$("${PORTAGE_BIN_PATH}/ebuild-helpers/portageq"
master_repositories "${EROOT}" "${repository}")
+ fi
+ retval=$?
++ if [[ ${retval} -eq 1 && -n ${READONLY_EPREFIX} ]]; then
++ output=$(${SHELL} -c "EPREFIX='${READONLY_EPREFIX%:*}'
EPYTHON= '${READONLY_EPREFIX%:*}'/usr/lib/portage/bin/portageq
master_repositories '${READONLY_EPREFIX%:*}' '${repository}'")
++ retval=$?
++ fi
+ [[ -n ${output} ]] && echo "${output}"
+ case "${retval}" in
+ 0|1)
+@@ -877,6 +889,10 @@
+ output=$("${PORTAGE_BIN_PATH}/ebuild-helpers/portageq"
get_repo_path "${EROOT}" "${repository}")
+ fi
+ retval=$?
++ if [[ ${retval} -eq 1 && -n ${READONLY_EPREFIX} ]]; then
++ output=$(${SHELL} -c "EPREFIX='${READONLY_EPREFIX%:*}'
EPYTHON= '${READONLY_EPREFIX%:*}'/usr/lib/portage/bin/portageq repository_path
'${READONLY_EPREFIX%:*}' '${repository}'")
++ retval=$?
++ fi
+ [[ -n ${output} ]] && echo "${output}"
+ case "${retval}" in
+ 0|1)
+@@ -907,6 +923,10 @@
+ output=$("${PORTAGE_BIN_PATH}/ebuild-helpers/portageq"
available_eclasses "${EROOT}" "${repository}")
+ fi
+ retval=$?
++ if [[ ${retval} -eq 1 && -n ${READONLY_EPREFIX} ]]; then
++ output=$(${SHELL} -c "EPREFIX='${READONLY_EPREFIX%:*}'
EPYTHON= '${READONLY_EPREFIX%:*}'/usr/lib/portage/bin/portageq
available_eclasses '${READONLY_EPREFIX%:*}' '${repository}'")
++ retval=$?
++ fi
+ [[ -n ${output} ]] && echo "${output}"
+ case "${retval}" in
+ 0|1)
+@@ -937,6 +957,10 @@
+ else
+ output=$("${PORTAGE_BIN_PATH}/ebuild-helpers/portageq"
eclass_path "${EROOT}" "${repository}" "${eclass}")
+ fi
++ if [[ ${retval} -eq 1 && -n ${READONLY_EPREFIX} ]]; then
++ output=$(${SHELL} -c "EPREFIX='${READONLY_EPREFIX%:*}'
EPYTHON= '${READONLY_EPREFIX%:*}'/usr/lib/portage/bin/portageq eclass_path
'${READONLY_EPREFIX%:*}' '${repository}' '${eclass}'")
++ retval=$?
++ fi
+ retval=$?
+ [[ -n ${output} ]] && echo "${output}"
+ case "${retval}" in
+@@ -968,6 +992,10 @@
+ else
+ output=$("${PORTAGE_BIN_PATH}/ebuild-helpers/portageq"
license_path "${EROOT}" "${repository}" "${license}")
+ fi
++ if [[ ${retval} -eq 1 && -n ${READONLY_EPREFIX} ]]; then
++ output=(${SHELL} -c "EPREFIX='${READONLY_EPREFIX%:*}'
EPYTHON= '${READONLY_EPREFIX%:*}'/usr/lib/portage/bin/portageq license_path
'${READONLY_EPREFIX%:*}' '${repository}' '${license}'")
++ retval=$?
++ fi
+ retval=$?
+ [[ -n ${output} ]] && echo "${output}"
+ case "${retval}" in
+Only in prefix-portage-2.2.14/bin: phase-helpers.sh.orig
+diff -ru prefix-portage-2.2.14.orig/pym/_emerge/actions.py
prefix-portage-2.2.14/pym/_emerge/actions.py
+--- prefix-portage-2.2.14.orig/pym/_emerge/actions.py 2014-10-02
20:48:26.000000000 +0200
++++ prefix-portage-2.2.14/pym/_emerge/actions.py 2015-06-17
10:24:28.997164214 +0200
+@@ -38,7 +38,7 @@
+ from portage import shutil
+ from portage import eapi_is_supported, _encodings, _unicode_decode
+ from portage.cache.cache_errors import CacheError
+-from portage.const import EPREFIX
++from portage.const import EPREFIX, BPREFIX
+ from portage.const import GLOBAL_CONFIG_PATH, VCS_DIRS,
_DEPCLEAN_LIB_CHECK_DEFAULT
+ from portage.const import SUPPORTED_BINPKG_FORMATS, TIMESTAMP_FORMAT
+ from portage.dbapi.dep_expand import dep_expand
+@@ -62,6 +62,7 @@
+ from portage.util._async.run_main_scheduler import run_main_scheduler
+ from portage.util._async.SchedulerInterface import SchedulerInterface
+ from portage.util._eventloop.global_event_loop import global_event_loop
++from portage.util._path import exists_raise_eaccess
+ from portage._global_updates import _global_updates
+
+ from _emerge.clear_caches import clear_caches
+@@ -2629,7 +2630,8 @@
+ out.eerror(line)
+ return exitcode
+ elif repo.sync_type == "cvs":
+- if not os.path.exists(EPREFIX + "/usr/bin/cvs"):
++ cvs_bin = portage.process.find_binary("cvs")
++ if cvs_bin is None:
+ print("!!! %s/usr/bin/cvs does not exist, so CVS
support is disabled." % (EPREFIX))
+ print("!!! Type \"emerge %s\" to enable CVS support." %
portage.const.CVS_PACKAGE_ATOM)
+ return os.EX_UNAVAILABLE
+@@ -2697,6 +2699,13 @@
+ writemsg_level(" %s spawn failed of %s\n" % (bad("*"),
postsync,),
+ level=logging.ERROR, noiselevel=-1)
+
++ postsync = os.path.join(BPREFIX, portage.USER_CONFIG_PATH, "bin",
"post_sync")
++ if os.access(postsync, os.X_OK):
++ retval = portage.process.spawn([postsync, dosyncuri],
env=settings.environ())
++ if retval != os.EX_OK:
++ writemsg_level(" %s spawn failed of %s\n" % (bad("*"),
postsync,),
++ level=logging.ERROR, noiselevel=-1)
++
+ return os.EX_OK
+
+ def action_uninstall(settings, trees, ldpath_mtimes,
+@@ -3413,6 +3422,9 @@
+ if portage.const.EPREFIX:
+ global_config_path = os.path.join(portage.const.EPREFIX,
+ portage.const.GLOBAL_CONFIG_PATH.lstrip(os.sep))
++ if not exists_raise_eaccess(global_config_path) and
portage.const.BPREFIX:
++ global_config_path = os.path.join(portage.const.BPREFIX,
++ portage.const.GLOBAL_CONFIG_PATH.lstrip(os.sep))
+ msg.append(" This usually means that '%s'" % \
+ (os.path.join(global_config_path, "sets/portage.conf"),))
+ msg.append(" is missing or corrupt.")
+Only in prefix-portage-2.2.14/pym/_emerge: actions.py.orig
+diff -ru prefix-portage-2.2.14.orig/pym/_emerge/depgraph.py
prefix-portage-2.2.14/pym/_emerge/depgraph.py
+--- prefix-portage-2.2.14.orig/pym/_emerge/depgraph.py 2014-11-12
18:26:12.000000000 +0100
++++ prefix-portage-2.2.14/pym/_emerge/depgraph.py 2015-06-17
10:19:41.254082296 +0200
+@@ -2743,23 +2743,24 @@
+ edepend["HDEPEND"] = ""
+
+ deps = (
+- (depend_root, edepend["DEPEND"],
++ (depend_root, "DEPEND",
+ self._priority(buildtime=True,
+ optional=(pkg.built or ignore_depend_deps),
+ ignored=ignore_depend_deps)),
+- (self._frozen_config._running_root.root,
edepend["HDEPEND"],
++ (self._frozen_config._running_root.root, "HDEPEND",
+ self._priority(buildtime=True,
+ optional=(pkg.built or ignore_hdepend_deps),
+ ignored=ignore_hdepend_deps)),
+- (myroot, edepend["RDEPEND"],
++ (myroot, "RDEPEND",
+ self._priority(runtime=True)),
+- (myroot, edepend["PDEPEND"],
++ (myroot, "PDEPEND",
+ self._priority(runtime_post=True))
+ )
+
+ debug = "--debug" in self._frozen_config.myopts
+
+- for dep_root, dep_string, dep_priority in deps:
++ for dep_root, dep_type, dep_priority in deps:
++ dep_string = edepend[dep_type]
+ if not dep_string:
+ continue
+ if debug:
+@@ -2797,7 +2798,7 @@
+
+ try:
+ dep_string =
list(self._queue_disjunctive_deps(
+- pkg, dep_root, dep_priority,
dep_string))
++ pkg, dep_root, dep_priority,
dep_string, dep_type))
+ except portage.exception.InvalidDependString as
e:
+ if pkg.installed:
+
self._dynamic_config._masked_installed.add(pkg)
+@@ -2812,14 +2813,14 @@
+
+ if not self._add_pkg_dep_string(
+ pkg, dep_root, dep_priority, dep_string,
+- allow_unsatisfied):
++ allow_unsatisfied, dep_type):
+ return 0
+
+ self._dynamic_config._traversed_pkg_deps.add(pkg)
+ return 1
+
+ def _add_pkg_dep_string(self, pkg, dep_root, dep_priority, dep_string,
+- allow_unsatisfied):
++ allow_unsatisfied, dep_type=None):
+ _autounmask_backup = self._dynamic_config._autounmask
+ if dep_priority.optional or dep_priority.ignored:
+ # Temporarily disable autounmask for deps that
+@@ -2828,7 +2829,7 @@
+ try:
+ return self._wrapped_add_pkg_dep_string(
+ pkg, dep_root, dep_priority, dep_string,
+- allow_unsatisfied)
++ allow_unsatisfied, dep_type)
+ finally:
+ self._dynamic_config._autounmask = _autounmask_backup
+
+@@ -2864,7 +2865,7 @@
+ not slot_operator_rebuild
+
+ def _wrapped_add_pkg_dep_string(self, pkg, dep_root, dep_priority,
+- dep_string, allow_unsatisfied):
++ dep_string, allow_unsatisfied, dep_type=None):
+ if isinstance(pkg.depth, int):
+ depth = pkg.depth + 1
+ else:
+@@ -2888,7 +2889,7 @@
+ try:
+ selected_atoms = self._select_atoms(dep_root,
+ dep_string, myuse=self._pkg_use_enabled(pkg),
parent=pkg,
+- strict=strict, priority=dep_priority)
++ strict=strict, priority=dep_priority,
dep_type=dep_type)
+ except portage.exception.InvalidDependString:
+ if pkg.installed:
+ self._dynamic_config._masked_installed.add(pkg)
+@@ -3186,7 +3187,7 @@
+ child_pkgs.sort()
+ yield (atom, child_pkgs[-1])
+
+- def _queue_disjunctive_deps(self, pkg, dep_root, dep_priority,
dep_struct):
++ def _queue_disjunctive_deps(self, pkg, dep_root, dep_priority,
dep_struct, dep_type=None):
+ """
+ Queue disjunctive (virtual and ||) deps in
self._dynamic_config._dep_disjunctive_stack.
+ Yields non-disjunctive deps. Raises InvalidDependString when
+@@ -3195,33 +3196,33 @@
+ for x in dep_struct:
+ if isinstance(x, list):
+ if x and x[0] == "||":
+- self._queue_disjunction(pkg, dep_root,
dep_priority, [x])
++ self._queue_disjunction(pkg, dep_root,
dep_priority, [x], dep_type)
+ else:
+ for y in self._queue_disjunctive_deps(
+- pkg, dep_root, dep_priority, x):
++ pkg, dep_root, dep_priority, x,
dep_type):
+ yield y
+ else:
+ # Note: Eventually this will check for
PROPERTIES=virtual
+ # or whatever other metadata gets implemented
for this
+ # purpose.
+ if x.cp.startswith('virtual/'):
+- self._queue_disjunction(pkg, dep_root,
dep_priority, [x])
++ self._queue_disjunction(pkg, dep_root,
dep_priority, [x], dep_type)
+ else:
+ yield x
+
+- def _queue_disjunction(self, pkg, dep_root, dep_priority, dep_struct):
++ def _queue_disjunction(self, pkg, dep_root, dep_priority, dep_struct,
dep_type=None):
+ self._dynamic_config._dep_disjunctive_stack.append(
+- (pkg, dep_root, dep_priority, dep_struct))
++ (pkg, dep_root, dep_priority, dep_struct, dep_type))
+
+ def _pop_disjunction(self, allow_unsatisfied):
+ """
+ Pop one disjunctive dep from
self._dynamic_config._dep_disjunctive_stack, and use it to
+ populate self._dynamic_config._dep_stack.
+ """
+- pkg, dep_root, dep_priority, dep_struct = \
++ pkg, dep_root, dep_priority, dep_struct, dep_type = \
+ self._dynamic_config._dep_disjunctive_stack.pop()
+ if not self._add_pkg_dep_string(
+- pkg, dep_root, dep_priority, dep_struct,
allow_unsatisfied):
++ pkg, dep_root, dep_priority, dep_struct,
allow_unsatisfied, dep_type):
+ return 0
+ return 1
+
+@@ -4030,7 +4031,7 @@
+ **portage._native_kwargs(kwargs))
+
+ def _select_atoms_highest_available(self, root, depstring,
+- myuse=None, parent=None, strict=True, trees=None,
priority=None):
++ myuse=None, parent=None, strict=True, trees=None,
priority=None, dep_type=None):
+ """This will raise InvalidDependString if necessary. If trees is
+ None then self._dynamic_config._filtered_trees is used."""
+
+@@ -4053,6 +4054,13 @@
+ pkgsettings = self._frozen_config.pkgsettings[root]
+ if trees is None:
+ trees = self._dynamic_config._filtered_trees
++
++ # this one is needed to guarantee good readonly root
++ # resolution display in the merge list. required since
++ # parent (below) can be None
++ trees[root]["disp_parent"] = parent
++
++
+ mytrees = trees[root]
+ atom_graph = digraph()
+ if True:
+@@ -4081,7 +4089,7 @@
+
+ mycheck = portage.dep_check(depstring, None,
+ pkgsettings, myuse=myuse,
+- myroot=root, trees=trees)
++ myroot=root, trees=trees,
dep_type=dep_type)
+ finally:
+ # restore state
+ self._dynamic_config._autounmask =
_autounmask_backup
+@@ -4152,6 +4160,7 @@
+ continue
+ node_stack.append((child_node,
node, child_atom))
+
++ trees[root].pop("disp_parent")
+ return selected_atoms
+
+ def _expand_virt_from_graph(self, root, atom):
+diff -ru prefix-portage-2.2.14.orig/pym/_emerge/resolver/output.py
prefix-portage-2.2.14/pym/_emerge/resolver/output.py
+--- prefix-portage-2.2.14.orig/pym/_emerge/resolver/output.py 2014-05-06
21:32:08.000000000 +0200
++++ prefix-portage-2.2.14/pym/_emerge/resolver/output.py 2015-06-17
10:24:28.920497614 +0200
+@@ -22,11 +22,12 @@
+ from portage.package.ebuild.config import _get_feature_flags
+ from portage.package.ebuild._spawn_nofetch import spawn_nofetch
+ from portage.output import ( blue, colorize, create_color_func,
+- darkblue, darkgreen, green, nc_len, teal)
++ darkblue, darkgreen, green, nc_len, teal, yellow, turquoise)
+ bad = create_color_func("BAD")
+ from portage._sets.base import InternalPackageSet
+ from portage.util import writemsg_stdout
+ from portage.versions import best, cpv_getversion
++from portage.dep.dep_check import ro_selected
+
+ from _emerge.Blocker import Blocker
+ from _emerge.create_world_atom import create_world_atom
+@@ -556,6 +557,42 @@
+ writemsg_stdout("%s\n" % (pkg,), noiselevel=-1)
+ return
+
++ def print_readonly_prefix(self):
++ """Performs the actual output printing for the readonly prefix
++ information stuff
++ """
++ out = sys.stdout
++
++ # print readonly selected packages
++ if len(ro_selected) > 0:
++ out.write("\n%s\n\n" % (darkgreen("Packages resolved
from readonly installations:")))
++
++ ro_mismatch_warning = False
++ ro_dupcheck = []
++ for x in ro_selected:
++ tmp_type = x["type"].replace("END","")
++ while len(tmp_type) < 4:
++ tmp_type += " "
++ if x["parent"] and str(x["atom"]) not in ro_dupcheck:
++ out.write("[%s %s] %s %s %s (%s by %s)" %
(teal("readonly"),
++ green(tmp_type),
green(str(x["matches"][0])), yellow("from"),
++ blue(x["ro_root"]),
turquoise(str(x["atom"])), green(x["parent"].cpv)))
++
++ ro_dupcheck.append(str(x["atom"]))
++
++ if x["host_mismatch"]:
++ ro_mismatch_warning = True
++ out.write(" %s\n" % (red("**")))
++ else:
++ out.write("\n")
++
++ if ro_mismatch_warning:
++ out.write("\n%s:" % (red("**")))
++ out.write(yellow(" WARNING: packages marked with **
have been resolved as a\n"))
++ out.write(yellow(" runtime dependency, but the CHOST
variable for the parent\n"))
++ out.write(yellow(" and dependency package don't
match. This could cause link\n"))
++ out.write(yellow(" errors. It is recommended to use
RDEPEND READONLY_EPREFIX's\n"))
++ out.write(yellow(" only with matching CHOST portage
instances.\n"))
+
+ def print_verbose(self, show_repos):
+ """Prints the verbose output to std_out
+@@ -907,6 +944,7 @@
+ # now finally print out the messages
+ self.print_messages(show_repos)
+ self.print_blockers()
++ self.print_readonly_prefix()
+ if self.conf.verbosity == 3:
+ self.print_verbose(show_repos)
+ for pkg, pkg_info in self.restrict_fetch_list.items():
+diff -ru prefix-portage-2.2.14.orig/pym/portage/const.py
prefix-portage-2.2.14/pym/portage/const.py
+--- prefix-portage-2.2.14.orig/pym/portage/const.py 2014-11-12
18:26:12.000000000 +0100
++++ prefix-portage-2.2.14/pym/portage/const.py 2015-06-17 10:24:28.963830910
+0200
+@@ -187,6 +187,7 @@
+ "notitles",
+ "parallel-fetch",
+ "parallel-install",
++ "prefix-chaining",
+ "prelink-checksums",
+ "preserve-libs",
+ "protect-owned",
+@@ -265,6 +266,11 @@
+ #EPREFIX = ""
+ # END PREFIX LOCAL
+
++BPREFIX = EPREFIX
++
++# --prefix commandline arg always rules, ends up in os.environ["EPREFIX"]
++if "EPREFIX" in os.environ:
++ os.environ["PORTAGE_OVERRIDE_EPREFIX"] = os.environ["EPREFIX"]
+ # pick up EPREFIX from the environment if set
+ if "PORTAGE_OVERRIDE_EPREFIX" in os.environ:
+ EPREFIX = os.environ["PORTAGE_OVERRIDE_EPREFIX"]
+Only in prefix-portage-2.2.14/pym/portage: const.py.orig
+diff -ru prefix-portage-2.2.14.orig/pym/portage/dbapi/vartree.py
prefix-portage-2.2.14/pym/portage/dbapi/vartree.py
+--- prefix-portage-2.2.14.orig/pym/portage/dbapi/vartree.py 2014-11-12
18:28:33.000000000 +0100
++++ prefix-portage-2.2.14/pym/portage/dbapi/vartree.py 2015-06-17
10:24:28.973830901 +0200
+@@ -184,8 +184,19 @@
+ self._counter_path = os.path.join(self._eroot,
+ CACHE_PATH, "counter")
+
+- self._plib_registry = PreservedLibsRegistry(settings["ROOT"],
+- os.path.join(self._eroot, PRIVATE_PATH,
"preserved_libs_registry"))
++ plibreg_path = os.path.join(self._eroot, PRIVATE_PATH,
"preserved_libs_registry")
++
++ if vartree:
++ self._kill_eprefix = vartree._kill_eprefix
++ else:
++ self._kill_eprefix = False
++
++ if self._kill_eprefix:
++ self._aux_cache_filename =
self._aux_cache_filename.replace(EPREFIX, "")
++ self._counter_path =
self._counter_path.replace(EPREFIX, "")
++ plibreg_path = plibreg_path.replace(EPREFIX, "")
++
++ self._plib_registry = PreservedLibsRegistry(settings["ROOT"],
plibreg_path)
+ self._linkmap = LinkageMap(self)
+ chost = self.settings.get('CHOST')
+ if not chost:
+@@ -215,6 +226,9 @@
+ # This is an optimized hotspot, so don't use unicode-wrapped
+ # os module and don't use os.path.join().
+ rValue = self._eroot + VDB_PATH + _os.sep + mykey
++ if self._kill_eprefix:
++ rValue = rValue.replace(EPREFIX, "")
++
+ if filename is not None:
+ # If filename is always relative, we can do just
+ # rValue += _os.sep + filename
+@@ -440,6 +454,9 @@
+ returnme = []
+ basepath = os.path.join(self._eroot, VDB_PATH) + os.path.sep
+
++ if self._kill_eprefix:
++ basepath = os.path.join(self.root,
basepath.replace(EPREFIX, ""))
++
+ if use_cache:
+ from portage import listdir
+ else:
+@@ -530,11 +547,17 @@
+ del self.matchcache[mycat]
+ return list(self._iter_match(mydep,
+ self.cp_list(mydep.cp, use_cache=use_cache)))
++
++ _tmp_path = os.path.join(self._eroot, VDB_PATH, mycat)
++
++ if self._kill_eprefix:
++ _tmp_path = _tmp_path.replace(EPREFIX, "")
++
+ try:
+ if sys.hexversion >= 0x3030000:
+- curmtime = os.stat(os.path.join(self._eroot,
VDB_PATH, mycat)).st_mtime_ns
++ curmtime = os.stat(_tmp_path).st_mtime_ns
+ else:
+- curmtime = os.stat(os.path.join(self._eroot,
VDB_PATH, mycat)).st_mtime
++ curmtime = os.stat(_tmp_path).st_mtime
+ except (IOError, OSError):
+ curmtime=0
+
+@@ -1339,7 +1362,7 @@
+ class vartree(object):
+ "this tree will scan a var/db/pkg database located at root (passed to
init)"
+ def __init__(self, root=None, virtual=DeprecationWarning,
categories=None,
+- settings=None):
++ settings=None, kill_eprefix=None):
+
+ if settings is None:
+ settings = portage.settings
+@@ -1357,6 +1380,7 @@
+ " constructor is unused",
+ DeprecationWarning, stacklevel=2)
+
++ self._kill_eprefix = kill_eprefix
+ self.settings = settings
+ self.dbapi = vardbapi(settings=settings, vartree=self)
+ self.populated = 1
+Only in prefix-portage-2.2.14/pym/portage/dbapi: vartree.py.orig
+diff -ru prefix-portage-2.2.14.orig/pym/portage/dep/dep_check.py
prefix-portage-2.2.14/pym/portage/dep/dep_check.py
+--- prefix-portage-2.2.14.orig/pym/portage/dep/dep_check.py 2014-09-28
19:12:31.000000000 +0200
++++ prefix-portage-2.2.14/pym/portage/dep/dep_check.py 2015-06-17
10:24:28.973830901 +0200
+@@ -247,6 +247,95 @@
+ __slots__ = ('atoms', 'slot_map', 'cp_map', 'all_available',
+ 'all_installed_slots')
+
++ro_trees={}
++ro_vartrees={}
++ro_selected=[]
++
++def dep_match_readonly_roots(settings, atom, dep_type, parent=None):
++ if len(ro_trees) < len(settings.readonly_prefixes):
++ # MDUFT: create additional vartrees for every readonly root here.
++ # the ro_vartrees instances are created below as they are needed to
++ # avoid reading vartrees of portage instances which aren't required
++ # while resolving this dependencies.
++ for type in ("DEPEND","RDEPEND", "PDEPEND"):
++ ro_trees[type] = []
++
++ for ro_root, ro_dep_types in settings.readonly_prefixes.items():
++ if type in ro_dep_types:
++ ro_trees[type].append(ro_root)
++
++ if len(ro_trees) == 0:
++ return []
++
++ matches = []
++
++ for ro_root in ro_trees[dep_type]:
++ if not ro_vartrees.has_key(ro_root):
++ # target_root=ro_root ok? or should it be the real target_root?
++ _tmp_settings = portage.config(config_root=ro_root,
target_root=ro_root,
++ config_incrementals=portage.const.INCREMENTALS)
++
++ ro_vartrees[ro_root] = portage.vartree(root=ro_root,
++ categories=_tmp_settings.categories,
++ settings=_tmp_settings, kill_eprefix=True)
++
++ ro_matches = ro_vartrees[ro_root].dbapi.match(atom)
++
++ if ro_matches:
++ ro_host_mismatch = False
++ if dep_type is "RDEPEND":
++ # we need to assure binary compatability, so it needs to be
++ # the same CHOST! But how? for now i cannot do anything...
++ if parent and parent.metadata["CHOST"] !=
ro_vartrees[ro_root].settings.get("CHOST", ""):
++ # provocate a big fat warning in the list of external
packages.
++ ro_host_mismatch = True
++ pass
++
++ matches.append({ "ro_root": ro_root, "atom": atom, "matches":
ro_matches,
++ "type": dep_type, "parent": parent, "host_mismatch":
ro_host_mismatch })
++
++ return matches
++
++def dep_wordreduce_readonly(reduced, unreduced, settings, dep_type, parent):
++ for mypos, token in enumerate(unreduced):
++ # recurse if it's a list.
++ if isinstance(reduced[mypos], list):
++ reduced[mypos] = dep_wordreduce_readonly(reduced[mypos],
++ unreduced[mypos], settings, dep_type, parent)
++
++ # do nothing if it's satisfied already.
++ elif not reduced[mypos]:
++ ro_matches = dep_match_readonly_roots(settings, unreduced[mypos],
dep_type, parent)
++
++ if ro_matches:
++ # TODO: select a match if there are more than one?
++ # for now, the first match is taken...
++ ro_selected.append(ro_matches[0])
++ reduced[mypos] = True
++
++ return reduced
++
++# this may be better placed somewhere else, but i put it here for now, to
++# keep all functions in the patch on one big heap.
++def readonly_pathmatch_any(settings, path):
++ path = path.lstrip('/')
++ # first try locally, and match that if it exists.
++ if os.path.exists(os.path.join(EPREFIX,path)):
++ return os.path.join(EPREFIX,path)
++
++ # after that try all readonly roots where DEPEND is allowed. this makes
++ # sure that executing binaries is possible from there.
++ for ro_root, ro_deps in settings.readonly_roots.items():
++ if "DEPEND" in ro_deps:
++ print(" --- checking %s --- " % (os.path.join(ro_root,path)))
++ if os.path.exists(os.path.join(ro_root,path)):
++ return os.path.join(ro_root,path)
++ break
++
++ # as a fallback make the string the same as it was originally.
++ # even though this path doesn't exist.
++ return os.path.join(EPREFIX,path)
++
+ def dep_zapdeps(unreduced, reduced, myroot, use_binaries=0, trees=None):
+ """
+ Takes an unreduced and reduced deplist and removes satisfied
dependencies.
+@@ -567,7 +656,7 @@
+ assert(False) # This point should not be reachable
+
+ def dep_check(depstring, mydbapi, mysettings, use="yes", mode=None,
myuse=None,
+- use_cache=1, use_binaries=0, myroot=None, trees=None):
++ use_cache=1, use_binaries=0, myroot=None, trees=None, dep_type=None):
+ """
+ Takes a depend string, parses it, and selects atoms.
+ The myroot parameter is unused (use mysettings['EROOT'] instead).
+@@ -663,6 +752,14 @@
+ writemsg("mysplit: %s\n" % (mysplit), 1)
+ writemsg("mysplit2: %s\n" % (mysplit2), 1)
+
++ if dep_type is not None:
++ mysplit2=dep_wordreduce_readonly(unreduced=mysplit[:],
++ reduced=mysplit2, settings=mysettings,
++ dep_type=dep_type,
parent=trees[myroot].get("disp_parent"))
++
++ writemsg("\n", 1)
++ writemsg("mysplit2 after readonly reduce: %s\n" % (mysplit2), 1)
++
+ selected_atoms = dep_zapdeps(mysplit, mysplit2, myroot,
+ use_binaries=use_binaries, trees=trees)
+
+Only in prefix-portage-2.2.14/pym/portage/dep: dep_check.py.orig
+diff -ru
prefix-portage-2.2.14.orig/pym/portage/package/ebuild/_config/LocationsManager.py
prefix-portage-2.2.14/pym/portage/package/ebuild/_config/LocationsManager.py
+---
prefix-portage-2.2.14.orig/pym/portage/package/ebuild/_config/LocationsManager.py
2014-02-06 21:49:32.000000000 +0100
++++
prefix-portage-2.2.14/pym/portage/package/ebuild/_config/LocationsManager.py
2015-06-17 10:24:28.983830892 +0200
+@@ -285,6 +285,9 @@
+ if portage.const.EPREFIX:
+ self.global_config_path =
os.path.join(portage.const.EPREFIX,
+ GLOBAL_CONFIG_PATH.lstrip(os.sep))
++ if not exists_raise_eaccess(self.global_config_path)
and portage.const.BPREFIX:
++ self.global_config_path =
os.path.join(portage.const.BPREFIX,
++ GLOBAL_CONFIG_PATH.lstrip(os.sep))
+
+ def set_port_dirs(self, portdir, portdir_overlay):
+ self.portdir = portdir
+diff -ru prefix-portage-2.2.14.orig/pym/portage/package/ebuild/config.py
prefix-portage-2.2.14/pym/portage/package/ebuild/config.py
+--- prefix-portage-2.2.14.orig/pym/portage/package/ebuild/config.py
2014-09-28 19:12:31.000000000 +0200
++++ prefix-portage-2.2.14/pym/portage/package/ebuild/config.py 2015-06-17
10:24:28.983830892 +0200
+@@ -298,6 +298,7 @@
+ self.features = features_set(self)
+ self.features._features =
copy.deepcopy(clone.features._features)
+ self._features_overrides =
copy.deepcopy(clone._features_overrides)
++ self.readonly_prefixes =
copy.deepcopy(clone.readonly_prefixes)
+
+ #Strictly speaking _license_manager is not immutable.
Users need to ensure that
+ #extract_global_changes() is called right after
__init__ (if at all).
+@@ -894,6 +895,63 @@
+
+ self._validate_commands()
+
++ # expand READONLY_EPREFIX to a list of all readonly
portage instances
++ # all the way down to the last one. beware that ATM a
deeper instance
++ # in the chain can provide more than the toplevel! this
means that
++ # if you only inherit DEPENDS from one instance, that
instance may
++ # inherit RDEPENDs from another one, making the
top-level instance
++ # inherit RDEPENDs from there too - even if the
intermediate prefix
++ # does not do this.
++ self.readonly_prefixes = {}
++ ro_cfg_root = config_root
++ ro_widest_depset = set(['DEPEND', 'RDEPEND', 'PDEPEND'])
++
++ while ro_cfg_root:
++ ro_make_conf_paths = [
++ os.path.join(ro_cfg_root, 'etc',
'make.conf'),
++ os.path.join(ro_cfg_root,
MAKE_CONF_FILE)
++ ]
++ try:
++ if
os.path.samefile(*ro_make_conf_paths):
++ ro_make_conf_paths.pop()
++ except OSError:
++ pass
++
++ ro_cfg_root = None
++ for ro_make_conf in ro_make_conf_paths:
++ if not os.path.exists(ro_make_conf):
++ continue
++
++ ro_cfg = getconfig(ro_make_conf,
tolerant=True, allow_sourcing=True)
++ if not
ro_cfg.has_key("READONLY_EPREFIX"):
++ continue
++
++ if not
ro_cfg["READONLY_EPREFIX"].find(":"):
++ raise
portage.exception.InvalidReadonlyERoot("ERROR: malformed READONLY_EPREFIX in
%s" % (ro_make_conf))
++
++ if ro_cfg_root is not None:
++ raise
portage.exception.InvalidReadonlyERoot("ERROR: duplicate READONLY_EPREFIX in %s
and %s" % tuple(ro_make_conf_paths))
++
++ (ro_cfg_root,ro_cfg_root_deps) =
ro_cfg["READONLY_EPREFIX"].rsplit(":",1)
++
++ if not os.path.exists(ro_cfg_root):
++ raise
portage.exception.InvalidReadonlyERoot("ERROR: malformed READONLY_EPREFIX in
%s: %s does not exist!" % (ro_make_conf, ro_cfg_root))
++
++ if os.path.samefile(ro_cfg_root,
config_root):
++ raise
portage.exception.InvalidReadonlyERoot("ERROR: cannot add this instance (%s) as
READONLY_EPREFIX in %s." % (ro_cfg_root, ro_make_conf))
++
++ if
self.readonly_prefixes.has_key(ro_cfg_root):
++ raise
portage.exception.InvalidReadonlyERoot("ERROR: circular READONLY_EPREFIX's in
%s. %s already checked for %s" % (ro_make_conf, ro_cfg_root,
self.readonly_prefixes[ro_cfg_root]))
++
++ # intersect the widest depset with the
current one to strip down
++ # the allowed dependency resolution to
not be wider than the
++ # next higher one. this way we can
prevent for a given prefix
++ # to resolve RDEPENDs from a prefix
with a different CHOST that
++ # is a few levels deeper in the chain.
++ ro_widest_depset =
set(ro_cfg_root_deps.split(",")) & ro_widest_depset
++ self.readonly_prefixes[ro_cfg_root] =
ro_widest_depset
++ pass
++
+ for k in self._case_insensitive_vars:
+ if k in self:
+ self[k] = self[k].lower()
+@@ -2671,6 +2729,10 @@
+ if not eapi_exports_merge_type(eapi):
+ mydict.pop("MERGE_TYPE", None)
+
++ # populate with PORTAGE_READONLY_EPREFIXES
++ if self.readonly_prefixes and len(self.readonly_prefixes) > 0:
++ mydict["PORTAGE_READONLY_EPREFIXES"] =
':'.join(self.readonly_prefixes)
++
+ # Prefix variables are supported beginning with EAPI 3, or when
+ # force-prefix is in FEATURES, since older EAPIs would
otherwise be
+ # useless with prefix configurations. This brings compatibility
with
+Only in prefix-portage-2.2.14/pym/portage/package/ebuild: config.py.orig
+diff -ru prefix-portage-2.2.14.orig/pym/portage/package/ebuild/doebuild.py
prefix-portage-2.2.14/pym/portage/package/ebuild/doebuild.py
+--- prefix-portage-2.2.14.orig/pym/portage/package/ebuild/doebuild.py
2014-09-28 19:25:39.000000000 +0200
++++ prefix-portage-2.2.14/pym/portage/package/ebuild/doebuild.py
2015-06-17 10:23:25.703886164 +0200
+@@ -46,6 +46,7 @@
+ unmerge, _encodings, _os_merge, \
+ _shell_quote, _unicode_decode, _unicode_encode
+ from portage.const import EBUILD_SH_ENV_FILE, EBUILD_SH_ENV_DIR, \
++ GLOBAL_CONFIG_PATH, \
+ EBUILD_SH_BINARY, INVALID_ENV_FILE, MISC_SH_BINARY,
PORTAGE_PYM_PACKAGES, EPREFIX, MACOSSANDBOX_PROFILE
+ from portage.data import portage_gid, portage_uid, secpass, \
+ uid, userpriv_groups
+@@ -66,7 +67,8 @@
+ from portage.package.ebuild.prepare_build_dirs import prepare_build_dirs
+ from portage.util import apply_recursive_permissions, \
+ apply_secpass_permissions, noiselimit, normalize_path, \
+- writemsg, writemsg_stdout, write_atomic
++ writemsg, writemsg_stdout, write_atomic, getconfig
++from portage.util._path import exists_raise_eaccess
+ from portage.util.lafilefixer import rewrite_lafile
+ from portage.versions import _pkgsplit
+ from _emerge.BinpkgEnvExtractor import BinpkgEnvExtractor
+@@ -212,8 +214,27 @@
+ path.append(os.path.join(portage_bin_path, "ebuild-helpers",
"bsd"))
+
+ path.append(os.path.join(portage_bin_path, "ebuild-helpers"))
++
++ # PREFIX CHAINING: append default path for all prefixes involved
++ pfxs = [ eprefix ]
++ pfxs.extend(settings.readonly_prefixes)
++ for prefix in pfxs:
++ global_config_path = os.path.join(prefix,
GLOBAL_CONFIG_PATH.lstrip(os.sep))
++ make_globals_path = os.path.join(global_config_path,
"make.globals")
++ if exists_raise_eaccess(make_globals_path):
++ expand_map = { "EPREFIX": prefix }
++ pxcfg = getconfig(make_globals_path, True, expand_map)
++ pxdefp = [x for x in pxcfg.get("DEFAULT_PATH",
"").split(":") if x]
++ for x in pxdefp:
++ if x.startswith(prefix) and not x in path:
++ path.append(x)
++ else:
++ pxdefs = [prefix + "/usr/sbin", prefix + "/usr/bin",
prefix + "/sbin", prefix + "/bin"]
++ path.extend(pxdefs)
++ # END PREFIX CHAINING
++
+ path.extend(prerootpath)
+- path.extend(defaultpath)
++ # path.extend(defaultpath) # PREFIX CHAINING appends the default path
for involved prefixes above
+ path.extend(rootpath)
+ path.extend(extrapath)
+ # END PREFIX LOCAL
+diff -ru prefix-portage-2.2.14.orig/pym/portage/package/ebuild/fetch.py
prefix-portage-2.2.14/pym/portage/package/ebuild/fetch.py
+--- prefix-portage-2.2.14.orig/pym/portage/package/ebuild/fetch.py
2014-04-22 21:50:06.000000000 +0200
++++ prefix-portage-2.2.14/pym/portage/package/ebuild/fetch.py 2015-06-17
10:24:28.983830892 +0200
+@@ -43,6 +43,7 @@
+ from portage.util import apply_recursive_permissions, \
+ apply_secpass_permissions, ensure_dirs, grabdict, shlex_split, \
+ varexpand, writemsg, writemsg_level, writemsg_stdout
++from portage.util._path import exists_raise_eaccess
+ from portage.process import spawn
+
+ _userpriv_spawn_kwargs = (
+@@ -869,6 +870,9 @@
+ global_config_path = GLOBAL_CONFIG_PATH
+ if portage.const.EPREFIX:
+ global_config_path =
os.path.join(portage.const.EPREFIX,
++
GLOBAL_CONFIG_PATH.lstrip(os.sep))
++ if not
exists_raise_eaccess(global_config_path) and portage.const.BPREFIX:
++ global_config_path =
os.path.join(portage.const.BPREFIX,
+
GLOBAL_CONFIG_PATH.lstrip(os.sep))
+
+ missing_file_param = False
+diff -ru prefix-portage-2.2.14.orig/pym/portage/_sets/__init__.py
prefix-portage-2.2.14/pym/portage/_sets/__init__.py
+--- prefix-portage-2.2.14.orig/pym/portage/_sets/__init__.py 2014-01-06
10:44:16.000000000 +0100
++++ prefix-portage-2.2.14/pym/portage/_sets/__init__.py 2015-06-17
10:24:28.983830892 +0200
+@@ -28,6 +28,7 @@
+ from portage.exception import PackageSetNotFound
+ from portage.localization import _
+ from portage.util import writemsg_level
++from portage.util._path import exists_raise_eaccess
+
+ SETPREFIX = "@"
+
+@@ -299,6 +300,10 @@
+ if portage.const.EPREFIX:
+ global_config_path = os.path.join(portage.const.EPREFIX,
+ GLOBAL_CONFIG_PATH.lstrip(os.sep))
++ if not exists_raise_eaccess(global_config_path) and
portage.const.BPREFIX:
++ global_config_path = os.path.join(portage.const.BPREFIX,
++ GLOBAL_CONFIG_PATH.lstrip(os.sep))
++
+ def _getfiles():
+ for path, dirs, files in
os.walk(os.path.join(global_config_path, "sets")):
+ for f in files:
+diff -ru
prefix-portage-2.2.14.orig/pym/portage/util/_dyn_libs/LinkageMapELF.py
prefix-portage-2.2.14/pym/portage/util/_dyn_libs/LinkageMapELF.py
+--- prefix-portage-2.2.14.orig/pym/portage/util/_dyn_libs/LinkageMapELF.py
2013-05-04 18:36:19.000000000 +0200
++++ prefix-portage-2.2.14/pym/portage/util/_dyn_libs/LinkageMapELF.py
2015-06-17 10:24:28.987164223 +0200
+@@ -17,7 +17,7 @@
+ from portage.util import grabfile
+ from portage.util import normalize_path
+ from portage.util import writemsg_level
+-from portage.const import EPREFIX
++from portage.const import BPREFIX
+
+ class LinkageMapELF(object):
+
+@@ -235,7 +235,7 @@
+ continue
+ plibs.update((x, cpv) for x in items)
+ if plibs:
+- args = [EPREFIX + "/usr/bin/scanelf", "-qF",
"%a;%F;%S;%r;%n"]
++ args = [BPREFIX + "/usr/bin/scanelf", "-qF",
"%a;%F;%S;%r;%n"]
+ args.extend(os.path.join(root, x.lstrip("." + os.sep)) \
+ for x in plibs)
+ try:
diff --git a/sys-apps/portage/metadata.xml b/sys-apps/portage/metadata.xml
index 34ef584..797178c 100644
--- a/sys-apps/portage/metadata.xml
+++ b/sys-apps/portage/metadata.xml
@@ -1,13 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd">
<pkgmetadata>
- <herd>prefix</herd>
- <maintainer><email>[email protected]</email></maintainer>
-
- <use>
- <flag name="epydoc">Build html API documentation with
epydoc.</flag>
- <flag name="ipc">Use inter-process communication between
portage and running ebuilds.</flag>
- <flag name="less">Pull in sys-apps/less as default pager for
etc-update.</flag>
- <flag name="prefix-chaining">mduft's experimental prefix
chaining facilities</flag>
- </use>
+ <upstream>
+ <bugs-to>mailto:[email protected]</bugs-to>
+
<changelog>https://gitweb.gentoo.org/proj/portage.git/plain/RELEASE-NOTES</changelog>
+ <doc>https://wiki.gentoo.org/wiki/Handbook:AMD64/Working/Portage</doc>
+ </upstream>
+ <maintainer type="project">
+ <email>[email protected]</email>
+ </maintainer>
+ <use>
+ <flag name="epydoc">Build html API documentation with epydoc.</flag>
+ <flag name="ipc">Use inter-process communication between portage and
running ebuilds.</flag>
+ <flag name="pypy2_0">Use pypy-c2.0 as Python interpreter.</flag>
+ <flag name="python2">Use python2 as Python interpreter.</flag>
+ <flag name="python3">Use python3 as Python interpreter.</flag>
+ <flag name="xattr">Preserve extended attributes (filesystem-stored
metadata) when installing files. Usually only required for hardened
systems.</flag>
+ <flag name="prefix-chaining">mduft's experimental prefix chaining
facilities</flag>
+ </use>
</pkgmetadata>
diff --git a/sys-apps/portage/portage-2.2.20.ebuild
b/sys-apps/portage/portage-2.2.20.ebuild
deleted file mode 100644
index 537888c..0000000
--- a/sys-apps/portage/portage-2.2.20.ebuild
+++ /dev/null
@@ -1,583 +0,0 @@
-# Copyright 1999-2015 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-# $Id: portage-2.2.01.16270.ebuild 58665 2010-09-05 19:54:38Z grobian $
-
-# Require EAPI 2 since we now require at least python-2.6 (for python 3
-# syntax support) which also requires EAPI 2.
-EAPI=3
-PYTHON_COMPAT=(
- pypy1_9 pypy2_0
- python3_1 python3_2 python3_3 python3_4 python3_5
- python2_6 python2_7
-)
-inherit eutils multilib
-
-DESCRIPTION="Prefix branch of the Portage Package Manager, used in Gentoo
Prefix"
-HOMEPAGE="http://prefix.gentoo.org/"
-LICENSE="GPL-2"
-KEYWORDS="~ppc-aix ~x64-freebsd ~x86-freebsd ~hppa-hpux ~ia64-hpux
~x86-interix ~amd64-linux ~ia64-linux ~x86-linux ~ppc-macos ~x64-macos
~x86-macos ~m68k-mint ~sparc-solaris ~sparc64-solaris ~x64-solaris ~x86-solaris"
-SLOT="0"
-IUSE="build doc epydoc +ipc linguas_ru pypy2_0 python2 python3 selinux xattr
prefix-chaining"
-
-for _pyimpl in ${PYTHON_COMPAT[@]} ; do
- IUSE+=" python_targets_${_pyimpl}"
-done
-unset _pyimpl
-
-# Import of the io module in python-2.6 raises ImportError for the
-# thread module if threading is disabled.
-python_dep_ssl="python3? ( =dev-lang/python-3*[ssl] )
- !pypy2_0? ( !python2? ( !python3? (
- || ( >=dev-lang/python-2.7[ssl]
dev-lang/python:2.6[threads,ssl] )
- ) ) )
- pypy2_0? ( !python2? ( !python3? ( dev-python/pypy:2.0[bzip2,ssl] ) ) )
- python2? ( !python3? ( || ( dev-lang/python:2.7[ssl]
dev-lang/python:2.6[ssl,threads] ) ) )"
-python_dep="${python_dep_ssl//\[ssl\]}"
-python_dep="${python_dep//,ssl}"
-python_dep="${python_dep//ssl,}"
-
-python_dep="${python_dep}
- python_targets_pypy1_9? ( dev-python/pypy:1.9 )
- python_targets_pypy2_0? ( dev-python/pypy:2.0 )
- python_targets_python2_6? ( dev-lang/python:2.6 )
- python_targets_python2_7? ( dev-lang/python:2.7 )
- python_targets_python3_1? ( dev-lang/python:3.1 )
- python_targets_python3_2? ( dev-lang/python:3.2 )
- python_targets_python3_3? ( dev-lang/python:3.3 )
- python_targets_python3_4? ( dev-lang/python:3.4 )
-"
-
-# The pysqlite blocker is for bug #282760.
-# make-3.82 is for bug #455858
-DEPEND="${python_dep}
- >=sys-devel/make-3.82
- >=sys-apps/sed-4.0.5 sys-devel/patch
- doc? ( app-text/xmlto ~app-text/docbook-xml-dtd-4.4 )
- epydoc? ( >=dev-python/epydoc-2.0 !<=dev-python/pysqlite-2.4.1 )"
-# Require sandbox-2.2 for bug #288863.
-# For xattr, we can spawn getfattr and setfattr from sys-apps/attr, but that's
-# quite slow, so it's not considered in the dependencies as an alternative to
-# to python-3.3 / pyxattr. Also, xattr support is only tested with Linux, so
-# for now, don't pull in xattr deps for other kernels.
-# For whirlpool hash, require python[ssl] or python-mhash (bug #425046).
-# For compgen, require bash[readline] (bug #445576).
-# bash-4.1 necessary for redirect_alloc_fd, which fails on non-Linux if bash
-# doesn't have a builtin for finding a random filedescriptor
-RDEPEND="${python_dep}
- !build? ( >=sys-apps/sed-4.0.5
- || ( >=app-shells/bash-4.2_p37[readline] (
<app-shells/bash-4.2_p37 >=app-shells/bash-4.1 ) )
- >=app-admin/eselect-1.2
- || ( ${python_dep_ssl} dev-python/python-mhash )
- )
- elibc_FreeBSD? ( !prefix? ( sys-freebsd/freebsd-bin ) )
- elibc_glibc? ( !prefix? ( >=sys-apps/sandbox-2.2 ) )
- elibc_uclibc? ( !prefix? ( >=sys-apps/sandbox-2.2 ) )
- kernel_linux? ( >=app-misc/pax-utils-0.1.17 )
- kernel_SunOS? ( >=app-misc/pax-utils-0.1.17 )
- kernel_FreeBSD? ( >=app-misc/pax-utils-0.1.17 )
- kernel_Darwin? ( >=app-misc/pax-utils-0.1.18 )
- kernel_HPUX? ( !hppa-hpux? ( >=app-misc/pax-utils-0.1.19 ) )
- kernel_AIX? ( >=sys-apps/aix-miscutils-0.1.1634 )
- xattr? ( kernel_linux? ( || ( >=dev-lang/python-3.3_pre20110902
dev-python/pyxattr ) ) )
- selinux? ( || ( >=sys-libs/libselinux-2.0.94[python]
<sys-libs/libselinux-2.0.94 ) )
- !<app-shells/bash-3.2_p17
- !prefix? ( !<app-admin/logrotate-3.8.0 )"
-PDEPEND="
- !build? (
- >=net-misc/rsync-2.6.4
- userland_GNU? ( >=sys-apps/coreutils-6.4 )
- )"
-# coreutils-6.4 rdep is for date format in emerge-webrsync #164532
-# NOTE: FEATURES=installsources requires debugedit and rsync
-
-SRC_ARCHIVES="http://dev.gentoo.org/~zmedico/portage/archives
http://dev.gentoo.org/~grobian/distfiles"
-
-prefix_src_archives() {
- local x y
- for x in ${@}; do
- for y in ${SRC_ARCHIVES}; do
- echo ${y}/${x}
- done
- done
-}
-
-PV_PL="2.1.2"
-PATCHVER_PL=""
-TARBALL_PV="${PV}"
-SRC_URI="mirror://gentoo/prefix-${PN}-${TARBALL_PV}.tar.bz2
- $(prefix_src_archives prefix-${PN}-${TARBALL_PV}.tar.bz2)"
-
-PATCHVER=
-[[ $TARBALL_PV = $PV ]] || PATCHVER=$PV
-if [ -n "${PATCHVER}" ]; then
- SRC_URI="${SRC_URI} mirror://gentoo/${PN}-${PATCHVER}.patch.bz2
- $(prefix_src_archives ${PN}-${PATCHVER}.patch.bz2)"
-fi
-
-S="${WORKDIR}"/prefix-${PN}-${TARBALL_PV}
-S_PL="${WORKDIR}"/${PN}-${PV_PL}
-
-compatible_python_is_selected() {
- [[ $("${EPREFIX}/usr/bin/python" -c 'import sys ;
sys.stdout.write(sys.hexversion >= 0x2060000 and "good" or "bad")') = good ]]
-}
-
-current_python_has_xattr() {
- [[ ${EPYTHON} ]] || die 'No Python implementation set (EPYTHON is
null).'
- local PYTHON=${EPREFIX}/usr/bin/${EPYTHON}
- [[ $("${PYTHON}" -c 'import sys ; sys.stdout.write(sys.hexversion >=
0x3030000 and "yes" or "no")') = yes ]] || \
- "${PYTHON}" -c 'import xattr' 2>/dev/null
-}
-
-call_with_python_impl() {
- [[ ${EPYTHON} ]] || die 'No Python implementation set (EPYTHON is
null).'
- env EPYTHON=${EPYTHON} "$@"
-}
-
-get_python_interpreter() {
- [ $# -eq 1 ] || die "expected 1 argument, got $#: $*"
- local impl=$1 python
- case "${impl}" in
- python*)
- python=${impl/_/.}
- ;;
- pypy*)
- python=${impl/_/.}
- python=${python/pypy/pypy-c}
- ;;
- *)
- die "Unrecognized python target: ${impl}"
- esac
- echo ${python}
-}
-
-get_python_sitedir() {
- [ $# -eq 1 ] || die "expected 1 argument, got $#: $*"
- local impl=$1
- local site_dir=/usr/$(get_libdir)/${impl/_/.}/site-packages
- [[ -d ${EROOT}${site_dir} ]] || \
- ewarn "site-packages dir missing for ${impl}:
${EROOT}${site_dir}"
- echo "${site_dir}"
-}
-
-python_compileall() {
- [[ ${EPYTHON} ]] || die 'No Python implementation set (EPYTHON is
null).'
- local d=${EPREFIX}$1 PYTHON=${EPREFIX}/usr/bin/${EPYTHON}
- local d_image=${D}${d#/}
- [[ -d ${d_image} ]] || die "directory does not exist: ${d_image}"
- case "${EPYTHON}" in
- python*)
- "${PYTHON}" -m compileall -q -f -d "${d}" "${d_image}"
|| die
- # Note: Using -OO breaks emaint, since it requires
__doc__,
- # and __doc__ is None when -OO is used.
- "${PYTHON}" -O -m compileall -q -f -d "${d}"
"${d_image}" || die
- ;;
- pypy*)
- "${PYTHON}" -m compileall -q -f -d "${d}" "${d_image}"
|| die
- ;;
- *)
- die "Unrecognized EPYTHON value: ${EPYTHON}"
- esac
-}
-
-pkg_setup() {
- if use python2 && use python3 ; then
- ewarn "Both python2 and python3 USE flags are enabled, but only
one"
- ewarn "can be in the shebangs. Using python3."
- fi
- if use pypy2_0 && use python3 ; then
- ewarn "Both pypy2_0 and python3 USE flags are enabled, but only
one"
- ewarn "can be in the shebangs. Using python3."
- fi
- if use pypy2_0 && use python2 ; then
- ewarn "Both pypy2_0 and python2 USE flags are enabled, but only
one"
- ewarn "can be in the shebangs. Using python2"
- fi
- if ! use pypy2_0 && ! use python2 && ! use python3 && \
- ! compatible_python_is_selected ; then
- ewarn "Attempting to select a compatible default python
interpreter"
- local x success=0
- for x in "${EPREFIX}"/usr/bin/python2.* ; do
- x=${x#${EPREFIX}/usr/bin/python2.}
- if [[ $x -ge 6 ]] 2>/dev/null ; then
- eselect python set python2.$x
- if compatible_python_is_selected ; then
- elog "Default python interpreter is now
set to python-2.$x"
- success=1
- break
- fi
- fi
- done
- if [ $success != 1 ] ; then
- eerror "Unable to select a compatible default python
interpreter!"
- die "This version of portage requires at least
python-2.6 to be selected as the default python interpreter (see \`eselect
python --help\`)."
- fi
- fi
-
- # We use EPYTHON to designate the active python interpreter,
- # but we only export when needed, via call_with_python_impl.
- EPYTHON=python
- export -n EPYTHON
- if use python3; then
- EPYTHON=python3
- elif use python2; then
- EPYTHON=python2
- elif use pypy2_0; then
- EPYTHON=pypy-c2.0
- fi
-}
-
-src_prepare() {
- if [ -n "${PATCHVER}" ] ; then
- if [[ -L $S/bin/ebuild-helpers/portageq ]] ; then
- rm "$S/bin/ebuild-helpers/portageq" \
- || die "failed to remove portageq helper
symlink"
- fi
- epatch "${WORKDIR}/${PN}-${PATCHVER}.patch"
- fi
-
- use prefix-chaining && epatch
"${FILESDIR}"/${PN}-2.2.00.15801-prefix-chaining.patch
- epatch "${FILESDIR}"/${PN}-2.2.8-ebuildshell.patch # 155161
- epatch "${FILESDIR}"/${PN}-2.2.10.1-brokentty-more-platforms.patch #
now upstream
-
- if ! use ipc ; then
- einfo "Disabling ipc..."
- sed -e "s:_enable_ipc_daemon = True:_enable_ipc_daemon =
False:" \
- -i pym/_emerge/AbstractEbuildProcess.py || \
- die "failed to patch AbstractEbuildProcess.py"
- fi
-
- if use xattr && use kernel_linux ; then
- einfo "Adding FEATURES=xattr to make.globals ..."
- echo -e '\nFEATURES="${FEATURES} xattr"' >> cnf/make.globals \
- || die "failed to append to make.globals"
- fi
-
- local set_shebang=
- if use python3; then
- set_shebang=python3
- elif use python2; then
- set_shebang=python2
- elif use pypy2_0; then
- set_shebang=pypy-c2.0
- fi
- if [[ -n ${set_shebang} ]] ; then
- einfo "Converting shebangs for ${set_shebang}..."
- while read -r -d $'\0' ; do
- local shebang=$(head -n1 "$REPLY")
- if [[ ${shebang} == "#!${EPREFIX}/usr/bin/python"* ]] ;
then
- sed -i -e "1s:python:${set_shebang}:" "$REPLY"
|| \
- die "sed failed"
- fi
- done < <(find . -type f -print0)
- fi
-
- # "native" Prefix still uses configure
- if use !prefix && [[ -n ${EPREFIX} ]] ; then
- einfo "Setting portage.const.EPREFIX ..."
- sed -e
"s|^\(SANDBOX_BINARY[[:space:]]*=[[:space:]]*\"\)\(/usr/bin/sandbox\"\)|\\1${EPREFIX}\\2|"
\
- -e
"s|^\(FAKEROOT_BINARY[[:space:]]*=[[:space:]]*\"\)\(/usr/bin/fakeroot\"\)|\\1${EPREFIX}\\2|"
\
- -e
"s|^\(BASH_BINARY[[:space:]]*=[[:space:]]*\"\)\(/bin/bash\"\)|\\1${EPREFIX}\\2|"
\
- -e
"s|^\(MOVE_BINARY[[:space:]]*=[[:space:]]*\"\)\(/bin/mv\"\)|\\1${EPREFIX}\\2|" \
- -e
"s|^\(PRELINK_BINARY[[:space:]]*=[[:space:]]*\"\)\(/usr/sbin/prelink\"\)|\\1${EPREFIX}\\2|"
\
- -e
"s|^\(EPREFIX[[:space:]]*=[[:space:]]*\"\).*|\\1${EPREFIX}\"|" \
- -i pym/portage/const.py || \
- die "Failed to patch portage.const.EPREFIX"
-
- einfo "Prefixing shebangs ..."
- while read -r -d $'\0' ; do
- local shebang=$(head -n1 "$REPLY")
- if [[ ${shebang} == "#!"* && ! ${shebang} ==
"#!${EPREFIX}/"* ]] ; then
- sed -i -e "1s:.*:#!${EPREFIX}${shebang:2}:"
"$REPLY" || \
- die "sed failed"
- fi
- done < <(find . -type f -print0)
-
- einfo "Adding FEATURES=force-prefix to make.globals ..."
- echo -e '\nFEATURES="${FEATURES} force-prefix"' >>
cnf/make.globals \
- || die "failed to append to make.globals"
- fi
-
- if use !prefix ; then
- cd "${S}/cnf" || die
- if [ -f "make.conf.${ARCH}".diff ]; then
- patch make.conf "make.conf.${ARCH}".diff || \
- die "Failed to patch make.conf.example"
- else
- eerror ""
- eerror "Portage does not have an arch-specific configuration
for this arch."
- eerror "Please notify the arch maintainer about this issue.
Using generic."
- eerror ""
- fi
- fi
-}
-
-src_configure() {
- if use prefix ; then
- local extrapath="/usr/bin:/bin"
- # ok, we can't rely on PORTAGE_ROOT_USER being there yet, as
people
- # tend not to update that often, as long as we are a separate
ebuild
- # we can assume when unset, it's time for some older trick
- if [[ -z ${PORTAGE_ROOT_USER} ]] ; then
- PORTAGE_ROOT_USER=$(python -c 'from portage.const
import rootuser; print rootuser')
- fi
- # lazy check, but works for now
- if [[ ${PORTAGE_ROOT_USER} == "root" ]] ; then
- # we need this for e.g. mtree on FreeBSD (and Darwin)
which is in
- # /usr/sbin
- extrapath="/usr/sbin:/usr/bin:/sbin:/bin"
- fi
-
- econf \
- --with-portage-user="${PORTAGE_USER:-portage}" \
- --with-portage-group="${PORTAGE_GROUP:-portage}" \
- --with-root-user="${PORTAGE_ROOT_USER}" \
- --with-offset-prefix="${EPREFIX}" \
- --with-extra-path="${extrapath}" \
- || die "econf failed"
- else
- default
- fi
-}
-
-src_compile() {
- if use prefix ; then
- emake || die "emake failed"
- fi
-
- if use doc; then
- call_with_python_impl \
- emake docbook || die
- fi
-
- if use epydoc; then
- einfo "Generating api docs"
- call_with_python_impl \
- emake epydoc || die
- fi
-}
-
-src_test() {
- # make files executable, in case they were created by patch
- find bin -type f | xargs chmod +x
- call_with_python_impl \
- emake test || die
-}
-
-src_install() {
- local portage_base="/usr/lib/portage"
-
- emake DESTDIR="${D}" install || die "make install failed."
- dodir /usr/lib/portage/bin
-
- if use userland_GNU; then
- rm "${ED}"${portage_base}/bin/ebuild-helpers/bsd/sed || die
"Failed to remove sed wrapper"
- fi
-
- use doc && dohtml -r "${S}"/doc/*
- use epydoc && dohtml -r "${WORKDIR}"/api
- dodir /etc/portage
- keepdir /etc/portage
-
- # Use dodoc for compression, since the Makefile doesn't do that.
- dodoc "${S}"/{ChangeLog,NEWS,RELEASE-NOTES} || die
-
- # Allow external portage API consumers to import portage python modules
- # (this used to be done with PYTHONPATH setting in /etc/env.d).
- # For each of PYTHON_TARGETS, install a tree of *.py symlinks in
- # site-packages, and compile with the corresponding interpreter.
- local impl files mod_dir dest_mod_dir python relative_path x
- for impl in "${PYTHON_COMPAT[@]}" ; do
- use "python_targets_${impl}" || continue
- if use build && [[ ${ROOT} == / &&
- ! -x ${EPREFIX}/usr/bin/$(get_python_interpreter
${impl}) ]] ; then
- # Tolerate --nodeps at beginning of stage1 for catalyst
- ewarn "skipping python_targets_${impl}, interpreter not
found"
- continue
- fi
- while read -r mod_dir ; do
- cd "${ED}/usr/lib/portage/pym/${mod_dir}" || die
- files=$(echo *.py)
- if [ -z "${files}" ] || [ "${files}" = "*.py" ]; then
- # __pycache__ directories contain no py files
- continue
- fi
- dest_mod_dir=$(get_python_sitedir ${impl})/${mod_dir}
- dodir "${dest_mod_dir}" || die
- relative_path=../../../lib/portage/pym/${mod_dir}
- x=/${mod_dir}
- while [ -n "${x}" ] ; do
- relative_path=../${relative_path}
- x=${x%/*}
- done
- for x in ${files} ; do
- dosym "${relative_path}/${x}" \
- "${dest_mod_dir}/${x}" || die
- done
- done < <(cd "${ED}"/usr/lib/portage/pym || die ; find * -type d
! -path "portage/tests*")
- cd "${S}" || die
- EPYTHON=$(get_python_interpreter ${impl}) \
- python_compileall "$(get_python_sitedir ${impl})"
- done
-
- # Compile /usr/lib/portage/pym with the active interpreter, since
portage
- # internal commands force this directory to the beginning of sys.path.
- python_compileall /usr/lib/portage/pym
-}
-
-pkg_preinst() {
- if [[ $ROOT == / ]] ; then
- # Run some minimal tests as a sanity check.
- local test_runner=$(find "$ED" -name runTests)
- if [[ -n $test_runner && -x $test_runner ]] ; then
- einfo "Running preinst sanity tests..."
- "$test_runner" || die "preinst sanity tests failed"
- fi
- fi
-
- if use xattr && ! current_python_has_xattr ; then
- ewarn "For optimal performance in xattr handling, install"
- ewarn "dev-python/pyxattr, or install >=dev-lang/python-3.3 and"
- ewarn "enable USE=python3 for $CATEGORY/$PN."
- fi
-
- has_version "<=${CATEGORY}/${PN}-2.2.00.13346"
- EAPIPREFIX_UPGRADE=$?
-
- if has_version "<${CATEGORY}/${PN}-2.2.7-r1" ; then
- REPOS_CONF_UPGRADE=true
- REPOS_CONF_SYNC=
- type -P portageq >/dev/null 2>&1 && \
- REPOS_CONF_SYNC=$("$(type -P portageq)" envvar SYNC)
- fi
-}
-
-new_config_protect() {
- # Generate a ._cfg file even if the target file
- # does not exist, ensuring that the user will
- # notice the config change.
- local basename=${1##*/}
- local dirname=${1%/*}
- local i=0
- while true ; do
- local filename=$(
- echo -n "${dirname}/._cfg"
- printf "%04d" ${i}
- echo -n "_${basename}"
- )
- [[ -e ${filename} ]] || break
- (( i++ ))
- done
- echo "${filename}"
-}
-
-pkg_postinst() {
-
- if [[ -n ${REPOS_CONF_UPGRADE} ]] ; then
- einfo "Generating repos.conf"
- local repo_name=
- [[ -f ${PORTDIR}/profiles/repo_name ]] && \
- repo_name=$(< "${PORTDIR}/profiles/repo_name")
- if [[ -z ${REPOS_CONF_SYNC} ]] ; then
- REPOS_CONF_SYNC=$(grep "^sync-uri ="
"${EROOT:-${ROOT}}usr/share/portage/config/repos.conf")
- REPOS_CONF_SYNC=${REPOS_CONF_SYNC##* }
- fi
- local sync_type=
- [[ ${REPOS_CONF_SYNC} == git://* ]] && sync_type=git
-
- if [[ ${REPOS_CONF_SYNC} == cvs://* ]]; then
- sync_type=cvs
- REPOS_CONF_SYNC=${REPOS_CONF_SYNC#cvs://}
- fi
-
- cat <<-EOF > "${T}/repos.conf"
- [DEFAULT]
- main-repo = ${repo_name:-gentoo}
-
- [${repo_name:-gentoo}]
- location = ${PORTDIR:-${EPREFIX}/usr/portage}
- sync-type = ${sync_type:-rsync}
- sync-uri = ${REPOS_CONF_SYNC}
- EOF
-
- [[ ${sync_type} == cvs ]] && echo "sync-cvs-repo =
$(<"${PORTDIR}/CVS/Repository")" >> "${T}/repos.conf"
-
- local dest=${EROOT:-${ROOT}}etc/portage/repos.conf
- if [[ ! -f ${dest} ]] && mkdir -p "${dest}" 2>/dev/null ; then
-
dest=${EROOT:-${ROOT}}etc/portage/repos.conf/${repo_name:-gentoo}.conf
- fi
- # Don't install the config update if the desired repos.conf
directory
- # and config file exist, since users may accept it blindly and
break
- # their config (bug #478726).
- [[ -e
${EROOT:-${ROOT}}etc/portage/repos.conf/${repo_name:-gentoo}.conf ]] || \
- mv "${T}/repos.conf" "$(new_config_protect "${dest}")"
-
- if [[ ${PORTDIR} == ${EPREFIX}/usr/portage ]] ; then
- einfo "Generating make.conf PORTDIR setting for
backward compatibility"
- for dest in "${EROOT:-${ROOT}}etc/make.conf"
"${EROOT:-${ROOT}}etc/portage/make.conf" ; do
- [[ -e ${dest} ]] && break
- done
- [[ -d ${dest} ]] && dest=${dest}/portdir.conf
- rm -rf "${T}/make.conf"
- [[ -f ${dest} ]] && cat "${dest}" > "${T}/make.conf"
- cat <<-EOF >> "${T}/make.conf"
-
- # Set PORTDIR for backward compatibility with various
tools:
- # gentoo-bashcomp - bug #478444
- # euse - bug #474574
- # euses and ufed - bug #478318
- PORTDIR="${EPREFIX}/usr/portage"
- EOF
- mkdir -p "${dest%/*}"
- mv "${T}/make.conf" "$(new_config_protect "${dest}")"
- fi
- fi
-
- pushd "${EROOT}var/db/pkg" > /dev/null
- local didwork=
- [[ ! -e "${EROOT}"var/lib/portage/preserved_libs_registry ]] && for cpv
in */*/NEEDED ; do
- if [[ ${CHOST} == *-darwin* && ! -f ${cpv}.MACHO.3 ]] ; then
- while read line; do
- scanmacho -BF "%a;%F;%S;%n" ${line% *} >>
"${cpv}".MACHO.3
- done < "${cpv}"
- [[ -z ${didwork} ]] \
- && didwork=yes \
- || didwork=already
- elif [[ ${CHOST} != *-darwin* && ${CHOST} != *-interix* && ! -f
${cpv}.ELF.2 ]] ; then
- while read line; do
- filename=${line% *}
- needed=${line#* }
- newline=$(scanelf -BF "%a;%F;%S;$needed;%r"
$filename)
- echo "${newline:3}" >> "${cpv}".ELF.2
- done < "${cpv}"
- [[ -z ${didwork} ]] \
- && didwork=yes \
- || didwork=already
- fi
- [[ ${didwork} == yes ]] && \
- einfo "converting NEEDED files to new syntax, please
wait"
- done
- popd > /dev/null
-
- if [[ ${EAPIPREFIX_UPGRADE} == 0 ]] ; then
- local eapi
- einfo 'removing EAPI="prefix" legacy from your vdb, please wait'
- pushd "${EROOT}var/db/pkg" > /dev/null
- for cpv in */* ; do
- [[ ${cpv##*/} == "-MERGING-"* ]] && continue
- # remove "prefix" from EAPI file
- eapi=$(<"${cpv}"/EAPI)
- eapi=${eapi/prefix/}
- eapi=${eapi# }
- eapi=${eapi:-0}
- echo ${eapi} > "${cpv}"/EAPI
- # remove "prefix" from EAPI in stored environment
- bzcat "${cpv}"/environment.bz2 \
- | sed -e "s/EAPI=\([\"']\)prefix
[0-9][\"']/EAPI=\1${eapi}\1/" \
- | bzip2 -9 > "${cpv}"/environment2.bz2 \
- && mv -f "${cpv}"/environment{2,}.bz2
- # remove "prefix" from the stored ebuild
- sed -i -e "s/^EAPI=.*$/EAPI=${eapi}/"
"${cpv}/${cpv##*/}.ebuild"
- done
- popd > /dev/null
- fi
-}
diff --git a/sys-apps/portage/portage-2.2.28.ebuild
b/sys-apps/portage/portage-2.2.28.ebuild
index dc0bdab..9b9b151 100644
--- a/sys-apps/portage/portage-2.2.28.ebuild
+++ b/sys-apps/portage/portage-2.2.28.ebuild
@@ -93,6 +93,8 @@ python_prepare_all() {
distutils-r1_python_prepare_all
epatch "${FILESDIR}"/${PN}-2.2.8-ebuildshell.patch # 155161
+ use prefix-chaining &&
+ epatch "${FILESDIR}"/${PN}-2.2.14-prefix-chaining.patch
# solved in git already, remove at next version
sed -i -e "s/version = '2.2.27'/version = '2.2.27-prefix'/" \