commit:     eed711a2e330ae73978bd7612ae596a7b3f7adbb
Author:     Fabian Groffen <grobian <AT> gentoo <DOT> org>
AuthorDate: Sun Apr  5 09:13:48 2015 +0000
Commit:     Fabian Groffen <grobian <AT> gentoo <DOT> org>
CommitDate: Sun Apr  5 09:13:48 2015 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=eed711a2

Merge remote-tracking branch 'overlays-gentoo-org/master' into prefix

 NEWS                                               |   11 +
 RELEASE-NOTES                                      |  121 ++
 bin/bashrc-functions.sh                            |    2 +-
 bin/chpathtool.py                                  |   22 +-
 bin/dispatch-conf                                  |   68 +-
 bin/eapi.sh                                        |  114 +-
 bin/ebuild                                         |    7 +-
 bin/ebuild-helpers/dohtml                          |    4 +
 bin/ebuild.sh                                      |   98 +-
 bin/egencache                                      |   38 +-
 bin/emerge-webrsync                                |    4 +-
 bin/etc-update                                     |  158 ++-
 bin/install-qa-check.d/05double-D                  |    9 +-
 bin/install-qa-check.d/90world-writable            |   27 +-
 bin/install.py                                     |    2 +-
 bin/isolated-functions.sh                          |   89 +-
 bin/misc-functions.sh                              |   71 +-
 bin/phase-functions.sh                             |   15 +-
 bin/phase-helpers.sh                               |  315 +++++-
 bin/portageq                                       |   27 +-
 bin/quickpkg                                       |    3 +-
 bin/regenworld                                     |    4 +-
 bin/repoman                                        |   43 +-
 bin/save-ebuild-env.sh                             |    9 +-
 bin/socks5-server.py                               |  227 ++++
 cnf/dispatch-conf.conf                             |    2 +-
 cnf/make.conf.example                              |    2 +-
 cnf/make.globals                                   |    3 +-
 cnf/repo.postsync.d/example                        |   51 +
 cnf/repos.conf                                     |    1 +
 cnf/sets/portage.conf                              |   12 +-
 doc/config/sets.docbook                            |   47 +-
 man/ebuild.5                                       |   28 +-
 man/egencache.1                                    |   15 +-
 man/emaint.1                                       |   71 +-
 man/emerge.1                                       |  117 +-
 man/make.conf.5                                    |   45 +-
 man/portage.5                                      |  262 ++++-
 man/repoman.1                                      |    2 +-
 pym/_emerge/AbstractPollTask.py                    |   52 +-
 pym/_emerge/Binpkg.py                              |   33 +-
 pym/_emerge/BinpkgExtractorAsync.py                |   25 +-
 pym/_emerge/BinpkgFetcher.py                       |   13 +-
 pym/_emerge/BinpkgPrefetcher.py                    |    2 +-
 pym/_emerge/BinpkgVerifier.py                      |    6 +-
 pym/_emerge/EbuildBinpkg.py                        |    9 +-
 pym/_emerge/EbuildBuild.py                         |   36 +-
 pym/_emerge/FakeVartree.py                         |   16 +-
 pym/_emerge/Package.py                             |  135 ++-
 pym/_emerge/Scheduler.py                           |    7 +-
 pym/_emerge/actions.py                             | 1194 +++-----------------
 pym/_emerge/clear_caches.py                        |    1 -
 pym/_emerge/create_depgraph_params.py              |   27 +
 pym/_emerge/create_world_atom.py                   |    6 +-
 pym/_emerge/depgraph.py                            |  780 ++++++++++---
 pym/_emerge/help.py                                |    2 +-
 pym/_emerge/is_valid_package_atom.py               |    5 +-
 pym/_emerge/main.py                                |   94 +-
 pym/_emerge/resolver/DbapiProvidesIndex.py         |  101 ++
 pym/_emerge/resolver/output.py                     |   40 +-
 pym/_emerge/resolver/output_helpers.py             |   19 +-
 pym/_emerge/resolver/package_tracker.py            |   42 +-
 pym/_emerge/resolver/slot_collision.py             |   35 +-
 pym/_emerge/search.py                              |  188 ++-
 pym/_emerge/unmerge.py                             |   42 +-
 pym/portage/__init__.py                            |   29 +-
 pym/portage/_global_updates.py                     |    4 +-
 pym/portage/_selinux.py                            |   14 +-
 pym/portage/_sets/ProfilePackageSet.py             |   35 +
 pym/portage/_sets/__init__.py                      |   19 +-
 pym/portage/_sets/files.py                         |  160 ++-
 pym/portage/_sets/profiles.py                      |   28 +-
 pym/portage/cache/fs_template.py                   |   25 +-
 pym/portage/cache/index/IndexStreamIterator.py     |   27 +
 .../sync => portage/cache/index}/__init__.py       |    2 +-
 pym/portage/cache/index/pkg_desc_index.py          |   60 +
 pym/portage/const.py                               |    3 +
 pym/portage/data.py                                |  134 ++-
 pym/portage/dbapi/DummyTree.py                     |   16 +
 pym/portage/dbapi/IndexedPortdb.py                 |  171 +++
 pym/portage/dbapi/IndexedVardb.py                  |  114 ++
 .../dbapi/_ContentsCaseSensitivityManager.py       |   93 ++
 pym/portage/dbapi/_VdbMetadataDelta.py             |  153 +++
 pym/portage/dbapi/__init__.py                      |   10 +-
 pym/portage/dbapi/bintree.py                       |  898 ++++++++-------
 pym/portage/dbapi/vartree.py                       |  416 ++++---
 pym/portage/dbapi/virtual.py                       |  113 +-
 pym/portage/dep/__init__.py                        |   69 +-
 pym/portage/dep/_slot_operator.py                  |   13 +
 pym/portage/dep/dep_check.py                       |   69 +-
 pym/portage/dep/soname/SonameAtom.py               |   72 ++
 .../sync => portage/dep/soname}/__init__.py        |    2 +-
 pym/portage/dep/soname/multilib_category.py        |  114 ++
 pym/portage/dep/soname/parse.py                    |   47 +
 pym/portage/dispatch_conf.py                       |  189 +++-
 pym/portage/eapi.py                                |    2 +-
 pym/portage/emaint/main.py                         |   33 +-
 pym/portage/emaint/modules/binhost/binhost.py      |   47 +-
 pym/portage/emaint/modules/merges/merges.py        |   15 +-
 pym/portage/emaint/modules/sync/__init__.py        |   55 +
 pym/portage/emaint/modules/sync/sync.py            |  289 +++++
 pym/portage/exception.py                           |    1 +
 pym/portage/locks.py                               |   11 +-
 pym/portage/metadata.py                            |  208 ++++
 pym/portage/{emaint => }/module.py                 |   40 +-
 pym/portage/news.py                                |   15 +-
 .../package/ebuild/_config/KeywordsManager.py      |    7 +-
 .../package/ebuild/_config/LocationsManager.py     |   44 +-
 pym/portage/package/ebuild/_config/MaskManager.py  |   25 +-
 pym/portage/package/ebuild/_config/UseManager.py   |  116 +-
 .../package/ebuild/_config/special_env_vars.py     |   10 +-
 pym/portage/package/ebuild/config.py               |  195 +++-
 pym/portage/package/ebuild/doebuild.py             |  246 +++-
 pym/portage/package/ebuild/fetch.py                |    7 +-
 pym/portage/package/ebuild/prepare_build_dirs.py   |    9 +-
 pym/portage/{emaint => }/progress.py               |    0
 pym/portage/repository/config.py                   |  121 +-
 pym/portage/sync/__init__.py                       |   38 +
 pym/portage/sync/config_checks.py                  |   72 ++
 pym/portage/sync/controller.py                     |  321 ++++++
 .../sync/getaddrinfo_validate.py                   |    0
 pym/{repoman => portage/sync/modules}/__init__.py  |    0
 pym/portage/sync/modules/cvs/__init__.py           |   45 +
 pym/portage/sync/modules/cvs/cvs.py                |   67 ++
 pym/portage/sync/modules/git/__init__.py           |   55 +
 pym/portage/sync/modules/git/git.py                |   86 ++
 pym/portage/sync/modules/rsync/__init__.py         |   28 +
 pym/portage/sync/modules/rsync/rsync.py            |  543 +++++++++
 pym/portage/sync/modules/svn/__init__.py           |   31 +
 pym/portage/sync/modules/svn/svn.py                |   89 ++
 pym/portage/sync/modules/webrsync/__init__.py      |   49 +
 pym/portage/sync/modules/webrsync/webrsync.py      |   66 ++
 .../sync/old_tree_timestamp.py                     |    5 +-
 pym/portage/sync/syncbase.py                       |  136 +++
 pym/portage/tests/__init__.py                      |    4 +-
 pym/portage/tests/dbapi/test_fakedbapi.py          |   11 +-
 pym/portage/tests/dbapi/test_portdb_cache.py       |   18 +-
 pym/portage/tests/dep/test_isvalidatom.py          |    8 +-
 .../tests/ebuild/test_use_expand_incremental.py    |  132 +++
 pym/portage/tests/emerge/test_config_protect.py    |  292 +++++
 pym/portage/tests/emerge/test_simple.py            |   10 +-
 pym/portage/tests/glsa/test_security_set.py        |    5 +-
 pym/portage/tests/lint/metadata.py                 |   11 +
 pym/portage/tests/lint/test_compile_modules.py     |   13 +
 pym/portage/tests/resolver/ResolverPlayground.py   |   46 +-
 .../resolver/binpkg_multi_instance}/__init__.py    |    2 +-
 .../resolver/binpkg_multi_instance/__test__.py}    |    2 +-
 .../test_build_id_profile_format.py                |  134 +++
 .../binpkg_multi_instance/test_rebuilt_binaries.py |  101 ++
 .../tests/resolver/soname}/__init__.py             |    2 +-
 .../tests/resolver/soname/__test__.py}             |    2 +-
 .../tests/resolver/soname/test_autounmask.py       |  103 ++
 pym/portage/tests/resolver/soname/test_depclean.py |   61 +
 .../tests/resolver/soname/test_downgrade.py        |  240 ++++
 .../tests/resolver/soname/test_or_choices.py       |   92 ++
 .../tests/resolver/soname/test_reinstall.py        |   87 ++
 .../tests/resolver/soname/test_skip_update.py      |   86 ++
 .../soname/test_slot_conflict_reinstall.py         |  342 ++++++
 .../resolver/soname/test_slot_conflict_update.py   |  117 ++
 .../tests/resolver/soname/test_soname_provided.py  |   78 ++
 .../tests/resolver/soname/test_unsatisfiable.py    |   71 ++
 .../tests/resolver/soname/test_unsatisfied.py      |   87 ++
 pym/portage/tests/resolver/test_backtracking.py    |    9 +-
 pym/portage/tests/resolver/test_changed_deps.py    |  120 ++
 .../tests/resolver/test_onlydeps_circular.py       |   51 +
 pym/portage/tests/resolver/test_or_choices.py      |  137 ++-
 pym/portage/tests/resolver/test_package_tracker.py |    4 +-
 .../tests/resolver/test_profile_default_eapi.py    |  126 +++
 .../tests/resolver/test_profile_package_set.py     |  123 ++
 ..._slot_operator_update_probe_parent_downgrade.py |   68 ++
 pym/portage/tests/resolver/test_virtual_slot.py    |   75 ++
 pym/portage/tests/resolver/test_with_test_deps.py  |   44 +
 pym/{_emerge => portage/tests}/sync/__init__.py    |    2 +-
 pym/portage/tests/sync/test_sync_local.py          |  189 ++++
 pym/portage/update.py                              |    4 +-
 pym/portage/util/__init__.py                       |  111 +-
 pym/portage/util/_dyn_libs/LinkageMapELF.py        |   62 +-
 pym/portage/util/_dyn_libs/NeededEntry.py          |   82 ++
 pym/portage/util/_dyn_libs/soname_deps.py          |  138 +++
 pym/portage/util/compression_probe.py              |   79 ++
 pym/portage/util/cpuinfo.py                        |   18 +
 pym/{_emerge/sync => portage/util/elf}/__init__.py |    2 +-
 pym/portage/util/elf/constants.py                  |   45 +
 pym/portage/util/elf/header.py                     |   65 ++
 .../sync => portage/util/endian}/__init__.py       |    2 +-
 pym/portage/util/endian/decode.py                  |   48 +
 pym/portage/util/iterators/MultiIterGroupBy.py     |   94 ++
 .../sync => portage/util/iterators}/__init__.py    |    2 +-
 pym/portage/util/movefile.py                       |    2 +-
 pym/portage/util/path.py                           |   48 +
 pym/portage/util/socks5.py                         |   81 ++
 pym/portage/util/writeable_check.py                |    2 +-
 pym/portage/versions.py                            |   28 +-
 pym/repoman/check_missingslot.py                   |   31 +
 pym/repoman/utilities.py                           |    7 +-
 setup.py                                           |   27 +-
 196 files changed, 12504 insertions(+), 2861 deletions(-)

