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'/" \

Reply via email to