diff --cc bin/bashrc-functions.sh
index 1a92738,cc02546..daa00d2
--- a/bin/bashrc-functions.sh
+++ b/bin/bashrc-functions.sh
@@@ -1,12 -1,7 +1,12 @@@
 -#!/bin/bash
 +#!@PORTAGE_BASH@
- # Copyright 1999-2013 Gentoo Foundation
+ # Copyright 1999-2014 Gentoo Foundation
  # Distributed under the terms of the GNU General Public License v2
  
 +portageq() {
 +      PYTHONPATH=${PORTAGE_PYTHONPATH:-${PORTAGE_PYM_PATH}}\
 +      "${PORTAGE_PYTHON:-@PREFIX_PORTAGE_PYTHON@}" 
"${PORTAGE_BIN_PATH}/portageq" "$@"
 +}
 +
  register_die_hook() {
        local x
        for x in $* ; do
diff --cc bin/dispatch-conf
index 286d821,678a66d..4215e5b
--- a/bin/dispatch-conf
+++ b/bin/dispatch-conf
@@@ -21,11 -26,10 +26,11 @@@ if osp.isfile(osp.join(osp.dirname(osp.
        sys.path.insert(0, 
osp.join(osp.dirname(osp.dirname(osp.realpath(__file__))), "pym"))
  import portage
  portage._internal_caller = True
- from portage import os
- from portage import _unicode_decode
- from portage.dispatch_conf import diffstatusoutput
+ from portage import os, shutil
+ from portage import _encodings, _unicode_decode
+ from portage.dispatch_conf import diffstatusoutput, diff_mixed_wrapper
  from portage.process import find_binary, spawn
 +from portage.const import EPREFIX
  
  FIND_EXTANT_CONFIGS  = "find '%s' %s -name '._cfg????_%s' ! -name '.*~' ! 
-iname '.*.bak' -print"
  DIFF_CONTENTS        = "diff -Nu '%s' '%s'"
diff --cc bin/ebuild-helpers/dohtml
index 70cb1f4,0478e49..bf1f0fe
--- a/bin/ebuild-helpers/dohtml
+++ b/bin/ebuild-helpers/dohtml
@@@ -2,10 -2,14 +2,14 @@@
  # Copyright 2009-2013 Gentoo Foundation
  # Distributed under the terms of the GNU General Public License v2
  
 -source "${PORTAGE_BIN_PATH:-/usr/lib/portage/bin}"/isolated-functions.sh
 +source "${PORTAGE_BIN_PATH:-@PORTAGE_BASE@/bin}"/isolated-functions.sh
  
+ if ___eapi_has_dohtml_deprecated; then
+       eqawarn "'${0##*/}' is deprecated in EAPI '$EAPI'"
+ fi
+ 
 -PORTAGE_BIN_PATH=${PORTAGE_BIN_PATH:-/usr/lib/portage/bin}
 -PORTAGE_PYM_PATH=${PORTAGE_PYM_PATH:-/usr/lib/portage/pym}
 +PORTAGE_BIN_PATH=${PORTAGE_BIN_PATH:-@PORTAGE_BASE@/bin}
 +PORTAGE_PYM_PATH=${PORTAGE_PYM_PATH:-@PORTAGE_BASE@/pym}
  # Use safe cwd, avoiding unsafe import for bug #469338.
  export __PORTAGE_HELPER_CWD=${PWD}
  cd "${PORTAGE_PYM_PATH}"
diff --cc bin/egencache
index e2f57a5,f97432f..def4837
--- a/bin/egencache
+++ b/bin/egencache
@@@ -57,8 -58,7 +58,8 @@@ from portage.util._async.run_main_sched
  from portage.util._eventloop.global_event_loop import global_event_loop
  from portage import cpv_getkey
  from portage.dep import Atom, isjustname
- from portage.versions import pkgsplit, vercmp
+ from portage.versions import pkgsplit, vercmp, _pkg_str
 +from portage.const import EPREFIX
  
  try:
        from xml.etree import ElementTree
diff --cc bin/install-qa-check.d/90world-writable
index 635612d,820683b..bb9b075
--- a/bin/install-qa-check.d/90world-writable
+++ b/bin/install-qa-check.d/90world-writable
@@@ -2,23 -2,34 +2,36 @@@
  
  world_writable_check() {
        # Now we look for all world writable files.
 -      local unsafe_files=$(find "${ED}" -type f -perm -2 | sed -e 
"s:^${ED}:/:")
 +      # PREFIX LOCAL: keep offset prefix in the reported files
-       local unsafe_files=$(find "${ED}" -type f -perm -2 | sed -e "s:^${D}:- 
:")
++      local unsafe_files=$(find "${ED}" -type f -perm -2 | sed -e 
"s:^${D}:/:")
 +      # END PREFIX LOCAL
+       local OLDIFS x prev_shopts=$-
+ 
+       OLDIFS=$IFS
+       IFS=$'\n'
+       set -f
+ 
        if [[ -n ${unsafe_files} ]] ; then
-               __vecho "QA Security Notice: world writable file(s):"
-               __vecho "${unsafe_files}"
-               __vecho "- This may or may not be a security problem, most of 
the time it is one."
-               __vecho "- Please double check that $PF really needs a world 
writeable bit and file bugs accordingly."
-               sleep 1
+               eqawarn "QA Security Notice: world writable file(s):"
+ 
+               eqatag -v world-writable $unsafe_files
+ 
+               eqawarn "This may or may not be a security problem, most of the 
time it is one."
+               eqawarn "Please double check that $PF really needs a world 
writeable bit and file bugs accordingly."
+               eqawarn
        fi
  
 -      local unsafe_files=$(find "${ED}" -type f '(' -perm -2002 -o -perm 
-4002 ')' | sed -e "s:^${ED}:/:")
 +      local unsafe_files=$(find "${ED}" -type f '(' -perm -2002 -o -perm 
-4002 ')' | sed -e "s:^${D}:/:")
        if [[ -n ${unsafe_files} ]] ; then
                eqawarn "QA Notice: Unsafe files detected (set*id and world 
writable)"
-               eqawarn "${unsafe_files}"
+ 
+               eqatag -v world-writable-setid $unsafe_files
+ 
                die "Unsafe files found in \${D}.  Portage will not install 
them."
        fi
+ 
+       IFS=$OLDIFS
+       [[ ${prev_shopts} == *f* ]] || set +f
  }
  
  world_writable_check
diff --cc bin/misc-functions.sh
index 5b8e872,e08c228..4928575
mode 100644,100755..100644
--- a/bin/misc-functions.sh
+++ b/bin/misc-functions.sh
@@@ -172,19 -168,21 +172,23 @@@ install_qa_check() 
                local EPREFIX= ED=${D}
        fi
  
 -      cd "${ED}" || die "cd failed"
 +      # PREFIX LOCAL: ED needs not to exist, whereas D does
 +      cd "${D}" || die "cd failed"
 +      # END PREFIX LOCAL
  
-       # Run QA checks from install-qa-check.d.
-       # Note: checks need to be run *before* stripping.
-       local f
-       # TODO: handle nullglob-like
-       for f in "${PORTAGE_BIN_PATH}"/install-qa-check.d/*; do
-               # Run in a subshell to treat it like external script,
-               # but use 'source' to pass all variables through.
-               (
-                       source "${f}" || eerror "Post-install QA check ${f##*/} 
failed to run"
+       # Collect the paths for QA checks, highest prio first.
+       paths=(
+               # sysadmin overrides
+               "${PORTAGE_OVERRIDE_EPREFIX}"/usr/local/lib/install-qa-check.d
+               # system-wide package installs
+               "${PORTAGE_OVERRIDE_EPREFIX}"/usr/lib/install-qa-check.d
+       )
+ 
+       # Now repo-specific checks.
+       # (yes, PORTAGE_ECLASS_LOCATIONS contains repo paths...)
+       for d in "${PORTAGE_ECLASS_LOCATIONS[@]}"; do
+               paths+=(
+                       "${d}"/metadata/install-qa-check.d
                )
        done
  
diff --cc bin/phase-functions.sh
index 2dece5a,2743e27..f447fca
--- a/bin/phase-functions.sh
+++ b/bin/phase-functions.sh
@@@ -31,8 -31,8 +31,8 @@@ PORTAGE_READONLY_VARS="D EBUILD EBUILD_
        PORTAGE_TMPDIR PORTAGE_UPDATE_ENV PORTAGE_USERNAME \
        PORTAGE_VERBOSE PORTAGE_WORKDIR_MODE PORTAGE_XATTR_EXCLUDE \
        PORTDIR \
-       PROFILE_PATHS REPLACING_VERSIONS REPLACED_BY_VERSION T WORKDIR \
+       REPLACING_VERSIONS REPLACED_BY_VERSION T WORKDIR \
 -      __PORTAGE_HELPER __PORTAGE_TEST_HARDLINK_LOCKS"
 +      __PORTAGE_HELPER __PORTAGE_TEST_HARDLINK_LOCKS ED EROOT"
  
  PORTAGE_SAVED_READONLY_VARS="A CATEGORY P PF PN PR PV PVR"
  
diff --cc cnf/make.globals
index a57a603,dd99618..880fed5
--- a/cnf/make.globals
+++ b/cnf/make.globals
@@@ -151,24 -122,11 +151,25 @@@ PORTAGE_ELOG_MAILFROM="@portageuser@@lo
  # Signing command used by repoman
  PORTAGE_GPG_SIGNING_COMMAND="gpg --sign --digest-algo SHA256 --clearsign 
--yes --default-key \"\${PORTAGE_GPG_KEY}\" --homedir \"\${PORTAGE_GPG_DIR}\" 
\"\${FILE}\""
  
+ # btrfs.* attributes are irrelevant, see bug #527636.
  # Security labels are special, see bug #461868.
  # system.nfs4_acl attributes are irrelevant, see bug #475496.
- PORTAGE_XATTR_EXCLUDE="security.* system.nfs4_acl"
+ PORTAGE_XATTR_EXCLUDE="btrfs.* security.* system.nfs4_acl"
  
 +# Writeable paths for Mac OS X seatbelt sandbox
 +#
 +# If path ends in a slash (/), access will recursively be allowed to directory
 +# contents (using a regex), not the directory itself. Without a slash, access
 +# to the directory or file itself will be allowed (using a literal), so it can
 +# be created, removed and changed. If both is needed, the directory needs to 
be
 +# given twice, once with and once without the slash. Obviously this only makes
 +# sense for directories, not files.
 +#
 +# An empty value for either variable will disable all restrictions on the
 +# corresponding operation.
 +MACOSSANDBOX_PATHS="/dev/fd/ /private/tmp/ /private/var/tmp/ 
@@PORTAGE_BUILDDIR@@/ @@PORTAGE_ACTUAL_DISTDIR@@/"
 +MACOSSANDBOX_PATHS_CONTENT_ONLY="/dev/null /dev/dtracehelper /dev/tty 
/private/var/run/syslog"
 +
  #            *****************************
  #            **  DO NOT EDIT THIS FILE  **
  # ***************************************************
diff --cc cnf/repos.conf
index 18c611a,1ca98ca..4433546
--- a/cnf/repos.conf
+++ b/cnf/repos.conf
@@@ -1,7 -1,8 +1,8 @@@
  [DEFAULT]
 -main-repo = gentoo
 +main-repo = gentoo_prefix
  
 -[gentoo]
 -location = /usr/portage
 +[gentoo_prefix]
 +location = @PORTAGE_EPREFIX@/usr/portage
  sync-type = rsync
 -sync-uri = rsync://rsync.gentoo.org/gentoo-portage
 +sync-uri = rsync://rsync.prefix.bitzolder.nl/gentoo-portage-prefix
+ auto-sync = yes
diff --cc pym/_emerge/Package.py
index bdf3b23,2c1a116..1570f3d
--- a/pym/_emerge/Package.py
+++ b/pym/_emerge/Package.py
@@@ -13,12 -13,12 +13,13 @@@ from portage.cache.mappings import slot
  from portage.const import EBUILD_PHASES
  from portage.dep import Atom, check_required_use, use_reduce, \
        paren_enclose, _slot_separator, _repo_separator
+ from portage.dep.soname.parse import parse_soname_deps
  from portage.versions import _pkg_str, _unknown_repo
  from portage.eapi import _get_eapi_attrs, eapi_has_use_aliases
- from portage.exception import InvalidDependString
+ from portage.exception import InvalidData, InvalidDependString
  from portage.localization import _
  from _emerge.Task import Task
 +from portage.const import EPREFIX
  
  if sys.hexversion >= 0x3000000:
        basestring = str
@@@ -40,11 -41,12 +42,12 @@@ class Package(Task)
                "_validated_atoms", "_visible")
  
        metadata_keys = [
-               "BUILD_TIME", "CHOST", "COUNTER", "DEPEND", "EAPI",
-               "HDEPEND", "INHERITED", "IUSE", "KEYWORDS",
-               "LICENSE", "PDEPEND", "PROVIDE", "RDEPEND",
-               "repository", "PROPERTIES", "RESTRICT", "SLOT", "USE",
-               "_mtime_", "DEFINED_PHASES", "REQUIRED_USE", "EPREFIX"]
+               "BUILD_ID", "BUILD_TIME", "CHOST", "COUNTER", "DEFINED_PHASES",
+               "DEPEND", "EAPI", "HDEPEND", "INHERITED", "IUSE", "KEYWORDS",
+               "LICENSE", "MD5", "PDEPEND", "PROVIDE", "PROVIDES",
+               "RDEPEND", "repository", "REQUIRED_USE",
+               "PROPERTIES", "REQUIRES", "RESTRICT", "SIZE",
 -              "SLOT", "USE", "_mtime_"]
++              "SLOT", "USE", "_mtime_", "EPREFIX"]
  
        _dep_keys = ('DEPEND', 'HDEPEND', 'PDEPEND', 'RDEPEND')
        _buildtime_keys = ('DEPEND', 'HDEPEND')
diff --cc pym/_emerge/main.py
index a5de7c3,a5dafa3..0bacd68
--- a/pym/_emerge/main.py
+++ b/pym/_emerge/main.py
@@@ -19,8 -19,8 +19,9 @@@ portage.proxy.lazyimport.lazyimport(glo
        '_emerge.is_valid_package_atom:insert_category_into_atom'
  )
  from portage import os
 +from portage.const import EPREFIX
  from portage.util._argparse import ArgumentParser
+ from portage.sync import _SUBMODULE_PATH_MAP
  
  if sys.hexversion >= 0x3000000:
        long = int
diff --cc pym/portage/data.py
index f4bbb44,2fd287d..fa89242
--- a/pym/portage/data.py
+++ b/pym/portage/data.py
@@@ -91,52 -147,38 +151,50 @@@ def _get_global(k)
                #Discover the uid and gid of the portage user/group
                keyerror = False
                try:
 -                      portage_uid = 
pwd.getpwnam(_get_global('_portage_username')).pw_uid
 +                      username = str(_get_global('_portage_username'))
 +                      portage_uid = pwd.getpwnam(username).pw_uid
                except KeyError:
 -                      keyerror = True
 -                      portage_uid = 0
 +                      # PREFIX LOCAL: some sysadmins are insane, bug #344307
 +                      if username.isdigit():
 +                              portage_uid = int(username)
 +                      else:
 +                              keyerror = True
 +                              portage_uid = 0
 +                      # END PREFIX LOCAL
  
                try:
 -                      portage_gid = 
grp.getgrnam(_get_global('_portage_grpname')).gr_gid
 +                      grpname = str(_get_global('_portage_grpname'))
 +                      portage_gid = grp.getgrnam(grpname).gr_gid
                except KeyError:
 -                      keyerror = True
 -                      portage_gid = 0
 +                      # PREFIX LOCAL: some sysadmins are insane, bug #344307
 +                      if grpname.isdigit():
 +                              portage_gid = int(grpname)
 +                      else:
 +                              keyerror = True
 +                              portage_gid = 0
 +                      # END PREFIX LOCAL
  
-               if secpass < 1 and portage_gid in os.getgroups():
-                       secpass = 1
- 
                # Suppress this error message if both PORTAGE_GRPNAME and
                # PORTAGE_USERNAME are set to "root", for things like
                # Android (see bug #454060).
                if keyerror and not (_get_global('_portage_username') == "root" 
and
                        _get_global('_portage_grpname') == "root"):
 +                      # PREFIX LOCAL: we need to fix this one day to 
distinguish prefix vs non-prefix
 +                      writemsg(colorize("BAD",
 +                              _("portage: '%s' user or '%s' group missing." % 
(_get_global('_portage_username'), _get_global('_portage_grpname')))) + "\n", 
noiselevel=-1)
                        writemsg(colorize("BAD",
 -                              _("portage: 'portage' user or group missing.")) 
+ "\n", noiselevel=-1)
 -                      writemsg(_(
 -                              "         For the defaults, line 1 goes into 
passwd, "
 -                              "and 2 into group.\n"), noiselevel=-1)
 -                      writemsg(colorize("GOOD",
 -                              "         
portage:x:250:250:portage:/var/tmp/portage:/bin/false") \
 -                              + "\n", noiselevel=-1)
 -                      writemsg(colorize("GOOD", "         
portage::250:portage") + "\n",
 -                              noiselevel=-1)
 +                              _("         In Prefix Portage this is quite 
dramatic")) + "\n", noiselevel=-1)
 +                      writemsg(colorize("BAD",
 +                              _("         since it means you have thrown away 
yourself.")) + "\n", noiselevel=-1)
 +                      writemsg(colorize("BAD",
 +                              _("         Re-add yourself or re-bootstrap 
Gentoo Prefix.")) + "\n", noiselevel=-1)
 +                      # END PREFIX LOCAL
                        portage_group_warning()
  
+               globals()['portage_gid'] = portage_gid
                _initialized_globals.add('portage_gid')
+               globals()['portage_uid'] = portage_uid
                _initialized_globals.add('portage_uid')
-               _initialized_globals.add('secpass')
  
                if k == 'portage_gid':
                        return portage_gid
@@@ -206,28 -244,24 +260,29 @@@
                        except OSError:
                                pass
                        else:
-                               if k == '_portage_grpname':
-                                       try:
-                                               grp_struct = 
grp.getgrgid(eroot_st.st_gid)
-                                       except KeyError:
-                                               v = eroot_st.st_gid
-                                       else:
-                                               v = grp_struct.gr_name
-                               else:
-                                       try:
-                                               pwd_struct = 
pwd.getpwuid(eroot_st.st_uid)
-                                       except KeyError:
-                                               v = eroot_st.st_uid
+                               if _unprivileged_mode(eroot_or_parent, 
eroot_st):
+                                       if k == '_portage_grpname':
+                                               try:
+                                                       grp_struct = 
grp.getgrgid(eroot_st.st_gid)
+                                               except KeyError:
+                                                       pass
+                                               else:
+                                                       v = grp_struct.gr_name
                                        else:
-                                               v = pwd_struct.pw_name
+                                               try:
+                                                       pwd_struct = 
pwd.getpwuid(eroot_st.st_uid)
+                                               except KeyError:
+                                                       pass
+                                               else:
+                                                       v = pwd_struct.pw_name
  
                if v is None:
 -                      v = 'portage'
 +                      # PREFIX LOCAL: use var iso hardwired 'portage'
 +                      if k == '_portage_grpname':
 +                              v = PORTAGE_GROUPNAME
 +                      else:
 +                              v = PORTAGE_USERNAME
 +                      # END PREFIX LOCAL
        else:
                raise AssertionError('unknown name: %s' % k)
  
diff --cc pym/portage/dbapi/bintree.py
index 45e8614,b37f388..e3e50e0
--- a/pym/portage/dbapi/bintree.py
+++ b/pym/portage/dbapi/bintree.py
@@@ -70,18 -70,26 +71,26 @@@ class bindbapi(fakedbapi)
        _known_keys = frozenset(list(fakedbapi._known_keys) + \
                ["CHOST", "repository", "USE"])
        def __init__(self, mybintree=None, **kwargs):
-               fakedbapi.__init__(self, **kwargs)
+               # Always enable multi_instance mode for bindbapi indexing. This
+               # does not affect the local PKGDIR file layout, since that is
+               # controlled independently by FEATURES=binpkg-multi-instance.
+               # The multi_instance mode is useful for the following reasons:
+               # * binary packages with the same cpv from multiple binhosts
+               #   can be considered simultaneously
+               # * if binpkg-multi-instance is disabled, it's still possible
+               #   to properly access a PKGDIR which has binpkg-multi-instance
+               #   layout (or mixed layout)
+               fakedbapi.__init__(self, exclusive_slots=False,
+                       multi_instance=True, **kwargs)
                self.bintree = mybintree
                self.move_ent = mybintree.move_ent
-               self.cpvdict={}
-               self.cpdict={}
                # Selectively cache metadata in order to optimize dep matching.
                self._aux_cache_keys = set(
-                       ["BUILD_TIME", "CHOST", "DEPEND", "EAPI",
-                       "HDEPEND", "IUSE", "KEYWORDS",
-                       "LICENSE", "PDEPEND", "PROPERTIES", "PROVIDE",
-                       "RDEPEND", "repository", "RESTRICT", "SLOT", "USE", 
"DEFINED_PHASES",
-                       "EPREFIX"
+                       ["BUILD_ID", "BUILD_TIME", "CHOST", "DEFINED_PHASES",
+                       "DEPEND", "EAPI", "HDEPEND", "IUSE", "KEYWORDS",
+                       "LICENSE", "MD5", "PDEPEND", "PROPERTIES", "PROVIDE",
+                       "PROVIDES", "RDEPEND", "repository", "REQUIRES", 
"RESTRICT",
 -                      "SIZE", "SLOT", "USE", "_mtime_"
++                      "SIZE", "SLOT", "USE", "_mtime_", "EPREFIX"
                        ])
                self._aux_cache_slot_dict = 
slot_dict_class(self._aux_cache_keys)
                self._aux_cache = {}
@@@ -306,12 -311,14 +312,14 @@@ class binarytree(object)
                        self._pkgindex_hashes = ["MD5","SHA1"]
                        self._pkgindex_file = os.path.join(self.pkgdir, 
"Packages")
                        self._pkgindex_keys = self.dbapi._aux_cache_keys.copy()
-                       self._pkgindex_keys.update(["CPV", "MTIME", "SIZE"])
+                       self._pkgindex_keys.update(["CPV", "SIZE"])
                        self._pkgindex_aux_keys = \
-                               ["BUILD_TIME", "CHOST", "DEPEND", 
"DESCRIPTION", "EAPI",
-                               "HDEPEND", "IUSE", "KEYWORDS", "LICENSE", 
"PDEPEND", "PROPERTIES",
-                               "PROVIDE", "RESTRICT", "RDEPEND", "repository", 
"SLOT", "USE", "DEFINED_PHASES",
-                               "BASE_URI", "EPREFIX"]
+                               ["BASE_URI", "BUILD_ID", "BUILD_TIME", "CHOST",
+                               "DEFINED_PHASES", "DEPEND", "DESCRIPTION", 
"EAPI",
+                               "HDEPEND", "IUSE", "KEYWORDS", "LICENSE", 
"PDEPEND",
+                               "PKGINDEX_URI", "PROPERTIES", "PROVIDE", 
"PROVIDES",
+                               "RDEPEND", "repository", "REQUIRES", "RESTRICT",
 -                              "SIZE", "SLOT", "USE"]
++                              "SIZE", "SLOT", "USE", "EPREFIX"]
                        self._pkgindex_aux_keys = list(self._pkgindex_aux_keys)
                        self._pkgindex_use_evaluated_keys = \
                                ("DEPEND", "HDEPEND", "LICENSE", "RDEPEND",
@@@ -322,9 -329,9 +330,10 @@@
                                "CONFIG_PROTECT", "CONFIG_PROTECT_MASK", 
"FEATURES",
                                "GENTOO_MIRRORS", "INSTALL_MASK", 
"IUSE_IMPLICIT", "USE",
                                "USE_EXPAND", "USE_EXPAND_HIDDEN", 
"USE_EXPAND_IMPLICIT",
 -                              "USE_EXPAND_UNPREFIXED"])
 +                              "USE_EXPAND_UNPREFIXED",
 +                              "EPREFIX"])
                        self._pkgindex_default_pkg_data = {
+                               "BUILD_ID"           : "",
                                "BUILD_TIME"         : "",
                                "DEFINED_PHASES"     : "",
                                "DEPEND"  : "",
diff --cc pym/portage/dbapi/vartree.py
index a0881a2,277c2f1..a037200
--- a/pym/portage/dbapi/vartree.py
+++ b/pym/portage/dbapi/vartree.py
@@@ -1077,8 -1097,8 +1112,11 @@@ class vardbapi(dbapi)
                                # Empty path is a code used to represent empty 
contents.
                                self._add_path("", pkg_hash)
  
-                       for x in contents:
-                               self._add_path(x[eroot_len:], pkg_hash)
+                       for x in db._contents.keys():
 -                              self._add_path(x[eroot_len:], pkg_hash)
++                              path = x[eroot_len:]
++                              if "case-insensitive-fs" in 
self._vardb.settings.features:
++                                      path = path.lower()
++                              self._add_path(patch, pkg_hash)
  
                        self._vardb._aux_cache["modified"].add(cpv)
  
@@@ -1259,14 -1279,16 +1297,18 @@@
                                                                continue
  
                                                        if is_basename:
-                                                               for p in 
dblink(cpv).getcontents():
+                                                               for p in 
dblink(cpv)._contents.keys():
 +                                                                      if 
case_insensitive:
 +                                                                              
p = p.lower()
                                                                        if 
os.path.basename(p) == name:
-                                                                               
owners.append((cpv, p[len(root):]))
+                                                                               
owners.append((cpv, dblink(cpv).
+                                                                               
_contents.unmap_key(
+                                                                               
p)[len(root):]))
                                                        else:
-                                                               if 
dblink(cpv).isowner(path):
-                                                                       
owners.append((cpv, path))
+                                                               key = 
dblink(cpv)._match_contents(path)
+                                                               if key is not 
False:
+                                                                       
owners.append(
+                                                                               
(cpv, key[len(root):]))
  
                                        except StopIteration:
                                                path_iter.append(path)
@@@ -1314,14 -1336,16 +1356,18 @@@
                                dblnk = self._vardb._dblink(cpv)
                                for path, name, is_basename in path_info_list:
                                        if is_basename:
-                                               for p in dblnk.getcontents():
+                                               for p in dblnk._contents.keys():
 +                                                      if case_insensitive:
 +                                                              p = p.lower()
                                                        if os.path.basename(p) 
== name:
-                                                               
search_pkg.results.append((dblnk, p[len(root):]))
+                                                               
search_pkg.results.append((dblnk,
+                                                                       
dblnk._contents.unmap_key(
+                                                                               
p)[len(root):]))
                                        else:
-                                               if dblnk.isowner(path):
-                                                       
search_pkg.results.append((dblnk, path))
+                                               key = 
dblnk._match_contents(path)
+                                               if key is not False:
+                                                       
search_pkg.results.append(
+                                                               (dblnk, 
key[len(root):]))
                                search_pkg.complete = True
                                return False
  
@@@ -2795,24 -2828,18 +2850,26 @@@ class dblink(object)
                        os_filename_arg.path.join(destroot,
                        filename.lstrip(os_filename_arg.path.sep)))
  
 +              pkgfiles = self.getcontents()
 +
 +              preserve_case = None
                if "case-insensitive-fs" in self.settings.features:
                        destfile = destfile.lower()
 -
 -              if self._contents.contains(destfile):
 -                      return self._contents.unmap_key(destfile)
 -
 -              if self.getcontents():
 +                      preserve_case = dict((k.lower(), k) for k in pkgfiles)
 +                      pkgfiles = dict((k.lower(), v) for k, v in 
pkgfiles.items())
 +
 +              if pkgfiles and destfile in pkgfiles:
 +                      if preserve_case is not None:
 +                              return preserve_case[destfile]
 +                      return destfile
++              #if self._contents.contains(destfile):
++              #       return self._contents.unmap_key(destfile)
 +              if pkgfiles:
                        basename = os_filename_arg.path.basename(destfile)
                        if self._contents_basenames is None:
  
                                try:
-                                       for x in pkgfiles:
 -                                      for x in self._contents.keys():
++                                      for x in pkgfiles):
                                                _unicode_encode(x,
                                                        
encoding=_encodings['merge'],
                                                        errors='strict')
@@@ -2897,10 -2924,8 +2954,12 @@@
                        if p_path_list:
                                for p_path in p_path_list:
                                        x = os_filename_arg.path.join(p_path, 
basename)
 -                                      if self._contents.contains(x):
 -                                              return 
self._contents.unmap_key(x)
 +                                      if x in pkgfiles:
 +                                              if preserve_case is not None:
 +                                                      return preserve_case[x]
 +                                              return x
++                                      #if self._contents.contains(x):
++                                      #       return 
self._contents.unmap_key(x)
  
                return False
  
diff --cc pym/portage/package/ebuild/config.py
index 6e578a9,3a4007b..18e95ff
--- a/pym/portage/package/ebuild/config.py
+++ b/pym/portage/package/ebuild/config.py
@@@ -834,40 -857,38 +857,44 @@@ class config(object)
                                "PORTAGE_INST_UID": "0",
                        }
  
 -                      eroot_or_parent = first_existing(eroot)
 -                      unprivileged = False
 -                      try:
 -                              eroot_st = os.stat(eroot_or_parent)
 -                      except OSError:
 -                              pass
 -                      else:
 -
 -                              if portage.data._unprivileged_mode(
 -                                      eroot_or_parent, eroot_st):
 -                                      unprivileged = True
 -
 -                                      default_inst_ids["PORTAGE_INST_GID"] = 
str(eroot_st.st_gid)
 -                                      default_inst_ids["PORTAGE_INST_UID"] = 
str(eroot_st.st_uid)
 -
 -                                      if "PORTAGE_USERNAME" not in self:
 -                                              try:
 -                                                      pwd_struct = 
pwd.getpwuid(eroot_st.st_uid)
 -                                              except KeyError:
 -                                                      pass
 -                                              else:
 -                                                      
self["PORTAGE_USERNAME"] = pwd_struct.pw_name
 -                                                      
self.backup_changes("PORTAGE_USERNAME")
 -
 -                                      if "PORTAGE_GRPNAME" not in self:
 -                                              try:
 -                                                      grp_struct = 
grp.getgrgid(eroot_st.st_gid)
 -                                              except KeyError:
 -                                                      pass
 -                                              else:
 -                                                      self["PORTAGE_GRPNAME"] 
= grp_struct.gr_name
 -                                                      
self.backup_changes("PORTAGE_GRPNAME")
 +                      # PREFIX LOCAL: inventing UID/GID based on a path is a 
very
 +                      # bad idea, it breaks almost everything since group ids
 +                      # don't have to match, when a user has many
 +                      # This in particularly breaks the configure-set portage
 +                      # group and user (in portage/data.py)
-                       #if eprefix:
-                       #       # For prefix environments, default to the UID 
and GID of
-                       #       # the top-level EROOT directory.
-                       #       try:
-                       #               eroot_st = os.stat(eroot)
-                       #       except OSError:
-                       #               pass
-                       #       else:
-                       #               default_inst_ids["PORTAGE_INST_GID"] = 
str(eroot_st.st_gid)
-                       #               default_inst_ids["PORTAGE_INST_UID"] = 
str(eroot_st.st_uid)
- 
-                       #               if "PORTAGE_USERNAME" not in self:
-                       #                       try:
-                       #                               pwd_struct = 
pwd.getpwuid(eroot_st.st_uid)
-                       #                       except KeyError:
-                       #                               pass
-                       #                       else:
-                       #                               
self["PORTAGE_USERNAME"] = pwd_struct.pw_name
-                       #                               
self.backup_changes("PORTAGE_USERNAME")
- 
-                       #               if "PORTAGE_GRPNAME" not in self:
-                       #                       try:
-                       #                               grp_struct = 
grp.getgrgid(eroot_st.st_gid)
-                       #                       except KeyError:
-                       #                               pass
-                       #                       else:
-                       #                               self["PORTAGE_GRPNAME"] 
= grp_struct.gr_name
-                       #                               
self.backup_changes("PORTAGE_GRPNAME")
++#                     eroot_or_parent = first_existing(eroot)
++#                     unprivileged = False
++#                     try:
++#                             eroot_st = os.stat(eroot_or_parent)
++#                     except OSError:
++#                             pass
++#                     else:
++#
++#                             if portage.data._unprivileged_mode(
++#                                     eroot_or_parent, eroot_st):
++#                                     unprivileged = True
++#
++#                                     default_inst_ids["PORTAGE_INST_GID"] = 
str(eroot_st.st_gid)
++#                                     default_inst_ids["PORTAGE_INST_UID"] = 
str(eroot_st.st_uid)
++#
++#                                     if "PORTAGE_USERNAME" not in self:
++#                                             try:
++#                                                     pwd_struct = 
pwd.getpwuid(eroot_st.st_uid)
++#                                             except KeyError:
++#                                                     pass
++#                                             else:
++#                                                     
self["PORTAGE_USERNAME"] = pwd_struct.pw_name
++#                                                     
self.backup_changes("PORTAGE_USERNAME")
++#
++#                                     if "PORTAGE_GRPNAME" not in self:
++#                                             try:
++#                                                     grp_struct = 
grp.getgrgid(eroot_st.st_gid)
++#                                             except KeyError:
++#                                                     pass
++#                                             else:
++#                                                     self["PORTAGE_GRPNAME"] 
= grp_struct.gr_name
++#                                                     
self.backup_changes("PORTAGE_GRPNAME")
 +                      # END PREFIX LOCAL
  
                        for var, default_val in default_inst_ids.items():
                                try:
diff --cc pym/portage/util/_dyn_libs/LinkageMapELF.py
index e4f8ee8,c44666a..c78f397
--- a/pym/portage/util/_dyn_libs/LinkageMapELF.py
+++ b/pym/portage/util/_dyn_libs/LinkageMapELF.py
@@@ -16,9 -16,33 +16,35 @@@ from portage.localization import 
  from portage.util import getlibpaths
  from portage.util import grabfile
  from portage.util import normalize_path
+ from portage.util import varexpand
  from portage.util import writemsg_level
+ from portage.util._dyn_libs.NeededEntry import NeededEntry
 +from portage.const import EPREFIX
  
+ # Map ELF e_machine values from NEEDED.ELF.2 to approximate multilib
+ # categories. This approximation will produce incorrect results on x32
+ # and mips systems, but the result is not worse than using the raw
+ # e_machine value which was used by earlier versions of portage.
+ _approx_multilib_categories = {
+       "386":           "x86_32",
+       "68K":           "m68k_32",
+       "AARCH64":       "arm_64",
+       "ALPHA":         "alpha_64",
+       "ARM":           "arm_32",
+       "IA_64":         "ia_64",
+       "MIPS":          "mips_o32",
+       "PARISC":        "hppa_64",
+       "PPC":           "ppc_32",
+       "PPC64":         "ppc_64",
+       "S390":          "s390_64",
+       "SH":            "sh_32",
+       "SPARC":         "sparc_32",
+       "SPARC32PLUS":   "sparc_32",
+       "SPARCV9":       "sparc_64",
+       "X86_64":        "x86_64",
+ }
++>>>>>>> overlays-gentoo-org/master
+ 
  class LinkageMapELF(object):
  
        """Models dynamic linker dependencies."""

Reply via email to