public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
* [gentoo-commits] proj/portage:multilib commit in: /
@ 2011-02-06 13:10 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2011-02-06 13:10 UTC (permalink / raw
  To: gentoo-commits

commit:     c94ec69ec2f161bf41324586e4adccdee1262562
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sun Feb  6 13:09:32 2011 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun Feb  6 13:09:32 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=c94ec69e

Merge commit 'v2.2.0_alpha20' into multilib


 bin/isolated-functions.sh                          |   12 +-
 bin/repoman                                        |    1 +
 man/emerge.1                                       |   24 +-
 man/make.conf.5                                    |    8 +-
 man/portage.5                                      |    3 +-
 man/repoman.1                                      |    5 +-
 pym/_emerge/BinpkgFetcher.py                       |    4 +-
 pym/_emerge/EbuildBuild.py                         |   17 +-
 pym/_emerge/EbuildFetcher.py                       |    6 +
 pym/_emerge/Package.py                             |   35 ++-
 pym/_emerge/actions.py                             |   46 ++-
 pym/_emerge/depgraph.py                            |  508 +++++++++++---------
 pym/_emerge/resolver/output.py                     |  116 +++--
 pym/_emerge/resolver/slot_collision.py             |   85 +++-
 pym/portage/__init__.py                            |    1 +
 pym/portage/_selinux.py                            |    6 +-
 pym/portage/cache/ebuild_xattr.py                  |    6 +-
 pym/portage/dbapi/_MergeProcess.py                 |    8 +-
 pym/portage/dbapi/bintree.py                       |   48 +-
 pym/portage/dep/__init__.py                        |  151 ++++++-
 .../package/ebuild/_config/KeywordsManager.py      |  203 ++++++--
 pym/portage/package/ebuild/_config/MaskManager.py  |   59 +++-
 pym/portage/package/ebuild/config.py               |   50 ++-
 pym/portage/package/ebuild/doebuild.py             |   35 ++-
 pym/portage/package/ebuild/fetch.py                |    1 +
 pym/portage/process.py                             |    5 +
 pym/portage/tests/dep/testCheckRequiredUse.py      |  112 +++++-
 .../test_lazy_import_portage_baseline.py           |    1 +
 pym/portage/tests/lint/test_import_modules.py      |   40 ++
 pym/portage/tests/resolver/ResolverPlayground.py   |   18 +-
 pym/portage/tests/resolver/test_depclean.py        |   40 ++
 ...ated_atoms.py => test_old_dep_chain_display.py} |   16 +-
 pym/portage/tests/resolver/test_required_use.py    |   26 +-
 pym/portage/tests/resolver/test_slot_collisions.py |   20 +-
 pym/portage/update.py                              |   14 +-
 pym/repoman/checks.py                              |   13 +-
 pym/repoman/errors.py                              |    3 +-
 37 files changed, 1309 insertions(+), 437 deletions(-)



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2011-02-08 18:12 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2011-02-08 18:12 UTC (permalink / raw
  To: gentoo-commits

commit:     07a2f8e3e0d03bb488a9f15ea4eac7e269c7c099
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Tue Feb  8 18:12:24 2011 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Tue Feb  8 18:12:24 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=07a2f8e3

Merge commit 'v2.2.0_alpha22' into multilib


 bin/ebuild.sh                              |   14 ++++++++++----
 man/ebuild.5                               |    4 ++--
 pym/portage/cache/sqlite.py                |   23 +++++++++++++++--------
 pym/portage/dep/__init__.py                |    2 +-
 pym/portage/dep/dep_check.py               |   19 +++++++++++++++----
 pym/portage/tests/dep/test_paren_reduce.py |    4 +++-
 6 files changed, 46 insertions(+), 20 deletions(-)



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2011-02-10 18:12 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2011-02-10 18:12 UTC (permalink / raw
  To: gentoo-commits

commit:     fe27fedc76de4cb436cee6421f8966d89c3cdcc9
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Thu Feb 10 18:11:56 2011 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Thu Feb 10 18:11:56 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=fe27fedc

Merge commit 'v2.2.0_alpha23' into multilib


 man/emerge.1                      |   10 ++++++----
 pym/_emerge/depgraph.py           |    3 ++-
 pym/portage/cache/ebuild_xattr.py |   13 +++++++------
 pym/portage/debug.py              |   10 ++++++++--
 pym/portage/dep/dep_check.py      |    8 ++++----
 pym/repoman/herdbase.py           |   11 +++++++++--
 6 files changed, 36 insertions(+), 19 deletions(-)



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2011-02-16 20:15 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2011-02-16 20:15 UTC (permalink / raw
  To: gentoo-commits

commit:     583b1dbc4d40488759f9683d281dba9b05793491
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Wed Feb 16 20:14:41 2011 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Wed Feb 16 20:14:41 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=583b1dbc

Merge commit 'v2.2.0_alpha24' into multilib


 bin/egencache                            |   37 ++++-
 bin/repoman                              |    1 +
 cnf/sets/portage.conf                    |    2 +-
 man/ebuild.1                             |    6 +-
 man/emerge.1                             |   17 ++-
 pym/_emerge/EbuildExecuter.py            |    3 +-
 pym/_emerge/Scheduler.py                 |    3 +-
 pym/_emerge/create_depgraph_params.py    |   16 ++-
 pym/_emerge/depgraph.py                  |  256 +++++++++++++++++++++++-------
 pym/_emerge/help.py                      |    7 +-
 pym/_emerge/resolver/output.py           |   10 +-
 pym/portage/dbapi/bintree.py             |   16 ++-
 pym/portage/dbapi/vartree.py             |   14 ++-
 pym/portage/dep/dep_check.py             |   35 +++--
 pym/portage/getbinpkg.py                 |    8 +-
 pym/portage/tests/resolver/test_depth.py |  233 +++++++++++++++++++++++++++
 pym/repoman/checks.py                    |    2 +-
 17 files changed, 561 insertions(+), 105 deletions(-)



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2011-02-25 13:45 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2011-02-25 13:45 UTC (permalink / raw
  To: gentoo-commits

commit:     0cd661019f7dd3d52c26b507c1dc87ec78c07965
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Fri Feb 25 13:44:35 2011 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Fri Feb 25 13:44:35 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=0cd66101

Merge commit 'v2.2.0_alpha25' into multilib


 bin/ebuild.sh                            |   14 +++-------
 bin/egencache                            |    8 +++++
 bin/isolated-functions.sh                |    4 +-
 bin/misc-functions.sh                    |    4 +-
 doc/package/ebuild/eapi/4.docbook        |    2 +-
 man/ebuild.5                             |    2 +-
 man/emerge.1                             |   13 ++++++---
 pym/_emerge/BinpkgVerifier.py            |    6 +++-
 pym/_emerge/Scheduler.py                 |    1 +
 pym/_emerge/SubProcess.py                |    3 +-
 pym/_emerge/actions.py                   |   19 +++++++++++--
 pym/_emerge/help.py                      |   15 +++++++---
 pym/_emerge/main.py                      |   43 +++++++++++++++++++++++++----
 pym/_emerge/unmerge.py                   |    4 +-
 pym/portage/dep/__init__.py              |    6 +++-
 pym/portage/mail.py                      |   38 ++++++++++++++++++--------
 pym/portage/tests/resolver/test_depth.py |   15 ++++++++++
 pym/repoman/checks.py                    |    2 +-
 18 files changed, 146 insertions(+), 53 deletions(-)



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2011-03-03 19:53 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2011-03-03 19:53 UTC (permalink / raw
  To: gentoo-commits

commit:     7d6007f4aef60e2b51e1f3412d52a49d53fb3bb4
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Thu Mar  3 19:53:00 2011 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Thu Mar  3 19:53:00 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=7d6007f4

Merge commit 'v2.2.0_alpha26' into multilib


 bin/ebuild                   |   51 +++++++++++++++++++++++++------------
 bin/ebuild-helpers/4/dodoc   |   49 +-----------------------------------
 bin/ebuild-helpers/dodoc     |    8 +++--
 bin/ebuild-helpers/doins     |   17 +++++++++++-
 bin/repoman                  |    2 +
 man/repoman.1                |    3 ++
 pym/_emerge/actions.py       |   53 ++++++++++++++++++++++++++++-----------
 pym/_emerge/depgraph.py      |   13 +++++++++-
 pym/portage/dbapi/vartree.py |   57 +++++++++++++++++++++++++++++++++--------
 pym/repoman/checks.py        |   16 ++++++++++-
 runtests.sh                  |    2 +-
 11 files changed, 172 insertions(+), 99 deletions(-)



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2011-03-17 17:58 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2011-03-17 17:58 UTC (permalink / raw
  To: gentoo-commits

commit:     99708ef674f479ef0a9ad4ad4629df8c41bbae5a
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Thu Mar 17 17:57:52 2011 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Thu Mar 17 17:57:52 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=99708ef6

Merge commit 'v2.2.0_alpha27' into multilib


 bin/ebuild-ipc.py                      |   15 +++-----
 man/emerge.1                           |    6 ++--
 pym/_emerge/AbstractEbuildProcess.py   |    5 +++
 pym/_emerge/AbstractPollTask.py        |   11 +++++-
 pym/_emerge/MetadataRegen.py           |   15 ++++----
 pym/_emerge/PollScheduler.py           |   39 ++++++++++++++++----
 pym/_emerge/QueueScheduler.py          |    5 ++-
 pym/_emerge/Scheduler.py               |   24 ++++++++++--
 pym/_emerge/depgraph.py                |    9 ++++-
 pym/_emerge/help.py                    |    7 +++-
 pym/_emerge/main.py                    |   29 +++++++++++++--
 pym/_emerge/unmerge.py                 |   31 +++++++++-------
 pym/portage/dbapi/porttree.py          |    2 -
 pym/portage/dbapi/vartree.py           |   63 +++++++++++++-------------------
 pym/portage/eclass_cache.py            |   17 +--------
 pym/portage/package/ebuild/config.py   |   25 +++++++------
 pym/portage/package/ebuild/doebuild.py |    7 +++-
 pym/portage/util/__init__.py           |   23 ++++++++++--
 18 files changed, 210 insertions(+), 123 deletions(-)



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2011-03-19 19:39 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2011-03-19 19:39 UTC (permalink / raw
  To: gentoo-commits

commit:     40319971cb692ac8e197031f2e133341a6192c0e
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sat Mar 19 19:38:45 2011 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sat Mar 19 19:38:45 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=40319971

Merge commit 'v2.2.0_alpha28' into multilib


 bin/ebuild-ipc.py                      |   55 ++++++++++++++++++++++++-------
 cnf/make.conf                          |    2 +-
 man/make.conf.5                        |    4 +-
 pym/_emerge/AbstractPollTask.py        |    3 ++
 pym/_emerge/AsynchronousLock.py        |   12 +++++++
 pym/_emerge/AsynchronousTask.py        |   15 +++++++--
 pym/_emerge/Binpkg.py                  |    9 ++---
 pym/_emerge/CompositeTask.py           |   48 +++++++++++++++++++++++++---
 pym/_emerge/EbuildBuild.py             |    5 +--
 pym/_emerge/EbuildExecuter.py          |    4 +-
 pym/_emerge/EbuildIpcDaemon.py         |   29 ++++++++++++++---
 pym/_emerge/FakeVartree.py             |    4 +-
 pym/_emerge/FifoIpcDaemon.py           |    6 +--
 pym/_emerge/PackageVirtualDbapi.py     |    6 ++--
 pym/_emerge/PipeReader.py              |    6 +--
 pym/_emerge/Scheduler.py               |   20 +++++++++---
 pym/_emerge/SubProcess.py              |    8 +----
 pym/_emerge/TaskSequence.py            |    5 +--
 pym/_emerge/resolver/slot_collision.py |    4 +-
 pym/portage/dbapi/vartree.py           |    8 -----
 pym/portage/dep/dep_check.py           |    9 +++--
 21 files changed, 181 insertions(+), 81 deletions(-)



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2011-03-28 17:24 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2011-03-28 17:24 UTC (permalink / raw
  To: gentoo-commits

commit:     9de771380d94ef3c292d4f38f46728f35bdf8937
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Mon Mar 28 17:23:36 2011 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Mon Mar 28 17:23:36 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=9de77138

Merge v2.2.0_alpha29


 bin/ebuild.sh                                      |   20 +-
 bin/emerge-webrsync                                |    6 +-
 bin/portageq                                       |   26 ++-
 man/emerge.1                                       |    2 +-
 pym/_emerge/AbstractEbuildProcess.py               |    6 +-
 pym/_emerge/AsynchronousTask.py                    |    4 +-
 pym/_emerge/Binpkg.py                              |   20 +-
 pym/_emerge/BlockerDB.py                           |   17 +-
 pym/_emerge/EbuildBuild.py                         |   13 +-
 pym/_emerge/EbuildMerge.py                         |   49 ++--
 pym/_emerge/EbuildPhase.py                         |   31 ++-
 pym/_emerge/FakeVartree.py                         |   18 +-
 pym/_emerge/MergeListItem.py                       |   36 +--
 pym/_emerge/MiscFunctionsProcess.py                |    5 +-
 pym/_emerge/PackageMerge.py                        |   17 +-
 pym/_emerge/PollScheduler.py                       |   49 ++-
 pym/_emerge/Scheduler.py                           |   27 +--
 pym/_emerge/TaskSequence.py                        |    1 +
 pym/_emerge/actions.py                             |   10 +-
 pym/_emerge/depgraph.py                            |    8 +-
 pym/_emerge/help.py                                |    4 +-
 pym/_emerge/main.py                                |   36 ++-
 pym/portage/dbapi/_MergeProcess.py                 |  191 +++++++++++-
 pym/portage/dbapi/vartree.py                       |  313 ++++++++-----------
 pym/portage/exception.py                           |   17 +-
 .../package/ebuild/_config/special_env_vars.py     |   12 +-
 pym/portage/util/env_update.py                     |   20 +-
 27 files changed, 572 insertions(+), 386 deletions(-)



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2011-04-16 10:17 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2011-04-16 10:17 UTC (permalink / raw
  To: gentoo-commits

commit:     41616039243b89884444fd837b43860bad4c529f
Author:     Arfrever Frehtes Taifersar Arahesis <Arfrever <AT> Gentoo <DOT> Org>
AuthorDate: Sun Apr  3 17:30:33 2011 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun Apr  3 17:30:33 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=41616039

Merge branch 'master' of git+ssh://git.overlays.gentoo.org/proj/portage


 bin/repoman |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2011-04-16 10:17 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2011-04-16 10:17 UTC (permalink / raw
  To: gentoo-commits

commit:     23d94a7d58046368d0a1a3f1abb375b0a700e509
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sat Apr 16 10:16:58 2011 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sat Apr 16 10:16:58 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=23d94a7d

Merge commit 'v2.2.0_alpha30' into multilib


 bin/ebuild-helpers/doins                           |    9 +++-
 bin/repoman                                        |   53 +++++++++++---------
 cnf/make.globals                                   |    5 ++-
 man/make.conf.5                                    |   10 +++-
 pym/_emerge/Scheduler.py                           |   10 +++-
 pym/_emerge/main.py                                |    8 ++-
 pym/_emerge/resolver/output.py                     |    4 +-
 pym/portage/const.py                               |    6 +-
 pym/portage/dbapi/porttree.py                      |    3 +
 pym/portage/dep/__init__.py                        |    8 ++-
 .../package/ebuild/_config/special_env_vars.py     |    3 +-
 pym/portage/package/ebuild/doebuild.py             |    2 +-
 pym/portage/package/ebuild/fetch.py                |   12 ++--
 pym/portage/tests/dep/testExtractAffectingUSE.py   |    5 ++-
 14 files changed, 90 insertions(+), 48 deletions(-)



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2011-05-07 18:38 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2011-05-07 18:38 UTC (permalink / raw
  To: gentoo-commits

commit:     531d14c05c3105b7e90023b4b73cc43c24a70b66
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sat May  7 18:37:39 2011 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sat May  7 18:37:39 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=531d14c0

Merge commit 'v2.2.0_alpha31' into multilib


 bin/ebuild                                       |    6 +-
 bin/ebuild-helpers/doins                         |    5 +-
 bin/ebuild.sh                                    |   49 ++-
 bin/isolated-functions.sh                        |    4 +-
 bin/misc-functions.sh                            |   86 ++--
 bin/repoman                                      |   49 +--
 man/emerge.1                                     |   43 ++-
 man/portage.5                                    |   20 +-
 man/repoman.1                                    |   12 +-
 pym/_emerge/DepPriority.py                       |   10 +-
 pym/_emerge/DepPriorityNormalRange.py            |    4 +-
 pym/_emerge/DepPrioritySatisfiedRange.py         |    3 +-
 pym/_emerge/Dependency.py                        |    9 +-
 pym/_emerge/EbuildPhase.py                       |    7 +-
 pym/_emerge/Package.py                           |    3 +-
 pym/_emerge/RootConfig.py                        |   10 +-
 pym/_emerge/Scheduler.py                         |   65 ---
 pym/_emerge/UnmergeDepPriority.py                |    6 +-
 pym/_emerge/actions.py                           |  145 ++++--
 pym/_emerge/create_depgraph_params.py            |    7 +-
 pym/_emerge/depgraph.py                          |  609 ++++++++++++++++++----
 pym/_emerge/emergelog.py                         |   10 +-
 pym/_emerge/help.py                              |   69 +++-
 pym/_emerge/main.py                              |  162 +++++-
 pym/_emerge/resolver/backtracking.py             |   15 +-
 pym/portage/dbapi/bintree.py                     |    8 +-
 pym/portage/dbapi/cpv_expand.py                  |   26 +-
 pym/portage/manifest.py                          |    4 +-
 pym/portage/package/ebuild/doebuild.py           |   37 +-
 pym/portage/tests/resolver/ResolverPlayground.py |    4 +-
 pym/portage/tests/resolver/test_autounmask.py    |   33 ++-
 pym/portage/tests/resolver/test_rebuild.py       |  138 +++++
 pym/repoman/checks.py                            |    5 +
 runtests.sh                                      |    4 +-
 34 files changed, 1275 insertions(+), 392 deletions(-)



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2011-05-14  9:59 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2011-05-14  9:59 UTC (permalink / raw
  To: gentoo-commits

commit:     4e63915f19eefb5a1c8dc109d0e49619aba7ad79
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sat May 14 09:58:36 2011 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sat May 14 09:58:36 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=4e63915f

Merge commit 'v2.2.0_alpha33' into multilib


 bin/ebuild.sh                                      |    2 +-
 cnf/make.globals                                   |    2 +-
 man/emerge.1                                       |    2 +
 man/make.conf.5                                    |   11 +-
 pym/_emerge/EbuildPhase.py                         |   20 +-
 pym/_emerge/FakeVartree.py                         |   17 +-
 pym/_emerge/Scheduler.py                           |   45 ++-
 pym/_emerge/actions.py                             |   75 +---
 pym/_emerge/depgraph.py                            |   85 ++---
 pym/_emerge/help.py                                |    5 +-
 pym/_emerge/main.py                                |    1 -
 pym/_emerge/unmerge.py                             |   20 +-
 pym/portage/cache/sqlite.py                        |    7 +-
 pym/portage/cache/volatile.py                      |    3 +-
 pym/portage/const.py                               |    7 +-
 pym/portage/dbapi/_MergeProcess.py                 |   36 ++-
 pym/portage/dbapi/_expand_new_virt.py              |   72 +++
 pym/portage/dbapi/cpv_expand.py                    |   13 +-
 pym/portage/dbapi/porttree.py                      |   38 +-
 pym/portage/dbapi/vartree.py                       |  498 +++++++++++---------
 pym/portage/dep/dep_check.py                       |   15 +-
 pym/portage/package/ebuild/config.py               |    6 +-
 pym/portage/package/ebuild/doebuild.py             |   15 +-
 pym/portage/util/_dyn_libs/LinkageMapELF.py        |   65 ++-
 .../util/_dyn_libs/PreservedLibsRegistry.py        |   69 ++-
 25 files changed, 692 insertions(+), 437 deletions(-)



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2011-05-22  9:42 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2011-05-22  9:42 UTC (permalink / raw
  To: gentoo-commits

commit:     1d305fca5d8176643852103f9fe12e587558c322
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sun May 22 09:41:33 2011 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun May 22 09:41:33 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=1d305fca

Merge commit 'v2.2.0_alpha34' into multilib


 bin/etc-update                                     |    6 +-
 bin/glsa-check                                     |    4 +-
 cnf/make.conf.sparc.diff                           |    2 +-
 doc/package/ebuild/eapi/4.docbook                  |    4 +-
 make.conf.txt                                      |  719 --------------------
 man/ebuild.5                                       |    4 +-
 man/emerge.1                                       |   18 +-
 man/make.conf.5                                    |    2 +-
 pym/_emerge/AsynchronousLock.py                    |   45 ++-
 pym/_emerge/AsynchronousTask.py                    |    5 +-
 pym/_emerge/Binpkg.py                              |    3 +-
 pym/_emerge/BinpkgFetcher.py                       |    7 +-
 pym/_emerge/EbuildBuild.py                         |    3 +-
 pym/_emerge/EbuildBuildDir.py                      |   29 +-
 pym/_emerge/EbuildMerge.py                         |   20 +-
 pym/_emerge/EbuildPhase.py                         |   32 +-
 pym/_emerge/actions.py                             |    3 +-
 pym/_emerge/depgraph.py                            |  479 +++++++++++---
 pym/_emerge/help.py                                |   21 +-
 pym/_emerge/main.py                                |   17 +-
 pym/_emerge/resolver/backtracking.py               |    7 +-
 pym/_emerge/resolver/output_helpers.py             |    4 +-
 pym/_emerge/unmerge.py                             |   10 +-
 pym/portage/cvstree.py                             |    6 +-
 pym/portage/dbapi/vartree.py                       |  247 +++++--
 pym/portage/mail.py                                |   11 +-
 pym/portage/output.py                              |    4 +-
 pym/portage/package/ebuild/getmaskingstatus.py     |    7 +-
 pym/portage/tests/ebuild/test_config.py            |    4 +-
 pym/portage/tests/locks/test_asynchronous_lock.py  |   95 +++-
 pym/portage/tests/resolver/ResolverPlayground.py   |   18 +-
 pym/portage/tests/resolver/test_autounmask.py      |   51 ++-
 .../tests/resolver/test_circular_dependencies.py   |    3 +-
 pym/portage/tests/resolver/test_multirepo.py       |    3 +
 .../tests/resolver/test_old_dep_chain_display.py   |    2 +
 pym/portage/tests/resolver/test_simple.py          |    2 +-
 pym/portage/tests/resolver/test_slot_collisions.py |    3 +-
 pym/portage/update.py                              |    4 +-
 pym/portage/util/_dyn_libs/LinkageMapELF.py        |   13 +-
 pym/portage/util/digraph.py                        |   10 +-
 pym/portage/util/movefile.py                       |    5 +-
 pym/portage/xml/metadata.py                        |    4 +-
 42 files changed, 962 insertions(+), 974 deletions(-)



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2011-05-26 17:55 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2011-05-26 17:55 UTC (permalink / raw
  To: gentoo-commits

commit:     1a3d8d5a2faefc40233fcaffbbc82e6f5967f7c6
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Thu May 26 17:55:15 2011 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Thu May 26 17:55:15 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=1a3d8d5a

Merge commit 'v2.2.0_alpha36' into multilib


 bin/ebuild.sh                                     |    7 +
 bin/regenworld                                    |    6 +-
 bin/repoman                                       |    2 +-
 man/make.conf.5                                   |    3 +
 pym/_emerge/Blocker.py                            |   12 +-
 pym/_emerge/DepPriority.py                        |    2 +-
 pym/_emerge/DepPrioritySatisfiedRange.py          |   31 +--
 pym/_emerge/EbuildMerge.py                        |    3 +-
 pym/_emerge/EbuildPhase.py                        |    2 +-
 pym/_emerge/FakeVartree.py                        |   13 +-
 pym/_emerge/Package.py                            |   59 +++-
 pym/_emerge/PackageUninstall.py                   |  102 +++++-
 pym/_emerge/Scheduler.py                          |   24 +-
 pym/_emerge/Task.py                               |   31 +-
 pym/_emerge/actions.py                            |   30 ++-
 pym/_emerge/depgraph.py                           |  129 +++++---
 pym/_emerge/unmerge.py                            |   64 +++-
 pym/portage/const.py                              |    2 +-
 pym/portage/dbapi/_MergeProcess.py                |   34 ++-
 pym/portage/dbapi/vartree.py                      |   84 +++--
 pym/portage/package/ebuild/doebuild.py            |  121 ++++---
 pym/portage/tests/locks/test_asynchronous_lock.py |    6 +-
 pym/portage/tests/resolver/ResolverPlayground.py  |   81 +++++-
 pym/portage/tests/resolver/test_depth.py          |    8 +-
 pym/portage/tests/resolver/test_merge_order.py    |  386 +++++++++++++++++++++
 pym/portage/util/__init__.py                      |   29 +-
 26 files changed, 968 insertions(+), 303 deletions(-)

diff --cc bin/ebuild.sh
index ec575b9,37a3084..0f95faa
--- a/bin/ebuild.sh
+++ b/bin/ebuild.sh
@@@ -1144,17 -1071,17 +1144,24 @@@ dyn_compile() 
  
  	trap abort_compile SIGINT SIGQUIT
  
+ 	if hasq distcc $FEATURES && hasq distcc-pump $FEATURES ; then
+ 		if [[ -z $INCLUDE_SERVER_PORT ]] || [[ ! -w $INCLUDE_SERVER_PORT ]] ; then
+ 			eval $(/usr/bin/pump --startup)
+ 			trap "/usr/bin/pump --shutdown" EXIT
+ 		fi
+ 	fi
+ 
  	ebuild_phase pre_src_compile
  
 -	vecho ">>> Compiling source in $PWD ..."
 +	vecho ">>> Compiling source in ${PWD}$(_get_abi_string) ..."
  	ebuild_phase src_compile
 +
 +		if is_auto-multilib && is_ebuild; then
 +			>> "$PORTAGE_BUILDDIR"/.compiled."${LOOP_ABI}" || die "IO Failure -- Failed to 'touch .compiled.${LOOP_ABI}'"
 +		fi
 +		is_ebuild && { unset_abi; source "${T}"/environment || die ; }
 +	done
 +	is_ebuild && { rm "${T}"/environment || die ; }
  	>> "$PORTAGE_BUILDDIR/.compiled" || \
  		die "Failed to create $PORTAGE_BUILDDIR/.compiled"
  	vecho ">>> Source compiled."



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2011-05-28 13:14 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2011-05-28 13:14 UTC (permalink / raw
  To: gentoo-commits

commit:     48cf4874fb23281bc3679a6b5247167b51e86c1c
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sat May 28 13:13:14 2011 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sat May 28 13:13:14 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=48cf4874

Merge commit 'v2.2.0_alpha37' into multilib


 bin/etc-update                     |    2 +-
 man/emerge.1                       |    2 +-
 pym/_emerge/AsynchronousLock.py    |   10 ++--
 pym/_emerge/BlockerDB.py           |    9 ++-
 pym/_emerge/FakeVartree.py         |   12 ++++-
 pym/_emerge/depgraph.py            |   31 +++++++----
 pym/_emerge/unmerge.py             |    2 +-
 pym/portage/dbapi/_MergeProcess.py |    9 +++
 pym/portage/dbapi/vartree.py       |  105 +++++++++++++++++++-----------------
 9 files changed, 107 insertions(+), 75 deletions(-)



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2011-06-07 15:44 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2011-06-07 15:44 UTC (permalink / raw
  To: gentoo-commits

commit:     aea59c668e3c30f8b9769dec16482919514150eb
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Tue Jun  7 15:44:09 2011 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Tue Jun  7 15:44:09 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=aea59c66

Merge commit 'v2.2.0_alpha38' into multilib


 NEWS                                               |   11 +++
 RELEASE-NOTES                                      |    9 ++
 bin/ebuild                                         |    1 -
 bin/etc-update                                     |    7 +-
 bin/portageq                                       |   57 ++++++++++++--
 cnf/etc-update.conf                                |    4 +
 man/ebuild.5                                       |    6 ++
 man/emerge.1                                       |    6 +-
 pym/_emerge/Binpkg.py                              |   22 ++----
 pym/_emerge/MergeListItem.py                       |    2 +-
 pym/_emerge/Package.py                             |    3 +-
 pym/_emerge/PackageArg.py                          |    5 +-
 pym/_emerge/Scheduler.py                           |   75 +-----------------
 pym/_emerge/actions.py                             |    7 +-
 pym/_emerge/create_world_atom.py                   |   12 ++-
 pym/_emerge/depgraph.py                            |   72 +++++++++++++++---
 pym/_emerge/emergelog.py                           |    5 +-
 pym/_emerge/help.py                                |    6 +-
 pym/_emerge/main.py                                |   28 ++++---
 pym/_emerge/resolver/circular_dependency.py        |    4 +-
 pym/portage/__init__.py                            |   35 +++++++-
 pym/portage/_sets/base.py                          |   10 ++-
 pym/portage/_sets/files.py                         |    6 +-
 pym/portage/dbapi/_MergeProcess.py                 |    9 ++-
 pym/portage/dbapi/__init__.py                      |   20 +++---
 pym/portage/dbapi/bintree.py                       |    9 ++-
 pym/portage/dbapi/dep_expand.py                    |   25 ++++--
 pym/portage/dbapi/porttree.py                      |   63 +++++++++-------
 pym/portage/dbapi/vartree.py                       |   81 +++++++++-----------
 pym/portage/dep/dep_check.py                       |   11 ++-
 pym/portage/getbinpkg.py                           |    2 +-
 .../package/ebuild/_config/KeywordsManager.py      |    3 +-
 pym/portage/package/ebuild/_config/MaskManager.py  |    3 +-
 pym/portage/package/ebuild/_config/helper.py       |    5 +-
 pym/portage/package/ebuild/config.py               |   10 ++-
 pym/portage/package/ebuild/doebuild.py             |    4 +-
 pym/portage/package/ebuild/getmaskingreason.py     |   42 ++++++++---
 pym/portage/package/ebuild/getmaskingstatus.py     |    7 +-
 pym/portage/repository/config.py                   |   30 +++++---
 pym/portage/tests/resolver/test_merge_order.py     |   36 +++++++++-
 pym/portage/tests/util/test_digraph.py             |   12 ++--
 pym/portage/util/__init__.py                       |   11 ++-
 pym/portage/util/mtimedb.py                        |    8 ++-
 pym/repoman/checks.py                              |    5 +-
 44 files changed, 495 insertions(+), 294 deletions(-)

diff --cc pym/portage/__init__.py
index 2436a8e,515a9a7..4f71f4e
--- a/pym/portage/__init__.py
+++ b/pym/portage/__init__.py
@@@ -1,8 -1,8 +1,8 @@@
  # portage.py -- core Portage functionality
- # Copyright 1998-2010 Gentoo Foundation
+ # Copyright 1998-2011 Gentoo Foundation
  # Distributed under the terms of the GNU General Public License v2
  
 -VERSION="HEAD"
 +VERSION="2.2_rc67-r8"
  
  # ===========================================================================
  # START OF IMPORTS -- START OF IMPORTS -- START OF IMPORTS -- START OF IMPORT



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2011-06-16 16:54 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2011-06-16 16:54 UTC (permalink / raw
  To: gentoo-commits

commit:     b286d42bd10fc263092bbe675a318e2ec29faa29
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Thu Jun 16 16:53:49 2011 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Thu Jun 16 16:53:49 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=b286d42b

Merge commit 'v2.2.0_alpha41' into multilib


 bin/ebuild.sh                                    |   14 ++-
 man/portage.5                                    |   51 +++++++-
 pym/_emerge/AbstractEbuildProcess.py             |   26 +++-
 pym/_emerge/BinpkgFetcher.py                     |    2 +-
 pym/_emerge/EbuildFetcher.py                     |    6 +-
 pym/_emerge/EbuildMetadataPhase.py               |    4 +-
 pym/_emerge/Scheduler.py                         |    7 +-
 pym/_emerge/SubProcess.py                        |   20 ++--
 pym/_emerge/depgraph.py                          |  146 +++++++++++++++-------
 pym/_emerge/resolver/circular_dependency.py      |    3 +-
 pym/_emerge/resolver/slot_collision.py           |   30 +++--
 pym/_emerge/unmerge.py                           |   12 ++-
 pym/portage/__init__.py                          |    2 +-
 pym/portage/dbapi/bintree.py                     |   28 +++--
 pym/portage/dbapi/virtual.py                     |    6 +-
 pym/portage/dep/__init__.py                      |   50 +++++---
 pym/portage/locks.py                             |    9 +-
 pym/portage/package/ebuild/config.py             |    2 +-
 pym/portage/package/ebuild/digestgen.py          |   22 +++-
 pym/portage/package/ebuild/getmaskingreason.py   |   13 ++-
 pym/portage/package/ebuild/getmaskingstatus.py   |   38 ++----
 pym/portage/{package => tests/dbapi}/__init__.py |    2 +-
 pym/portage/tests/{bin => dbapi}/__test__        |    0
 pym/portage/tests/dbapi/test_fakedbapi.py        |   58 +++++++++
 pym/portage/tests/dep/testExtractAffectingUSE.py |    4 +-
 pym/portage/tests/dep/test_use_reduce.py         |   12 +-
 pym/portage/tests/ebuild/test_spawn.py           |    2 +-
 pym/portage/tests/locks/test_lock_nonblock.py    |   46 +++++++
 pym/portage/tests/resolver/test_merge_order.py   |   33 +++++
 pym/portage/util/__init__.py                     |    4 +-
 30 files changed, 472 insertions(+), 180 deletions(-)



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2011-07-05 17:34 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2011-07-05 17:34 UTC (permalink / raw
  To: gentoo-commits

commit:     725033094da621d2b319f8666b2af7f3b7cb3465
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Tue Jul  5 17:33:39 2011 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Tue Jul  5 17:33:39 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=72503309

Merge commit 'v2.2.0_alpha43' into multilib


 RELEASE-NOTES                                      |    2 +-
 bin/ebuild                                         |   23 +++-
 bin/ebuild-helpers/ecompress                       |    6 +-
 bin/emaint                                         |   45 +++++-
 bin/misc-functions.sh                              |   11 ++
 bin/portageq                                       |   13 +-
 bin/repoman                                        |   37 ++++-
 cnf/make.globals                                   |    2 +-
 man/ebuild.5                                       |    5 +-
 man/env-update.1                                   |    3 +-
 man/make.conf.5                                    |    9 +-
 man/portage.5                                      |    7 +
 man/repoman.1                                      |    4 +
 pym/_emerge/EbuildPhase.py                         |   10 ++
 pym/_emerge/Package.py                             |   33 ++++-
 pym/_emerge/UseFlagDisplay.py                      |    8 +-
 pym/_emerge/depgraph.py                            |   21 ++-
 pym/_emerge/resolver/circular_dependency.py        |   24 ++-
 pym/_emerge/resolver/output.py                     |   13 +-
 pym/portage/checksum.py                            |   15 ++-
 pym/portage/const.py                               |    2 +-
 pym/portage/dbapi/vartree.py                       |   30 ++--
 pym/portage/dep/__init__.py                        |    4 +-
 pym/portage/package/ebuild/_config/UseManager.py   |  170 +++++++++++++-------
 .../package/ebuild/_config/special_env_vars.py     |    6 +
 pym/portage/package/ebuild/config.py               |   57 +++++++-
 pym/portage/package/ebuild/doebuild.py             |  141 ++++++++++++++++-
 pym/portage/package/ebuild/prepare_build_dirs.py   |   14 ++-
 pym/portage/repository/config.py                   |    3 +
 pym/portage/tests/util/test_varExpand.py           |   35 ++++-
 pym/portage/util/__init__.py                       |   51 +++----
 pym/portage/util/_dyn_libs/LinkageMapELF.py        |   30 +++-
 pym/portage/util/env_update.py                     |   14 +-
 33 files changed, 667 insertions(+), 181 deletions(-)



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2011-07-15 13:24 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2011-07-15 13:24 UTC (permalink / raw
  To: gentoo-commits

commit:     da552fc0c4f609e87df0fefb4d3e953b814d0a43
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Fri Jul 15 13:23:43 2011 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Fri Jul 15 13:23:43 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=da552fc0

Merge v2.2.0_alpha45


 bin/binhost-snapshot                               |    6 +-
 bin/ebuild-helpers/doman                           |    8 +-
 bin/ebuild-helpers/prepall                         |    6 +-
 bin/ebuild-helpers/prepallman                      |    4 +-
 bin/ebuild-helpers/prepinfo                        |    4 +-
 bin/ebuild-helpers/prepman                         |    4 +-
 bin/ebuild-helpers/prepstrip                       |   24 ++--
 bin/ebuild.sh                                      |  131 ++++++++++----------
 bin/egencache                                      |   41 ++++---
 bin/emerge-webrsync                                |    4 +-
 bin/filter-bash-environment.py                     |   12 +-
 bin/isolated-functions.sh                          |   22 +++-
 bin/misc-functions.sh                              |   22 ++--
 bin/repoman                                        |   15 +--
 cnf/logrotate.d/elog-save-summary                  |    3 +-
 man/ebuild.5                                       |    8 +-
 man/make.conf.5                                    |    6 +-
 pym/_emerge/AbstractEbuildProcess.py               |   10 +-
 pym/_emerge/Binpkg.py                              |   15 ++-
 pym/_emerge/BinpkgVerifier.py                      |    8 +-
 pym/_emerge/EbuildFetcher.py                       |   21 ++--
 pym/_emerge/EbuildMetadataPhase.py                 |    4 +-
 pym/_emerge/EbuildPhase.py                         |   38 +++---
 pym/_emerge/JobStatusDisplay.py                    |    8 +-
 pym/_emerge/Scheduler.py                           |    1 -
 pym/_emerge/UseFlagDisplay.py                      |    7 +-
 pym/_emerge/actions.py                             |   26 +++--
 pym/_emerge/depgraph.py                            |  103 ++++++++++------
 pym/_emerge/emergelog.py                           |   18 ++--
 pym/_emerge/is_valid_package_atom.py               |   18 ++-
 pym/_emerge/main.py                                |    8 +-
 pym/_emerge/resolver/circular_dependency.py        |   48 ++++----
 pym/_emerge/resolver/output_helpers.py             |    4 +-
 pym/_emerge/resolver/slot_collision.py             |   44 ++++++-
 pym/portage/__init__.py                            |   37 +-----
 pym/portage/_ensure_encodings.py                   |  132 --------------------
 pym/portage/cache/flat_hash.py                     |   19 ++-
 pym/portage/cache/flat_list.py                     |   18 ++-
 pym/portage/checksum.py                            |    9 +-
 pym/portage/const.py                               |    1 +
 pym/portage/cvstree.py                             |    6 +-
 pym/portage/dbapi/_MergeProcess.py                 |    6 +-
 pym/portage/dbapi/bintree.py                       |    5 +-
 pym/portage/dbapi/cpv_expand.py                    |    6 +-
 pym/portage/dbapi/porttree.py                      |    5 +-
 pym/portage/dbapi/vartree.py                       |   39 +++---
 pym/portage/dispatch_conf.py                       |    6 +-
 pym/portage/elog/messages.py                       |    7 +-
 pym/portage/elog/mod_save.py                       |   38 ++++---
 pym/portage/elog/mod_save_summary.py               |   48 +++++--
 pym/portage/env/loaders.py                         |    6 +-
 pym/portage/glsa.py                                |    8 +-
 pym/portage/manifest.py                            |   11 +-
 pym/portage/news.py                                |    6 +-
 pym/portage/output.py                              |   10 +-
 .../package/ebuild/_config/LocationsManager.py     |    6 +-
 .../package/ebuild/_config/special_env_vars.py     |    3 +-
 pym/portage/package/ebuild/_ipc/QueryCommand.py    |   11 +-
 .../package/ebuild/deprecated_profile_check.py     |    6 +-
 pym/portage/package/ebuild/digestcheck.py          |   18 ++-
 pym/portage/package/ebuild/doebuild.py             |   46 +++++---
 pym/portage/package/ebuild/fetch.py                |   10 +-
 pym/portage/package/ebuild/prepare_build_dirs.py   |   55 +++++++--
 pym/portage/repository/config.py                   |   10 +-
 pym/portage/tests/ebuild/test_spawn.py             |    6 +-
 .../test_lazy_import_portage_baseline.py           |    2 +-
 pym/portage/tests/resolver/test_slot_collisions.py |   18 +++
 pym/portage/update.py                              |   12 +-
 pym/portage/util/ExtractKernelVersion.py           |    6 +-
 pym/portage/util/__init__.py                       |   39 +++++--
 pym/portage/util/env_update.py                     |    4 +-
 pym/repoman/checks.py                              |   34 ++++--
 pym/repoman/errors.py                              |    2 +
 pym/repoman/utilities.py                           |    6 +-
 74 files changed, 753 insertions(+), 665 deletions(-)

diff --cc bin/ebuild.sh
index 18c88d5,2ef40cb..b5b6a79
--- a/bin/ebuild.sh
+++ b/bin/ebuild.sh
@@@ -162,14 -162,12 +163,14 @@@ use() 
  
  	# Make sure we have this USE flag in IUSE
  	elif [[ -n $PORTAGE_IUSE && -n $EBUILD_PHASE ]] ; then
 -		[[ $u =~ $PORTAGE_IUSE ]] || \
 -			eqawarn "QA Notice: USE Flag '${u}' not" \
 -				"in IUSE for ${CATEGORY}/${PF}"
 +		if [[ $u != multilib ]]; then
 +			[[ $u =~ $PORTAGE_IUSE ]] || \
 +				eqawarn "QA Notice: USE Flag '${u}' not" \
 +					"in IUSE for ${CATEGORY}/${PF}"
 +		fi
  	fi
  
- 	if hasq ${u} ${USE} ; then
+ 	if has ${u} ${USE} ; then
  		return ${found}
  	else
  		return $((!found))
@@@ -766,13 -742,12 +767,13 @@@ dyn_unpack() 
  	fi
  	if [ "${newstuff}" == "yes" ]; then
  		# We don't necessarily have privileges to do a full dyn_clean here.
 -		rm -rf "${PORTAGE_BUILDDIR}"/{.setuped,.unpacked,.prepared,.configured,.compiled,.tested,.installed,.packaged,build-info}
 +		rm -rf "${PORTAGE_BUILDDIR}"/{.setuped*,.unpacked*,.prepared*,.configured*,.compiled*,.tested*,.installed*,.packaged*,build-info}
- 		if ! hasq keepwork $FEATURES ; then
+ 		if ! has keepwork $FEATURES ; then
  			rm -rf "${WORKDIR}"
  		fi
 +		rm -rf "${D}".*
  		if [ -d "${T}" ] && \
- 			! hasq keeptemp $FEATURES ; then
+ 			! has keeptemp $FEATURES ; then
  			rm -rf "${T}" && mkdir "${T}"
  		fi
  	fi
@@@ -816,18 -783,18 +817,18 @@@ dyn_clean() 
  		chflags -R nosunlnk,nouunlnk "${PORTAGE_BUILDDIR}" 2>/dev/null
  	fi
  
 -	rm -rf "${PORTAGE_BUILDDIR}/image" "${PORTAGE_BUILDDIR}/homedir"
 -	rm -f "${PORTAGE_BUILDDIR}/.installed"
 +	rm -rf "${PORTAGE_BUILDDIR}"/image* "${PORTAGE_BUILDDIR}/homedir"
 +	rm -f "${PORTAGE_BUILDDIR}"/.installed*
  
  	if [[ $EMERGE_FROM = binary ]] || \
- 		! hasq keeptemp $FEATURES && ! hasq keepwork $FEATURES ; then
+ 		! has keeptemp $FEATURES && ! has keepwork $FEATURES ; then
  		rm -rf "${T}"
  	fi
  
- 	if [[ $EMERGE_FROM = binary ]] || ! hasq keepwork $FEATURES; then
+ 	if [[ $EMERGE_FROM = binary ]] || ! has keepwork $FEATURES; then
 -		rm -f "$PORTAGE_BUILDDIR"/.{ebuild_changed,logid,pretended,setuped,unpacked,prepared} \
 -			"$PORTAGE_BUILDDIR"/.{configured,compiled,tested,packaged} \
 -			"$PORTAGE_BUILDDIR"/.die_hooks \
 +		rm -f "$PORTAGE_BUILDDIR"/.{ebuild_changed,logid,pretended*,setuped*,unpacked*,prepared*} \
 +			"$PORTAGE_BUILDDIR"/.{configured*,compiled*,tested*,packaged*} \
 +			"$PORTAGE_BUILDDIR"/.{die_hooks,abi} \
  			"$PORTAGE_BUILDDIR"/.ipc_{in,out,lock} \
  			"$PORTAGE_BUILDDIR"/.exit_status
  
@@@ -1029,17 -996,9 +1030,17 @@@ dyn_prepare() 
  		return 0
  	fi
  
 +	for LOOP_ABI in $(get_abi_list); do
 +		is_ebuild && { set_abi ${LOOP_ABI}; source "${T}"/environment || die ; }
 +
 +	if [ "${PORTAGE_BUILDDIR}"/.prepared.${LOOP_ABI} -nt "${WORKDIR}" ]; then
 +		echo ">>> It appears that ${PN} is already prepared for ABI=${LOOP_ABI}; skipping."
 +		echo ">>> Remove '$PORTAGE_BUILDDIR/.prepared.${LOOP_ABI}' to force prepare."
 +		continue
 +	fi
  	if [[ -d $S ]] ; then
  		cd "${S}"
- 	elif hasq $EAPI 0 1 2 3 3_pre2 ; then
+ 	elif has $EAPI 0 1 2 3 3_pre2 ; then
  		cd "${WORKDIR}"
  	elif [[ -z ${A} ]] && ! has_phase_defined_up_to prepare; then
  		cd "${WORKDIR}"
@@@ -1076,17 -1027,9 +1077,17 @@@ dyn_configure() 
  		return 0
  	fi
  
 +	for LOOP_ABI in $(get_abi_list); do
 +		is_ebuild && { set_abi ${LOOP_ABI}; source "${T}"/environment || die ; }
 +
 +	if [ ${PORTAGE_BUILDDIR}/.configured.${LOOP_ABI} -nt "${WORKDIR}" ]; then
 +			echo ">>> It appears that ${PN} is already configured for ABI=${LOOP_ABI}; skipping."
 +			echo ">>> Remove '$PORTAGE_BUILDDIR/.configured.${LOOP_ABI}' to force configuration."
 +			continue
 +	fi
  	if [[ -d $S ]] ; then
  		cd "${S}"
- 	elif hasq $EAPI 0 1 2 3 3_pre2 ; then
+ 	elif has $EAPI 0 1 2 3 3_pre2 ; then
  		cd "${WORKDIR}"
  	elif [[ -z ${A} ]] && ! has_phase_defined_up_to configure; then
  		cd "${WORKDIR}"
@@@ -1124,17 -1060,9 +1125,17 @@@ dyn_compile() 
  		return 0
  	fi
  
 +	for LOOP_ABI in $(get_abi_list); do
 +		is_ebuild && { set_abi ${LOOP_ABI}; source "${T}"/environment || die ; }
 +
 +	if [ ${PORTAGE_BUILDDIR}/.compiled.${LOOP_ABI} -nt "${WORKDIR}" ]; then
 +		echo ">>> It appears that ${PN} is already compiled for ABI=${LOOP_ABI}; skipping."
 +		echo ">>> Remove '$PORTAGE_BUILDDIR/.compiled.${LOOP_ABI}' to force compilation."
 +		continue
 +	fi
  	if [[ -d $S ]] ; then
  		cd "${S}"
- 	elif hasq $EAPI 0 1 2 3 3_pre2 ; then
+ 	elif has $EAPI 0 1 2 3 3_pre2 ; then
  		cd "${WORKDIR}"
  	elif [[ -z ${A} ]] && ! has_phase_defined_up_to compile; then
  		cd "${WORKDIR}"
@@@ -1240,14 -1144,10 +1241,14 @@@ dyn_install() 
  	trap "abort_install" SIGINT SIGQUIT
  	ebuild_phase pre_src_install
  	rm -rf "${PORTAGE_BUILDDIR}/image"
 +	is_auto-multilib && rm -rf "${PORTAGE_BUILDDIR}"/image.${ABI}
  	mkdir "${PORTAGE_BUILDDIR}/image"
 +	for LOOP_ABI in $(get_abi_list); do
 +		is_ebuild && { set_abi ${LOOP_ABI}; source "${T}"/environment || die ; }
 +
  	if [[ -d $S ]] ; then
  		cd "${S}"
- 	elif hasq $EAPI 0 1 2 3 3_pre2 ; then
+ 	elif has $EAPI 0 1 2 3 3_pre2 ; then
  		cd "${WORKDIR}"
  	elif [[ -z ${A} ]] && ! has_phase_defined_up_to install; then
  		cd "${WORKDIR}"
@@@ -1341,23 -1212,6 +1342,23 @@@
  	then
  		>> DEBUGBUILD
  	fi
 +
 +	else
 +		cd "${PORTAGE_BUILDDIR}"
- 		if [[ $EMERGE_FROM = binary ]] || ! hasq keepwork $FEATURES; then
++		if [[ $EMERGE_FROM = binary ]] || ! has keepwork $FEATURES; then
 +			rm -f "$PORTAGE_BUILDDIR"/.{ebuild_changed,exit_status,logid,unpacked,prepared} \
 +				"$PORTAGE_BUILDDIR"/.{configured,compiled,tested,packaged} \
 +				"$PORTAGE_BUILDDIR"/.die_hooks
 +
 +#			rm -rf "${PORTAGE_BUILDDIR}/build-info"
 +			rm -rf "${WORKDIR}"
 +		fi
 +
 +		if [ -f "${PORTAGE_BUILDDIR}/.unpacked" ]; then
 +			find "${PORTAGE_BUILDDIR}" -type d ! -regex "^${WORKDIR}" | sort -r | tr "\n" "\0" | $XARGS -0 rmdir &>/dev/null
 +		fi
 +	fi
 +
  	trap - SIGINT SIGQUIT
  }
  
@@@ -2009,9 -1857,6 +2010,9 @@@ filter_readonly_variables() 
  			${PORTAGE_MUTABLE_FILTERED_VARS}
  		"
  	fi
- 	if hasq --filter-metadata $* ; then
++	if has --filter-metadata $* ; then
 +		filtered_vars+=" ${PORTAGE_READONLY_METADATA} filter_opts"
 +	fi
  
  	"${PORTAGE_PYTHON:-/usr/bin/python}" "${PORTAGE_BIN_PATH}"/filter-bash-environment.py "${filtered_vars}" || die "filter-bash-environment.py failed"
  }
@@@ -2377,8 -2222,8 +2378,8 @@@ ebuild_main() 
  	nofetch)
  		ebuild_phase_with_hooks pkg_nofetch
  		;;
 -	prerm|postrm|postinst|config|info)
 +	config|info)
- 		if hasq "$EBUILD_SH_ARGS" config info && \
+ 		if has "$EBUILD_SH_ARGS" config info && \
  			! declare -F "pkg_$EBUILD_SH_ARGS" >/dev/null ; then
  			ewarn  "pkg_${EBUILD_SH_ARGS}() is not defined: '${EBUILD##*/}'"
  		fi



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2011-07-21 19:18 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2011-07-21 19:18 UTC (permalink / raw
  To: gentoo-commits

commit:     2a700978cad3adb6261821d5a95528de4d711b56
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Thu Jul 21 19:18:39 2011 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Thu Jul 21 19:18:39 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=2a700978

Merge commit 'v2.2.0_alpha46' into multilib


 bin/ebuild.sh                               |    3 +-
 bin/isolated-functions.sh                   |    3 +-
 bin/portageq                                |    3 +-
 man/emerge.1                                |    8 +--
 pym/_emerge/Binpkg.py                       |    7 ++-
 pym/_emerge/EbuildBuild.py                  |   32 +++++++-
 pym/_emerge/EbuildFetcher.py                |  123 +++++++++++++++++++++++---
 pym/_emerge/Scheduler.py                    |   49 +++++------
 pym/_emerge/actions.py                      |    8 +-
 pym/_emerge/depgraph.py                     |   11 ---
 pym/_emerge/help.py                         |    9 +--
 pym/_emerge/main.py                         |    3 +-
 pym/portage/dbapi/vartree.py                |    3 +-
 pym/portage/package/ebuild/doebuild.py      |    1 +
 pym/portage/util/_dyn_libs/LinkageMapELF.py |   58 +++++++++++--
 15 files changed, 234 insertions(+), 87 deletions(-)



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2011-07-28 17:07 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2011-07-28 17:07 UTC (permalink / raw
  To: gentoo-commits

commit:     6047c312b9e02bfb205783476ac3e61d5295a20b
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Thu Jul 28 17:07:19 2011 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Thu Jul 28 17:07:19 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=6047c312

Merge commit 'v2.2.0_alpha47' into multilib


 pym/_emerge/BinpkgFetcher.py                |    2 +
 pym/_emerge/SpawnProcess.py                 |   14 ++-
 pym/_emerge/actions.py                      |   10 ++-
 pym/_emerge/main.py                         |   10 ++-
 pym/portage/_sets/dbapi.py                  |   20 +--
 pym/portage/_sets/libs.py                   |   21 ++-
 pym/portage/dbapi/vartree.py                |   20 ++-
 pym/portage/util/_dyn_libs/LinkageMapELF.py |  176 +++++++++++++++++++--------
 8 files changed, 191 insertions(+), 82 deletions(-)



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2011-08-01 16:53 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2011-08-01 16:53 UTC (permalink / raw
  To: gentoo-commits

commit:     cf5851aab90ecfd4546083e65d13edc6d576923d
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Mon Aug  1 16:53:10 2011 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Mon Aug  1 16:53:10 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=cf5851aa

Merge commit 'v2.2.0_alpha49' into multilib


 NEWS                                 |    6 ++
 pym/_emerge/depgraph.py              |    8 ++-
 pym/_emerge/resolver/output.py       |    9 ++-
 pym/portage/dbapi/vartree.py         |  128 +++++++++++++++++++++++++++++++---
 pym/portage/package/ebuild/config.py |    2 +-
 5 files changed, 139 insertions(+), 14 deletions(-)



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2011-08-05 12:29 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2011-08-05 12:29 UTC (permalink / raw
  To: gentoo-commits

commit:     e72ea5bf97883849db2ea371998ffe57ab3ecdda
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Fri Aug  5 12:29:37 2011 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Fri Aug  5 12:29:37 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=e72ea5bf

Merge commit 'v2.2.0_alpha50' into multilib


 bin/ebuild.sh                |    4 +++-
 pym/_emerge/depgraph.py      |    2 +-
 pym/_emerge/main.py          |    8 +-------
 pym/portage/dbapi/vartree.py |   36 +++++++++++++++++++++++++++++-------
 4 files changed, 34 insertions(+), 16 deletions(-)



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2011-08-16 12:20 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2011-08-16 12:20 UTC (permalink / raw
  To: gentoo-commits

commit:     f80075060915ae64f2d152166bc87f45d3ca1d79
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Tue Aug 16 12:20:20 2011 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Tue Aug 16 12:20:20 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=f8007506

Merge commit 'v2.2.0_alpha51' into multilib


 bin/portageq                                     |   62 ++++++++++++---
 bin/repoman                                      |   25 ++++++
 man/portage.5                                    |    1 +
 man/repoman.1                                    |    3 +
 pym/_emerge/Package.py                           |    6 --
 pym/_emerge/Scheduler.py                         |    7 ++
 pym/_emerge/actions.py                           |   91 +++++++++++-----------
 pym/_emerge/depgraph.py                          |   12 ++--
 pym/portage/dbapi/porttree.py                    |    5 -
 pym/portage/dbapi/vartree.py                     |   44 +++++++++++
 pym/portage/elog/mod_save.py                     |   25 ++++++-
 pym/portage/elog/mod_save_summary.py             |   18 ++++-
 pym/portage/package/ebuild/config.py             |    3 +
 pym/portage/package/ebuild/doebuild.py           |   27 ++++++-
 pym/portage/package/ebuild/fetch.py              |   11 +++-
 pym/portage/package/ebuild/getmaskingstatus.py   |    4 -
 pym/portage/package/ebuild/prepare_build_dirs.py |   17 ++++-
 pym/portage/repository/config.py                 |    2 +-
 pym/repoman/checks.py                            |    2 +-
 19 files changed, 275 insertions(+), 90 deletions(-)



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2011-09-09 13:03 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2011-09-09 13:03 UTC (permalink / raw
  To: gentoo-commits

commit:     34687a7f50063b4c1b6221b023b6ff20dc636e63
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Fri Sep  9 13:01:59 2011 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Fri Sep  9 13:01:59 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=34687a7f

merge v2.2.0_alpha54


 bin/dispatch-conf                                  |    6 +-
 bin/ebuild                                         |    8 +-
 bin/ebuild-helpers/dosym                           |    6 +
 bin/ebuild.sh                                      |   41 +---
 bin/egencache                                      |   32 ++-
 bin/isolated-functions.sh                          |    7 +-
 bin/repoman                                        |   46 ++--
 cnf/make.globals                                   |    3 +
 cnf/metadata.dtd                                   |   99 +++++++
 man/egencache.1                                    |    4 +
 man/emerge.1                                       |   14 +-
 man/make.conf.5                                    |   21 ++-
 man/repoman.1                                      |    3 +-
 pym/_emerge/AsynchronousLock.py                    |   13 +
 pym/_emerge/BinpkgEnvExtractor.py                  |    2 +-
 pym/_emerge/BlockerCache.py                        |   10 +-
 pym/_emerge/EbuildBuild.py                         |    2 +-
 pym/_emerge/EbuildPhase.py                         |    7 +-
 pym/_emerge/PipeReader.py                          |    7 +-
 pym/_emerge/PollScheduler.py                       |    3 +
 pym/_emerge/Scheduler.py                           |    6 +-
 pym/_emerge/SpawnProcess.py                        |   16 +-
 pym/_emerge/actions.py                             |   27 ++-
 pym/_emerge/depgraph.py                            |  155 +++++------
 pym/_emerge/help.py                                |   18 +-
 pym/_emerge/main.py                                |   62 ++++-
 pym/_emerge/search.py                              |   26 ++-
 pym/portage/__init__.py                            |   32 ++-
 pym/portage/_sets/__init__.py                      |    9 +-
 pym/portage/const.py                               |    3 +-
 pym/portage/data.py                                |    3 +
 pym/portage/dbapi/vartree.py                       |   88 ++++--
 pym/portage/elog/messages.py                       |    6 +-
 pym/portage/elog/mod_echo.py                       |   13 +
 pym/portage/elog/mod_save.py                       |    3 +-
 pym/portage/elog/mod_save_summary.py               |    3 +-
 pym/portage/getbinpkg.py                           |    2 +-
 pym/portage/news.py                                |    7 +-
 pym/portage/output.py                              |   12 +-
 .../package/ebuild/_config/LocationsManager.py     |   10 +-
 .../package/ebuild/_config/special_env_vars.py     |    4 +-
 pym/portage/package/ebuild/config.py               |   11 +
 pym/portage/package/ebuild/doebuild.py             |  127 ++++++++-
 pym/portage/package/ebuild/prepare_build_dirs.py   |    6 +-
 pym/portage/repository/config.py                   |   16 +-
 pym/portage/tests/__init__.py                      |   34 ++-
 .../tests/ebuild/test_array_fromfile_eof.py        |   12 +-
 pym/portage/tests/ebuild/test_doebuild_spawn.py    |    4 +-
 pym/portage/tests/ebuild/test_pty_eof.py           |   13 +
 pym/portage/tests/{dbapi => emerge}/__init__.py    |    0
 pym/portage/tests/{bin => emerge}/__test__         |    0
 pym/portage/tests/emerge/test_simple.py            |  294 ++++++++++++++++++++
 .../test_lazy_import_portage_baseline.py           |    2 +-
 pym/portage/tests/process/test_poll.py             |   10 +-
 pym/portage/tests/{dbapi => repoman}/__init__.py   |    0
 pym/portage/tests/{bin => repoman}/__test__        |    0
 pym/portage/tests/repoman/test_simple.py           |  160 +++++++++++
 pym/portage/tests/resolver/ResolverPlayground.py   |   84 +++++-
 pym/portage/tests/resolver/test_rebuild.py         |   65 +++--
 pym/portage/tests/runTests                         |    2 +-
 pym/portage/update.py                              |   16 +-
 pym/portage/util/ExtractKernelVersion.py           |    2 +
 pym/portage/util/__init__.py                       |   13 +-
 pym/portage/util/_dyn_libs/LinkageMapELF.py        |    1 +
 .../util/_dyn_libs/PreservedLibsRegistry.py        |   22 +-
 pym/portage/util/_pty.py                           |    9 +-
 pym/portage/util/env_update.py                     |   42 ++--
 pym/portage/util/mtimedb.py                        |    8 +-
 pym/portage/xml/metadata.py                        |   49 +++-
 pym/portage/xpak.py                                |   11 +-
 pym/repoman/utilities.py                           |    2 +-
 runtests.sh                                        |    2 +-
 72 files changed, 1458 insertions(+), 398 deletions(-)



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2011-09-11 14:33 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2011-09-11 14:33 UTC (permalink / raw
  To: gentoo-commits

commit:     375a9f2a59b734492d3d105f9272f1d2b9829fb4
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sun Sep 11 14:33:01 2011 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun Sep 11 14:33:01 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=375a9f2a

Merge commit 'v2.2.0_alpha55' into multilib


 bin/egencache                           |   29 +++++++++++++++++----
 pym/_emerge/depgraph.py                 |    8 +++++-
 pym/portage/__init__.py                 |   40 +++++++++++++++++--------------
 pym/portage/cache/volatile.py           |    8 ++++-
 pym/portage/dbapi/porttree.py           |   33 +++++++++++++++++++++----
 pym/portage/getbinpkg.py                |   15 +++++++++--
 pym/portage/tests/emerge/test_simple.py |    1 -
 7 files changed, 97 insertions(+), 37 deletions(-)



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2011-10-01 13:56 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2011-10-01 13:56 UTC (permalink / raw
  To: gentoo-commits

commit:     e3101f17239f2f3f410e93fc3369c4692d6af7b3
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sat Oct  1 13:54:17 2011 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sat Oct  1 13:54:17 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=e3101f17

Merge v2.2.0_alpha58


 bin/bashrc-functions.sh                          |  140 ++
 bin/ebuild                                       |   27 +-
 bin/ebuild.sh                                    | 2150 ++--------------------
 bin/isolated-functions.sh                        |  163 +--
 bin/phase-functions.sh                           | 1163 ++++++++++++
 bin/phase-helpers.sh                             |  626 +++++++
 bin/repoman                                      |   43 +-
 bin/save-ebuild-env.sh                           |   97 +
 man/portage.5                                    |    4 +
 pym/_emerge/EbuildFetcher.py                     |    6 +-
 pym/_emerge/depgraph.py                          |  141 +-
 pym/_emerge/search.py                            |    5 +-
 pym/portage/dbapi/porttree.py                    |    9 +-
 pym/portage/dep/__init__.py                      |    8 +
 pym/portage/manifest.py                          |  178 ++-
 pym/portage/package/ebuild/config.py             |   13 +
 pym/portage/package/ebuild/digestcheck.py        |   50 +-
 pym/portage/package/ebuild/digestgen.py          |   17 +-
 pym/portage/package/ebuild/doebuild.py           |   39 +-
 pym/portage/package/ebuild/fetch.py              |    4 +-
 pym/portage/repository/config.py                 |  216 ++-
 pym/portage/tests/ebuild/test_config.py          |   65 +
 pym/portage/tests/repoman/test_simple.py         |    7 +-
 pym/portage/tests/resolver/ResolverPlayground.py |   28 +-
 pym/portage/tests/resolver/test_multislot.py     |   16 +-
 pym/portage/tests/resolver/test_virtual_slot.py  |   93 +
 pym/portage/util/__init__.py                     |    4 +-
 pym/repoman/checks.py                            |    1 +
 28 files changed, 2844 insertions(+), 2469 deletions(-)

diff --cc bin/ebuild.sh
index 26cb611,7b77c10..aebdb17
--- a/bin/ebuild.sh
+++ b/bin/ebuild.sh
@@@ -5,6 -5,48 +5,49 @@@
  PORTAGE_BIN_PATH="${PORTAGE_BIN_PATH:-/usr/lib/portage/bin}"
  PORTAGE_PYM_PATH="${PORTAGE_PYM_PATH:-/usr/lib/portage/pym}"
  
+ ROOTPATH=${ROOTPATH##:}
+ ROOTPATH=${ROOTPATH%%:}
+ PREROOTPATH=${PREROOTPATH##:}
+ PREROOTPATH=${PREROOTPATH%%:}
+ PATH=$PORTAGE_BIN_PATH/ebuild-helpers:$PREROOTPATH${PREROOTPATH:+:}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin${ROOTPATH:+:}$ROOTPATH
+ export PATH
+ 
+ # Prevent aliases from causing portage to act inappropriately.
+ # Make sure it's before everything so we don't mess aliases that follow.
+ unalias -a
+ 
+ source "${PORTAGE_BIN_PATH}/isolated-functions.sh" || exit 1
++source "${PORTAGE_BIN_PATH}/auto-multilib.sh" || exit 1
+ 
+ if [[ $EBUILD_PHASE != depend ]] ; then
+ 	source "${PORTAGE_BIN_PATH}/phase-functions.sh" || die
+ 	source "${PORTAGE_BIN_PATH}/save-ebuild-env.sh" || die
+ 	source "${PORTAGE_BIN_PATH}/phase-helpers.sh" || die
+ 	source "${PORTAGE_BIN_PATH}/bashrc-functions.sh" || die
+ else
+ 	# These dummy functions are for things that are likely to be called
+ 	# in global scope, even though they are completely useless during
+ 	# the "depend" phase.
+ 	for x in diropts docompress exeopts get_KV insopts \
+ 		keepdir KV_major KV_micro KV_minor KV_to_int \
+ 		libopts register_die_hook register_success_hook \
+ 		remove_path_entry set_unless_changed strip_duplicate_slashes \
+ 		unset_unless_changed use_with use_enable ; do
+ 		eval "${x}() { : ; }"
+ 	done
+ 	# These dummy functions return false, in order to ensure that
+ 	# `use multislot` is false for the "depend" phase.
+ 	for x in use useq usev ; do
+ 		eval "${x}() { return 1; }"
+ 	done
+ 	# These functions die because calls to them during the "depend" phase
+ 	# are considered to be severe QA violations.
+ 	for x in best_version has_version portageq ; do
+ 		eval "${x}() { die \"\${FUNCNAME} calls are not allowed in global scope\"; }"
+ 	done
+ 	unset x
+ fi
+ 
  if [[ $PORTAGE_SANDBOX_COMPAT_LEVEL -lt 22 ]] ; then
  	# Ensure that /dev/std* streams have appropriate sandbox permission for
  	# bug #288863. This can be removed after sandbox is fixed and portage
@@@ -59,1353 -94,72 +95,73 @@@ qa_call() 
  	[[ $shopts != $(shopt) ]] &&
  		eqawarn "QA Notice: Global shell options changed and were not restored while calling '$*'"
  	[[ "$IFS" != "$OLDIFS" ]] &&
- 		eqawarn "QA Notice: Global IFS changed and was not restored while calling '$*'"
- 	return $retval
- }
- 
- EBUILD_SH_ARGS="$*"
- 
- shift $#
- 
- # Prevent aliases from causing portage to act inappropriately.
- # Make sure it's before everything so we don't mess aliases that follow.
- unalias -a
- 
- # Unset some variables that break things.
- unset GZIP BZIP BZIP2 CDPATH GREP_OPTIONS GREP_COLOR GLOBIGNORE
- 
- source "${PORTAGE_BIN_PATH}/isolated-functions.sh"  &>/dev/null
- source "${PORTAGE_BIN_PATH}/auto-multilib.sh"  &>/dev/null
- 
- [[ $PORTAGE_QUIET != "" ]] && export PORTAGE_QUIET
- 
- # sandbox support functions; defined prior to profile.bashrc srcing, since the profile might need to add a default exception (/usr/lib64/conftest fex)
- _sb_append_var() {
- 	local _v=$1 ; shift
- 	local var="SANDBOX_${_v}"
- 	[[ -z $1 || -n $2 ]] && die "Usage: add$(echo ${_v} | \
- 		LC_ALL=C tr [:upper:] [:lower:]) <colon-delimited list of paths>"
- 	export ${var}="${!var:+${!var}:}$1"
- }
- # bash-4 version:
- # local var="SANDBOX_${1^^}"
- # addread() { _sb_append_var ${0#add} "$@" ; }
- addread()    { _sb_append_var READ    "$@" ; }
- addwrite()   { _sb_append_var WRITE   "$@" ; }
- adddeny()    { _sb_append_var DENY    "$@" ; }
- addpredict() { _sb_append_var PREDICT "$@" ; }
- 
- addwrite "${PORTAGE_TMPDIR}"
- addread "/:${PORTAGE_TMPDIR}"
- [[ -n ${PORTAGE_GPG_DIR} ]] && addpredict "${PORTAGE_GPG_DIR}"
- 
- # Avoid sandbox violations in temporary directories.
- if [[ -w $T ]] ; then
- 	export TEMP=$T
- 	export TMP=$T
- 	export TMPDIR=$T
- elif [[ $SANDBOX_ON = 1 ]] ; then
- 	for x in TEMP TMP TMPDIR ; do
- 		[[ -n ${!x} ]] && addwrite "${!x}"
- 	done
- 	unset x
- fi
- 
- # the sandbox is disabled by default except when overridden in the relevant stages
- export SANDBOX_ON=0
- 
- lchown() {
- 	chown -h "$@"
- }
- 
- lchgrp() {
- 	chgrp -h "$@"
- }
- 
- esyslog() {
- 	# Custom version of esyslog() to take care of the "Red Star" bug.
- 	# MUST follow functions.sh to override the "" parameter problem.
- 	return 0
- }
- 
- useq() {
- 	has $EBUILD_PHASE prerm postrm || eqawarn \
- 		"QA Notice: The 'useq' function is deprecated (replaced by 'use')"
- 	use ${1}
- }
- 
- usev() {
- 	if use ${1}; then
- 		echo "${1#!}"
- 		return 0
- 	fi
- 	return 1
- }
- 
- use() {
- 	local u=$1
- 	local found=0
- 
- 	# if we got something like '!flag', then invert the return value
- 	if [[ ${u:0:1} == "!" ]] ; then
- 		u=${u:1}
- 		found=1
- 	fi
- 
- 	if [[ $EBUILD_PHASE = depend ]] ; then
- 		# TODO: Add a registration interface for eclasses to register
- 		# any number of phase hooks, so that global scope eclass
- 		# initialization can by migrated to phase hooks in new EAPIs.
- 		# Example: add_phase_hook before pkg_setup $ECLASS_pre_pkg_setup
- 		#if [[ -n $EAPI ]] && ! has "$EAPI" 0 1 2 3 ; then
- 		#	die "use() called during invalid phase: $EBUILD_PHASE"
- 		#fi
- 		true
- 
- 	# Make sure we have this USE flag in IUSE
- 	elif [[ -n $PORTAGE_IUSE && -n $EBUILD_PHASE ]] ; then
- 		if [[ $u != multilib ]]; then
- 			[[ $u =~ $PORTAGE_IUSE ]] || \
- 				eqawarn "QA Notice: USE Flag '${u}' not" \
- 					"in IUSE for ${CATEGORY}/${PF}"
- 		fi
- 	fi
- 
- 	if has ${u} ${USE} ; then
- 		return ${found}
- 	else
- 		return $((!found))
- 	fi
- }
- 
- # Return true if given package is installed. Otherwise return false.
- # Takes single depend-type atoms.
- has_version() {
- 	if [ "${EBUILD_PHASE}" == "depend" ]; then
- 		die "portageq calls (has_version calls portageq) are not allowed in the global scope"
- 	fi
- 
- 	if [[ -n $PORTAGE_IPC_DAEMON ]] ; then
- 		"$PORTAGE_BIN_PATH"/ebuild-ipc has_version "$ROOT" "$1"
- 	else
- 		PYTHONPATH=${PORTAGE_PYM_PATH}${PYTHONPATH:+:}${PYTHONPATH} \
- 		"${PORTAGE_PYTHON:-/usr/bin/python}" "${PORTAGE_BIN_PATH}/portageq" has_version "${ROOT}" "$1"
- 	fi
- 	local retval=$?
- 	case "${retval}" in
- 		0|1)
- 			return ${retval}
- 			;;
- 		*)
- 			die "unexpected portageq exit code: ${retval}"
- 			;;
- 	esac
- }
- 
- portageq() {
- 	if [ "${EBUILD_PHASE}" == "depend" ]; then
- 		die "portageq calls are not allowed in the global scope"
- 	fi
- 
- 	PYTHONPATH=${PORTAGE_PYM_PATH}${PYTHONPATH:+:}${PYTHONPATH} \
- 	"${PORTAGE_PYTHON:-/usr/bin/python}" "${PORTAGE_BIN_PATH}/portageq" "$@"
- }
- 
- 
- # ----------------------------------------------------------------------------
- # ----------------------------------------------------------------------------
- # ----------------------------------------------------------------------------
- 
- 
- # Returns the best/most-current match.
- # Takes single depend-type atoms.
- best_version() {
- 	if [ "${EBUILD_PHASE}" == "depend" ]; then
- 		die "portageq calls (best_version calls portageq) are not allowed in the global scope"
- 	fi
- 
- 	if [[ -n $PORTAGE_IPC_DAEMON ]] ; then
- 		"$PORTAGE_BIN_PATH"/ebuild-ipc best_version "$ROOT" "$1"
- 	else
- 		PYTHONPATH=${PORTAGE_PYM_PATH}${PYTHONPATH:+:}${PYTHONPATH} \
- 		"${PORTAGE_PYTHON:-/usr/bin/python}" "${PORTAGE_BIN_PATH}/portageq" 'best_version' "${ROOT}" "$1"
- 	fi
- 	local retval=$?
- 	case "${retval}" in
- 		0|1)
- 			return ${retval}
- 			;;
- 		*)
- 			die "unexpected portageq exit code: ${retval}"
- 			;;
- 	esac
- }
- 
- use_with() {
- 	if [ -z "$1" ]; then
- 		echo "!!! use_with() called without a parameter." >&2
- 		echo "!!! use_with <USEFLAG> [<flagname> [value]]" >&2
- 		return 1
- 	fi
- 
- 	if ! has "${EAPI:-0}" 0 1 2 3 ; then
- 		local UW_SUFFIX=${3+=$3}
- 	else
- 		local UW_SUFFIX=${3:+=$3}
- 	fi
- 	local UWORD=${2:-$1}
- 
- 	if use $1; then
- 		echo "--with-${UWORD}${UW_SUFFIX}"
- 	else
- 		echo "--without-${UWORD}"
- 	fi
- 	return 0
- }
- 
- use_enable() {
- 	if [ -z "$1" ]; then
- 		echo "!!! use_enable() called without a parameter." >&2
- 		echo "!!! use_enable <USEFLAG> [<flagname> [value]]" >&2
- 		return 1
- 	fi
- 
- 	if ! has "${EAPI:-0}" 0 1 2 3 ; then
- 		local UE_SUFFIX=${3+=$3}
- 	else
- 		local UE_SUFFIX=${3:+=$3}
- 	fi
- 	local UWORD=${2:-$1}
- 
- 	if use $1; then
- 		echo "--enable-${UWORD}${UE_SUFFIX}"
- 	else
- 		echo "--disable-${UWORD}"
- 	fi
- 	return 0
- }
- 
- register_die_hook() {
- 	local x
- 	for x in $* ; do
- 		has $x $EBUILD_DEATH_HOOKS || \
- 			export EBUILD_DEATH_HOOKS="$EBUILD_DEATH_HOOKS $x"
- 	done
- }
- 
- register_success_hook() {
- 	local x
- 	for x in $* ; do
- 		has $x $EBUILD_SUCCESS_HOOKS || \
- 			export EBUILD_SUCCESS_HOOKS="$EBUILD_SUCCESS_HOOKS $x"
- 	done
- }
- 
- # Ensure that $PWD is sane whenever possible, to protect against
- # exploitation of insecure search path for python -c in ebuilds.
- # See bug #239560.
- if ! has "$EBUILD_PHASE" clean cleanrm depend help ; then
- 	cd "$PORTAGE_BUILDDIR" || \
- 		die "PORTAGE_BUILDDIR does not exist: '$PORTAGE_BUILDDIR'"
- fi
- 
- #if no perms are specified, dirs/files will have decent defaults
- #(not secretive, but not stupid)
- umask 022
- export DESTTREE=/usr
- export INSDESTTREE=""
- export _E_EXEDESTTREE_=""
- export _E_DOCDESTTREE_=""
- export INSOPTIONS="-m0644"
- export EXEOPTIONS="-m0755"
- export LIBOPTIONS="-m0644"
- export DIROPTIONS="-m0755"
- export MOPREFIX=${PN}
- declare -a PORTAGE_DOCOMPRESS=( /usr/share/{doc,info,man} )
- declare -a PORTAGE_DOCOMPRESS_SKIP=( /usr/share/doc/${PF}/html )
- 
- # adds ".keep" files so that dirs aren't auto-cleaned
- keepdir() {
- 	dodir "$@"
- 	local x
- 	if [ "$1" == "-R" ] || [ "$1" == "-r" ]; then
- 		shift
- 		find "$@" -type d -printf "${D}%p/.keep_${CATEGORY}_${PN}-${SLOT}\n" \
- 			| tr "\n" "\0" | \
- 			while read -r -d $'\0' ; do
- 				>> "$REPLY" || \
- 					die "Failed to recursively create .keep files"
- 			done
- 	else
- 		for x in "$@"; do
- 			>> "${D}${x}/.keep_${CATEGORY}_${PN}-${SLOT}" || \
- 				die "Failed to create .keep in ${D}${x}"
- 		done
- 	fi
- }
- 
- unpack() {
- 	local srcdir
- 	local x
- 	local y
- 	local myfail
- 	local eapi=${EAPI:-0}
- 	[ -z "$*" ] && die "Nothing passed to the 'unpack' command"
- 
- 	for x in "$@"; do
- 		vecho ">>> Unpacking ${x} to ${PWD}"
- 		y=${x%.*}
- 		y=${y##*.}
- 
- 		if [[ ${x} == "./"* ]] ; then
- 			srcdir=""
- 		elif [[ ${x} == ${DISTDIR%/}/* ]] ; then
- 			die "Arguments to unpack() cannot begin with \${DISTDIR}."
- 		elif [[ ${x} == "/"* ]] ; then
- 			die "Arguments to unpack() cannot be absolute"
- 		else
- 			srcdir="${DISTDIR}/"
- 		fi
- 		[[ ! -s ${srcdir}${x} ]] && die "${x} does not exist"
- 
- 		_unpack_tar() {
- 			if [ "${y}" == "tar" ]; then
- 				$1 -c -- "$srcdir$x" | tar xof -
- 				assert_sigpipe_ok "$myfail"
- 			else
- 				local cwd_dest=${x##*/}
- 				cwd_dest=${cwd_dest%.*}
- 				$1 -c -- "${srcdir}${x}" > "${cwd_dest}" || die "$myfail"
- 			fi
- 		}
- 
- 		myfail="failure unpacking ${x}"
- 		case "${x##*.}" in
- 			tar)
- 				tar xof "$srcdir$x" || die "$myfail"
- 				;;
- 			tgz)
- 				tar xozf "$srcdir$x" || die "$myfail"
- 				;;
- 			tbz|tbz2)
- 				${PORTAGE_BUNZIP2_COMMAND:-${PORTAGE_BZIP2_COMMAND} -d} -c -- "$srcdir$x" | tar xof -
- 				assert_sigpipe_ok "$myfail"
- 				;;
- 			ZIP|zip|jar)
- 				# unzip will interactively prompt under some error conditions,
- 				# as reported in bug #336285
- 				( while true ; do echo n || break ; done ) | \
- 				unzip -qo "${srcdir}${x}" || die "$myfail"
- 				;;
- 			gz|Z|z)
- 				_unpack_tar "gzip -d"
- 				;;
- 			bz2|bz)
- 				_unpack_tar "${PORTAGE_BUNZIP2_COMMAND:-${PORTAGE_BZIP2_COMMAND} -d}"
- 				;;
- 			7Z|7z)
- 				local my_output
- 				my_output="$(7z x -y "${srcdir}${x}")"
- 				if [ $? -ne 0 ]; then
- 					echo "${my_output}" >&2
- 					die "$myfail"
- 				fi
- 				;;
- 			RAR|rar)
- 				unrar x -idq -o+ "${srcdir}${x}" || die "$myfail"
- 				;;
- 			LHa|LHA|lha|lzh)
- 				lha xfq "${srcdir}${x}" || die "$myfail"
- 				;;
- 			a)
- 				ar x "${srcdir}${x}" || die "$myfail"
- 				;;
- 			deb)
- 				# Unpacking .deb archives can not always be done with
- 				# `ar`.  For instance on AIX this doesn't work out.  If
- 				# we have `deb2targz` installed, prefer it over `ar` for
- 				# that reason.  We just make sure on AIX `deb2targz` is
- 				# installed.
- 				if type -P deb2targz > /dev/null; then
- 					y=${x##*/}
- 					local created_symlink=0
- 					if [ ! "$srcdir$x" -ef "$y" ] ; then
- 						# deb2targz always extracts into the same directory as
- 						# the source file, so create a symlink in the current
- 						# working directory if necessary.
- 						ln -sf "$srcdir$x" "$y" || die "$myfail"
- 						created_symlink=1
- 					fi
- 					deb2targz "$y" || die "$myfail"
- 					if [ $created_symlink = 1 ] ; then
- 						# Clean up the symlink so the ebuild
- 						# doesn't inadvertently install it.
- 						rm -f "$y"
- 					fi
- 					mv -f "${y%.deb}".tar.gz data.tar.gz || die "$myfail"
- 				else
- 					ar x "$srcdir$x" || die "$myfail"
- 				fi
- 				;;
- 			lzma)
- 				_unpack_tar "lzma -d"
- 				;;
- 			xz)
- 				if has $eapi 0 1 2 ; then
- 					vecho "unpack ${x}: file format not recognized. Ignoring."
- 				else
- 					_unpack_tar "xz -d"
- 				fi
- 				;;
- 			*)
- 				vecho "unpack ${x}: file format not recognized. Ignoring."
- 				;;
- 		esac
- 	done
- 	# Do not chmod '.' since it's probably ${WORKDIR} and PORTAGE_WORKDIR_MODE
- 	# should be preserved.
- 	find . -mindepth 1 -maxdepth 1 ! -type l -print0 | \
- 		${XARGS} -0 chmod -fR a+rX,u+w,g-w,o-w
- }
- 
- strip_duplicate_slashes() {
- 	if [[ -n $1 ]] ; then
- 		local removed=$1
- 		while [[ ${removed} == *//* ]] ; do
- 			removed=${removed//\/\///}
- 		done
- 		echo ${removed}
- 	fi
- }
- 
- hasg() {
-     local x s=$1
-     shift
-     for x ; do [[ ${x} == ${s} ]] && echo "${x}" && return 0 ; done
-     return 1
- }
- hasgq() { hasg "$@" >/dev/null ; }
- econf() {
- 	local x
- 
- 	local phase_func=$(_ebuild_arg_to_phase "$EAPI" "$EBUILD_PHASE")
- 	if [[ -n $phase_func ]] ; then
- 		if has "$EAPI" 0 1 ; then
- 			[[ $phase_func != src_compile ]] && \
- 				eqawarn "QA Notice: econf called in" \
- 					"$phase_func instead of src_compile"
- 		else
- 			[[ $phase_func != src_configure ]] && \
- 				eqawarn "QA Notice: econf called in" \
- 					"$phase_func instead of src_configure"
- 		fi
- 	fi
- 
- 	: ${ECONF_SOURCE:=.}
- 	if [ -x "${ECONF_SOURCE}/configure" ]; then
- 		if [[ -n $CONFIG_SHELL && \
- 			"$(head -n1 "$ECONF_SOURCE/configure")" =~ ^'#!'[[:space:]]*/bin/sh([[:space:]]|$) ]] ; then
- 			sed -e "1s:^#![[:space:]]*/bin/sh:#!$CONFIG_SHELL:" -i "$ECONF_SOURCE/configure" || \
- 				die "Substition of shebang in '$ECONF_SOURCE/configure' failed"
- 		fi
- 		if [ -e /usr/share/gnuconfig/ ]; then
- 			find "${WORKDIR}" -type f '(' \
- 			-name config.guess -o -name config.sub ')' -print0 | \
- 			while read -r -d $'\0' x ; do
- 				vecho " * econf: updating ${x/${WORKDIR}\/} with /usr/share/gnuconfig/${x##*/}"
- 				cp -f /usr/share/gnuconfig/"${x##*/}" "${x}"
- 			done
- 		fi
- 
- 		# EAPI=4 adds --disable-dependency-tracking to econf
- 		if ! has "$EAPI" 0 1 2 3 3_pre2 && \
- 			"${ECONF_SOURCE}/configure" --help 2>/dev/null | \
- 			grep -q disable-dependency-tracking ; then
- 			set -- --disable-dependency-tracking "$@"
- 		fi
- 
- 		# if the profile defines a location to install libs to aside from default, pass it on.
- 		# if the ebuild passes in --libdir, they're responsible for the conf_libdir fun.
- 		local CONF_LIBDIR LIBDIR_VAR="LIBDIR_${ABI}"
- 		if [[ -n ${ABI} && -n ${!LIBDIR_VAR} ]] ; then
- 			CONF_LIBDIR=${!LIBDIR_VAR}
- 		fi
- 		if [[ -n ${CONF_LIBDIR} ]] && ! hasgq --libdir=\* "$@" ; then
- 			export CONF_PREFIX=$(hasg --exec-prefix=\* "$@")
- 			[[ -z ${CONF_PREFIX} ]] && CONF_PREFIX=$(hasg --prefix=\* "$@")
- 			: ${CONF_PREFIX:=/usr}
- 			CONF_PREFIX=${CONF_PREFIX#*=}
- 			[[ ${CONF_PREFIX} != /* ]] && CONF_PREFIX="/${CONF_PREFIX}"
- 			[[ ${CONF_LIBDIR} != /* ]] && CONF_LIBDIR="/${CONF_LIBDIR}"
- 			set -- --libdir="$(strip_duplicate_slashes ${CONF_PREFIX}${CONF_LIBDIR})" "$@"
- 		fi
- 
- 		set -- \
- 			--prefix=/usr \
- 			${CBUILD:+--build=${CBUILD}} \
- 			--host=${CHOST} \
- 			${CTARGET:+--target=${CTARGET}} \
- 			--mandir=/usr/share/man \
- 			--infodir=/usr/share/info \
- 			--datadir=/usr/share \
- 			--sysconfdir=/etc \
- 			--localstatedir=/var/lib \
- 			"$@" \
- 			${EXTRA_ECONF}
- 		vecho "${ECONF_SOURCE}/configure" "$@"
- 
- 		if ! "${ECONF_SOURCE}/configure" "$@" ; then
- 
- 			if [ -s config.log ]; then
- 				echo
- 				echo "!!! Please attach the following file when seeking support:"
- 				echo "!!! ${PWD}/config.log"
- 			fi
- 			die "econf failed"
- 		fi
- 	elif [ -f "${ECONF_SOURCE}/configure" ]; then
- 		die "configure is not executable"
- 	else
- 		die "no configure script found"
- 	fi
- }
- 
- einstall() {
- 	# CONF_PREFIX is only set if they didn't pass in libdir above.
- 	local LOCAL_EXTRA_EINSTALL="${EXTRA_EINSTALL}"
- 	LIBDIR_VAR="LIBDIR_${ABI}"
- 	if [ -n "${ABI}" -a -n "${!LIBDIR_VAR}" ]; then
- 		CONF_LIBDIR="${!LIBDIR_VAR}"
- 	fi
- 	unset LIBDIR_VAR
- 	if [ -n "${CONF_LIBDIR}" ] && [ "${CONF_PREFIX:+set}" = set ]; then
- 		EI_DESTLIBDIR="${D}/${CONF_PREFIX}/${CONF_LIBDIR}"
- 		EI_DESTLIBDIR="$(strip_duplicate_slashes ${EI_DESTLIBDIR})"
- 		LOCAL_EXTRA_EINSTALL="libdir=${EI_DESTLIBDIR} ${LOCAL_EXTRA_EINSTALL}"
- 		unset EI_DESTLIBDIR
- 	fi
- 
- 	if [ -f ./[mM]akefile -o -f ./GNUmakefile ] ; then
- 		if [ "${PORTAGE_DEBUG}" == "1" ]; then
- 			${MAKE:-make} -n prefix="${D}usr" \
- 				datadir="${D}usr/share" \
- 				infodir="${D}usr/share/info" \
- 				localstatedir="${D}var/lib" \
- 				mandir="${D}usr/share/man" \
- 				sysconfdir="${D}etc" \
- 				${LOCAL_EXTRA_EINSTALL} \
- 				${MAKEOPTS} ${EXTRA_EMAKE} -j1 \
- 				"$@" install
- 		fi
- 		${MAKE:-make} prefix="${D}usr" \
- 			datadir="${D}usr/share" \
- 			infodir="${D}usr/share/info" \
- 			localstatedir="${D}var/lib" \
- 			mandir="${D}usr/share/man" \
- 			sysconfdir="${D}etc" \
- 			${LOCAL_EXTRA_EINSTALL} \
- 			${MAKEOPTS} ${EXTRA_EMAKE} -j1 \
- 			"$@" install || die "einstall failed"
- 	else
- 		die "no Makefile found"
- 	fi
- }
- 
- _eapi0_pkg_nofetch() {
- 	[ -z "${SRC_URI}" ] && return
- 
- 	elog "The following are listed in SRC_URI for ${PN}:"
- 	local x
- 	for x in $(echo ${SRC_URI}); do
- 		elog "   ${x}"
- 	done
- }
- 
- _eapi0_src_unpack() {
- 	[[ -n ${A} ]] && unpack ${A}
- }
- 
- _eapi0_src_compile() {
- 	if [ -x ./configure ] ; then
- 		econf
- 	fi
- 	_eapi2_src_compile
- }
- 
- _eapi0_src_test() {
- 	# Since we don't want emake's automatic die
- 	# support (EAPI 4 and later), and we also don't
- 	# want the warning messages that it produces if
- 	# we call it in 'nonfatal' mode, we use emake_cmd
- 	# to emulate the desired parts of emake behavior.
- 	local emake_cmd="${MAKE:-make} ${MAKEOPTS} ${EXTRA_EMAKE}"
- 	if $emake_cmd -j1 check -n &> /dev/null; then
- 		vecho ">>> Test phase [check]: ${CATEGORY}/${PF}"
- 		if ! $emake_cmd -j1 check; then
- 			has test $FEATURES && die "Make check failed. See above for details."
- 			has test $FEATURES || eerror "Make check failed. See above for details."
- 		fi
- 	elif $emake_cmd -j1 test -n &> /dev/null; then
- 		vecho ">>> Test phase [test]: ${CATEGORY}/${PF}"
- 		if ! $emake_cmd -j1 test; then
- 			has test $FEATURES && die "Make test failed. See above for details."
- 			has test $FEATURES || eerror "Make test failed. See above for details."
- 		fi
- 	else
- 		vecho ">>> Test phase [none]: ${CATEGORY}/${PF}"
- 	fi
- }
- 
- _eapi1_src_compile() {
- 	_eapi2_src_configure
- 	_eapi2_src_compile
- }
- 
- _eapi2_src_configure() {
- 	if [[ -x ${ECONF_SOURCE:-.}/configure ]] ; then
- 		econf
- 	fi
- }
- 
- _eapi2_src_compile() {
- 	if [ -f Makefile ] || [ -f GNUmakefile ] || [ -f makefile ]; then
- 		emake || die "emake failed"
- 	fi
- }
- 
- _eapi4_src_install() {
- 	if [[ -f Makefile || -f GNUmakefile || -f makefile ]] ; then
- 		emake DESTDIR="${D}" install
- 	fi
- 
- 	if ! declare -p DOCS &>/dev/null ; then
- 		local d
- 		for d in README* ChangeLog AUTHORS NEWS TODO CHANGES \
- 				THANKS BUGS FAQ CREDITS CHANGELOG ; do
- 			[[ -s "${d}" ]] && dodoc "${d}"
- 		done
- 	elif [[ $(declare -p DOCS) == "declare -a "* ]] ; then
- 		dodoc "${DOCS[@]}"
- 	else
- 		dodoc ${DOCS}
- 	fi
- }
- 
- ebuild_phase() {
- 	declare -F "$1" >/dev/null && qa_call $1
- }
- 
- ebuild_phase_with_hooks() {
- 	local x phase_name=${1}
- 	for x in {pre_,,post_}${phase_name} ; do
- 		ebuild_phase ${x}
- 	done
- }
- 
- dyn_pretend() {
- 	if [[ -e $PORTAGE_BUILDDIR/.pretended ]] ; then
- 		vecho ">>> It appears that '$PF' is already pretended; skipping."
- 		vecho ">>> Remove '$PORTAGE_BUILDDIR/.pretended' to force pretend."
- 		return 0
- 	fi
- 	ebuild_phase pre_pkg_pretend
- 	ebuild_phase pkg_pretend
- 	>> "$PORTAGE_BUILDDIR/.pretended" || \
- 		die "Failed to create $PORTAGE_BUILDDIR/.pretended"
- 	ebuild_phase post_pkg_pretend
- }
- 
- dyn_setup() {
- 	if ! is_auto-multilib && ! use multilib_abi_"${DEFAULT_ABI}" ; then
- 		ewarn
- 		ewarn "You disabled all ABIs"
- 		ewarn "You should enable at least one ABI"
- 		ewarn "Enabling the default ABI now"
- 		ewarn
- 	fi
- 	for LOOP_ABI in $(get_abi_list); do
- 		set_abi ${LOOP_ABI}
- 		if is_ebuild; then
- 			 source "${T}"/environment || die
- 		else
- 			rm -f "${T}"/environment
- 		fi
- 
- 	if [[ -e $PORTAGE_BUILDDIR/.setuped.${ABI} ]] ; then
- 		vecho ">>> It appears that '$PF' is already setup; skipping."
- 		vecho ">>> Remove '$PORTAGE_BUILDDIR/.setuped.${ABI}' to force setup."
- 		return 0
- 	fi
- 	ebuild_phase pre_pkg_setup
- 	ebuild_phase pkg_setup
- 	>> "$PORTAGE_BUILDDIR/.setuped.${ABI}" || \
- 		die "Failed to create $PORTAGE_BUILDDIR/.setuped"
- 	ebuild_phase post_pkg_setup
- 
- 		is_ebuild && { unset_abi; source "${T}"/environment || die ; }
- 	done
- 	is_ebuild && { rm "${T}"/environment || die ; }
- }
- 
- dyn_unpack() {
- 	if [[ -f ${PORTAGE_BUILDDIR}/.unpacked ]] ; then
- 		vecho ">>> WORKDIR is up-to-date, keeping..."
- 		return 0
- 	fi
- 	if [ ! -d "${WORKDIR}" ]; then
- 		install -m${PORTAGE_WORKDIR_MODE:-0700} -d "${WORKDIR}" || die "Failed to create dir '${WORKDIR}'"
- 	fi
- 	cd "${WORKDIR}" || die "Directory change failed: \`cd '${WORKDIR}'\`"
- 	ebuild_phase pre_src_unpack
- 	vecho ">>> Unpacking source$(_get_abi_string)..."
- 	ebuild_phase src_unpack
- 
- 		if is_auto-multilib && is_ebuild; then
- 			>> "$PORTAGE_BUILDDIR"/.unpacked."${LOOP_ABI}" || die "IO Failure -- Failed to 'touch .unpacked.${LOOP_ABI}'"
- 		fi
- 		is_ebuild && { unset_abi; source "${T}"/environment || die ; }
- 
- 	is_ebuild && { rm "${T}"/environment || die ; }
- 	>> "$PORTAGE_BUILDDIR/.unpacked" || \
- 		die "Failed to create $PORTAGE_BUILDDIR/.unpacked"
- 	vecho ">>> Source unpacked in ${WORKDIR}"
- 	ebuild_phase post_src_unpack
- }
- 
- dyn_clean() {
- 	if [ -z "${PORTAGE_BUILDDIR}" ]; then
- 		echo "Aborting clean phase because PORTAGE_BUILDDIR is unset!"
- 		return 1
- 	elif [ ! -d "${PORTAGE_BUILDDIR}" ] ; then
- 		return 0
- 	fi
- 	if has chflags $FEATURES ; then
- 		chflags -R noschg,nouchg,nosappnd,nouappnd "${PORTAGE_BUILDDIR}"
- 		chflags -R nosunlnk,nouunlnk "${PORTAGE_BUILDDIR}" 2>/dev/null
- 	fi
- 
- 	rm -rf "${PORTAGE_BUILDDIR}"/image* "${PORTAGE_BUILDDIR}/homedir"
- 	rm -f "${PORTAGE_BUILDDIR}"/.installed*
- 
- 	if [[ $EMERGE_FROM = binary ]] || \
- 		! has keeptemp $FEATURES && ! has keepwork $FEATURES ; then
- 		rm -rf "${T}"
- 	fi
- 
- 	if [[ $EMERGE_FROM = binary ]] || ! has keepwork $FEATURES; then
- 		rm -f "$PORTAGE_BUILDDIR"/.{ebuild_changed,logid,pretended*,setuped*,unpacked*,prepared*} \
- 			"$PORTAGE_BUILDDIR"/.{configured*,compiled*,tested*,packaged*} \
- 			"$PORTAGE_BUILDDIR"/.{die_hooks,abi} \
- 			"$PORTAGE_BUILDDIR"/.ipc_{in,out,lock} \
- 			"$PORTAGE_BUILDDIR"/.exit_status
- 
- 		rm -rf "${PORTAGE_BUILDDIR}/"{build-info,abi-code}
- 		rm -rf "${WORKDIR}"*
- 	fi
- 
- 	if [ -f "${PORTAGE_BUILDDIR}/.unpacked" ]; then
- 		find "${PORTAGE_BUILDDIR}" -type d ! -regex "^${WORKDIR}" | sort -r | tr "\n" "\0" | $XARGS -0 rmdir &>/dev/null
- 	fi
- 
- 	# do not bind this to doebuild defined DISTDIR; don't trust doebuild, and if mistakes are made it'll
- 	# result in it wiping the users distfiles directory (bad).
- 	rm -rf "${PORTAGE_BUILDDIR}/distdir"
- 
- 	# Some kernels, such as Solaris, return EINVAL when an attempt
- 	# is made to remove the current working directory.
- 	cd "$PORTAGE_BUILDDIR"/../..
- 	rmdir "$PORTAGE_BUILDDIR" 2>/dev/null
- 
- 	true
- }
- 
- into() {
- 	if [ "$1" == "/" ]; then
- 		export DESTTREE=""
- 	else
- 		export DESTTREE=$1
- 		if [ ! -d "${D}${DESTTREE}" ]; then
- 			install -d "${D}${DESTTREE}"
- 			local ret=$?
- 			if [[ $ret -ne 0 ]] ; then
- 				helpers_die "${FUNCNAME[0]} failed"
- 				return $ret
- 			fi
- 		fi
- 	fi
- }
- 
- insinto() {
- 	if [ "$1" == "/" ]; then
- 		export INSDESTTREE=""
- 	else
- 		export INSDESTTREE=$1
- 		if [ ! -d "${D}${INSDESTTREE}" ]; then
- 			install -d "${D}${INSDESTTREE}"
- 			local ret=$?
- 			if [[ $ret -ne 0 ]] ; then
- 				helpers_die "${FUNCNAME[0]} failed"
- 				return $ret
- 			fi
- 		fi
- 	fi
- }
- 
- exeinto() {
- 	if [ "$1" == "/" ]; then
- 		export _E_EXEDESTTREE_=""
- 	else
- 		export _E_EXEDESTTREE_="$1"
- 		if [ ! -d "${D}${_E_EXEDESTTREE_}" ]; then
- 			install -d "${D}${_E_EXEDESTTREE_}"
- 			local ret=$?
- 			if [[ $ret -ne 0 ]] ; then
- 				helpers_die "${FUNCNAME[0]} failed"
- 				return $ret
- 			fi
- 		fi
- 	fi
- }
- 
- docinto() {
- 	if [ "$1" == "/" ]; then
- 		export _E_DOCDESTTREE_=""
- 	else
- 		export _E_DOCDESTTREE_="$1"
- 		if [ ! -d "${D}usr/share/doc/${PF}/${_E_DOCDESTTREE_}" ]; then
- 			install -d "${D}usr/share/doc/${PF}/${_E_DOCDESTTREE_}"
- 			local ret=$?
- 			if [[ $ret -ne 0 ]] ; then
- 				helpers_die "${FUNCNAME[0]} failed"
- 				return $ret
- 			fi
- 		fi
- 	fi
- }
- 
- insopts() {
- 	export INSOPTIONS="$@"
- 
- 	# `install` should never be called with '-s' ...
- 	has -s ${INSOPTIONS} && die "Never call insopts() with -s"
- }
- 
- diropts() {
- 	export DIROPTIONS="$@"
- }
- 
- exeopts() {
- 	export EXEOPTIONS="$@"
- 
- 	# `install` should never be called with '-s' ...
- 	has -s ${EXEOPTIONS} && die "Never call exeopts() with -s"
- }
- 
- libopts() {
- 	export LIBOPTIONS="$@"
- 
- 	# `install` should never be called with '-s' ...
- 	has -s ${LIBOPTIONS} && die "Never call libopts() with -s"
- }
- 
- docompress() {
- 	has "${EAPI}" 0 1 2 3 && die "'docompress' not supported in this EAPI"
- 
- 	local f g
- 	if [[ $1 = "-x" ]]; then
- 		shift
- 		for f; do
- 			f=$(strip_duplicate_slashes "${f}"); f=${f%/}
- 			[[ ${f:0:1} = / ]] || f="/${f}"
- 			for g in "${PORTAGE_DOCOMPRESS_SKIP[@]}"; do
- 				[[ ${f} = "${g}" ]] && continue 2
- 			done
- 			PORTAGE_DOCOMPRESS_SKIP[${#PORTAGE_DOCOMPRESS_SKIP[@]}]=${f}
- 		done
- 	else
- 		for f; do
- 			f=$(strip_duplicate_slashes "${f}"); f=${f%/}
- 			[[ ${f:0:1} = / ]] || f="/${f}"
- 			for g in "${PORTAGE_DOCOMPRESS[@]}"; do
- 				[[ ${f} = "${g}" ]] && continue 2
- 			done
- 			PORTAGE_DOCOMPRESS[${#PORTAGE_DOCOMPRESS[@]}]=${f}
- 		done
- 	fi
- }
- 
- abort_handler() {
- 	local msg
- 	if [ "$2" != "fail" ]; then
- 		msg="${EBUILD}: ${1} aborted; exiting."
- 	else
- 		msg="${EBUILD}: ${1} failed; exiting."
- 	fi
- 	echo
- 	echo "$msg"
- 	echo
- 	eval ${3}
- 	#unset signal handler
- 	trap - SIGINT SIGQUIT
- }
- 
- abort_prepare() {
- 	abort_handler src_prepare $1
- 	rm -f "$PORTAGE_BUILDDIR/.prepared"
- 	exit 1
- }
- 
- abort_configure() {
- 	abort_handler src_configure $1
- 	rm -f "$PORTAGE_BUILDDIR/.configured"
- 	exit 1
- }
- 
- abort_compile() {
- 	abort_handler "src_compile" $1
- 	rm -f "${PORTAGE_BUILDDIR}/.compiled"
- 	exit 1
- }
- 
- abort_test() {
- 	abort_handler "dyn_test" $1
- 	rm -f "${PORTAGE_BUILDDIR}/.tested"
- 	exit 1
- }
- 
- abort_install() {
- 	abort_handler "src_install" $1
- 	rm -rf "${PORTAGE_BUILDDIR}"/{image,image.*}
- 	exit 1
- }
- 
- has_phase_defined_up_to() {
- 	local phase
- 	for phase in unpack prepare configure compile install; do
- 		has ${phase} ${DEFINED_PHASES} && return 0
- 		[[ ${phase} == $1 ]] && return 1
- 	done
- 	# We shouldn't actually get here
- 	return 1
- }
- 
- dyn_prepare() {
- 
- 	if [[ -e $PORTAGE_BUILDDIR/.prepared ]] ; then
- 		vecho ">>> It appears that '$PF' is already prepared; skipping."
- 		vecho ">>> Remove '$PORTAGE_BUILDDIR/.prepared' to force prepare."
- 		return 0
- 	fi
- 
- 	for LOOP_ABI in $(get_abi_list); do
- 		is_ebuild && { set_abi ${LOOP_ABI}; source "${T}"/environment || die ; }
- 
- 	if [ "${PORTAGE_BUILDDIR}"/.prepared.${LOOP_ABI} -nt "${WORKDIR}" ]; then
- 		echo ">>> It appears that ${PN} is already prepared for ABI=${LOOP_ABI}; skipping."
- 		echo ">>> Remove '$PORTAGE_BUILDDIR/.prepared.${LOOP_ABI}' to force prepare."
- 		continue
- 	fi
- 	if [[ -d $S ]] ; then
- 		cd "${S}"
- 	elif has $EAPI 0 1 2 3 3_pre2 ; then
- 		cd "${WORKDIR}"
- 	elif [[ -z ${A} ]] && ! has_phase_defined_up_to prepare; then
- 		cd "${WORKDIR}"
- 	else
- 		die "The source directory '${S}' doesn't exist"
- 	fi
- 
- 	trap abort_prepare SIGINT SIGQUIT
- 
- 	ebuild_phase pre_src_prepare
- 	vecho ">>> Preparing source in ${PWD}$(_get_abi_string) ..."
- 	ebuild_phase src_prepare
- 
- 		if is_auto-multilib && is_ebuild; then
- 			>> "$PORTAGE_BUILDDIR"/.prepared."${LOOP_ABI}" || die "IO Failure -- Failed to 'touch .prepared.${LOOP_ABI}'"
- 		fi
- 		is_ebuild && { unset_abi; source "${T}"/environment || die ; }
- 	done
- 	is_ebuild && { rm "${T}"/environment || die ; }
- 
- 	>> "$PORTAGE_BUILDDIR/.prepared" || \
- 		die "Failed to create $PORTAGE_BUILDDIR/.prepared"
- 	vecho ">>> Source prepared."
- 	ebuild_phase post_src_prepare
- 
- 	trap - SIGINT SIGQUIT
- }
- 
- dyn_configure() {
- 
- 	if [[ -e $PORTAGE_BUILDDIR/.configured ]] ; then
- 		vecho ">>> It appears that '$PF' is already configured; skipping."
- 		vecho ">>> Remove '$PORTAGE_BUILDDIR/.configured' to force configuration."
- 		return 0
- 	fi
- 
- 	for LOOP_ABI in $(get_abi_list); do
- 		is_ebuild && { set_abi ${LOOP_ABI}; source "${T}"/environment || die ; }
- 
- 	if [ ${PORTAGE_BUILDDIR}/.configured.${LOOP_ABI} -nt "${WORKDIR}" ]; then
- 			echo ">>> It appears that ${PN} is already configured for ABI=${LOOP_ABI}; skipping."
- 			echo ">>> Remove '$PORTAGE_BUILDDIR/.configured.${LOOP_ABI}' to force configuration."
- 			continue
- 	fi
- 	if [[ -d $S ]] ; then
- 		cd "${S}"
- 	elif has $EAPI 0 1 2 3 3_pre2 ; then
- 		cd "${WORKDIR}"
- 	elif [[ -z ${A} ]] && ! has_phase_defined_up_to configure; then
- 		cd "${WORKDIR}"
- 	else
- 		die "The source directory '${S}' doesn't exist"
- 	fi
- 
- 	trap abort_configure SIGINT SIGQUIT
- 
- 	ebuild_phase pre_src_configure
- 
- 	vecho ">>> Configuring source in ${PWD}$(_get_abi_string) ..."
- 	ebuild_phase src_configure
- 
- 		if is_auto-multilib && is_ebuild; then
- 			>> "$PORTAGE_BUILDDIR"/.configured."${LOOP_ABI}" || die "IO Failure -- Failed to 'touch .configured.${LOOP_ABI}'"
- 		fi
- 		is_ebuild && { unset_abi; source "${T}"/environment || die ; }
- 	done
- 	is_ebuild && { rm "${T}"/environment || die ; }
- 	>> "$PORTAGE_BUILDDIR/.configured" || \
- 		die "Failed to create $PORTAGE_BUILDDIR/.configured"
- 	vecho ">>> Source configured."
- 
- 	ebuild_phase post_src_configure
- 
- 	trap - SIGINT SIGQUIT
- }
- 
- dyn_compile() {
- 
- 	if [[ -e $PORTAGE_BUILDDIR/.compiled ]] ; then
- 		vecho ">>> It appears that '${PF}' is already compiled; skipping."
- 		vecho ">>> Remove '$PORTAGE_BUILDDIR/.compiled' to force compilation."
- 		return 0
- 	fi
- 
- 	for LOOP_ABI in $(get_abi_list); do
- 		is_ebuild && { set_abi ${LOOP_ABI}; source "${T}"/environment || die ; }
- 
- 	if [ ${PORTAGE_BUILDDIR}/.compiled.${LOOP_ABI} -nt "${WORKDIR}" ]; then
- 		echo ">>> It appears that ${PN} is already compiled for ABI=${LOOP_ABI}; skipping."
- 		echo ">>> Remove '$PORTAGE_BUILDDIR/.compiled.${LOOP_ABI}' to force compilation."
- 		continue
- 	fi
- 	if [[ -d $S ]] ; then
- 		cd "${S}"
- 	elif has $EAPI 0 1 2 3 3_pre2 ; then
- 		cd "${WORKDIR}"
- 	elif [[ -z ${A} ]] && ! has_phase_defined_up_to compile; then
- 		cd "${WORKDIR}"
- 	else
- 		die "The source directory '${S}' doesn't exist"
- 	fi
- 
- 	trap abort_compile SIGINT SIGQUIT
- 
- 	if has distcc $FEATURES && has distcc-pump $FEATURES ; then
- 		if [[ -z $INCLUDE_SERVER_PORT ]] || [[ ! -w $INCLUDE_SERVER_PORT ]] ; then
- 			eval $(pump --startup)
- 			trap "pump --shutdown" EXIT
- 		fi
- 	fi
- 
- 	ebuild_phase pre_src_compile
- 
- 	vecho ">>> Compiling source in ${PWD}$(_get_abi_string) ..."
- 	ebuild_phase src_compile
- 
- 		if is_auto-multilib && is_ebuild; then
- 			>> "$PORTAGE_BUILDDIR"/.compiled."${LOOP_ABI}" || die "IO Failure -- Failed to 'touch .compiled.${LOOP_ABI}'"
- 		fi
- 		is_ebuild && { unset_abi; source "${T}"/environment || die ; }
- 	done
- 	is_ebuild && { rm "${T}"/environment || die ; }
- 	>> "$PORTAGE_BUILDDIR/.compiled" || \
- 		die "Failed to create $PORTAGE_BUILDDIR/.compiled"
- 	vecho ">>> Source compiled."
- 
- 	ebuild_phase post_src_compile
- 
- 	trap - SIGINT SIGQUIT
- }
- 
- dyn_test() {
- 
- 	if [[ -e $PORTAGE_BUILDDIR/.tested ]] ; then
- 		vecho ">>> It appears that ${PN} has already been tested; skipping."
- 		vecho ">>> Remove '${PORTAGE_BUILDDIR}/.tested' to force test."
- 		return
- 	fi
- 
- 	if [ "${EBUILD_FORCE_TEST}" == "1" ] ; then
- 		# If USE came from ${T}/environment then it might not have USE=test
- 		# like it's supposed to here.
- 		! has test ${USE} && export USE="${USE} test"
- 	fi
- 
- 	trap "abort_test" SIGINT SIGQUIT
- 	for LOOP_ABI in $(get_abi_list); do
- 		is_ebuild && { set_abi ${LOOP_ABI}; source "${T}"/environment || die ; }
- 
- 	if [ -d "${S}" ]; then
- 		cd "${S}"
- 	else
- 		cd "${WORKDIR}"
- 	fi
- 
- 	if ! has test $FEATURES && [ "${EBUILD_FORCE_TEST}" != "1" ]; then
- 		vecho ">>> Test phase [not enabled]: ${CATEGORY}/${PF}"
- 	elif has test $RESTRICT; then
- 		einfo "Skipping make test/check due to ebuild restriction."
- 		vecho ">>> Test phase [explicitly disabled]: ${CATEGORY}/${PF}"
- 	else
- 		if [ ${PORTAGE_BUILDDIR}/.tested.${LOOP_ABI} -nt "${WORKDIR}" ]; then
- 			echo ">>> It appears that ${PN} is already tested for ABI=${LOOP_ABI}; skipping."
- 			echo ">>> Remove '$PORTAGE_BUILDDIR/.tested.${LOOP_ABI}' to force testing."
- 			continue
- 		fi
- 
- 		local save_sp=${SANDBOX_PREDICT}
- 		addpredict /
- 		ebuild_phase pre_src_test
- 		ebuild_phase src_test
- 
- 			if is_auto-multilib && is_ebuild; then
- 				>> "$PORTAGE_BUILDDIR"/.tested."${LOOP_ABI}" || die "IO Failure -- Failed to 'touch .tested.${LOOP_ABI}'"
- 			fi
- 		>> "$PORTAGE_BUILDDIR/.tested" || \
- 			die "Failed to create $PORTAGE_BUILDDIR/.tested"
- 		ebuild_phase post_src_test
- 		SANDBOX_PREDICT=${save_sp}
- 	fi
- 
- 		is_ebuild && { unset_abi; source "${T}"/environment || die ; }
- 	done
- 	is_ebuild && { rm "${T}"/environment || die ; }
- 
- 	trap - SIGINT SIGQUIT
- }
- 
- dyn_install() {
- 	[ -z "$PORTAGE_BUILDDIR" ] && die "${FUNCNAME}: PORTAGE_BUILDDIR is unset"
- 	if has noauto $FEATURES ; then
- 		rm -f "${PORTAGE_BUILDDIR}/.installed"
- 	elif [[ -e $PORTAGE_BUILDDIR/.installed ]] ; then
- 		vecho ">>> It appears that '${PF}' is already installed; skipping."
- 		vecho ">>> Remove '${PORTAGE_BUILDDIR}/.installed' to force install."
- 		return 0
- 	fi
- 	trap "abort_install" SIGINT SIGQUIT
- 	ebuild_phase pre_src_install
- 	rm -rf "${PORTAGE_BUILDDIR}/image"
- 	is_auto-multilib && rm -rf "${PORTAGE_BUILDDIR}"/image.${ABI}
- 	mkdir "${PORTAGE_BUILDDIR}/image"
- 	for LOOP_ABI in $(get_abi_list); do
- 		is_ebuild && { set_abi ${LOOP_ABI}; source "${T}"/environment || die ; }
- 
- 	if [[ -d $S ]] ; then
- 		cd "${S}"
- 	elif has $EAPI 0 1 2 3 3_pre2 ; then
- 		cd "${WORKDIR}"
- 	elif [[ -z ${A} ]] && ! has_phase_defined_up_to install; then
- 		cd "${WORKDIR}"
- 	else
- 		die "The source directory '${S}' doesn't exist"
- 	fi
- 
- 	vecho
- 	vecho ">>> Install ${PF} into ${D} category ${CATEGORY}"
- 	#our custom version of libtool uses $S and $D to fix
- 	#invalid paths in .la files
- 	export S D
- 
- 	# Reset exeinto(), docinto(), insinto(), and into() state variables
- 	# in case the user is running the install phase multiple times
- 	# consecutively via the ebuild command.
- 	export DESTTREE=/usr
- 	export INSDESTTREE=""
- 	export _E_EXEDESTTREE_=""
- 	export _E_DOCDESTTREE_=""
- 
- 	ebuild_phase src_install
- 
- 		if is_auto-multilib ; then
- 			_finalize_abi_install
- 			cp "${T}"/environment "${PORTAGE_BUILDDIR}"/build-info/environment.${LOOP_ABI} || die
- 			if is_ebuild; then
- 				unset_abi; source "${T}"/environment || die
- 				touch "$PORTAGE_BUILDDIR"/.installed."${LOOP_ABI}" || die "IO Failure -- Failed to 'touch .installed.${LOOP_ABI}'"
- 			fi
- 		fi
- 	done
- 	if [[ -d "${D}" ]]; then
- 		if [[ "${CATEGORY}/${PN}" == "sys-devel/libtool" ]] ; then
- 			ewarn "Preserving libltdl.la because of extensive usage"
- 			ewarn "even in m4 macros of libtool"
- 		else
- 			find "${D}" -name '*.la' ! -exec grep -q shouldnotlink=yes {} \; -exec rm {} \;
- 			/usr/bin/lafilefixer "${D}"
- 		fi
- 
- 	>> "$PORTAGE_BUILDDIR/.installed" || \
- 		die "Failed to create $PORTAGE_BUILDDIR/.installed"
- 	vecho ">>> Completed installing ${PF} into ${D}"
- 	vecho
- 	ebuild_phase post_src_install
- 
- 	cd "${PORTAGE_BUILDDIR}"/build-info
- 	set -f
- 	local f x
- 	IFS=$' \t\n\r'
- 	for f in CATEGORY DEFINED_PHASES FEATURES INHERITED IUSE REQUIRED_USE \
- 		PF PKGUSE SLOT KEYWORDS HOMEPAGE DESCRIPTION ; do
- 		x=$(echo -n ${!f})
- 		[[ -n $x ]] && echo "$x" > $f
- 	done
- 	if [[ $CATEGORY != virtual ]] ; then
- 		for f in ASFLAGS CBUILD CC CFLAGS CHOST CTARGET CXX \
- 			CXXFLAGS EXTRA_ECONF EXTRA_EINSTALL EXTRA_MAKE \
- 			LDFLAGS LIBCFLAGS LIBCXXFLAGS ; do
- 			x=$(echo -n ${!f})
- 			[[ -n $x ]] && echo "$x" > $f
- 		done
- 	fi
- 	if has_multilib_profile ; then
- 		local i= x=
- 		for i in ${MULTILIB_ABIS} ; do
- 			x+=" multilib_abi_${i}"
- 		done
- 		echo "${IUSE}${x}"	> IUSE
- 	fi
- 	echo "${USE}"       > USE
- 	echo "${EAPI:-0}"   > EAPI
- 	if is_auto-multilib; then
- 		echo "$(get_abi_order)" > MULTILIB_ABIS
- 	fi
- 	set +f
- 
- 	# local variables can leak into the saved environment.
- 	unset f
- 
- 	save_ebuild_env --exclude-init-phases | filter_readonly_variables \
- 		--filter-path --filter-sandbox --allow-extra-vars > environment
- 	assert "save_ebuild_env failed"
+ 		eqawarn "QA Notice: Global IFS changed and was not restored while calling '$*'"
+ 	return $retval
+ }
  
- 	${PORTAGE_BZIP2_COMMAND} -f9 environment*
+ EBUILD_SH_ARGS="$*"
  
- 	cp "${EBUILD}" "${PF}.ebuild"
- 	[ -n "${PORTAGE_REPO_NAME}" ]  && echo "${PORTAGE_REPO_NAME}" > repository
- 	if has nostrip ${FEATURES} ${RESTRICT} || has strip ${RESTRICT}
- 	then
- 		>> DEBUGBUILD
- 	fi
+ shift $#
  
- 	else
- 		cd "${PORTAGE_BUILDDIR}"
- 		if [[ $EMERGE_FROM = binary ]] || ! has keepwork $FEATURES; then
- 			rm -f "$PORTAGE_BUILDDIR"/.{ebuild_changed,exit_status,logid,unpacked,prepared} \
- 				"$PORTAGE_BUILDDIR"/.{configured,compiled,tested,packaged} \
- 				"$PORTAGE_BUILDDIR"/.die_hooks
- 
- #			rm -rf "${PORTAGE_BUILDDIR}/build-info"
- 			rm -rf "${WORKDIR}"
- 		fi
+ # Unset some variables that break things.
+ unset GZIP BZIP BZIP2 CDPATH GREP_OPTIONS GREP_COLOR GLOBIGNORE
  
- 		if [ -f "${PORTAGE_BUILDDIR}/.unpacked" ]; then
- 			find "${PORTAGE_BUILDDIR}" -type d ! -regex "^${WORKDIR}" | sort -r | tr "\n" "\0" | $XARGS -0 rmdir &>/dev/null
- 		fi
- 	fi
+ [[ $PORTAGE_QUIET != "" ]] && export PORTAGE_QUIET
  
- 	trap - SIGINT SIGQUIT
+ # sandbox support functions; defined prior to profile.bashrc srcing, since the profile might need to add a default exception (/usr/lib64/conftest fex)
+ _sb_append_var() {
+ 	local _v=$1 ; shift
+ 	local var="SANDBOX_${_v}"
+ 	[[ -z $1 || -n $2 ]] && die "Usage: add$(echo ${_v} | \
+ 		LC_ALL=C tr [:upper:] [:lower:]) <colon-delimited list of paths>"
+ 	export ${var}="${!var:+${!var}:}$1"
  }
+ # bash-4 version:
+ # local var="SANDBOX_${1^^}"
+ # addread() { _sb_append_var ${0#add} "$@" ; }
+ addread()    { _sb_append_var READ    "$@" ; }
+ addwrite()   { _sb_append_var WRITE   "$@" ; }
+ adddeny()    { _sb_append_var DENY    "$@" ; }
+ addpredict() { _sb_append_var PREDICT "$@" ; }
  
- dyn_preinst() {
- 	if [ -z "${D}" ]; then
- 		eerror "${FUNCNAME}: D is unset"
- 		return 1
- 	fi
- 	for LOOP_ABI in $(get_abi_order); do
- 		set_abi ${LOOP_ABI}; source "${T}"/environment || die
- 
- 	ebuild_phase_with_hooks pkg_preinst
+ addwrite "${PORTAGE_TMPDIR}"
+ addread "/:${PORTAGE_TMPDIR}"
+ [[ -n ${PORTAGE_GPG_DIR} ]] && addpredict "${PORTAGE_GPG_DIR}"
  
- 		unset_abi; source "${T}"/environment || die
+ # Avoid sandbox violations in temporary directories.
+ if [[ -w $T ]] ; then
+ 	export TEMP=$T
+ 	export TMP=$T
+ 	export TMPDIR=$T
+ elif [[ $SANDBOX_ON = 1 ]] ; then
+ 	for x in TEMP TMP TMPDIR ; do
+ 		[[ -n ${!x} ]] && addwrite "${!x}"
  	done
- }
+ 	unset x
+ fi
  
- dyn_help() {
- 	echo
- 	echo "Portage"
- 	echo "Copyright 1999-2010 Gentoo Foundation"
- 	echo
- 	echo "How to use the ebuild command:"
- 	echo
- 	echo "The first argument to ebuild should be an existing .ebuild file."
- 	echo
- 	echo "One or more of the following options can then be specified.  If more"
- 	echo "than one option is specified, each will be executed in order."
- 	echo
- 	echo "  help        : show this help screen"
- 	echo "  pretend     : execute package specific pretend actions"
- 	echo "  setup       : execute package specific setup actions"
- 	echo "  fetch       : download source archive(s) and patches"
- 	echo "  digest      : create a manifest file for the package"
- 	echo "  manifest    : create a manifest file for the package"
- 	echo "  unpack      : unpack sources (auto-dependencies if needed)"
- 	echo "  prepare     : prepare sources (auto-dependencies if needed)"
- 	echo "  configure   : configure sources (auto-fetch/unpack if needed)"
- 	echo "  compile     : compile sources (auto-fetch/unpack/configure if needed)"
- 	echo "  test        : test package (auto-fetch/unpack/configure/compile if needed)"
- 	echo "  preinst     : execute pre-install instructions"
- 	echo "  postinst    : execute post-install instructions"
- 	echo "  install     : install the package to the temporary install directory"
- 	echo "  qmerge      : merge image into live filesystem, recording files in db"
- 	echo "  merge       : do fetch, unpack, compile, install and qmerge"
- 	echo "  prerm       : execute pre-removal instructions"
- 	echo "  postrm      : execute post-removal instructions"
- 	echo "  unmerge     : remove package from live filesystem"
- 	echo "  config      : execute package specific configuration actions"
- 	echo "  package     : create a tarball package in ${PKGDIR}/All"
- 	echo "  rpm         : build a RedHat RPM package"
- 	echo "  clean       : clean up all source and temporary files"
- 	echo
- 	echo "The following settings will be used for the ebuild process:"
- 	echo
- 	echo "  package     : ${PF}"
- 	echo "  slot        : ${SLOT}"
- 	echo "  category    : ${CATEGORY}"
- 	echo "  description : ${DESCRIPTION}"
- 	echo "  system      : ${CHOST}"
- 	echo "  c flags     : ${CFLAGS}"
- 	echo "  c++ flags   : ${CXXFLAGS}"
- 	echo "  make flags  : ${MAKEOPTS}"
- 	echo -n "  build mode  : "
- 	if has nostrip ${FEATURES} ${RESTRICT} || has strip ${RESTRICT} ;
- 	then
- 		echo "debug (large)"
- 	else
- 		echo "production (stripped)"
- 	fi
- 	echo "  merge to    : ${ROOT}"
- 	echo
- 	if [ -n "$USE" ]; then
- 		echo "Additionally, support for the following optional features will be enabled:"
- 		echo
- 		echo "  ${USE}"
- 	fi
- 	echo
+ # the sandbox is disabled by default except when overridden in the relevant stages
+ export SANDBOX_ON=0
+ 
+ esyslog() {
+ 	# Custom version of esyslog() to take care of the "Red Star" bug.
+ 	# MUST follow functions.sh to override the "" parameter problem.
+ 	return 0
  }
  
+ # Ensure that $PWD is sane whenever possible, to protect against
+ # exploitation of insecure search path for python -c in ebuilds.
+ # See bug #239560.
+ if ! has "$EBUILD_PHASE" clean cleanrm depend help ; then
+ 	cd "$PORTAGE_BUILDDIR" || \
+ 		die "PORTAGE_BUILDDIR does not exist: '$PORTAGE_BUILDDIR'"
+ fi
++>>>>>>> v2.2.0_alpha58
+ 
+ #if no perms are specified, dirs/files will have decent defaults
+ #(not secretive, but not stupid)
+ umask 022
+ 
  # debug-print() gets called from many places with verbose status information useful
  # for tracking down problems. The output is in $T/eclass-debug.log.
  # You can set ECLASS_DEBUG_OUTPUT to redirect the output somewhere else as well.
diff --cc bin/phase-functions.sh
index 0000000,164b309..6fc8b51
mode 000000,100644..100644
--- a/bin/phase-functions.sh
+++ b/bin/phase-functions.sh
@@@ -1,0 -1,970 +1,1163 @@@
+ #!/bin/bash
+ # Copyright 1999-2011 Gentoo Foundation
+ # Distributed under the terms of the GNU General Public License v2
+ 
+ # Hardcoded bash lists are needed for backward compatibility with
+ # <portage-2.1.4 since they assume that a newly installed version
+ # of ebuild.sh will work for pkg_postinst, pkg_prerm, and pkg_postrm
+ # when portage is upgrading itself.
+ 
+ PORTAGE_READONLY_METADATA="DEFINED_PHASES DEPEND DESCRIPTION
+ 	EAPI HOMEPAGE INHERITED IUSE REQUIRED_USE KEYWORDS LICENSE
+ 	PDEPEND PROVIDE RDEPEND RESTRICT SLOT SRC_URI"
+ 
+ PORTAGE_READONLY_VARS="D EBUILD EBUILD_PHASE \
+ 	EBUILD_SH_ARGS ECLASSDIR EMERGE_FROM FILESDIR MERGE_TYPE \
+ 	PM_EBUILD_HOOK_DIR \
+ 	PORTAGE_ACTUAL_DISTDIR PORTAGE_ARCHLIST PORTAGE_BASHRC  \
+ 	PORTAGE_BINPKG_FILE PORTAGE_BINPKG_TAR_OPTS PORTAGE_BINPKG_TMPFILE \
+ 	PORTAGE_BIN_PATH PORTAGE_BUILDDIR PORTAGE_BUNZIP2_COMMAND \
+ 	PORTAGE_BZIP2_COMMAND PORTAGE_COLORMAP PORTAGE_CONFIGROOT \
+ 	PORTAGE_DEBUG PORTAGE_DEPCACHEDIR PORTAGE_EBUILD_EXIT_FILE \
+ 	PORTAGE_GID PORTAGE_GRPNAME PORTAGE_INST_GID PORTAGE_INST_UID \
+ 	PORTAGE_IPC_DAEMON PORTAGE_IUSE PORTAGE_LOG_FILE \
+ 	PORTAGE_MUTABLE_FILTERED_VARS PORTAGE_PYM_PATH PORTAGE_PYTHON \
+ 	PORTAGE_READONLY_METADATA PORTAGE_READONLY_VARS \
+ 	PORTAGE_REPO_NAME PORTAGE_RESTRICT PORTAGE_SANDBOX_COMPAT_LEVEL \
+ 	PORTAGE_SAVED_READONLY_VARS PORTAGE_SIGPIPE_STATUS \
+ 	PORTAGE_TMPDIR PORTAGE_UPDATE_ENV PORTAGE_USERNAME \
+ 	PORTAGE_VERBOSE PORTAGE_WORKDIR_MODE PORTDIR PORTDIR_OVERLAY \
+ 	PROFILE_PATHS REPLACING_VERSIONS REPLACED_BY_VERSION T WORKDIR"
+ 
+ PORTAGE_SAVED_READONLY_VARS="A CATEGORY P PF PN PR PV PVR"
+ 
+ # Variables that portage sets but doesn't mark readonly.
+ # In order to prevent changed values from causing unexpected
+ # interference, they are filtered out of the environment when
+ # it is saved or loaded (any mutations do not persist).
+ PORTAGE_MUTABLE_FILTERED_VARS="AA HOSTNAME"
+ 
+ # @FUNCTION: filter_readonly_variables
+ # @DESCRIPTION: [--filter-sandbox] [--allow-extra-vars]
+ # Read an environment from stdin and echo to stdout while filtering variables
+ # with names that are known to cause interference:
+ #
+ #   * some specific variables for which bash does not allow assignment
+ #   * some specific variables that affect portage or sandbox behavior
+ #   * variable names that begin with a digit or that contain any
+ #     non-alphanumeric characters that are not be supported by bash
+ #
+ # --filter-sandbox causes all SANDBOX_* variables to be filtered, which
+ # is only desired in certain cases, such as during preprocessing or when
+ # saving environment.bz2 for a binary or installed package.
+ #
+ # --filter-features causes the special FEATURES variable to be filtered.
+ # Generally, we want it to persist between phases since the user might
+ # want to modify it via bashrc to enable things like splitdebug and
+ # installsources for specific packages. They should be able to modify it
+ # in pre_pkg_setup() and have it persist all the way through the install
+ # phase. However, if FEATURES exist inside environment.bz2 then they
+ # should be overridden by current settings.
+ #
+ # --filter-locale causes locale related variables such as LANG and LC_*
+ # variables to be filtered. These variables should persist between phases,
+ # in case they are modified by the ebuild. However, the current user
+ # settings should be used when loading the environment from a binary or
+ # installed package.
+ #
+ # --filter-path causes the PATH variable to be filtered. This variable
+ # should persist between phases, in case it is modified by the ebuild.
+ # However, old settings should be overridden when loading the
+ # environment from a binary or installed package.
+ #
+ # ---allow-extra-vars causes some extra vars to be allowd through, such
+ # as ${PORTAGE_SAVED_READONLY_VARS} and ${PORTAGE_MUTABLE_FILTERED_VARS}.
+ #
+ # In bash-3.2_p20+ an attempt to assign BASH_*, FUNCNAME, GROUPS or any
+ # readonly variable cause the shell to exit while executing the "source"
+ # builtin command. To avoid this problem, this function filters those
+ # variables out and discards them. See bug #190128.
+ filter_readonly_variables() {
+ 	local x filtered_vars
+ 	local readonly_bash_vars="BASHOPTS BASHPID DIRSTACK EUID
+ 		FUNCNAME GROUPS PIPESTATUS PPID SHELLOPTS UID"
+ 	local bash_misc_vars="BASH BASH_.* COMP_WORDBREAKS HISTCMD
+ 		HISTFILE HOSTNAME HOSTTYPE IFS LINENO MACHTYPE OLDPWD
+ 		OPTERR OPTIND OSTYPE POSIXLY_CORRECT PS4 PWD RANDOM
+ 		SECONDS SHELL SHLVL"
+ 	local filtered_sandbox_vars="SANDBOX_ACTIVE SANDBOX_BASHRC
+ 		SANDBOX_DEBUG_LOG SANDBOX_DISABLED SANDBOX_LIB
+ 		SANDBOX_LOG SANDBOX_ON"
+ 	local misc_garbage_vars="_portage_filter_opts"
+ 	filtered_vars="$readonly_bash_vars $bash_misc_vars
+ 		$PORTAGE_READONLY_VARS $misc_garbage_vars"
+ 
+ 	# Don't filter/interfere with prefix variables unless they are
+ 	# supported by the current EAPI.
+ 	case "${EAPI:-0}" in
+ 		0|1|2)
+ 			;;
+ 		*)
+ 			filtered_vars+=" ED EPREFIX EROOT"
+ 			;;
+ 	esac
+ 
+ 	if has --filter-sandbox $* ; then
+ 		filtered_vars="${filtered_vars} SANDBOX_.*"
+ 	else
+ 		filtered_vars="${filtered_vars} ${filtered_sandbox_vars}"
+ 	fi
+ 	if has --filter-features $* ; then
+ 		filtered_vars="${filtered_vars} FEATURES PORTAGE_FEATURES"
+ 	fi
+ 	if has --filter-path $* ; then
+ 		filtered_vars+=" PATH"
+ 	fi
+ 	if has --filter-locale $* ; then
+ 		filtered_vars+=" LANG LC_ALL LC_COLLATE
+ 			LC_CTYPE LC_MESSAGES LC_MONETARY
+ 			LC_NUMERIC LC_PAPER LC_TIME"
+ 	fi
+ 	if ! has --allow-extra-vars $* ; then
+ 		filtered_vars="
+ 			${filtered_vars}
+ 			${PORTAGE_SAVED_READONLY_VARS}
+ 			${PORTAGE_MUTABLE_FILTERED_VARS}
+ 		"
+ 	fi
++	if has --filter-metadata $* ; then
++		filtered_vars+=" ${PORTAGE_READONLY_METADATA} filter_opts"
++	fi
+ 
+ 	"${PORTAGE_PYTHON:-/usr/bin/python}" "${PORTAGE_BIN_PATH}"/filter-bash-environment.py "${filtered_vars}" || die "filter-bash-environment.py failed"
+ }
+ 
+ # @FUNCTION: preprocess_ebuild_env
+ # @DESCRIPTION:
+ # Filter any readonly variables from ${T}/environment, source it, and then
+ # save it via save_ebuild_env(). This process should be sufficient to prevent
+ # any stale variables or functions from an arbitrary environment from
+ # interfering with the current environment. This is useful when an existing
+ # environment needs to be loaded from a binary or installed package.
+ preprocess_ebuild_env() {
+ 	local _portage_filter_opts="--filter-features --filter-locale --filter-path --filter-sandbox"
+ 
+ 	# If environment.raw is present, this is a signal from the python side,
+ 	# indicating that the environment may contain stale FEATURES and
+ 	# SANDBOX_{DENY,PREDICT,READ,WRITE} variables that should be filtered out.
+ 	# Otherwise, we don't need to filter the environment.
+ 	[ -f "${T}/environment.raw" ] || return 0
+ 
+ 	filter_readonly_variables $_portage_filter_opts < "${T}"/environment \
+ 		>> "$T/environment.filtered" || return $?
+ 	unset _portage_filter_opts
+ 	mv "${T}"/environment.filtered "${T}"/environment || return $?
+ 	rm -f "${T}/environment.success" || return $?
+ 	# WARNING: Code inside this subshell should avoid making assumptions
+ 	# about variables or functions after source "${T}"/environment has been
+ 	# called. Any variables that need to be relied upon should already be
+ 	# filtered out above.
+ 	(
+ 		export SANDBOX_ON=1
+ 		source "${T}/environment" || exit $?
+ 		# We have to temporarily disable sandbox since the
+ 		# SANDBOX_{DENY,READ,PREDICT,WRITE} values we've just loaded
+ 		# may be unusable (triggering in spurious sandbox violations)
+ 		# until we've merged them with our current values.
+ 		export SANDBOX_ON=0
+ 
+ 		# It's remotely possible that save_ebuild_env() has been overridden
+ 		# by the above source command. To protect ourselves, we override it
+ 		# here with our own version. ${PORTAGE_BIN_PATH} is safe to use here
+ 		# because it's already filtered above.
+ 		source "${PORTAGE_BIN_PATH}/save-ebuild-env.sh" || exit $?
+ 
+ 		# Rely on save_ebuild_env() to filter out any remaining variables
+ 		# and functions that could interfere with the current environment.
+ 		save_ebuild_env || exit $?
+ 		>> "$T/environment.success" || exit $?
+ 	) > "${T}/environment.filtered"
+ 	local retval
+ 	if [ -e "${T}/environment.success" ] ; then
+ 		filter_readonly_variables --filter-features < \
+ 			"${T}/environment.filtered" > "${T}/environment"
+ 		retval=$?
+ 	else
+ 		retval=1
+ 	fi
+ 	rm -f "${T}"/environment.{filtered,raw,success}
+ 	return ${retval}
+ }
+ 
+ ebuild_phase() {
+ 	declare -F "$1" >/dev/null && qa_call $1
+ }
+ 
+ ebuild_phase_with_hooks() {
+ 	local x phase_name=${1}
+ 	for x in {pre_,,post_}${phase_name} ; do
+ 		ebuild_phase ${x}
+ 	done
+ }
+ 
+ dyn_pretend() {
+ 	if [[ -e $PORTAGE_BUILDDIR/.pretended ]] ; then
+ 		vecho ">>> It appears that '$PF' is already pretended; skipping."
+ 		vecho ">>> Remove '$PORTAGE_BUILDDIR/.pretended' to force pretend."
+ 		return 0
+ 	fi
+ 	ebuild_phase pre_pkg_pretend
+ 	ebuild_phase pkg_pretend
+ 	>> "$PORTAGE_BUILDDIR/.pretended" || \
+ 		die "Failed to create $PORTAGE_BUILDDIR/.pretended"
+ 	ebuild_phase post_pkg_pretend
+ }
+ 
+ dyn_setup() {
 -	if [[ -e $PORTAGE_BUILDDIR/.setuped ]] ; then
++	if ! is_auto-multilib && ! use multilib_abi_"${DEFAULT_ABI}" ; then
++		ewarn
++		ewarn "You disabled all ABIs"
++		ewarn "You should enable at least one ABI"
++		ewarn "Enabling the default ABI now"
++		ewarn
++	fi
++	for LOOP_ABI in $(get_abi_list); do
++		set_abi ${LOOP_ABI}
++		if is_ebuild; then
++			source "${T}"/environment || die
++		else
++			rm -f "${T}"/environment
++		fi
++	if [[ -e $PORTAGE_BUILDDIR/.setuped.${ABI} ]] ; then
+ 		vecho ">>> It appears that '$PF' is already setup; skipping."
 -		vecho ">>> Remove '$PORTAGE_BUILDDIR/.setuped' to force setup."
++		vecho ">>> Remove '$PORTAGE_BUILDDIR/.setuped.${ABI}' to force setup."
+ 		return 0
+ 	fi
+ 	ebuild_phase pre_pkg_setup
+ 	ebuild_phase pkg_setup
 -	>> "$PORTAGE_BUILDDIR/.setuped" || \
++	>> "$PORTAGE_BUILDDIR/.setuped.${ABI}" || \
+ 		die "Failed to create $PORTAGE_BUILDDIR/.setuped"
+ 	ebuild_phase post_pkg_setup
++
++		is_ebuild && { unset_abi; source "${T}"/environment || die ; }
++	done
++	is_ebuild && { rm "${T}"/environment || die ; }
+ }
+ 
+ dyn_unpack() {
+ 	if [[ -f ${PORTAGE_BUILDDIR}/.unpacked ]] ; then
+ 		vecho ">>> WORKDIR is up-to-date, keeping..."
+ 		return 0
+ 	fi
+ 	if [ ! -d "${WORKDIR}" ]; then
+ 		install -m${PORTAGE_WORKDIR_MODE:-0700} -d "${WORKDIR}" || die "Failed to create dir '${WORKDIR}'"
+ 	fi
+ 	cd "${WORKDIR}" || die "Directory change failed: \`cd '${WORKDIR}'\`"
+ 	ebuild_phase pre_src_unpack
 -	vecho ">>> Unpacking source..."
++	vecho ">>> Unpacking source$(_get_abi_string)..."
+ 	ebuild_phase src_unpack
++
++		if is_auto-multilib && is_ebuild; then
++			>> "$PORTAGE_BUILDDIR"/.unpacked."${LOOP_ABI}" || die "IO Failure -- Failed to 'touch .unpacked.${LOOP_ABI}'"
++		fi
++		is_ebuild && { unset_abi; source "${T}"/environment || die ; }
++
++	is_ebuild && { rm "${T}"/environment || die ; }
+ 	>> "$PORTAGE_BUILDDIR/.unpacked" || \
+ 		die "Failed to create $PORTAGE_BUILDDIR/.unpacked"
+ 	vecho ">>> Source unpacked in ${WORKDIR}"
+ 	ebuild_phase post_src_unpack
+ }
+ 
+ dyn_clean() {
+ 	if [ -z "${PORTAGE_BUILDDIR}" ]; then
+ 		echo "Aborting clean phase because PORTAGE_BUILDDIR is unset!"
+ 		return 1
+ 	elif [ ! -d "${PORTAGE_BUILDDIR}" ] ; then
+ 		return 0
+ 	fi
+ 	if has chflags $FEATURES ; then
+ 		chflags -R noschg,nouchg,nosappnd,nouappnd "${PORTAGE_BUILDDIR}"
+ 		chflags -R nosunlnk,nouunlnk "${PORTAGE_BUILDDIR}" 2>/dev/null
+ 	fi
+ 
 -	rm -rf "${PORTAGE_BUILDDIR}/image" "${PORTAGE_BUILDDIR}/homedir"
 -	rm -f "${PORTAGE_BUILDDIR}/.installed"
++	rm -rf "${PORTAGE_BUILDDIR}"/image* "${PORTAGE_BUILDDIR}/homedir"
++	rm -f "${PORTAGE_BUILDDIR}"/.installed*
+ 
+ 	if [[ $EMERGE_FROM = binary ]] || \
+ 		! has keeptemp $FEATURES && ! has keepwork $FEATURES ; then
+ 		rm -rf "${T}"
+ 	fi
+ 
+ 	if [[ $EMERGE_FROM = binary ]] || ! has keepwork $FEATURES; then
 -		rm -f "$PORTAGE_BUILDDIR"/.{ebuild_changed,logid,pretended,setuped,unpacked,prepared} \
 -			"$PORTAGE_BUILDDIR"/.{configured,compiled,tested,packaged} \
++		rm -f "$PORTAGE_BUILDDIR"/.{ebuild_changed,logid,pretended*,setuped*,unpacked*,prepared*} \
++			"$PORTAGE_BUILDDIR"/.{configured*,compiled*,tested*,packaged*} \
+ 			"$PORTAGE_BUILDDIR"/.die_hooks \
+ 			"$PORTAGE_BUILDDIR"/.ipc_{in,out,lock} \
+ 			"$PORTAGE_BUILDDIR"/.exit_status
+ 
 -		rm -rf "${PORTAGE_BUILDDIR}/build-info"
 -		rm -rf "${WORKDIR}"
++		rm -rf "${PORTAGE_BUILDDIR}"/{build-info,abi-code}
++		rm -rf "${WORKDIR}"*
+ 	fi
+ 
+ 	if [ -f "${PORTAGE_BUILDDIR}/.unpacked" ]; then
+ 		find "${PORTAGE_BUILDDIR}" -type d ! -regex "^${WORKDIR}" | sort -r | tr "\n" "\0" | $XARGS -0 rmdir &>/dev/null
+ 	fi
+ 
+ 	# do not bind this to doebuild defined DISTDIR; don't trust doebuild, and if mistakes are made it'll
+ 	# result in it wiping the users distfiles directory (bad).
+ 	rm -rf "${PORTAGE_BUILDDIR}/distdir"
+ 
+ 	# Some kernels, such as Solaris, return EINVAL when an attempt
+ 	# is made to remove the current working directory.
+ 	cd "$PORTAGE_BUILDDIR"/../..
+ 	rmdir "$PORTAGE_BUILDDIR" 2>/dev/null
+ 
+ 	true
+ }
+ 
+ abort_handler() {
+ 	local msg
+ 	if [ "$2" != "fail" ]; then
+ 		msg="${EBUILD}: ${1} aborted; exiting."
+ 	else
+ 		msg="${EBUILD}: ${1} failed; exiting."
+ 	fi
+ 	echo
+ 	echo "$msg"
+ 	echo
+ 	eval ${3}
+ 	#unset signal handler
+ 	trap - SIGINT SIGQUIT
+ }
+ 
+ abort_prepare() {
+ 	abort_handler src_prepare $1
+ 	rm -f "$PORTAGE_BUILDDIR/.prepared"
+ 	exit 1
+ }
+ 
+ abort_configure() {
+ 	abort_handler src_configure $1
+ 	rm -f "$PORTAGE_BUILDDIR/.configured"
+ 	exit 1
+ }
+ 
+ abort_compile() {
+ 	abort_handler "src_compile" $1
+ 	rm -f "${PORTAGE_BUILDDIR}/.compiled"
+ 	exit 1
+ }
+ 
+ abort_test() {
+ 	abort_handler "dyn_test" $1
+ 	rm -f "${PORTAGE_BUILDDIR}/.tested"
+ 	exit 1
+ }
+ 
+ abort_install() {
+ 	abort_handler "src_install" $1
+ 	rm -rf "${PORTAGE_BUILDDIR}/image"
+ 	exit 1
+ }
+ 
+ has_phase_defined_up_to() {
+ 	local phase
+ 	for phase in unpack prepare configure compile install; do
+ 		has ${phase} ${DEFINED_PHASES} && return 0
+ 		[[ ${phase} == $1 ]] && return 1
+ 	done
+ 	# We shouldn't actually get here
+ 	return 1
+ }
+ 
+ dyn_prepare() {
+ 
+ 	if [[ -e $PORTAGE_BUILDDIR/.prepared ]] ; then
+ 		vecho ">>> It appears that '$PF' is already prepared; skipping."
+ 		vecho ">>> Remove '$PORTAGE_BUILDDIR/.prepared' to force prepare."
+ 		return 0
+ 	fi
+ 
++	for LOOP_ABI in $(get_abi_list); do
++		is_ebuild && { set_abi ${LOOP_ABI}; source "${T}"/environment || die ; }
++
++	if [ "${PORTAGE_BUILDDIR}"/.prepared.${LOOP_ABI} -nt "${WORKDIR}" ]; then
++		echo ">>> It appears that ${PN} is already prepared for ABI=${LOOP_ABI}; skipping."
++		echo ">>> Remove '$PORTAGE_BUILDDIR/.prepared.${LOOP_ABI}' to force prepare."
++		continue
++	fi
+ 	if [[ -d $S ]] ; then
+ 		cd "${S}"
+ 	elif has $EAPI 0 1 2 3 3_pre2 ; then
+ 		cd "${WORKDIR}"
+ 	elif [[ -z ${A} ]] && ! has_phase_defined_up_to prepare; then
+ 		cd "${WORKDIR}"
+ 	else
+ 		die "The source directory '${S}' doesn't exist"
+ 	fi
+ 
+ 	trap abort_prepare SIGINT SIGQUIT
+ 
+ 	ebuild_phase pre_src_prepare
 -	vecho ">>> Preparing source in $PWD ..."
++	vecho ">>> Preparing source in $PWD$(_get_abi_string) ..."
+ 	ebuild_phase src_prepare
++
++		if is_auto-multilib && is_ebuild; then
++			>> "$PORTAGE_BUILDDIR"/.prepared."${LOOP_ABI}" || die "IO Failure -- Failed to 'touch .prepared.${LOOP_ABI}'"
++		fi
++		is_ebuild && { unset_abi; source "${T}"/environment || die ; }
++	done
++	is_ebuild && { rm "${T}"/environment || die ; }
++
+ 	>> "$PORTAGE_BUILDDIR/.prepared" || \
+ 		die "Failed to create $PORTAGE_BUILDDIR/.prepared"
+ 	vecho ">>> Source prepared."
+ 	ebuild_phase post_src_prepare
+ 
+ 	trap - SIGINT SIGQUIT
+ }
+ 
+ dyn_configure() {
+ 
+ 	if [[ -e $PORTAGE_BUILDDIR/.configured ]] ; then
+ 		vecho ">>> It appears that '$PF' is already configured; skipping."
+ 		vecho ">>> Remove '$PORTAGE_BUILDDIR/.configured' to force configuration."
+ 		return 0
+ 	fi
+ 
++	for LOOP_ABI in $(get_abi_list); do
++		is_ebuild && { set_abi ${LOOP_ABI}; source "${T}"/environment || die ; }
++
++	if [ ${PORTAGE_BUILDDIR}/.configured.${LOOP_ABI} -nt "${WORKDIR}" ]; then
++		echo ">>> It appears that ${PN} is already configured for ABI=${LOOP_ABI}; skipping."
++		echo ">>> Remove '$PORTAGE_BUILDDIR/.configured.${LOOP_ABI}' to force configuration."
++		continue
++	fi
+ 	if [[ -d $S ]] ; then
+ 		cd "${S}"
+ 	elif has $EAPI 0 1 2 3 3_pre2 ; then
+ 		cd "${WORKDIR}"
+ 	elif [[ -z ${A} ]] && ! has_phase_defined_up_to configure; then
+ 		cd "${WORKDIR}"
+ 	else
+ 		die "The source directory '${S}' doesn't exist"
+ 	fi
+ 
+ 	trap abort_configure SIGINT SIGQUIT
+ 
+ 	ebuild_phase pre_src_configure
+ 
 -	vecho ">>> Configuring source in $PWD ..."
++	vecho ">>> Configuring source in $PWD$(_get_abi_string) ..."
+ 	ebuild_phase src_configure
++
++		if is_auto-multilib && is_ebuild; then
++			>> "$PORTAGE_BUILDDIR"/.configured."${LOOP_ABI}" || die "IO Failure -- Failed to 'touch .configured.${LOOP_ABI}'"
++		fi
++		is_ebuild && { unset_abi; source "${T}"/environment || die ; }
++	done
++	is_ebuild && { rm "${T}"/environment || die ; }
+ 	>> "$PORTAGE_BUILDDIR/.configured" || \
+ 		die "Failed to create $PORTAGE_BUILDDIR/.configured"
+ 	vecho ">>> Source configured."
+ 
+ 	ebuild_phase post_src_configure
+ 
+ 	trap - SIGINT SIGQUIT
+ }
+ 
+ dyn_compile() {
+ 
+ 	if [[ -e $PORTAGE_BUILDDIR/.compiled ]] ; then
+ 		vecho ">>> It appears that '${PF}' is already compiled; skipping."
+ 		vecho ">>> Remove '$PORTAGE_BUILDDIR/.compiled' to force compilation."
+ 		return 0
+ 	fi
+ 
++	for LOOP_ABI in $(get_abi_list); do
++		is_ebuild && { set_abi ${LOOP_ABI}; source "${T}"/environment || die ; }
++
++		if [ ${PORTAGE_BUILDDIR}/.compiled.${LOOP_ABI} -nt "${WORKDIR}" ]; then
++			echo ">>> It appears that ${PN} is already compiled for ABI=${LOOP_ABI}; skipping."
++			echo ">>> Remove '$PORTAGE_BUILDDIR/.compiled.${LOOP_ABI}' to force compilation."
++			continue
++		fi
+ 	if [[ -d $S ]] ; then
+ 		cd "${S}"
+ 	elif has $EAPI 0 1 2 3 3_pre2 ; then
+ 		cd "${WORKDIR}"
+ 	elif [[ -z ${A} ]] && ! has_phase_defined_up_to compile; then
+ 		cd "${WORKDIR}"
+ 	else
+ 		die "The source directory '${S}' doesn't exist"
+ 	fi
+ 
+ 	trap abort_compile SIGINT SIGQUIT
+ 
+ 	if has distcc $FEATURES && has distcc-pump $FEATURES ; then
+ 		if [[ -z $INCLUDE_SERVER_PORT ]] || [[ ! -w $INCLUDE_SERVER_PORT ]] ; then
+ 			eval $(pump --startup)
+ 			trap "pump --shutdown" EXIT
+ 		fi
+ 	fi
+ 
+ 	ebuild_phase pre_src_compile
+ 
 -	vecho ">>> Compiling source in $PWD ..."
++	vecho ">>> Compiling source in $PWD$(_get_abi_string) ..."
+ 	ebuild_phase src_compile
++
++		if is_auto-multilib && is_ebuild; then
++			>> "$PORTAGE_BUILDDIR"/.compiled."${LOOP_ABI}" || die "IO Failure -- Failed to 'touch .compiled.${LOOP_ABI}'"
++		fi
++		is_ebuild && { unset_abi; source "${T}"/environment || die ; }
++	done
++	is_ebuild && { rm "${T}"/environment || die ; }
+ 	>> "$PORTAGE_BUILDDIR/.compiled" || \
+ 		die "Failed to create $PORTAGE_BUILDDIR/.compiled"
+ 	vecho ">>> Source compiled."
+ 
+ 	ebuild_phase post_src_compile
+ 
+ 	trap - SIGINT SIGQUIT
+ }
+ 
+ dyn_test() {
+ 
+ 	if [[ -e $PORTAGE_BUILDDIR/.tested ]] ; then
+ 		vecho ">>> It appears that ${PN} has already been tested; skipping."
+ 		vecho ">>> Remove '${PORTAGE_BUILDDIR}/.tested' to force test."
+ 		return
+ 	fi
+ 
+ 	if [ "${EBUILD_FORCE_TEST}" == "1" ] ; then
+ 		# If USE came from ${T}/environment then it might not have USE=test
+ 		# like it's supposed to here.
+ 		! has test ${USE} && export USE="${USE} test"
+ 	fi
+ 
+ 	trap "abort_test" SIGINT SIGQUIT
++	for LOOP_ABI in $(get_abi_list); do
++		is_ebuild && { set_abi ${LOOP_ABI}; source "${T}"/environment || die ; }
++
+ 	if [ -d "${S}" ]; then
+ 		cd "${S}"
+ 	else
+ 		cd "${WORKDIR}"
+ 	fi
+ 
+ 	if ! has test $FEATURES && [ "${EBUILD_FORCE_TEST}" != "1" ]; then
+ 		vecho ">>> Test phase [not enabled]: ${CATEGORY}/${PF}"
+ 	elif has test $RESTRICT; then
+ 		einfo "Skipping make test/check due to ebuild restriction."
+ 		vecho ">>> Test phase [explicitly disabled]: ${CATEGORY}/${PF}"
+ 	else
++		if [ ${PORTAGE_BUILDDIR}/.tested.${LOOP_ABI} -nt "${WORKDIR}" ]; then
++			echo ">>> It appears that ${PN} is already tested for ABI=${LOOP_ABI}; skipping."
++			echo ">>> Remove '$PORTAGE_BUILDDIR/.tested.${LOOP_ABI}' to force testing."
++			continue
++		fi
++
+ 		local save_sp=${SANDBOX_PREDICT}
+ 		addpredict /
+ 		ebuild_phase pre_src_test
+ 		ebuild_phase src_test
++
++			if is_auto-multilib && is_ebuild; then
++				>> "$PORTAGE_BUILDDIR"/.tested."${LOOP_ABI}" || die "IO Failure -- Failed to 'touch .tested.${LOOP_ABI}'"
++			fi
+ 		>> "$PORTAGE_BUILDDIR/.tested" || \
+ 			die "Failed to create $PORTAGE_BUILDDIR/.tested"
+ 		ebuild_phase post_src_test
+ 		SANDBOX_PREDICT=${save_sp}
+ 	fi
+ 
++		is_ebuild && { unset_abi; source "${T}"/environment || die ; }
++	done
++	is_ebuild && { rm "${T}"/environment || die ; }
++
+ 	trap - SIGINT SIGQUIT
+ }
+ 
+ dyn_install() {
+ 	[ -z "$PORTAGE_BUILDDIR" ] && die "${FUNCNAME}: PORTAGE_BUILDDIR is unset"
+ 	if has noauto $FEATURES ; then
+ 		rm -f "${PORTAGE_BUILDDIR}/.installed"
+ 	elif [[ -e $PORTAGE_BUILDDIR/.installed ]] ; then
+ 		vecho ">>> It appears that '${PF}' is already installed; skipping."
+ 		vecho ">>> Remove '${PORTAGE_BUILDDIR}/.installed' to force install."
+ 		return 0
+ 	fi
+ 	trap "abort_install" SIGINT SIGQUIT
+ 	ebuild_phase pre_src_install
+ 	rm -rf "${PORTAGE_BUILDDIR}/image"
++	is_auto-multilib && rm -rf "${PORTAGE_BUILDDIR}"/image.${ABI}
+ 	mkdir "${PORTAGE_BUILDDIR}/image"
++	for LOOP_ABI in $(get_abi_list); do
++		is_ebuild && { set_abi ${LOOP_ABI}; source "${T}"/environment || die ; }
++
+ 	if [[ -d $S ]] ; then
+ 		cd "${S}"
+ 	elif has $EAPI 0 1 2 3 3_pre2 ; then
+ 		cd "${WORKDIR}"
+ 	elif [[ -z ${A} ]] && ! has_phase_defined_up_to install; then
+ 		cd "${WORKDIR}"
+ 	else
+ 		die "The source directory '${S}' doesn't exist"
+ 	fi
+ 
+ 	vecho
+ 	vecho ">>> Install ${PF} into ${D} category ${CATEGORY}"
+ 	#our custom version of libtool uses $S and $D to fix
+ 	#invalid paths in .la files
+ 	export S D
+ 
+ 	# Reset exeinto(), docinto(), insinto(), and into() state variables
+ 	# in case the user is running the install phase multiple times
+ 	# consecutively via the ebuild command.
+ 	export DESTTREE=/usr
+ 	export INSDESTTREE=""
+ 	export _E_EXEDESTTREE_=""
+ 	export _E_DOCDESTTREE_=""
+ 
+ 	ebuild_phase src_install
++
++		if is_auto-multilib ; then
++			_finalize_abi_install
++			cp "${T}"/environment "${PORTAGE_BUILDDIR}"/build-info/environment.${LOOP_ABI} || die
++			if is_ebuild; then
++				unset_abi; source "${T}"/environment || die
++				touch "$PORTAGE_BUILDDIR"/.installed."${LOOP_ABI}" || die "IO Failure -- Failed to 'touch .installed.${LOOP_ABI}'"
++			fi
++		fi
++	done
++	if [[ -d "${D}" ]]; then
++		if [[ "${CATEGORY}/${PN}" == "sys-devel/libtool" ]] ; then
++			ewarn "Preserving libltdl.la because of extensive usage"
++			ewarn "even in m4 macros of libtool"
++		else
++			find "${D}" -name '*.la' ! -exec grep -q shouldnotlink=yes {} \; -exec rm {} \;
++		fi
++
+ 	>> "$PORTAGE_BUILDDIR/.installed" || \
+ 		die "Failed to create $PORTAGE_BUILDDIR/.installed"
+ 	vecho ">>> Completed installing ${PF} into ${D}"
+ 	vecho
+ 	ebuild_phase post_src_install
+ 
+ 	cd "${PORTAGE_BUILDDIR}"/build-info
+ 	set -f
+ 	local f x
+ 	IFS=$' \t\n\r'
+ 	for f in CATEGORY DEFINED_PHASES FEATURES INHERITED IUSE REQUIRED_USE \
+ 		PF PKGUSE SLOT KEYWORDS HOMEPAGE DESCRIPTION ; do
+ 		x=$(echo -n ${!f})
+ 		[[ -n $x ]] && echo "$x" > $f
+ 	done
+ 	if [[ $CATEGORY != virtual ]] ; then
+ 		for f in ASFLAGS CBUILD CC CFLAGS CHOST CTARGET CXX \
+ 			CXXFLAGS EXTRA_ECONF EXTRA_EINSTALL EXTRA_MAKE \
+ 			LDFLAGS LIBCFLAGS LIBCXXFLAGS ; do
+ 			x=$(echo -n ${!f})
+ 			[[ -n $x ]] && echo "$x" > $f
+ 		done
+ 	fi
++	if has_multilib_profile ; then
++		local i= x=
++		for i in ${MULTILIB_ABIS} ; do
++			x+=" multilib_abi_${i}"
++		done
++		echo "${IUSE}${x}"      > IUSE
++	fi
+ 	echo "${USE}"       > USE
+ 	echo "${EAPI:-0}"   > EAPI
++	if is_auto-multilib; then
++		echo "$(get_abi_order)" > MULTILIB_ABIS
++	fi
+ 	set +f
+ 
+ 	# local variables can leak into the saved environment.
+ 	unset f
+ 
+ 	save_ebuild_env --exclude-init-phases | filter_readonly_variables \
+ 		--filter-path --filter-sandbox --allow-extra-vars > environment
+ 	assert "save_ebuild_env failed"
+ 
+ 	${PORTAGE_BZIP2_COMMAND} -f9 environment
+ 
+ 	cp "${EBUILD}" "${PF}.ebuild"
+ 	[ -n "${PORTAGE_REPO_NAME}" ]  && echo "${PORTAGE_REPO_NAME}" > repository
+ 	if has nostrip ${FEATURES} ${RESTRICT} || has strip ${RESTRICT}
+ 	then
+ 		>> DEBUGBUILD
+ 	fi
++
++	else
++		cd "${PORTAGE_BUILDDIR}"
++		if [[ $EMERGE_FROM = binary ]] || ! has keepwork $FEATURES; then
++			rm -f "$PORTAGE_BUILDDIR"/.{ebuild_changed,exit_status,logid,unpacked,prepared} \
++				"$PORTAGE_BUILDDIR"/.{configured,compiled,tested,packaged} \
++				"$PORTAGE_BUILDDIR"/.die_hooks
++
++#                       rm -rf "${PORTAGE_BUILDDIR}/build-info"
++			rm -rf "${WORKDIR}"
++		fi
++
++		if [ -f "${PORTAGE_BUILDDIR}/.unpacked" ]; then
++			find "${PORTAGE_BUILDDIR}" -type d ! -regex "^${WORKDIR}" | sort -r | tr "\n" "\0" | $XARGS -0 rmdir &>/dev/null
++		fi
++	fi
++
+ 	trap - SIGINT SIGQUIT
+ }
+ 
+ dyn_preinst() {
+ 	if [ -z "${D}" ]; then
+ 		eerror "${FUNCNAME}: D is unset"
+ 		return 1
+ 	fi
++	for LOOP_ABI in $(get_abi_order); do
++		set_abi ${LOOP_ABI}; source "${T}"/environment || die
++
+ 	ebuild_phase_with_hooks pkg_preinst
++
++		unset_abi; source "${T}"/environment || die
++	done
+ }
+ 
+ dyn_help() {
+ 	echo
+ 	echo "Portage"
+ 	echo "Copyright 1999-2010 Gentoo Foundation"
+ 	echo
+ 	echo "How to use the ebuild command:"
+ 	echo
+ 	echo "The first argument to ebuild should be an existing .ebuild file."
+ 	echo
+ 	echo "One or more of the following options can then be specified.  If more"
+ 	echo "than one option is specified, each will be executed in order."
+ 	echo
+ 	echo "  help        : show this help screen"
+ 	echo "  pretend     : execute package specific pretend actions"
+ 	echo "  setup       : execute package specific setup actions"
+ 	echo "  fetch       : download source archive(s) and patches"
+ 	echo "  digest      : create a manifest file for the package"
+ 	echo "  manifest    : create a manifest file for the package"
+ 	echo "  unpack      : unpack sources (auto-dependencies if needed)"
+ 	echo "  prepare     : prepare sources (auto-dependencies if needed)"
+ 	echo "  configure   : configure sources (auto-fetch/unpack if needed)"
+ 	echo "  compile     : compile sources (auto-fetch/unpack/configure if needed)"
+ 	echo "  test        : test package (auto-fetch/unpack/configure/compile if needed)"
+ 	echo "  preinst     : execute pre-install instructions"
+ 	echo "  postinst    : execute post-install instructions"
+ 	echo "  install     : install the package to the temporary install directory"
+ 	echo "  qmerge      : merge image into live filesystem, recording files in db"
+ 	echo "  merge       : do fetch, unpack, compile, install and qmerge"
+ 	echo "  prerm       : execute pre-removal instructions"
+ 	echo "  postrm      : execute post-removal instructions"
+ 	echo "  unmerge     : remove package from live filesystem"
+ 	echo "  config      : execute package specific configuration actions"
+ 	echo "  package     : create a tarball package in ${PKGDIR}/All"
+ 	echo "  rpm         : build a RedHat RPM package"
+ 	echo "  clean       : clean up all source and temporary files"
+ 	echo
+ 	echo "The following settings will be used for the ebuild process:"
+ 	echo
+ 	echo "  package     : ${PF}"
+ 	echo "  slot        : ${SLOT}"
+ 	echo "  category    : ${CATEGORY}"
+ 	echo "  description : ${DESCRIPTION}"
+ 	echo "  system      : ${CHOST}"
+ 	echo "  c flags     : ${CFLAGS}"
+ 	echo "  c++ flags   : ${CXXFLAGS}"
+ 	echo "  make flags  : ${MAKEOPTS}"
+ 	echo -n "  build mode  : "
+ 	if has nostrip ${FEATURES} ${RESTRICT} || has strip ${RESTRICT} ;
+ 	then
+ 		echo "debug (large)"
+ 	else
+ 		echo "production (stripped)"
+ 	fi
+ 	echo "  merge to    : ${ROOT}"
+ 	echo
+ 	if [ -n "$USE" ]; then
+ 		echo "Additionally, support for the following optional features will be enabled:"
+ 		echo
+ 		echo "  ${USE}"
+ 	fi
+ 	echo
+ }
+ 
+ # @FUNCTION: _ebuild_arg_to_phase
+ # @DESCRIPTION:
+ # Translate a known ebuild(1) argument into the precise
+ # name of it's corresponding ebuild phase.
+ _ebuild_arg_to_phase() {
+ 	[ $# -ne 2 ] && die "expected exactly 2 args, got $#: $*"
+ 	local eapi=$1
+ 	local arg=$2
+ 	local phase_func=""
+ 
+ 	case "$arg" in
+ 		pretend)
+ 			! has $eapi 0 1 2 3 3_pre2 && \
+ 				phase_func=pkg_pretend
+ 			;;
+ 		setup)
+ 			phase_func=pkg_setup
+ 			;;
+ 		nofetch)
+ 			phase_func=pkg_nofetch
+ 			;;
+ 		unpack)
+ 			phase_func=src_unpack
+ 			;;
+ 		prepare)
+ 			! has $eapi 0 1 && \
+ 				phase_func=src_prepare
+ 			;;
+ 		configure)
+ 			! has $eapi 0 1 && \
+ 				phase_func=src_configure
+ 			;;
+ 		compile)
+ 			phase_func=src_compile
+ 			;;
+ 		test)
+ 			phase_func=src_test
+ 			;;
+ 		install)
+ 			phase_func=src_install
+ 			;;
+ 		preinst)
+ 			phase_func=pkg_preinst
+ 			;;
+ 		postinst)
+ 			phase_func=pkg_postinst
+ 			;;
+ 		prerm)
+ 			phase_func=pkg_prerm
+ 			;;
+ 		postrm)
+ 			phase_func=pkg_postrm
+ 			;;
+ 	esac
+ 
+ 	[[ -z $phase_func ]] && return 1
+ 	echo "$phase_func"
+ 	return 0
+ }
+ 
+ _ebuild_phase_funcs() {
+ 	[ $# -ne 2 ] && die "expected exactly 2 args, got $#: $*"
+ 	local eapi=$1
+ 	local phase_func=$2
+ 	local default_phases="pkg_nofetch src_unpack src_prepare src_configure
+ 		src_compile src_install src_test"
+ 	local x y default_func=""
+ 
+ 	for x in pkg_nofetch src_unpack src_test ; do
+ 		declare -F $x >/dev/null || \
+ 			eval "$x() { _eapi0_$x \"\$@\" ; }"
+ 	done
+ 
+ 	case $eapi in
+ 
+ 		0|1)
+ 
+ 			if ! declare -F src_compile >/dev/null ; then
+ 				case $eapi in
+ 					0)
+ 						src_compile() { _eapi0_src_compile "$@" ; }
+ 						;;
+ 					*)
+ 						src_compile() { _eapi1_src_compile "$@" ; }
+ 						;;
+ 				esac
+ 			fi
+ 
+ 			for x in $default_phases ; do
+ 				eval "default_$x() {
+ 					die \"default_$x() is not supported with EAPI='$eapi' during phase $phase_func\"
+ 				}"
+ 			done
+ 
+ 			eval "default() {
+ 				die \"default() is not supported with EAPI='$eapi' during phase $phase_func\"
+ 			}"
+ 
+ 			;;
+ 
+ 		*)
+ 
+ 			declare -F src_configure >/dev/null || \
+ 				src_configure() { _eapi2_src_configure "$@" ; }
+ 
+ 			declare -F src_compile >/dev/null || \
+ 				src_compile() { _eapi2_src_compile "$@" ; }
+ 
+ 			has $eapi 2 3 3_pre2 || declare -F src_install >/dev/null || \
+ 				src_install() { _eapi4_src_install "$@" ; }
+ 
+ 			if has $phase_func $default_phases ; then
+ 
+ 				_eapi2_pkg_nofetch   () { _eapi0_pkg_nofetch          "$@" ; }
+ 				_eapi2_src_unpack    () { _eapi0_src_unpack           "$@" ; }
+ 				_eapi2_src_prepare   () { true                             ; }
+ 				_eapi2_src_test      () { _eapi0_src_test             "$@" ; }
+ 				_eapi2_src_install   () { die "$FUNCNAME is not supported" ; }
+ 
+ 				for x in $default_phases ; do
+ 					eval "default_$x() { _eapi2_$x \"\$@\" ; }"
+ 				done
+ 
+ 				eval "default() { _eapi2_$phase_func \"\$@\" ; }"
+ 
+ 				case $eapi in
+ 					2|3)
+ 						;;
+ 					*)
+ 						eval "default_src_install() { _eapi4_src_install \"\$@\" ; }"
+ 						[[ $phase_func = src_install ]] && \
+ 							eval "default() { _eapi4_$phase_func \"\$@\" ; }"
+ 						;;
+ 				esac
+ 
+ 			else
+ 
+ 				for x in $default_phases ; do
+ 					eval "default_$x() {
+ 						die \"default_$x() is not supported in phase $default_func\"
+ 					}"
+ 				done
+ 
+ 				eval "default() {
+ 					die \"default() is not supported with EAPI='$eapi' during phase $phase_func\"
+ 				}"
+ 
+ 			fi
+ 
+ 			;;
+ 	esac
+ }
+ 
+ ebuild_main() {
+ 
+ 	# Subshell/helper die support (must export for the die helper).
+ 	# Since this function is typically executed in a subshell,
+ 	# setup EBUILD_MASTER_PID to refer to the current $BASHPID,
+ 	# which seems to give the best results when further
+ 	# nested subshells call die.
+ 	export EBUILD_MASTER_PID=$BASHPID
+ 	trap 'exit 1' SIGTERM
+ 
+ 	#a reasonable default for $S
+ 	[[ -z ${S} ]] && export S=${WORKDIR}/${P}
+ 
+ 	if [[ -s $SANDBOX_LOG ]] ; then
+ 		# We use SANDBOX_LOG to check for sandbox violations,
+ 		# so we ensure that there can't be a stale log to
+ 		# interfere with our logic.
+ 		local x=
+ 		if [[ -n SANDBOX_ON ]] ; then
+ 			x=$SANDBOX_ON
+ 			export SANDBOX_ON=0
+ 		fi
+ 
+ 		rm -f "$SANDBOX_LOG" || \
+ 			die "failed to remove stale sandbox log: '$SANDBOX_LOG'"
+ 
+ 		if [[ -n $x ]] ; then
+ 			export SANDBOX_ON=$x
+ 		fi
+ 		unset x
+ 	fi
+ 
+ 	# Force configure scripts that automatically detect ccache to
+ 	# respect FEATURES="-ccache".
+ 	has ccache $FEATURES || export CCACHE_DISABLE=1
+ 
+ 	local phase_func=$(_ebuild_arg_to_phase "$EAPI" "$EBUILD_PHASE")
+ 	[[ -n $phase_func ]] && _ebuild_phase_funcs "$EAPI" "$phase_func"
+ 	unset phase_func
+ 
+ 	source_all_bashrcs
+ 
+ 	case ${1} in
+ 	nofetch)
+ 		ebuild_phase_with_hooks pkg_nofetch
+ 		;;
 -	prerm|postrm|postinst|config|info)
++	config|info)
+ 		if has "${1}" config info && \
+ 			! declare -F "pkg_${1}" >/dev/null ; then
+ 			ewarn  "pkg_${1}() is not defined: '${EBUILD##*/}'"
+ 		fi
+ 		export SANDBOX_ON="0"
+ 		if [ "${PORTAGE_DEBUG}" != "1" ] || [ "${-/x/}" != "$-" ]; then
+ 			ebuild_phase_with_hooks pkg_${1}
+ 		else
+ 			set -x
+ 			ebuild_phase_with_hooks pkg_${1}
+ 			set +x
+ 		fi
 -		if [[ $EBUILD_PHASE == postinst ]] && [[ -n $PORTAGE_UPDATE_ENV ]]; then
 -			# Update environment.bz2 in case installation phases
 -			# need to pass some variables to uninstallation phases.
 -			save_ebuild_env --exclude-init-phases | \
 -				filter_readonly_variables --filter-path \
 -				--filter-sandbox --allow-extra-vars \
 -				| ${PORTAGE_BZIP2_COMMAND} -c -f9 > "$PORTAGE_UPDATE_ENV"
 -			assert "save_ebuild_env failed"
 -		fi
++		;;
++	prerm|postrm|postinst)
++		for LOOP_ABI in $(get_abi_order); do
++			if is_auto-multilib ; then
++				case ${1} in
++					postinst)
++						set_abi ${LOOP_ABI}
++						;;
++					prerm|postrm)
++						# if = backward compactibility for previous versions, which did not
++						# install a per-ABI environment
++						if [[ -f "${ROOT}"var/db/pkg/${CATEGORY}/${PF}/environment.${LOOP_ABI}.bz2 ]] ; then
++							bzcat "${ROOT}"var/db/pkg/${CATEGORY}/${PF}/environment.${LOOP_ABI}.bz2 > "${T}"/environment || die
++							preprocess_ebuild_env --filter-metadata
++						fi
++						;;
++				esac
++				# >/dev/null = backward compactibility for prerm/postrm
++				source "${T}"/environment 2>/dev/null || die
++			fi
++			export SANDBOX_ON="0"
++			if [ "${PORTAGE_DEBUG}" != "1" ] || [ "${-/x/}" != "$-" ]; then
++				ebuild_phase_with_hooks pkg_${1}
++			else
++				set -x
++				ebuild_phase_with_hooks pkg_${1}
++				set +x
++			fi
++
++			if [[ $EBUILD_PHASE == postinst ]] && [[ -n $PORTAGE_UPDATE_ENV ]]; then
++				# Update environment.bz2 in case installation phases
++				# need to pass some variables to uninstallation phases.
++				save_ebuild_env --exclude-init-phases | \
++					filter_readonly_variables --filter-path \
++					--filter-sandbox --allow-extra-vars \
++					| ${PORTAGE_BZIP2_COMMAND} -c -f9 > "$PORTAGE_UPDATE_ENV"
++				assert "save_ebuild_env failed"
++			fi
++			if is_auto-multilib ; then
++				case ${1} in
++					postinst)
++						unset_abi
++						;;
++					prerm|postrm)
++						#if = backward compactibility for previous versions, which did not
++						#install a per-ABI environment
++						if [[ -f "${ROOT}"var/db/pkg/${CATEGORY}/${PF}/environment.${LOOP_ABI}.bz2 ]] ; then
++							preprocess_ebuild_env --filter-metadata
++							bzcat "${ROOT}"var/db/pkg/${CATEGORY}/${PF}/environment.${LOOP_ABI}.bz2 > "${T}"/environment || die
++						fi
++						;;
++				esac
++				# >/dev/null = backward compactibility for prerm/postrm
++				source "${T}"/environment 2>/dev/null || die
++			fi
++		done
+ 		;;
+ 	unpack|prepare|configure|compile|test|clean|install)
+ 		if [[ ${SANDBOX_DISABLED:-0} = 0 ]] ; then
+ 			export SANDBOX_ON="1"
+ 		else
+ 			export SANDBOX_ON="0"
+ 		fi
+ 
+ 		case "${1}" in
+ 		configure|compile)
+ 
+ 			local x
+ 			for x in ASFLAGS CCACHE_DIR CCACHE_SIZE \
+ 				CFLAGS CXXFLAGS LDFLAGS LIBCFLAGS LIBCXXFLAGS ; do
+ 				[[ ${!x+set} = set ]] && export $x
+ 			done
+ 			unset x
+ 
+ 			has distcc $FEATURES && [[ -n $DISTCC_DIR ]] && \
+ 				[[ ${SANDBOX_WRITE/$DISTCC_DIR} = $SANDBOX_WRITE ]] && \
+ 				addwrite "$DISTCC_DIR"
+ 
+ 			x=LIBDIR_$ABI
+ 			[ -z "$PKG_CONFIG_PATH" -a -n "$ABI" -a -n "${!x}" ] && \
+ 				export PKG_CONFIG_PATH=/usr/${!x}/pkgconfig
+ 
+ 			if has noauto $FEATURES && \
+ 				[[ ! -f $PORTAGE_BUILDDIR/.unpacked ]] ; then
+ 				echo
+ 				echo "!!! We apparently haven't unpacked..." \
+ 					"This is probably not what you"
+ 				echo "!!! want to be doing... You are using" \
+ 					"FEATURES=noauto so I'll assume"
+ 				echo "!!! that you know what you are doing..." \
+ 					"You have 5 seconds to abort..."
+ 				echo
+ 
+ 				local x
+ 				for x in 1 2 3 4 5 6 7 8; do
+ 					LC_ALL=C sleep 0.25
+ 				done
+ 
+ 				sleep 3
+ 			fi
+ 
+ 			cd "$PORTAGE_BUILDDIR"
+ 			if [ ! -d build-info ] ; then
+ 				mkdir build-info
+ 				cp "$EBUILD" "build-info/$PF.ebuild"
+ 			fi
+ 
+ 			#our custom version of libtool uses $S and $D to fix
+ 			#invalid paths in .la files
+ 			export S D
+ 
+ 			;;
+ 		esac
+ 
+ 		if [ "${PORTAGE_DEBUG}" != "1" ] || [ "${-/x/}" != "$-" ]; then
+ 			dyn_${1}
+ 		else
+ 			set -x
+ 			dyn_${1}
+ 			set +x
+ 		fi
+ 		export SANDBOX_ON="0"
+ 		;;
+ 	help|pretend|setup|preinst)
+ 		#pkg_setup needs to be out of the sandbox for tmp file creation;
+ 		#for example, awking and piping a file in /tmp requires a temp file to be created
+ 		#in /etc.  If pkg_setup is in the sandbox, both our lilo and apache ebuilds break.
+ 		export SANDBOX_ON="0"
+ 		if [ "${PORTAGE_DEBUG}" != "1" ] || [ "${-/x/}" != "$-" ]; then
+ 			dyn_${1}
+ 		else
+ 			set -x
+ 			dyn_${1}
+ 			set +x
+ 		fi
+ 		;;
+ 	_internal_test)
+ 		;;
+ 	*)
+ 		export SANDBOX_ON="1"
+ 		echo "Unrecognized arg '${1}'"
+ 		echo
+ 		dyn_help
+ 		exit 1
+ 		;;
+ 	esac
+ 
+ 	# Save the env only for relevant phases.
+ 	if ! has "${1}" clean help info nofetch ; then
+ 		umask 002
+ 		save_ebuild_env | filter_readonly_variables \
+ 			--filter-features > "$T/environment"
+ 		assert "save_ebuild_env failed"
+ 		chown portage:portage "$T/environment" &>/dev/null
+ 		chmod g+w "$T/environment" &>/dev/null
+ 	fi
+ 	[[ -n $PORTAGE_EBUILD_EXIT_FILE ]] && > "$PORTAGE_EBUILD_EXIT_FILE"
+ 	if [[ -n $PORTAGE_IPC_DAEMON ]] ; then
+ 		[[ ! -s $SANDBOX_LOG ]]
+ 		"$PORTAGE_BIN_PATH"/ebuild-ipc exit $?
+ 	fi
+ }
diff --cc bin/phase-helpers.sh
index 0000000,a033fa8..c8f4262
mode 000000,100644..100644
--- a/bin/phase-helpers.sh
+++ b/bin/phase-helpers.sh
@@@ -1,0 -1,624 +1,626 @@@
+ #!/bin/bash
+ # Copyright 1999-2011 Gentoo Foundation
+ # Distributed under the terms of the GNU General Public License v2
+ 
+ export DESTTREE=/usr
+ export INSDESTTREE=""
+ export _E_EXEDESTTREE_=""
+ export _E_DOCDESTTREE_=""
+ export INSOPTIONS="-m0644"
+ export EXEOPTIONS="-m0755"
+ export LIBOPTIONS="-m0644"
+ export DIROPTIONS="-m0755"
+ export MOPREFIX=${PN}
+ declare -a PORTAGE_DOCOMPRESS=( /usr/share/{doc,info,man} )
+ declare -a PORTAGE_DOCOMPRESS_SKIP=( /usr/share/doc/${PF}/html )
+ 
+ into() {
+ 	if [ "$1" == "/" ]; then
+ 		export DESTTREE=""
+ 	else
+ 		export DESTTREE=$1
+ 		if [ ! -d "${D}${DESTTREE}" ]; then
+ 			install -d "${D}${DESTTREE}"
+ 			local ret=$?
+ 			if [[ $ret -ne 0 ]] ; then
+ 				helpers_die "${FUNCNAME[0]} failed"
+ 				return $ret
+ 			fi
+ 		fi
+ 	fi
+ }
+ 
+ insinto() {
+ 	if [ "$1" == "/" ]; then
+ 		export INSDESTTREE=""
+ 	else
+ 		export INSDESTTREE=$1
+ 		if [ ! -d "${D}${INSDESTTREE}" ]; then
+ 			install -d "${D}${INSDESTTREE}"
+ 			local ret=$?
+ 			if [[ $ret -ne 0 ]] ; then
+ 				helpers_die "${FUNCNAME[0]} failed"
+ 				return $ret
+ 			fi
+ 		fi
+ 	fi
+ }
+ 
+ exeinto() {
+ 	if [ "$1" == "/" ]; then
+ 		export _E_EXEDESTTREE_=""
+ 	else
+ 		export _E_EXEDESTTREE_="$1"
+ 		if [ ! -d "${D}${_E_EXEDESTTREE_}" ]; then
+ 			install -d "${D}${_E_EXEDESTTREE_}"
+ 			local ret=$?
+ 			if [[ $ret -ne 0 ]] ; then
+ 				helpers_die "${FUNCNAME[0]} failed"
+ 				return $ret
+ 			fi
+ 		fi
+ 	fi
+ }
+ 
+ docinto() {
+ 	if [ "$1" == "/" ]; then
+ 		export _E_DOCDESTTREE_=""
+ 	else
+ 		export _E_DOCDESTTREE_="$1"
+ 		if [ ! -d "${D}usr/share/doc/${PF}/${_E_DOCDESTTREE_}" ]; then
+ 			install -d "${D}usr/share/doc/${PF}/${_E_DOCDESTTREE_}"
+ 			local ret=$?
+ 			if [[ $ret -ne 0 ]] ; then
+ 				helpers_die "${FUNCNAME[0]} failed"
+ 				return $ret
+ 			fi
+ 		fi
+ 	fi
+ }
+ 
+ insopts() {
+ 	export INSOPTIONS="$@"
+ 
+ 	# `install` should never be called with '-s' ...
+ 	has -s ${INSOPTIONS} && die "Never call insopts() with -s"
+ }
+ 
+ diropts() {
+ 	export DIROPTIONS="$@"
+ }
+ 
+ exeopts() {
+ 	export EXEOPTIONS="$@"
+ 
+ 	# `install` should never be called with '-s' ...
+ 	has -s ${EXEOPTIONS} && die "Never call exeopts() with -s"
+ }
+ 
+ libopts() {
+ 	export LIBOPTIONS="$@"
+ 
+ 	# `install` should never be called with '-s' ...
+ 	has -s ${LIBOPTIONS} && die "Never call libopts() with -s"
+ }
+ 
+ docompress() {
+ 	has "${EAPI}" 0 1 2 3 && die "'docompress' not supported in this EAPI"
+ 
+ 	local f g
+ 	if [[ $1 = "-x" ]]; then
+ 		shift
+ 		for f; do
+ 			f=$(strip_duplicate_slashes "${f}"); f=${f%/}
+ 			[[ ${f:0:1} = / ]] || f="/${f}"
+ 			for g in "${PORTAGE_DOCOMPRESS_SKIP[@]}"; do
+ 				[[ ${f} = "${g}" ]] && continue 2
+ 			done
+ 			PORTAGE_DOCOMPRESS_SKIP[${#PORTAGE_DOCOMPRESS_SKIP[@]}]=${f}
+ 		done
+ 	else
+ 		for f; do
+ 			f=$(strip_duplicate_slashes "${f}"); f=${f%/}
+ 			[[ ${f:0:1} = / ]] || f="/${f}"
+ 			for g in "${PORTAGE_DOCOMPRESS[@]}"; do
+ 				[[ ${f} = "${g}" ]] && continue 2
+ 			done
+ 			PORTAGE_DOCOMPRESS[${#PORTAGE_DOCOMPRESS[@]}]=${f}
+ 		done
+ 	fi
+ }
+ 
+ # adds ".keep" files so that dirs aren't auto-cleaned
+ keepdir() {
+ 	dodir "$@"
+ 	local x
+ 	if [ "$1" == "-R" ] || [ "$1" == "-r" ]; then
+ 		shift
+ 		find "$@" -type d -printf "${D}%p/.keep_${CATEGORY}_${PN}-${SLOT}\n" \
+ 			| tr "\n" "\0" | \
+ 			while read -r -d $'\0' ; do
+ 				>> "$REPLY" || \
+ 					die "Failed to recursively create .keep files"
+ 			done
+ 	else
+ 		for x in "$@"; do
+ 			>> "${D}${x}/.keep_${CATEGORY}_${PN}-${SLOT}" || \
+ 				die "Failed to create .keep in ${D}${x}"
+ 		done
+ 	fi
+ }
+ 
+ 
+ useq() {
+ 	has $EBUILD_PHASE prerm postrm || eqawarn \
+ 		"QA Notice: The 'useq' function is deprecated (replaced by 'use')"
+ 	use ${1}
+ }
+ 
+ usev() {
+ 	if use ${1}; then
+ 		echo "${1#!}"
+ 		return 0
+ 	fi
+ 	return 1
+ }
+ 
+ use() {
+ 	local u=$1
+ 	local found=0
+ 
+ 	# if we got something like '!flag', then invert the return value
+ 	if [[ ${u:0:1} == "!" ]] ; then
+ 		u=${u:1}
+ 		found=1
+ 	fi
+ 
+ 	if [[ $EBUILD_PHASE = depend ]] ; then
+ 		# TODO: Add a registration interface for eclasses to register
+ 		# any number of phase hooks, so that global scope eclass
+ 		# initialization can by migrated to phase hooks in new EAPIs.
+ 		# Example: add_phase_hook before pkg_setup $ECLASS_pre_pkg_setup
+ 		#if [[ -n $EAPI ]] && ! has "$EAPI" 0 1 2 3 ; then
+ 		#	die "use() called during invalid phase: $EBUILD_PHASE"
+ 		#fi
+ 		true
+ 
+ 	# Make sure we have this USE flag in IUSE
+ 	elif [[ -n $PORTAGE_IUSE && -n $EBUILD_PHASE ]] ; then
++		if [[ $u != multilib ]]; then
+ 		[[ $u =~ $PORTAGE_IUSE ]] || \
+ 			eqawarn "QA Notice: USE Flag '${u}' not" \
+ 				"in IUSE for ${CATEGORY}/${PF}"
++		fi
+ 	fi
+ 
+ 	if has ${u} ${USE} ; then
+ 		return ${found}
+ 	else
+ 		return $((!found))
+ 	fi
+ }
+ 
+ use_with() {
+ 	if [ -z "$1" ]; then
+ 		echo "!!! use_with() called without a parameter." >&2
+ 		echo "!!! use_with <USEFLAG> [<flagname> [value]]" >&2
+ 		return 1
+ 	fi
+ 
+ 	if ! has "${EAPI:-0}" 0 1 2 3 ; then
+ 		local UW_SUFFIX=${3+=$3}
+ 	else
+ 		local UW_SUFFIX=${3:+=$3}
+ 	fi
+ 	local UWORD=${2:-$1}
+ 
+ 	if use $1; then
+ 		echo "--with-${UWORD}${UW_SUFFIX}"
+ 	else
+ 		echo "--without-${UWORD}"
+ 	fi
+ 	return 0
+ }
+ 
+ use_enable() {
+ 	if [ -z "$1" ]; then
+ 		echo "!!! use_enable() called without a parameter." >&2
+ 		echo "!!! use_enable <USEFLAG> [<flagname> [value]]" >&2
+ 		return 1
+ 	fi
+ 
+ 	if ! has "${EAPI:-0}" 0 1 2 3 ; then
+ 		local UE_SUFFIX=${3+=$3}
+ 	else
+ 		local UE_SUFFIX=${3:+=$3}
+ 	fi
+ 	local UWORD=${2:-$1}
+ 
+ 	if use $1; then
+ 		echo "--enable-${UWORD}${UE_SUFFIX}"
+ 	else
+ 		echo "--disable-${UWORD}"
+ 	fi
+ 	return 0
+ }
+ 
+ unpack() {
+ 	local srcdir
+ 	local x
+ 	local y
+ 	local myfail
+ 	local eapi=${EAPI:-0}
+ 	[ -z "$*" ] && die "Nothing passed to the 'unpack' command"
+ 
+ 	for x in "$@"; do
+ 		vecho ">>> Unpacking ${x} to ${PWD}"
+ 		y=${x%.*}
+ 		y=${y##*.}
+ 
+ 		if [[ ${x} == "./"* ]] ; then
+ 			srcdir=""
+ 		elif [[ ${x} == ${DISTDIR%/}/* ]] ; then
+ 			die "Arguments to unpack() cannot begin with \${DISTDIR}."
+ 		elif [[ ${x} == "/"* ]] ; then
+ 			die "Arguments to unpack() cannot be absolute"
+ 		else
+ 			srcdir="${DISTDIR}/"
+ 		fi
+ 		[[ ! -s ${srcdir}${x} ]] && die "${x} does not exist"
+ 
+ 		_unpack_tar() {
+ 			if [ "${y}" == "tar" ]; then
+ 				$1 -c -- "$srcdir$x" | tar xof -
+ 				assert_sigpipe_ok "$myfail"
+ 			else
+ 				local cwd_dest=${x##*/}
+ 				cwd_dest=${cwd_dest%.*}
+ 				$1 -c -- "${srcdir}${x}" > "${cwd_dest}" || die "$myfail"
+ 			fi
+ 		}
+ 
+ 		myfail="failure unpacking ${x}"
+ 		case "${x##*.}" in
+ 			tar)
+ 				tar xof "$srcdir$x" || die "$myfail"
+ 				;;
+ 			tgz)
+ 				tar xozf "$srcdir$x" || die "$myfail"
+ 				;;
+ 			tbz|tbz2)
+ 				${PORTAGE_BUNZIP2_COMMAND:-${PORTAGE_BZIP2_COMMAND} -d} -c -- "$srcdir$x" | tar xof -
+ 				assert_sigpipe_ok "$myfail"
+ 				;;
+ 			ZIP|zip|jar)
+ 				# unzip will interactively prompt under some error conditions,
+ 				# as reported in bug #336285
+ 				( while true ; do echo n || break ; done ) | \
+ 				unzip -qo "${srcdir}${x}" || die "$myfail"
+ 				;;
+ 			gz|Z|z)
+ 				_unpack_tar "gzip -d"
+ 				;;
+ 			bz2|bz)
+ 				_unpack_tar "${PORTAGE_BUNZIP2_COMMAND:-${PORTAGE_BZIP2_COMMAND} -d}"
+ 				;;
+ 			7Z|7z)
+ 				local my_output
+ 				my_output="$(7z x -y "${srcdir}${x}")"
+ 				if [ $? -ne 0 ]; then
+ 					echo "${my_output}" >&2
+ 					die "$myfail"
+ 				fi
+ 				;;
+ 			RAR|rar)
+ 				unrar x -idq -o+ "${srcdir}${x}" || die "$myfail"
+ 				;;
+ 			LHa|LHA|lha|lzh)
+ 				lha xfq "${srcdir}${x}" || die "$myfail"
+ 				;;
+ 			a)
+ 				ar x "${srcdir}${x}" || die "$myfail"
+ 				;;
+ 			deb)
+ 				# Unpacking .deb archives can not always be done with
+ 				# `ar`.  For instance on AIX this doesn't work out.  If
+ 				# we have `deb2targz` installed, prefer it over `ar` for
+ 				# that reason.  We just make sure on AIX `deb2targz` is
+ 				# installed.
+ 				if type -P deb2targz > /dev/null; then
+ 					y=${x##*/}
+ 					local created_symlink=0
+ 					if [ ! "$srcdir$x" -ef "$y" ] ; then
+ 						# deb2targz always extracts into the same directory as
+ 						# the source file, so create a symlink in the current
+ 						# working directory if necessary.
+ 						ln -sf "$srcdir$x" "$y" || die "$myfail"
+ 						created_symlink=1
+ 					fi
+ 					deb2targz "$y" || die "$myfail"
+ 					if [ $created_symlink = 1 ] ; then
+ 						# Clean up the symlink so the ebuild
+ 						# doesn't inadvertently install it.
+ 						rm -f "$y"
+ 					fi
+ 					mv -f "${y%.deb}".tar.gz data.tar.gz || die "$myfail"
+ 				else
+ 					ar x "$srcdir$x" || die "$myfail"
+ 				fi
+ 				;;
+ 			lzma)
+ 				_unpack_tar "lzma -d"
+ 				;;
+ 			xz)
+ 				if has $eapi 0 1 2 ; then
+ 					vecho "unpack ${x}: file format not recognized. Ignoring."
+ 				else
+ 					_unpack_tar "xz -d"
+ 				fi
+ 				;;
+ 			*)
+ 				vecho "unpack ${x}: file format not recognized. Ignoring."
+ 				;;
+ 		esac
+ 	done
+ 	# Do not chmod '.' since it's probably ${WORKDIR} and PORTAGE_WORKDIR_MODE
+ 	# should be preserved.
+ 	find . -mindepth 1 -maxdepth 1 ! -type l -print0 | \
+ 		${XARGS} -0 chmod -fR a+rX,u+w,g-w,o-w
+ }
+ 
+ econf() {
+ 	local x
+ 
+ 	_hasg() {
+ 		local x s=$1
+ 		shift
+ 		for x ; do [[ ${x} == ${s} ]] && echo "${x}" && return 0 ; done
+ 		return 1
+ 	}
+ 
+ 	_hasgq() { _hasg "$@" >/dev/null ; }
+ 
+ 	local phase_func=$(_ebuild_arg_to_phase "$EAPI" "$EBUILD_PHASE")
+ 	if [[ -n $phase_func ]] ; then
+ 		if has "$EAPI" 0 1 ; then
+ 			[[ $phase_func != src_compile ]] && \
+ 				eqawarn "QA Notice: econf called in" \
+ 					"$phase_func instead of src_compile"
+ 		else
+ 			[[ $phase_func != src_configure ]] && \
+ 				eqawarn "QA Notice: econf called in" \
+ 					"$phase_func instead of src_configure"
+ 		fi
+ 	fi
+ 
+ 	: ${ECONF_SOURCE:=.}
+ 	if [ -x "${ECONF_SOURCE}/configure" ]; then
+ 		if [[ -n $CONFIG_SHELL && \
+ 			"$(head -n1 "$ECONF_SOURCE/configure")" =~ ^'#!'[[:space:]]*/bin/sh([[:space:]]|$) ]] ; then
+ 			sed -e "1s:^#![[:space:]]*/bin/sh:#!$CONFIG_SHELL:" -i "$ECONF_SOURCE/configure" || \
+ 				die "Substition of shebang in '$ECONF_SOURCE/configure' failed"
+ 		fi
+ 		if [ -e /usr/share/gnuconfig/ ]; then
+ 			find "${WORKDIR}" -type f '(' \
+ 			-name config.guess -o -name config.sub ')' -print0 | \
+ 			while read -r -d $'\0' x ; do
+ 				vecho " * econf: updating ${x/${WORKDIR}\/} with /usr/share/gnuconfig/${x##*/}"
+ 				cp -f /usr/share/gnuconfig/"${x##*/}" "${x}"
+ 			done
+ 		fi
+ 
+ 		# EAPI=4 adds --disable-dependency-tracking to econf
+ 		if ! has "$EAPI" 0 1 2 3 3_pre2 && \
+ 			"${ECONF_SOURCE}/configure" --help 2>/dev/null | \
+ 			grep -q disable-dependency-tracking ; then
+ 			set -- --disable-dependency-tracking "$@"
+ 		fi
+ 
+ 		# if the profile defines a location to install libs to aside from default, pass it on.
+ 		# if the ebuild passes in --libdir, they're responsible for the conf_libdir fun.
+ 		local CONF_LIBDIR LIBDIR_VAR="LIBDIR_${ABI}"
+ 		if [[ -n ${ABI} && -n ${!LIBDIR_VAR} ]] ; then
+ 			CONF_LIBDIR=${!LIBDIR_VAR}
+ 		fi
+ 		if [[ -n ${CONF_LIBDIR} ]] && ! _hasgq --libdir=\* "$@" ; then
+ 			export CONF_PREFIX=$(_hasg --exec-prefix=\* "$@")
+ 			[[ -z ${CONF_PREFIX} ]] && CONF_PREFIX=$(_hasg --prefix=\* "$@")
+ 			: ${CONF_PREFIX:=/usr}
+ 			CONF_PREFIX=${CONF_PREFIX#*=}
+ 			[[ ${CONF_PREFIX} != /* ]] && CONF_PREFIX="/${CONF_PREFIX}"
+ 			[[ ${CONF_LIBDIR} != /* ]] && CONF_LIBDIR="/${CONF_LIBDIR}"
+ 			set -- --libdir="$(strip_duplicate_slashes ${CONF_PREFIX}${CONF_LIBDIR})" "$@"
+ 		fi
+ 
+ 		set -- \
+ 			--prefix=/usr \
+ 			${CBUILD:+--build=${CBUILD}} \
+ 			--host=${CHOST} \
+ 			${CTARGET:+--target=${CTARGET}} \
+ 			--mandir=/usr/share/man \
+ 			--infodir=/usr/share/info \
+ 			--datadir=/usr/share \
+ 			--sysconfdir=/etc \
+ 			--localstatedir=/var/lib \
+ 			"$@" \
+ 			${EXTRA_ECONF}
+ 		vecho "${ECONF_SOURCE}/configure" "$@"
+ 
+ 		if ! "${ECONF_SOURCE}/configure" "$@" ; then
+ 
+ 			if [ -s config.log ]; then
+ 				echo
+ 				echo "!!! Please attach the following file when seeking support:"
+ 				echo "!!! ${PWD}/config.log"
+ 			fi
+ 			die "econf failed"
+ 		fi
+ 	elif [ -f "${ECONF_SOURCE}/configure" ]; then
+ 		die "configure is not executable"
+ 	else
+ 		die "no configure script found"
+ 	fi
+ }
+ 
+ einstall() {
+ 	# CONF_PREFIX is only set if they didn't pass in libdir above.
+ 	local LOCAL_EXTRA_EINSTALL="${EXTRA_EINSTALL}"
+ 	LIBDIR_VAR="LIBDIR_${ABI}"
+ 	if [ -n "${ABI}" -a -n "${!LIBDIR_VAR}" ]; then
+ 		CONF_LIBDIR="${!LIBDIR_VAR}"
+ 	fi
+ 	unset LIBDIR_VAR
+ 	if [ -n "${CONF_LIBDIR}" ] && [ "${CONF_PREFIX:+set}" = set ]; then
+ 		EI_DESTLIBDIR="${D}/${CONF_PREFIX}/${CONF_LIBDIR}"
+ 		EI_DESTLIBDIR="$(strip_duplicate_slashes ${EI_DESTLIBDIR})"
+ 		LOCAL_EXTRA_EINSTALL="libdir=${EI_DESTLIBDIR} ${LOCAL_EXTRA_EINSTALL}"
+ 		unset EI_DESTLIBDIR
+ 	fi
+ 
+ 	if [ -f ./[mM]akefile -o -f ./GNUmakefile ] ; then
+ 		if [ "${PORTAGE_DEBUG}" == "1" ]; then
+ 			${MAKE:-make} -n prefix="${D}usr" \
+ 				datadir="${D}usr/share" \
+ 				infodir="${D}usr/share/info" \
+ 				localstatedir="${D}var/lib" \
+ 				mandir="${D}usr/share/man" \
+ 				sysconfdir="${D}etc" \
+ 				${LOCAL_EXTRA_EINSTALL} \
+ 				${MAKEOPTS} ${EXTRA_EMAKE} -j1 \
+ 				"$@" install
+ 		fi
+ 		${MAKE:-make} prefix="${D}usr" \
+ 			datadir="${D}usr/share" \
+ 			infodir="${D}usr/share/info" \
+ 			localstatedir="${D}var/lib" \
+ 			mandir="${D}usr/share/man" \
+ 			sysconfdir="${D}etc" \
+ 			${LOCAL_EXTRA_EINSTALL} \
+ 			${MAKEOPTS} ${EXTRA_EMAKE} -j1 \
+ 			"$@" install || die "einstall failed"
+ 	else
+ 		die "no Makefile found"
+ 	fi
+ }
+ 
+ _eapi0_pkg_nofetch() {
+ 	[ -z "${SRC_URI}" ] && return
+ 
+ 	elog "The following are listed in SRC_URI for ${PN}:"
+ 	local x
+ 	for x in $(echo ${SRC_URI}); do
+ 		elog "   ${x}"
+ 	done
+ }
+ 
+ _eapi0_src_unpack() {
+ 	[[ -n ${A} ]] && unpack ${A}
+ }
+ 
+ _eapi0_src_compile() {
+ 	if [ -x ./configure ] ; then
+ 		econf
+ 	fi
+ 	_eapi2_src_compile
+ }
+ 
+ _eapi0_src_test() {
+ 	# Since we don't want emake's automatic die
+ 	# support (EAPI 4 and later), and we also don't
+ 	# want the warning messages that it produces if
+ 	# we call it in 'nonfatal' mode, we use emake_cmd
+ 	# to emulate the desired parts of emake behavior.
+ 	local emake_cmd="${MAKE:-make} ${MAKEOPTS} ${EXTRA_EMAKE}"
+ 	if $emake_cmd -j1 check -n &> /dev/null; then
+ 		vecho ">>> Test phase [check]: ${CATEGORY}/${PF}"
+ 		if ! $emake_cmd -j1 check; then
+ 			has test $FEATURES && die "Make check failed. See above for details."
+ 			has test $FEATURES || eerror "Make check failed. See above for details."
+ 		fi
+ 	elif $emake_cmd -j1 test -n &> /dev/null; then
+ 		vecho ">>> Test phase [test]: ${CATEGORY}/${PF}"
+ 		if ! $emake_cmd -j1 test; then
+ 			has test $FEATURES && die "Make test failed. See above for details."
+ 			has test $FEATURES || eerror "Make test failed. See above for details."
+ 		fi
+ 	else
+ 		vecho ">>> Test phase [none]: ${CATEGORY}/${PF}"
+ 	fi
+ }
+ 
+ _eapi1_src_compile() {
+ 	_eapi2_src_configure
+ 	_eapi2_src_compile
+ }
+ 
+ _eapi2_src_configure() {
+ 	if [[ -x ${ECONF_SOURCE:-.}/configure ]] ; then
+ 		econf
+ 	fi
+ }
+ 
+ _eapi2_src_compile() {
+ 	if [ -f Makefile ] || [ -f GNUmakefile ] || [ -f makefile ]; then
+ 		emake || die "emake failed"
+ 	fi
+ }
+ 
+ _eapi4_src_install() {
+ 	if [[ -f Makefile || -f GNUmakefile || -f makefile ]] ; then
+ 		emake DESTDIR="${D}" install
+ 	fi
+ 
+ 	if ! declare -p DOCS &>/dev/null ; then
+ 		local d
+ 		for d in README* ChangeLog AUTHORS NEWS TODO CHANGES \
+ 				THANKS BUGS FAQ CREDITS CHANGELOG ; do
+ 			[[ -s "${d}" ]] && dodoc "${d}"
+ 		done
+ 	elif [[ $(declare -p DOCS) == "declare -a "* ]] ; then
+ 		dodoc "${DOCS[@]}"
+ 	else
+ 		dodoc ${DOCS}
+ 	fi
+ }
+ 
+ # Return true if given package is installed. Otherwise return false.
+ # Takes single depend-type atoms.
+ has_version() {
+ 
+ 	if [[ -n $PORTAGE_IPC_DAEMON ]] ; then
+ 		"$PORTAGE_BIN_PATH"/ebuild-ipc has_version "$ROOT" "$1"
+ 	else
+ 		PYTHONPATH=${PORTAGE_PYM_PATH}${PYTHONPATH:+:}${PYTHONPATH} \
+ 		"${PORTAGE_PYTHON:-/usr/bin/python}" "${PORTAGE_BIN_PATH}/portageq" has_version "${ROOT}" "$1"
+ 	fi
+ 	local retval=$?
+ 	case "${retval}" in
+ 		0|1)
+ 			return ${retval}
+ 			;;
+ 		*)
+ 			die "unexpected portageq exit code: ${retval}"
+ 			;;
+ 	esac
+ }
+ 
+ # Returns the best/most-current match.
+ # Takes single depend-type atoms.
+ best_version() {
+ 
+ 	if [[ -n $PORTAGE_IPC_DAEMON ]] ; then
+ 		"$PORTAGE_BIN_PATH"/ebuild-ipc best_version "$ROOT" "$1"
+ 	else
+ 		PYTHONPATH=${PORTAGE_PYM_PATH}${PYTHONPATH:+:}${PYTHONPATH} \
+ 		"${PORTAGE_PYTHON:-/usr/bin/python}" "${PORTAGE_BIN_PATH}/portageq" best_version "${ROOT}" "$1"
+ 	fi
+ 	local retval=$?
+ 	case "${retval}" in
+ 		0|1)
+ 			return ${retval}
+ 			;;
+ 		*)
+ 			die "unexpected portageq exit code: ${retval}"
+ 			;;
+ 	esac
+ }



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2011-10-01 13:56 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2011-10-01 13:56 UTC (permalink / raw
  To: gentoo-commits

commit:     a173ae4f96adebc538b3acd1c9814ca7c126b667
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sat Oct  1 13:54:56 2011 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sat Oct  1 13:54:56 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=a173ae4f

Merge commit 'v2.2.0_alpha60' into multilib


 bin/archive-conf                                   |    2 +-
 bin/dispatch-conf                                  |   33 +
 bin/ebuild                                         |    6 +-
 bin/emerge-webrsync                                |    1 +
 bin/etc-update                                     |   11 +-
 bin/misc-functions.sh                              |   35 +-
 bin/portageq                                       |   48 +-
 bin/repoman                                        |   40 +-
 cnf/dispatch-conf.conf                             |   10 +-
 cnf/etc-update.conf                                |   12 +-
 man/emerge.1                                       |   21 +-
 man/make.conf.5                                    |    4 -
 man/portage.5                                      |    3 +
 pym/_emerge/EbuildFetcher.py                       |   21 +-
 pym/_emerge/actions.py                             |    3 +-
 pym/_emerge/create_depgraph_params.py              |   16 +
 pym/_emerge/depgraph.py                            |  170 ++++-
 pym/_emerge/help.py                                |  794 +-------------------
 pym/_emerge/main.py                                |   40 +-
 pym/_emerge/resolver/backtracking.py               |   25 +
 pym/_emerge/resolver/output_helpers.py             |    4 +-
 pym/portage/const.py                               |    1 -
 pym/portage/dbapi/__init__.py                      |  106 ++--
 pym/portage/dbapi/porttree.py                      |  328 +++++----
 pym/portage/dbapi/vartree.py                       |   37 +-
 pym/portage/dep/__init__.py                        |    9 +
 pym/portage/manifest.py                            |   15 +-
 pym/portage/package/ebuild/config.py               |    4 +-
 pym/portage/package/ebuild/digestcheck.py          |    3 +-
 pym/portage/package/ebuild/digestgen.py            |    6 +
 pym/portage/package/ebuild/doebuild.py             |   11 +-
 pym/portage/package/ebuild/fetch.py                |    1 -
 pym/portage/package/ebuild/getmaskingstatus.py     |    4 +-
 pym/portage/repository/config.py                   |   24 +-
 pym/portage/tests/emerge/test_simple.py            |    9 +
 pym/portage/tests/resolver/ResolverPlayground.py   |   22 +-
 pym/portage/tests/resolver/test_autounmask.py      |  103 +++
 pym/portage/tests/resolver/test_backtracking.py    |   43 ++
 .../tests/resolver/test_circular_choices.py        |   61 ++
 pym/portage/tests/resolver/test_complete_graph.py  |   66 ++
 pym/portage/tests/resolver/test_virtual_slot.py    |   49 ++
 pym/portage/util/env_update.py                     |   31 +-
 pym/repoman/herdbase.py                            |    4 -
 43 files changed, 1053 insertions(+), 1183 deletions(-)



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2011-10-07 12:41 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2011-10-07 12:41 UTC (permalink / raw
  To: gentoo-commits

commit:     54fbc12eec26f21aaa4a993167b51ba963cdf04f
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Fri Oct  7 12:40:39 2011 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Fri Oct  7 12:40:39 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=54fbc12e

Merge commit 'v2.2.0_alpha62' into multilib


 bin/dispatch-conf                                  |    2 +-
 bin/repoman                                        |   65 ++-
 pym/_emerge/depgraph.py                            |   17 +-
 pym/_emerge/resolver/output.py                     |    2 +
 pym/portage/cache/template.py                      |    1 +
 pym/portage/checksum.py                            |   75 ++-
 pym/portage/const.py                               |   31 +-
 pym/portage/dbapi/porttree.py                      |   15 +-
 pym/portage/dbapi/vartree.py                       |    7 +-
 pym/portage/dep/__init__.py                        |   45 ++-
 pym/portage/elog/messages.py                       |    1 +
 pym/portage/manifest.py                            |   48 +-
 pym/portage/output.py                              |   12 +-
 .../package/ebuild/_config/KeywordsManager.py      |   16 +-
 pym/portage/repository/config.py                   |   69 ++-
 pym/portage/tests/dep/test_best_match_to_list.py   |   28 +-
 pym/portage/tests/ebuild/test_config.py            |    1 +
 pym/portage/tests/resolver/ResolverPlayground.py   |    8 +-
 pym/portage/tests/resolver/test_keywords.py        |  356 +++++++++
 .../tests/resolver/test_virtual_transition.py      |   51 ++
 pym/portage/tests/util/test_whirlpool.py           |   16 +
 pym/portage/util/whirlpool.py                      |  794 ++++++++++++++++++++
 22 files changed, 1554 insertions(+), 106 deletions(-)



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2011-10-08  8:34 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2011-10-08  8:34 UTC (permalink / raw
  To: gentoo-commits

commit:     f783fc9318abfb1f2265967aeb26c8eb7d257de5
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sat Oct  8 08:34:22 2011 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sat Oct  8 08:34:22 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=f783fc93

Merge commit 'v2.2.0_alpha63' into multilib


 bin/repoman |   20 +++++++++++---------
 1 files changed, 11 insertions(+), 9 deletions(-)



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2011-10-09 10:33 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2011-10-09 10:33 UTC (permalink / raw
  To: gentoo-commits

commit:     91d13883d0d18da99feaa5768dd97031a6258a56
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sun Oct  9 10:32:51 2011 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun Oct  9 10:32:51 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=91d13883

Merge commit 'v2.2.0_alpha64' into multilib


 bin/repoman                   |    2 +-
 pym/portage/mail.py           |    3 +--
 pym/portage/util/whirlpool.py |   12 ++++++------
 3 files changed, 8 insertions(+), 9 deletions(-)



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2011-10-12 16:28 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2011-10-12 16:28 UTC (permalink / raw
  To: gentoo-commits

commit:     5fdebfee5f5aded3373e1c1c81ccf26f56115448
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Wed Oct 12 16:28:01 2011 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Wed Oct 12 16:28:01 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=5fdebfee

Merge commit 'v2.2.0_alpha67' into multilib


 bin/ebuild                                        |   12 ++-
 bin/ebuild-helpers/prepstrip                      |  157 ++++++++++++++-------
 cnf/make.globals                                  |    2 +-
 man/emerge.1                                      |   14 ++
 man/make.conf.5                                   |    5 -
 man/portage.5                                     |    7 +
 pym/_emerge/EbuildBuild.py                        |   13 +-
 pym/_emerge/FakeVartree.py                        |   12 +-
 pym/_emerge/Scheduler.py                          |    3 +-
 pym/_emerge/create_depgraph_params.py             |    4 +
 pym/_emerge/depgraph.py                           |   39 +++++-
 pym/_emerge/main.py                               |    6 +
 pym/portage/_global_updates.py                    |    3 +-
 pym/portage/const.py                              |    2 +-
 pym/portage/elog/__init__.py                      |   20 ++-
 pym/portage/elog/mod_syslog.py                    |    9 +-
 pym/portage/package/ebuild/_config/MaskManager.py |   45 ++++++-
 pym/portage/package/ebuild/doebuild.py            |   23 ++-
 pym/portage/package/ebuild/fetch.py               |   26 ++--
 pym/portage/repository/config.py                  |   26 +++-
 pym/portage/tests/__init__.py                     |  118 +++++++++-------
 pym/portage/tests/bin/setup_env.py                |    3 +
 pym/portage/tests/bin/test_dodir.py               |    2 +
 pym/portage/tests/runTests                        |    4 +-
 runtests.sh                                       |    3 +
 25 files changed, 389 insertions(+), 169 deletions(-)



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2011-10-21 13:57 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2011-10-21 13:57 UTC (permalink / raw
  To: gentoo-commits

commit:     236e798f6d5598fc3381a764c2b33ff8bb1c3ec8
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Fri Oct 21 13:56:28 2011 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Fri Oct 21 13:56:28 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=236e798f

Merge commit 'v2.2.0_alpha69' into multilib


 RELEASE-NOTES                                      |    6 +
 bin/ebuild                                         |    7 +-
 bin/egencache                                      |   14 +-
 bin/fixpackages                                    |    9 +-
 bin/misc-functions.sh                              |    4 +
 bin/portageq                                       |   43 ++-
 bin/quickpkg                                       |   53 ++-
 bin/repoman                                        |  480 +++++++++++---------
 man/ebuild.5                                       |    6 +
 man/emerge.1                                       |   17 +-
 man/repoman.1                                      |    9 +-
 man/xpak.5                                         |  253 +++++------
 pym/_emerge/EbuildBuild.py                         |    3 +-
 pym/_emerge/EbuildMetadataPhase.py                 |   35 +-
 pym/_emerge/MetadataRegen.py                       |   13 +-
 pym/_emerge/Scheduler.py                           |    7 +-
 pym/_emerge/actions.py                             |   48 +--
 pym/_emerge/main.py                                |   28 +-
 pym/portage/_global_updates.py                     |    8 +-
 pym/portage/cache/ebuild_xattr.py                  |    3 +-
 pym/portage/cache/flat_hash.py                     |    9 +-
 pym/portage/cache/metadata.py                      |    7 +-
 pym/portage/cache/metadata_overlay.py              |  105 -----
 pym/portage/cache/template.py                      |   94 +++-
 pym/portage/cache/util.py                          |  170 -------
 pym/portage/cache/volatile.py                      |    3 +-
 pym/portage/checksum.py                            |    4 +-
 pym/portage/dbapi/porttree.py                      |  158 ++++---
 pym/portage/eclass_cache.py                        |   82 +++-
 .../package/ebuild/_config/special_env_vars.py     |    4 +-
 pym/portage/package/ebuild/config.py               |   27 +-
 pym/portage/package/ebuild/digestcheck.py          |    2 +
 pym/portage/package/ebuild/doebuild.py             |   45 ++-
 pym/portage/repository/config.py                   |   52 ++-
 pym/portage/tests/emerge/test_simple.py            |   48 ++-
 pym/portage/tests/repoman/test_simple.py           |   96 ++++-
 pym/repoman/utilities.py                           |  189 ++++++++-
 37 files changed, 1230 insertions(+), 911 deletions(-)



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2011-10-23 11:05 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2011-10-23 11:05 UTC (permalink / raw
  To: gentoo-commits

commit:     d03a7327d9c6951c2a36461fefe2dde71709d5cf
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sun Oct 23 11:05:32 2011 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun Oct 23 11:05:32 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=d03a7327

Merge v2.2.0_alpha70


 bin/misc-functions.sh                    |   12 +-
 bin/repoman                              |   16 +-
 man/portage.5                            |    4 +-
 pym/_emerge/depgraph.py                  |   15 +-
 pym/_emerge/resolver/output.py           |   23 ++-
 pym/portage/dbapi/bintree.py             |   28 ++++
 pym/portage/repository/config.py         |    6 +-
 pym/portage/tests/repoman/test_simple.py |   43 +++++-
 pym/repoman/utilities.py                 |  244 ++++++++++++++++++++++++------
 9 files changed, 308 insertions(+), 83 deletions(-)

diff --cc bin/misc-functions.sh
index 17932e1,55d9663..80d88c7
--- a/bin/misc-functions.sh
+++ b/bin/misc-functions.sh
@@@ -145,8 -144,8 +145,8 @@@ prepcompress() 
  }
  
  install_qa_check() {
- 	local f x
+ 	local f i x
 -
 +	[[ -d "${D}" ]] || return 0
  	cd "${D}" || die "cd failed"
  
  	export STRIP_MASK



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2011-10-23 11:05 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2011-10-23 11:05 UTC (permalink / raw
  To: gentoo-commits

commit:     7a2867753bca22f6655ab4760950c0a8be6c8ef7
Author:     Fabian Groffen <grobian <AT> gentoo <DOT> org>
AuthorDate: Thu Oct 20 20:40:06 2011 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Thu Oct 20 20:40:06 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=7a286775

Merge branch 'master' of git+ssh://git.overlays.gentoo.org/proj/portage


 pym/portage/tests/repoman/test_simple.py |   18 ++++++++++++++----
 1 files changed, 14 insertions(+), 4 deletions(-)



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2011-10-24 18:54 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2011-10-24 18:54 UTC (permalink / raw
  To: gentoo-commits

commit:     830a6dd2b58e88c7d0c782900067918c08270bc7
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Mon Oct 24 18:54:26 2011 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Mon Oct 24 18:54:26 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=830a6dd2

Merge commit 'v2.2.0_alpha71' into multilib


 man/repoman.1                                   |    5 ++-
 pym/_emerge/main.py                             |    3 +-
 pym/portage/tests/emerge/test_global_updates.py |   39 +++++++++++++++++++++++
 pym/portage/update.py                           |    5 +++
 4 files changed, 50 insertions(+), 2 deletions(-)



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2011-10-31 19:53 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2011-10-31 19:53 UTC (permalink / raw
  To: gentoo-commits

commit:     0fe2340f8bb892447768b64dfe2970a7be760107
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Mon Oct 31 19:52:01 2011 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Mon Oct 31 19:52:01 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=0fe2340f

Merge commit 'v2.2.0_alpha72' into multilib


 bin/ebuild                                         |    4 +-
 bin/egencache                                      |   87 ++++--
 bin/emaint                                         |   22 +-
 bin/glsa-check                                     |    5 +-
 bin/lock-helper.py                                 |    4 +-
 bin/portageq                                       |   81 +++--
 bin/quickpkg                                       |   24 +-
 bin/regenworld                                     |    5 +-
 bin/repoman                                        |   11 +-
 bin/xpak-helper.py                                 |    4 +-
 man/emerge.1                                       |    4 +
 man/make.conf.5                                    |    9 +-
 man/portage.5                                      |   12 +-
 pym/_emerge/BlockerDB.py                           |    5 +-
 pym/_emerge/EbuildFetchonly.py                     |    4 +-
 pym/_emerge/EbuildMetadataPhase.py                 |    6 +-
 pym/_emerge/FakeVartree.py                         |   11 +-
 pym/_emerge/Package.py                             |    8 +-
 pym/_emerge/RootConfig.py                          |    2 +-
 pym/_emerge/Scheduler.py                           |   17 +-
 pym/_emerge/actions.py                             |  304 +++++++----------
 pym/_emerge/depgraph.py                            |   33 +-
 pym/_emerge/main.py                                |   46 ++-
 pym/_emerge/unmerge.py                             |    4 +-
 pym/portage/__init__.py                            |   42 ++-
 pym/portage/_global_updates.py                     |    2 +-
 pym/portage/_legacy_globals.py                     |   12 +-
 pym/portage/_sets/__init__.py                      |   38 ++-
 pym/portage/cache/metadata.py                      |    1 -
 pym/portage/cache/template.py                      |    5 +
 pym/portage/checksum.py                            |   41 ++-
 pym/portage/dbapi/_expand_new_virt.py              |    3 +-
 pym/portage/dbapi/bintree.py                       |   35 ++-
 pym/portage/dbapi/porttree.py                      |   43 ++-
 pym/portage/dbapi/vartree.py                       |  110 +++++--
 pym/portage/dep/dep_check.py                       |    8 +-
 pym/portage/elog/mod_syslog.py                     |    2 +-
 pym/portage/news.py                                |   74 ++++-
 .../package/ebuild/_config/KeywordsManager.py      |    6 +-
 .../package/ebuild/_config/LocationsManager.py     |   83 ++++-
 pym/portage/package/ebuild/_config/MaskManager.py  |   37 ++-
 pym/portage/package/ebuild/_config/UseManager.py   |   18 +-
 pym/portage/package/ebuild/config.py               |   96 +++---
 pym/portage/package/ebuild/digestcheck.py          |    2 +-
 pym/portage/package/ebuild/doebuild.py             |   25 +-
 pym/portage/repository/config.py                   |  358 +++++++++++++-------
 pym/portage/tests/ebuild/test_config.py            |    8 +-
 pym/portage/tests/ebuild/test_doebuild_spawn.py    |    2 +-
 pym/portage/tests/emerge/test_simple.py            |   39 ++-
 pym/portage/tests/repoman/test_simple.py           |    2 +-
 pym/portage/tests/resolver/ResolverPlayground.py   |   27 +-
 pym/portage/util/__init__.py                       |   11 +-
 pym/portage/util/env_update.py                     |   13 +-
 pym/repoman/utilities.py                           |    4 +
 runtests.sh                                        |   20 ++
 55 files changed, 1203 insertions(+), 676 deletions(-)

diff --cc pym/_emerge/actions.py
index d8f9032,af3780e..66204b6
--- a/pym/_emerge/actions.py
+++ b/pym/_emerge/actions.py
@@@ -1464,11 -1468,7 +1468,8 @@@ def action_info(settings, trees, myopts
  
  	myvars = portage.util.unique_array(myvars)
  	use_expand = settings.get('USE_EXPAND', '').split()
 +	use_expand.append("MULTILIB_ABIS")
  	use_expand.sort()
- 	use_expand_hidden = set(
- 		settings.get('USE_EXPAND_HIDDEN', '').upper().split())
- 	alphabetical_use = '--alphabetical' in myopts
  	unset_vars = []
  	myvars.sort()
  	for k in myvars:
diff --cc pym/_emerge/main.py
index e5ba5e1,52e4c42..534d0ea
--- a/pym/_emerge/main.py
+++ b/pym/_emerge/main.py
@@@ -1639,16 -1642,11 +1642,16 @@@ def emerge_main(args=None)
  	adjust_configs(myopts, trees)
  	apply_priorities(settings)
  
 +	if settings.get("NO_AUTO_FLAG", "") is "":
 +		writemsg_level(bad("!!! Failed to find vars from extra profile") + "\n",level=logging.ERROR, noiselevel=-1)
 +		writemsg_level(bad("!!! Please make sure that you did follow the instructions and included the extra profile\n"),level=logging.ERROR, noiselevel=-1)
 +		return 1
 +
  	if myaction == 'version':
  		writemsg_stdout(getportageversion(
- 			settings["PORTDIR"], settings["ROOT"],
+ 			settings["PORTDIR"], None,
  			settings.profile_path, settings["CHOST"],
- 			trees[settings["ROOT"]]["vartree"].dbapi) + '\n', noiselevel=-1)
+ 			trees[settings['EROOT']]['vartree'].dbapi) + '\n', noiselevel=-1)
  		return 0
  	elif myaction == 'help':
  		_emerge.help.help()
diff --cc pym/portage/package/ebuild/config.py
index ceb5154,765a4f7..ee6253f
--- a/pym/portage/package/ebuild/config.py
+++ b/pym/portage/package/ebuild/config.py
@@@ -424,16 -430,14 +430,16 @@@ class config(object)
  				mygcfg_dlists = [getconfig(os.path.join(x, "make.defaults"),
  					expand=expand_map) for x in self.profiles]
  				self._make_defaults = mygcfg_dlists
- 				self.mygcfg = stack_dicts(mygcfg_dlists,
+ 				mygcfg = stack_dicts(mygcfg_dlists,
  					incrementals=self.incrementals)
- 				if self.mygcfg is None:
- 					self.mygcfg = {}
- 			self.configlist.append(self.mygcfg)
+ 				if mygcfg is None:
+ 					mygcfg = {}
+ 			self.configlist.append(mygcfg)
  			self.configdict["defaults"]=self.configlist[-1]
 +			if self.configdict["defaults"].get("MULTILIB_ABIS", "").count(' ') != 0:
 +				self.configdict["defaults"]["USE"] = self.configdict["defaults"].get("USE", "") + " multilib_abi_" + self.configdict["defaults"].get("DEFAULT_ABI", "")
  
- 			self.mygcfg = getconfig(
+ 			mygcfg = getconfig(
  				os.path.join(config_root, MAKE_CONF_FILE),
  				tolerant=tolerant, allow_sourcing=True,
  				expand=expand_map) or {}



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2011-11-11 22:52 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2011-11-11 22:52 UTC (permalink / raw
  To: gentoo-commits

commit:     2e4b2de0c7d37d0ddae04507c47aa2af84e3862a
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Fri Nov 11 22:51:57 2011 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Fri Nov 11 22:51:57 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=2e4b2de0

Merge 2.2_alpha74


 RELEASE-NOTES                                      |    5 +
 bin/dohtml.py                                      |   12 +-
 bin/ebuild-helpers/dobin                           |    8 +-
 bin/ebuild-helpers/dodir                           |    6 +-
 bin/ebuild-helpers/dodoc                           |    4 +-
 bin/ebuild-helpers/doexe                           |   10 +-
 bin/ebuild-helpers/dohard                          |    8 +-
 bin/ebuild-helpers/doinfo                          |   10 +-
 bin/ebuild-helpers/doins                           |   16 +-
 bin/ebuild-helpers/dolib                           |    6 +-
 bin/ebuild-helpers/doman                           |    8 +-
 bin/ebuild-helpers/domo                            |   11 +-
 bin/ebuild-helpers/dosbin                          |   10 +-
 bin/ebuild-helpers/dosed                           |    8 +-
 bin/ebuild-helpers/dosym                           |   10 +-
 bin/ebuild-helpers/ecompressdir                    |   31 ++--
 bin/ebuild-helpers/fowners                         |    6 +-
 bin/ebuild-helpers/fperms                          |    5 +-
 bin/ebuild-helpers/prepall                         |   10 +-
 bin/ebuild-helpers/prepalldocs                     |    7 +-
 bin/ebuild-helpers/prepallinfo                     |    6 +-
 bin/ebuild-helpers/prepallman                      |    6 +-
 bin/ebuild-helpers/prepallstrip                    |    6 +-
 bin/ebuild-helpers/prepinfo                        |    8 +-
 bin/ebuild-helpers/preplib                         |    8 +-
 bin/ebuild-helpers/prepman                         |   10 +-
 bin/ebuild-helpers/prepstrip                       |   26 ++-
 bin/ebuild.sh                                      |   47 +---
 bin/isolated-functions.sh                          |   27 +--
 bin/misc-functions.sh                              |  239 ++++++++++++++++----
 bin/phase-functions.sh                             |   16 +-
 bin/phase-helpers.sh                               |  112 ++++++----
 bin/save-ebuild-env.sh                             |   11 +-
 man/emerge.1                                       |   11 +-
 pym/_emerge/actions.py                             |    2 +-
 pym/_emerge/depgraph.py                            |   15 +-
 pym/_emerge/main.py                                |   46 +++--
 pym/_emerge/resolver/circular_dependency.py        |    5 +-
 pym/_emerge/resolver/output_helpers.py             |   49 +++--
 pym/_emerge/resolver/slot_collision.py             |    2 +-
 pym/portage/dbapi/bintree.py                       |    5 +-
 pym/portage/dbapi/vartree.py                       |    2 +-
 .../package/ebuild/_config/special_env_vars.py     |    3 +-
 pym/portage/package/ebuild/doebuild.py             |   79 ++++++-
 pym/portage/tests/bin/setup_env.py                 |    1 +
 pym/portage/tests/emerge/test_simple.py            |   39 +++-
 pym/portage/tests/resolver/test_multislot.py       |    4 +-
 runtests.sh                                        |    2 +-
 48 files changed, 649 insertions(+), 329 deletions(-)

diff --cc bin/misc-functions.sh
index 80d88c7,1c11dc5..cb95f6a
--- a/bin/misc-functions.sh
+++ b/bin/misc-functions.sh
@@@ -17,8 -17,8 +17,9 @@@ shift $
  source "${PORTAGE_BIN_PATH:-/usr/lib/portage/bin}/ebuild.sh"
  
  install_symlink_html_docs() {
- 	[[ -e "${D}" ]] || return 0
- 	cd "${D}" || die "cd failed"
+ 	case "$EAPI" in 0|1|2) local ED=${D} ;; esac
++	[[ -e "${ED}" ]] || return 0
+ 	cd "${ED}" || die "cd failed"
  	#symlink the html documentation (if DOC_SYMLINKS_DIR is set in make.conf)
  	if [ -n "${DOC_SYMLINKS_DIR}" ] ; then
  		local mydocdir docdir
@@@ -146,8 -147,9 +148,10 @@@ prepcompress() 
  
  install_qa_check() {
  	local f i x
- 	[[ -d "${D}" ]] || return 0
- 	cd "${D}" || die "cd failed"
+ 	case "$EAPI" in 0|1|2) local ED=${D} ;; esac
+ 
++	[[ -d "${ED}" ]] || return 0
+ 	cd "${ED}" || die "cd failed"
  
  	export STRIP_MASK
  	prepall
diff --cc bin/phase-functions.sh
index 1922aa6,f46368d..122faeb
--- a/bin/phase-functions.sh
+++ b/bin/phase-functions.sh
@@@ -590,11 -498,12 +590,15 @@@ dyn_install() 
  	fi
  	trap "abort_install" SIGINT SIGQUIT
  	ebuild_phase pre_src_install
- 	rm -rf "${PORTAGE_BUILDDIR}/image"
- 	is_auto-multilib && rm -rf "${PORTAGE_BUILDDIR}"/image.${ABI}
- 	mkdir "${PORTAGE_BUILDDIR}/image"
- 	for LOOP_ABI in $(get_abi_list); do
+ 
+ 	_x=${ED}
+ 	case "$EAPI" in 0|1|2) _x=${D} ;; esac
+ 	rm -rf "${D}"
++	is_auto-multilib && rm -rf "${D}".${ABI}
+ 	mkdir -p "${_x}"
+ 	unset _x
++	for LOOP_ABI in $(get_abi_list); do                                                                                                                                                                                                                                                                                
 +		is_ebuild && { set_abi ${LOOP_ABI}; source "${T}"/environment || die ; }
  
  	if [[ -d $S ]] ; then
  		cd "${S}"



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2011-11-18 23:27 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2011-11-18 23:27 UTC (permalink / raw
  To: gentoo-commits

commit:     73e829f92b1d85874fa62ee39d0aeee092521d07
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Fri Nov 18 23:25:45 2011 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Fri Nov 18 23:25:45 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=73e829f9

Merge commit 'v2.2.0_alpha75' into multilib


 cnf/make.conf                           |    2 +-
 pym/_emerge/JobStatusDisplay.py         |    9 ++++-
 pym/_emerge/Scheduler.py                |   63 ++++++++++++++++++++-----------
 pym/_emerge/actions.py                  |    2 +-
 pym/_emerge/main.py                     |    3 -
 pym/portage/checksum.py                 |   12 +++++-
 pym/portage/tests/emerge/test_simple.py |    4 ++
 7 files changed, 65 insertions(+), 30 deletions(-)



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2011-11-19 14:25 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2011-11-19 14:25 UTC (permalink / raw
  To: gentoo-commits

commit:     f4a14182fed2fc42054755296ee434c81e8baca6
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sat Nov 19 14:25:03 2011 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sat Nov 19 14:25:03 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=f4a14182

Merge commit 'v2.2.0_alpha76' into multilib


 pym/_emerge/Scheduler.py                       |  141 ++++++------------------
 pym/_emerge/depgraph.py                        |   11 --
 pym/_emerge/main.py                            |   14 ++-
 pym/_emerge/resolver/output.py                 |   28 +----
 pym/_emerge/resolver/output_helpers.py         |    4 +-
 pym/portage/dbapi/_MergeProcess.py             |   58 ----------
 pym/portage/elog/messages.py                   |   33 ++++--
 pym/portage/package/ebuild/config.py           |   59 ++++++----
 pym/portage/package/ebuild/doebuild.py         |   55 +++++++++-
 pym/portage/tests/resolver/test_merge_order.py |    8 --
 10 files changed, 167 insertions(+), 244 deletions(-)



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2011-11-26 14:03 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2011-11-26 14:03 UTC (permalink / raw
  To: gentoo-commits

commit:     82eef59c7b5770ae8a147e55a2f5d282ea6b0c26
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sat Nov 26 14:03:14 2011 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sat Nov 26 14:03:14 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=82eef59c

Merge commit 'v2.2.0_alpha78' into multilib


 bin/emerge-webrsync                  |    2 +-
 bin/repoman                          |    1 +
 man/emerge.1                         |    5 ++++
 pym/_emerge/help.py                  |    2 +-
 pym/portage/dbapi/vartree.py         |    2 +-
 pym/portage/elog/mod_syslog.py       |    5 ++++
 pym/portage/package/ebuild/config.py |   45 +++++++++++++++++----------------
 pym/repoman/utilities.py             |    4 +++
 8 files changed, 41 insertions(+), 25 deletions(-)



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2011-12-07 21:31 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2011-12-07 21:31 UTC (permalink / raw
  To: gentoo-commits

commit:     4f06140c585394bc9850eb424af135447e66731d
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Wed Dec  7 21:31:21 2011 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Wed Dec  7 21:31:21 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=4f06140c

Merge commit 'v2.2.0_alpha79' into multilib


 pym/_emerge/depgraph.py      |   35 ++++++++++++++++++++++-------------
 pym/portage/dbapi/vartree.py |    2 +-
 2 files changed, 23 insertions(+), 14 deletions(-)



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2011-12-16 16:30 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2011-12-16 16:30 UTC (permalink / raw
  To: gentoo-commits

commit:     93e622fba8e61722fe5fbdab0f9c29eef7c73e6f
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Fri Dec 16 16:29:07 2011 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Fri Dec 16 16:29:07 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=93e622fb

Merge v2.2.0_alpha81


 bin/chpathtool.py                                  |  182 ++++++++++++++++
 bin/dispatch-conf                                  |    5 +-
 bin/ebuild-helpers/dobin                           |    5 +-
 bin/ebuild-helpers/dodir                           |    3 +-
 bin/ebuild-helpers/dodoc                           |    3 +-
 bin/ebuild-helpers/doexe                           |    3 +-
 bin/ebuild-helpers/dohard                          |    3 +-
 bin/ebuild-helpers/doinfo                          |    3 +-
 bin/ebuild-helpers/doins                           |    3 +-
 bin/ebuild-helpers/dolib                           |    3 +-
 bin/ebuild-helpers/doman                           |    3 +-
 bin/ebuild-helpers/domo                            |    3 +-
 bin/ebuild-helpers/dosbin                          |    3 +-
 bin/ebuild-helpers/dosed                           |    3 +-
 bin/ebuild-helpers/dosym                           |    3 +-
 bin/ebuild-helpers/ecompressdir                    |    3 +-
 bin/ebuild-helpers/fowners                         |    3 +-
 bin/ebuild-helpers/fperms                          |    4 +-
 bin/ebuild-helpers/prepall                         |    3 +-
 bin/ebuild-helpers/prepalldocs                     |    3 +-
 bin/ebuild-helpers/prepallinfo                     |    3 +-
 bin/ebuild-helpers/prepallman                      |    3 +-
 bin/ebuild-helpers/prepallstrip                    |    3 +-
 bin/ebuild-helpers/prepinfo                        |    3 +-
 bin/ebuild-helpers/preplib                         |    3 +-
 bin/ebuild-helpers/prepman                         |    3 +-
 bin/ebuild-helpers/prepstrip                       |    3 +-
 bin/ebuild-ipc.py                                  |   38 +++-
 bin/ebuild.sh                                      |   32 ++--
 bin/egencache                                      |    8 +-
 bin/emerge-webrsync                                |    2 +
 bin/etc-update                                     |   10 +-
 bin/lock-helper.py                                 |    1 +
 bin/misc-functions.sh                              |   24 ++-
 bin/phase-functions.sh                             |   27 ++-
 bin/phase-helpers.sh                               |   27 ++-
 bin/portageq                                       |    6 +-
 bin/repoman                                        |   14 +-
 cnf/dispatch-conf.conf                             |    2 +-
 cnf/make.conf                                      |    8 +-
 cnf/make.globals                                   |   18 +-
 doc/config/sets.docbook                            |    2 +-
 man/emerge.1                                       |   25 ++-
 man/fixpackages.1                                  |   15 ++
 man/make.conf.5                                    |   16 ++-
 pym/_emerge/AbstractEbuildProcess.py               |   16 ++-
 pym/_emerge/AsynchronousLock.py                    |   43 +++--
 pym/_emerge/Binpkg.py                              |   75 ++++++-
 pym/_emerge/BinpkgEnvExtractor.py                  |    4 +-
 pym/_emerge/EbuildMetadataPhase.py                 |   23 ++-
 pym/_emerge/FifoIpcDaemon.py                       |   16 +-
 pym/_emerge/PipeReader.py                          |   35 ++--
 pym/_emerge/Scheduler.py                           |    2 +-
 pym/_emerge/SpawnProcess.py                        |   31 ++--
 pym/_emerge/SubProcess.py                          |    5 +-
 pym/_emerge/actions.py                             |   41 +++--
 pym/_emerge/depgraph.py                            |   15 +-
 pym/_emerge/emergelog.py                           |    9 +-
 pym/_emerge/main.py                                |    6 +-
 pym/_emerge/unmerge.py                             |    2 +-
 pym/portage/__init__.py                            |   12 +-
 pym/portage/_legacy_globals.py                     |    1 -
 pym/portage/checksum.py                            |   29 +++
 pym/portage/const.py                               |   25 ++-
 pym/portage/data.py                                |  182 +++++++++++-----
 pym/portage/dbapi/_MergeProcess.py                 |    2 +-
 pym/portage/dbapi/porttree.py                      |   44 +---
 pym/portage/dbapi/vartree.py                       |    4 +-
 pym/portage/dispatch_conf.py                       |   10 +-
 pym/portage/exception.py                           |    4 +
 pym/portage/locks.py                               |  226 ++++++++++++++------
 pym/portage/output.py                              |   15 +-
 .../package/ebuild/_config/LocationsManager.py     |    5 +-
 .../package/ebuild/_config/special_env_vars.py     |    8 +-
 pym/portage/package/ebuild/_spawn_nofetch.py       |    2 +-
 pym/portage/package/ebuild/config.py               |  115 +++++++---
 pym/portage/package/ebuild/doebuild.py             |   21 ++-
 pym/portage/package/ebuild/fetch.py                |    3 +-
 pym/portage/package/ebuild/prepare_build_dirs.py   |    3 +-
 pym/portage/process.py                             |    7 +-
 pym/portage/repository/config.py                   |   31 +++-
 pym/portage/tests/bin/setup_env.py                 |    6 +-
 pym/portage/tests/dbapi/test_fakedbapi.py          |    4 +-
 pym/portage/tests/ebuild/test_doebuild_spawn.py    |    5 +
 pym/portage/tests/ebuild/test_ipc_daemon.py        |   13 +-
 pym/portage/tests/emerge/test_simple.py            |    9 +-
 pym/portage/tests/locks/test_asynchronous_lock.py  |   62 +++++-
 pym/portage/tests/locks/test_lock_nonblock.py      |   17 ++-
 pym/portage/tests/repoman/test_simple.py           |    8 +-
 pym/portage/tests/resolver/ResolverPlayground.py   |    9 +-
 pym/portage/tests/util/test_getconfig.py           |    2 +-
 pym/portage/tests/util/test_uniqueArray.py         |    6 +-
 pym/portage/util/env_update.py                     |    2 +-
 pym/portage/util/movefile.py                       |   99 +++++++--
 pym/portage/xpak.py                                |    2 +-
 pym/repoman/utilities.py                           |    2 +-
 96 files changed, 1353 insertions(+), 505 deletions(-)

diff --cc bin/misc-functions.sh
index cb95f6a,3582889..ed77353
--- a/bin/misc-functions.sh
+++ b/bin/misc-functions.sh
@@@ -17,8 -17,8 +17,9 @@@ shift $
  source "${PORTAGE_BIN_PATH:-/usr/lib/portage/bin}/ebuild.sh"
  
  install_symlink_html_docs() {
- 	case "$EAPI" in 0|1|2) local ED=${D} ;; esac
+ 	[[ " ${FEATURES} " == *" force-prefix "* ]] || \
+ 		case "$EAPI" in 0|1|2) local ED=${D} ;; esac
 +	[[ -e "${ED}" ]] || return 0
  	cd "${ED}" || die "cd failed"
  	#symlink the html documentation (if DOC_SYMLINKS_DIR is set in make.conf)
  	if [ -n "${DOC_SYMLINKS_DIR}" ] ; then
@@@ -148,9 -149,9 +150,10 @@@ prepcompress() 
  
  install_qa_check() {
  	local f i x
- 	case "$EAPI" in 0|1|2) local ED=${D} ;; esac
+ 	[[ " ${FEATURES} " == *" force-prefix "* ]] || \
+ 		case "$EAPI" in 0|1|2) local ED=${D} ;; esac
  
 +	[[ -d "${ED}" ]] || return 0
  	cd "${ED}" || die "cd failed"
  
  	export STRIP_MASK
diff --cc bin/phase-functions.sh
index 9e2d275,664202a..1ac66e3
--- a/bin/phase-functions.sh
+++ b/bin/phase-functions.sh
@@@ -592,13 -504,11 +596,14 @@@ dyn_install() 
  	ebuild_phase pre_src_install
  
  	_x=${ED}
- 	case "$EAPI" in 0|1|2) _x=${D} ;; esac
+ 	[[ " ${FEATURES} " == *" force-prefix "* ]] || \
+ 		case "$EAPI" in 0|1|2) _x=${D} ;; esac
  	rm -rf "${D}"
 +	is_auto-multilib && rm -rf "${D}".${ABI}
  	mkdir -p "${_x}"
  	unset _x
 +	for LOOP_ABI in $(get_abi_list); do                                                                                                                                                                                                                                                                                
 +		is_ebuild && { set_abi ${LOOP_ABI}; source "${T}"/environment || die ; }
  
  	if [[ -d $S ]] ; then
  		cd "${S}"
@@@ -669,18 -558,22 +674,32 @@@
  			[[ -n $x ]] && echo "$x" > $f
  		done
  	fi
 +	if has_multilib_profile ; then
 +		local i= x=
 +		for i in ${MULTILIB_ABIS} ; do
 +			x+=" multilib_abi_${i}"
 +		done
 +		echo "${IUSE}${x}"      > IUSE
 +	fi
  	echo "${USE}"       > USE
  	echo "${EAPI:-0}"   > EAPI
 +	if is_auto-multilib; then
 +		echo "$(get_abi_order)" > MULTILIB_ABIS
 +	fi
+ 
+ 	# Save EPREFIX, since it makes it easy to use chpathtool to
+ 	# adjust the content of a binary package so that it will
+ 	# work in a different EPREFIX from the one is was built for.
+ 	case "${EAPI:-0}" in
+ 		0|1|2)
+ 			[[ " ${FEATURES} " == *" force-prefix "* ]] && \
+ 				[ -n "${EPREFIX}" ] && echo "${EPREFIX}" > EPREFIX
+ 			;;
+ 		*)
+ 			[ -n "${EPREFIX}" ] && echo "${EPREFIX}" > EPREFIX
+ 			;;
+ 	esac
+ 
  	set +f
  
  	# local variables can leak into the saved environment.
diff --cc pym/portage/package/ebuild/config.py
index 985b86f,f6166c6..fbb5263
--- a/pym/portage/package/ebuild/config.py
+++ b/pym/portage/package/ebuild/config.py
@@@ -725,20 -726,50 +728,54 @@@ class config(object)
  					self["USERLAND"] = "GNU"
  				self.backup_changes("USERLAND")
  
- 			for var in ("PORTAGE_INST_UID", "PORTAGE_INST_GID"):
+ 			default_inst_ids = {
+ 				"PORTAGE_INST_GID": "0",
+ 				"PORTAGE_INST_UID": "0",
+ 			}
+ 
+ 			if eprefix:
+ 				# For prefix environments, default to the UID and GID of
+ 				# the top-level EROOT directory.
  				try:
- 					self[var] = str(int(self.get(var, "0")))
+ 					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")
+ 
+ 			for var, default_val in default_inst_ids.items():
+ 				try:
+ 					self[var] = str(int(self.get(var, default_val)))
  				except ValueError:
  					writemsg(_("!!! %s='%s' is not a valid integer.  "
- 						"Falling back to '0'.\n") % (var, self[var]),
+ 						"Falling back to %s.\n") % (var, self[var], default_val),
  						noiselevel=-1)
- 					self[var] = "0"
+ 					self[var] = default_val
  				self.backup_changes(var)
  
 +			#add multilib_abi internally to list of USE_EXPANDed vars
 +			self["USE_EXPAND"] = "multilib_abi" + " " + self.get("USE_EXPAND", "")
 +			self.backup_changes("USE_EXPAND")
 +
  			# initialize self.features
  			self.regenerate()
  



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2011-12-24 14:16 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2011-12-24 14:16 UTC (permalink / raw
  To: gentoo-commits

commit:     06259074cf1c75044715bad9229e2aa2a090fc82
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sat Dec 24 14:15:40 2011 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sat Dec 24 14:15:40 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=06259074

Merge commit 'v2.2.0_alpha82' into multilib


 RELEASE-NOTES                                      |    5 -
 bin/ebuild-helpers/newbin                          |    5 +-
 bin/ebuild-helpers/newconfd                        |    5 +-
 bin/ebuild-helpers/newdoc                          |    5 +-
 bin/ebuild-helpers/newenvd                         |    5 +-
 bin/ebuild-helpers/newexe                          |    5 +-
 bin/ebuild-helpers/newinitd                        |    5 +-
 bin/ebuild-helpers/newins                          |    3 +
 bin/ebuild-helpers/newlib.a                        |    5 +-
 bin/ebuild-helpers/newlib.so                       |    5 +-
 bin/ebuild-helpers/newman                          |    5 +-
 bin/ebuild-helpers/newsbin                         |    5 +-
 bin/ebuild-helpers/prepstrip                       |   37 ++++--
 bin/ebuild.sh                                      |   20 ++-
 bin/isolated-functions.sh                          |    6 +-
 bin/misc-functions.sh                              |   92 ++++++++++---
 bin/phase-functions.sh                             |   19 ++-
 cnf/make.conf                                      |    6 +
 cnf/make.conf.ia64.diff                            |   23 +---
 cnf/make.conf.s390.diff                            |   23 +---
 cnf/make.globals                                   |    4 +-
 doc/package/ebuild.docbook                         |    1 +
 doc/package/ebuild/eapi/4-python.docbook           |   49 +++++++
 doc/portage.docbook                                |    1 +
 man/ebuild.5                                       |   12 ++-
 man/emerge.1                                       |   20 ++--
 man/make.conf.5                                    |    9 +-
 pym/_emerge/AbstractPollTask.py                    |   67 ++++++++-
 pym/_emerge/AsynchronousLock.py                    |    4 +-
 pym/_emerge/BinpkgExtractorAsync.py                |    3 +-
 pym/_emerge/BlockerCache.py                        |    2 +-
 pym/_emerge/EbuildExecuter.py                      |    2 -
 pym/_emerge/FakeVartree.py                         |    2 -
 pym/_emerge/MergeListItem.py                       |    2 +-
 pym/_emerge/PackageMerge.py                        |    2 +-
 pym/_emerge/PipeReader.py                          |   60 +++++---
 pym/_emerge/Scheduler.py                           |   22 +++-
 pym/_emerge/SpawnProcess.py                        |   50 +++----
 pym/_emerge/actions.py                             |   19 +--
 pym/_emerge/depgraph.py                            |   73 ++++------
 pym/_emerge/main.py                                |   12 +-
 pym/_emerge/resolver/backtracking.py               |    2 +-
 pym/_emerge/resolver/output.py                     |    2 +-
 pym/_emerge/resolver/slot_collision.py             |    2 +-
 pym/_emerge/search.py                              |    2 +-
 pym/portage/data.py                                |   55 ++++++--
 pym/portage/dbapi/vartree.py                       |  128 ++++++++++++++---
 pym/portage/eclass_cache.py                        |    2 +
 .../package/ebuild/_config/special_env_vars.py     |    2 +-
 pym/portage/package/ebuild/config.py               |    5 +-
 pym/portage/package/ebuild/doebuild.py             |    4 +
 pym/portage/package/ebuild/fetch.py                |   25 ++--
 pym/portage/repository/config.py                   |   82 +++++------
 pym/portage/tests/ebuild/test_pty_eof.py           |   45 ------
 pym/portage/tests/emerge/test_simple.py            |    4 +-
 pym/portage/tests/process/test_poll.py             |   58 +++++++--
 pym/portage/util/_pty.py                           |  153 +-------------------
 57 files changed, 740 insertions(+), 531 deletions(-)

diff --cc bin/phase-functions.sh
index 1ac66e3,2167853..db41f35
--- a/bin/phase-functions.sh
+++ b/bin/phase-functions.sh
@@@ -123,15 -127,15 +127,18 @@@ filter_readonly_variables() 
  			LC_NUMERIC LC_PAPER LC_TIME"
  	fi
  	if ! has --allow-extra-vars $* ; then
- 		filtered_vars="
- 			${filtered_vars}
- 			${PORTAGE_SAVED_READONLY_VARS}
- 			${PORTAGE_MUTABLE_FILTERED_VARS}
- 		"
+ 		if [ "${EMERGE_FROM}" = binary ] ; then
+ 			# preserve additional variables from build time,
+ 			# while excluding untrusted variables
+ 			filtered_vars+=" ${binpkg_untrusted_vars}"
+ 		else
+ 			filtered_vars+=" ${PORTAGE_SAVED_READONLY_VARS}"
+ 			filtered_vars+=" ${PORTAGE_MUTABLE_FILTERED_VARS}"
+ 		fi
  	fi
 +	if has --filter-metadata $* ; then
 +		filtered_vars+=" ${PORTAGE_READONLY_METADATA} filter_opts"
 +	fi
  
  	"${PORTAGE_PYTHON:-/usr/bin/python}" "${PORTAGE_BIN_PATH}"/filter-bash-environment.py "${filtered_vars}" || die "filter-bash-environment.py failed"
  }



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2011-12-28 13:33 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2011-12-28 13:33 UTC (permalink / raw
  To: gentoo-commits

commit:     ea7b8a670b20397448d53bf971a66bcc9896714c
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Wed Dec 28 13:33:04 2011 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Wed Dec 28 13:33:04 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=ea7b8a67

Merge commit 'v2.2.0_alpha84' into multilib


 bin/misc-functions.sh                            |  157 ++++++++++++----------
 bin/repoman                                      |    8 +-
 man/ebuild.5                                     |    2 +-
 man/make.conf.5                                  |    6 +-
 pym/_emerge/FakeVartree.py                       |    1 +
 pym/portage/const.py                             |    1 +
 pym/portage/dbapi/vartree.py                     |   15 ++-
 pym/portage/repository/config.py                 |   38 +++---
 pym/portage/tests/ebuild/test_config.py          |    2 +
 pym/portage/tests/resolver/ResolverPlayground.py |   10 +-
 pym/portage/xpak.py                              |    2 +-
 11 files changed, 140 insertions(+), 102 deletions(-)

diff --cc bin/misc-functions.sh
index 252fba1,5a726b3..a27d5da
--- a/bin/misc-functions.sh
+++ b/bin/misc-functions.sh
@@@ -153,9 -152,92 +153,93 @@@ install_qa_check() 
  	[[ " ${FEATURES} " == *" force-prefix "* ]] || \
  		case "$EAPI" in 0|1|2) local ED=${D} ;; esac
  
 +	[[ -d "${ED}" ]] || return 0
  	cd "${ED}" || die "cd failed"
  
+ 	# Merge QA_FLAGS_IGNORED and QA_DT_HASH into a single array, since
+ 	# QA_DT_HASH is deprecated.
+ 	qa_var="QA_FLAGS_IGNORED_${ARCH/-/_}"
+ 	eval "[[ -n \${!qa_var} ]] && QA_FLAGS_IGNORED=(\"\${${qa_var}[@]}\")"
+ 	if [[ ${#QA_FLAGS_IGNORED[@]} -eq 1 ]] ; then
+ 		local shopts=$-
+ 		set -o noglob
+ 		QA_FLAGS_IGNORED=(${QA_FLAGS_IGNORED})
+ 		set +o noglob
+ 		set -${shopts}
+ 	fi
+ 
+ 	qa_var="QA_DT_HASH_${ARCH/-/_}"
+ 	eval "[[ -n \${!qa_var} ]] && QA_DT_HASH=(\"\${${qa_var}[@]}\")"
+ 	if [[ ${#QA_DT_HASH[@]} -eq 1 ]] ; then
+ 		local shopts=$-
+ 		set -o noglob
+ 		QA_DT_HASH=(${QA_DT_HASH})
+ 		set +o noglob
+ 		set -${shopts}
+ 	fi
+ 
+ 	if [[ -n ${QA_DT_HASH} ]] ; then
+ 		QA_FLAGS_IGNORED=("${QA_FLAGS_IGNORED[@]}" "${QA_DT_HASH[@]}")
+ 		unset QA_DT_HASH
+ 	fi
+ 
+ 	# Merge QA_STRICT_FLAGS_IGNORED and QA_STRICT_DT_HASH, since
+ 	# QA_STRICT_DT_HASH is deprecated
+ 	if [ "${QA_STRICT_FLAGS_IGNORED-unset}" = unset ] && \
+ 		[ "${QA_STRICT_DT_HASH-unset}" != unset ] ; then
+ 		QA_STRICT_FLAGS_IGNORED=1
+ 		unset QA_STRICT_DT_HASH
+ 	fi
+ 
+ 	# Check for files built without respecting *FLAGS. Note that
+ 	# -frecord-gcc-switches must be in all *FLAGS variables, in
+ 	# order to avoid false positive results here.
+ 	# NOTE: This check must execute before prepall/prepstrip, since
+ 	# prepstrip strips the .GCC.command.line sections.
+ 	if type -P scanelf > /dev/null && ! has binchecks ${RESTRICT} && \
+ 		[[ "${CFLAGS}" == *-frecord-gcc-switches* ]] && \
+ 		[[ "${CXXFLAGS}" == *-frecord-gcc-switches* ]] && \
+ 		[[ "${FFLAGS}" == *-frecord-gcc-switches* ]] && \
+ 		[[ "${FCFLAGS}" == *-frecord-gcc-switches* ]] ; then
+ 		rm -f "${T}"/scanelf-ignored-CFLAGS.log
+ 		for x in $(scanelf -qyRF '%k %p' -k \!.GCC.command.line "${ED}" | \
+ 			sed -e "s:\!.GCC.command.line ::") ; do
+ 			# Separate out file types that are known to support
+ 			# .GCC.command.line sections, using the `file` command
+ 			# similar to how prepstrip uses it.
+ 			f=$(file "${x}") || continue
+ 			[[ -z ${f} ]] && continue
+ 			if [[ ${f} == *"SB executable"* ||
+ 				${f} == *"SB shared object"* ]] ; then
+ 				echo "${x}" >> "${T}"/scanelf-ignored-CFLAGS.log
+ 			fi
+ 		done
+ 
+ 		if [[ -f "${T}"/scanelf-ignored-CFLAGS.log ]] ; then
+ 
+ 			if [ "${QA_STRICT_FLAGS_IGNORED-unset}" = unset ] ; then
+ 				for x in "${QA_FLAGS_IGNORED[@]}" ; do
+ 					sed -e "s#^${x#/}\$##" -i "${T}"/scanelf-ignored-CFLAGS.log
+ 				done
+ 			fi
+ 			# Filter anything under /usr/lib/debug/ in order to avoid
+ 			# duplicate warnings for splitdebug files.
+ 			sed -e "s#^usr/lib/debug/.*##" -e "/^\$/d" -e "s#^#/#" \
+ 				-i "${T}"/scanelf-ignored-CFLAGS.log
+ 			f=$(<"${T}"/scanelf-ignored-CFLAGS.log)
+ 			if [[ -n ${f} ]] ; then
+ 				vecho -ne '\n'
+ 				eqawarn "${BAD}QA Notice: Files built without respecting CFLAGS have been detected${NORMAL}"
+ 				eqawarn " Please include the following list of files in your report:"
+ 				eqawarn "${f}"
+ 				vecho -ne '\n'
+ 				sleep 1
+ 			else
+ 				rm -f "${T}"/scanelf-ignored-CFLAGS.log
+ 			fi
+ 		fi
+ 	fi
+ 
  	export STRIP_MASK
  	prepall
  	has "${EAPI}" 0 1 2 3 || prepcompress



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2012-02-06 19:38 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2012-02-06 19:38 UTC (permalink / raw
  To: gentoo-commits

commit:     135714d23121ab2a39f54a9cc46e0445c7ee39e5
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Mon Feb  6 19:37:27 2012 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Mon Feb  6 19:37:27 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=135714d2

Merge commit 'v2.2.0_alpha85' into multilib


 DEVELOPING                                         |   36 ++---
 bin/ebuild-helpers/ecompressdir                    |    4 +
 bin/ebuild-helpers/prepstrip                       |    8 +-
 bin/ebuild.sh                                      |    4 +-
 bin/egencache                                      |   20 ++--
 bin/misc-functions.sh                              |   27 +++-
 bin/phase-functions.sh                             |    4 +-
 bin/phase-helpers.sh                               |   14 +-
 bin/portageq                                       |   17 ++-
 bin/repoman                                        |   24 +--
 cnf/make.globals                                   |    2 +-
 doc/package/ebuild/eapi/4-python.docbook           |   51 +++++++
 man/ebuild.5                                       |    2 +-
 man/emerge.1                                       |   10 +-
 man/make.conf.5                                    |   14 ++-
 man/portage.5                                      |    3 +
 man/repoman.1                                      |    6 -
 pym/_emerge/EbuildPhase.py                         |    6 +-
 pym/_emerge/MiscFunctionsProcess.py                |   10 +-
 pym/_emerge/actions.py                             |    1 +
 pym/_emerge/create_world_atom.py                   |   35 ++++-
 pym/_emerge/depgraph.py                            |   33 +++--
 pym/_emerge/main.py                                |    2 +
 pym/_emerge/resolver/output.py                     |  156 ++++++++++++--------
 pym/_emerge/resolver/output_helpers.py             |   11 +-
 pym/portage/const.py                               |    8 +-
 pym/portage/dbapi/vartree.py                       |   27 +++-
 pym/portage/debug.py                               |    4 +-
 pym/portage/dep/__init__.py                        |   19 ++-
 pym/portage/eapi.py                                |    8 +-
 .../package/ebuild/_config/special_env_vars.py     |    6 +-
 pym/portage/package/ebuild/_ipc/QueryCommand.py    |    9 +-
 pym/portage/package/ebuild/doebuild.py             |   13 +-
 pym/portage/repository/config.py                   |   33 +++--
 pym/portage/tests/ebuild/test_config.py            |    3 +-
 pym/portage/util/__init__.py                       |   21 +++-
 pym/portage/util/_dyn_libs/LinkageMapELF.py        |    7 +
 pym/portage/util/env_update.py                     |    4 -
 pym/portage/util/movefile.py                       |    4 +-
 pym/portage/xml/metadata.py                        |    9 +-
 40 files changed, 452 insertions(+), 223 deletions(-)



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2012-02-18 15:52 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2012-02-18 15:52 UTC (permalink / raw
  To: gentoo-commits

commit:     e44e308eb68a1a7b5574450006e87e976fb23b98
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sat Feb 18 15:51:00 2012 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sat Feb 18 15:51:00 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=e44e308e

Merge commit 'v2.2.0_alpha87' into multilib


 bin/repoman                                        |   27 +-
 man/portage.5                                      |    2 +
 man/repoman.1                                      |    5 +-
 pym/_emerge/AbstractDepPriority.py                 |    4 +-
 pym/_emerge/AbstractEbuildProcess.py               |   36 ++-
 pym/_emerge/AbstractPollTask.py                    |   47 ++-
 pym/_emerge/AsynchronousLock.py                    |   36 +-
 pym/_emerge/AsynchronousTask.py                    |   30 +-
 pym/_emerge/Binpkg.py                              |    4 +-
 pym/_emerge/BinpkgFetcher.py                       |    3 -
 pym/_emerge/CompositeTask.py                       |    5 +-
 pym/_emerge/Dependency.py                          |    5 +-
 pym/_emerge/EbuildBuild.py                         |    4 +-
 pym/_emerge/EbuildBuildDir.py                      |    5 +-
 pym/_emerge/EbuildExecuter.py                      |    2 +-
 pym/_emerge/EbuildFetcher.py                       |   13 +-
 pym/_emerge/EbuildFetchonly.py                     |    4 +-
 pym/_emerge/EbuildIpcDaemon.py                     |   31 ++-
 pym/_emerge/EbuildMerge.py                         |    4 +-
 pym/_emerge/EbuildMetadataPhase.py                 |    7 +-
 pym/_emerge/FifoIpcDaemon.py                       |    9 +-
 pym/_emerge/JobStatusDisplay.py                    |   10 +-
 pym/_emerge/MetadataRegen.py                       |   72 ++--
 pym/_emerge/PipeReader.py                          |   12 +-
 pym/_emerge/PollScheduler.py                       |  331 ++++-----------
 pym/_emerge/QueueScheduler.py                      |   73 ++--
 pym/_emerge/Scheduler.py                           |  127 ++----
 pym/_emerge/SequentialTaskQueue.py                 |   72 ++--
 pym/_emerge/SpawnProcess.py                        |   24 +-
 pym/_emerge/SubProcess.py                          |   60 ++--
 pym/_emerge/Task.py                                |    5 +-
 pym/_emerge/TaskScheduler.py                       |    1 +
 pym/_emerge/depgraph.py                            |   16 +-
 pym/portage/checksum.py                            |   31 +--
 pym/portage/dbapi/_MergeProcess.py                 |   38 ++-
 pym/portage/dbapi/vartree.py                       |   22 +-
 pym/portage/package/ebuild/config.py               |   17 +
 pym/portage/package/ebuild/doebuild.py             |    3 +-
 pym/portage/package/ebuild/fetch.py                |   22 +-
 pym/portage/process.py                             |   41 ++-
 pym/portage/repository/config.py                   |    9 +-
 pym/portage/tests/ebuild/test_ipc_daemon.py        |   14 +-
 pym/portage/tests/process/test_poll.py             |   14 +-
 pym/portage/update.py                              |    5 +-
 pym/{_emerge => portage/util}/SlotObject.py        |   13 +-
 .../util/_dyn_libs/PreservedLibsRegistry.py        |   61 +++-
 pym/portage/util/_eventloop/EventLoop.py           |  476 ++++++++++++++++++++
 pym/portage/util/_eventloop/GlibEventLoop.py       |   23 +
 .../util/_eventloop}/PollConstants.py              |    0
 .../util/_eventloop}/PollSelectAdapter.py          |    7 +-
 .../util/_eventloop}/__init__.py                   |    2 +-
 pym/portage/util/_eventloop/global_event_loop.py   |   35 ++
 pym/portage/util/mtimedb.py                        |   75 +++-
 pym/portage/xpak.py                                |   44 +-
 pym/repoman/checks.py                              |    3 +-
 runtests.sh                                        |   14 +-
 56 files changed, 1311 insertions(+), 744 deletions(-)



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2012-02-23 19:08 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2012-02-23 19:08 UTC (permalink / raw
  To: gentoo-commits

commit:     b58cc3bd0dd249d2c90c44589efce187b22fe82d
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Thu Feb 23 19:07:55 2012 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Thu Feb 23 19:07:55 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=b58cc3bd

Merge commit 'v2.2.0_alpha89' into multilib


 bin/ebuild-helpers/ecompressdir |   13 ++-
 pym/_emerge/Scheduler.py        |    3 +-
 pym/portage/dbapi/vartree.py    |  280 ++++++++++++++++++++++++++-------------
 3 files changed, 202 insertions(+), 94 deletions(-)



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2012-02-25 12:04 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2012-02-25 12:04 UTC (permalink / raw
  To: gentoo-commits

commit:     900118198db83ac7bde471f5423114618550463c
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sat Feb 25 11:41:59 2012 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sat Feb 25 11:41:59 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=90011819

Drop unused script

---
 add_lib32.sh |    5 -----
 1 files changed, 0 insertions(+), 5 deletions(-)

diff --git a/add_lib32.sh b/add_lib32.sh
deleted file mode 100755
index 87fdb79..0000000
--- a/add_lib32.sh
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/bash
-cd /var/db/pkg
-for i in */*/IUSE; do grep lib32 $i>/dev/null || echo $(cat $i) lib32 > $i ; done
-for i in */*; do ! [[ -e $i/IUSE ]] && echo lib32 > $i/IUSE ; done
-touch */*



^ permalink raw reply related	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2012-02-26 16:27 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2012-02-26 16:27 UTC (permalink / raw
  To: gentoo-commits

commit:     1606299e37b2ba36c4876891833a51c0dda95e6b
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sun Feb 26 12:51:25 2012 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun Feb 26 12:51:25 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=1606299e

Merge branch 'master' into multilib


 pym/_emerge/depgraph.py |    4 ++++
 1 files changed, 4 insertions(+), 0 deletions(-)



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2012-03-06 18:21 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2012-03-06 18:21 UTC (permalink / raw
  To: gentoo-commits

commit:     b3875c1248e3a076326096be74a26536245aac36
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Tue Mar  6 18:21:17 2012 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Tue Mar  6 18:21:17 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=b3875c12

Merge commit 'v2.2.0_alpha90' into multilib


 bin/repoman                                        |   23 ++++-
 pym/_emerge/actions.py                             |    2 +-
 pym/_emerge/depgraph.py                            |  128 ++++++++++++--------
 pym/portage/cvstree.py                             |   10 ++-
 pym/portage/tests/resolver/test_autounmask.py      |   47 +++++++-
 .../util/_dyn_libs/PreservedLibsRegistry.py        |   36 +++++-
 pym/repoman/utilities.py                           |   33 +++++-
 7 files changed, 217 insertions(+), 62 deletions(-)



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2012-03-18 15:29 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2012-03-18 15:29 UTC (permalink / raw
  To: gentoo-commits

commit:     eedca77080c03ef7f08dba388ce4ccac768e4bbc
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sun Mar 18 15:28:56 2012 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun Mar 18 15:28:56 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=eedca770

Merge commit 'v2.2.0_alpha91' into multilib


 Makefile                               |  214 +++++++++
 bin/dispatch-conf                      |   50 ++-
 bin/ebuild.sh                          |   46 ++-
 bin/etc-update                         |  755 ++++++++++++++++++--------------
 bin/isolated-functions.sh              |    2 +-
 bin/misc-functions.sh                  |    7 +
 bin/portageq                           |    8 +
 bin/repoman                            |   35 ++-
 man/etc-update.1                       |   32 +-
 man/repoman.1                          |   17 +-
 mkrelease.sh                           |    2 +-
 pym/_emerge/AsynchronousTask.py        |   15 +
 pym/_emerge/Binpkg.py                  |    6 +-
 pym/_emerge/EbuildBuild.py             |    6 +-
 pym/_emerge/actions.py                 |   53 ++-
 pym/_emerge/main.py                    |   21 +-
 pym/_emerge/resolver/output.py         |   13 +-
 pym/portage/dbapi/vartree.py           |   10 +-
 pym/portage/dispatch_conf.py           |    8 +-
 pym/portage/manifest.py                |   10 +-
 pym/portage/output.py                  |    6 +
 pym/portage/package/ebuild/doebuild.py |   31 +-
 pym/portage/util/whirlpool.py          |    2 +-
 23 files changed, 924 insertions(+), 425 deletions(-)



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2012-03-21 18:50 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2012-03-21 18:50 UTC (permalink / raw
  To: gentoo-commits

commit:     8c2261e66098f9070972ef42369b71cc01bb6dbb
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Wed Mar 21 18:49:34 2012 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Wed Mar 21 18:49:34 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=8c2261e6

Merge commit 'v2.2.0_alpha93' into multilib


 pym/_emerge/resolver/output.py               |    3 +-
 pym/portage/dbapi/vartree.py                 |    9 ++++++++
 pym/portage/dispatch_conf.py                 |    2 +-
 pym/portage/package/ebuild/_spawn_nofetch.py |    6 ++++-
 pym/portage/package/ebuild/digestgen.py      |    3 +-
 pym/portage/package/ebuild/doebuild.py       |   28 ++++++++++++++++++-------
 6 files changed, 37 insertions(+), 14 deletions(-)



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2012-03-23 14:42 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2012-03-23 14:42 UTC (permalink / raw
  To: gentoo-commits

commit:     0262156749b0fb2050499ffbc888ac7913a63caf
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Fri Mar 23 14:41:45 2012 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Fri Mar 23 14:41:45 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=02621567

Merge commit 'v2.2.0_alpha94' into multilib


 bin/misc-functions.sh                              |   12 +++
 pym/_emerge/EbuildBuild.py                         |    5 +-
 pym/_emerge/Scheduler.py                           |    2 +-
 pym/_emerge/actions.py                             |    5 +-
 pym/_emerge/main.py                                |    2 -
 pym/_emerge/resolver/output.py                     |   10 +--
 pym/_emerge/resolver/output_helpers.py             |   78 ++++++++++++++++----
 pym/portage/package/ebuild/getmaskingreason.py     |    8 ++-
 .../util/_dyn_libs/PreservedLibsRegistry.py        |   10 +-
 pym/portage/util/mtimedb.py                        |   22 +++---
 10 files changed, 108 insertions(+), 46 deletions(-)



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2012-03-24 10:51 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2012-03-24 10:51 UTC (permalink / raw
  To: gentoo-commits

commit:     dbd8a00d8b9e58d67935c3f9c5b05c20cd5301bb
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sat Mar 24 10:51:26 2012 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sat Mar 24 10:51:26 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=dbd8a00d

Merge commit 'v2.2.0_alpha95' into multilib


 bin/repoman                                        |    6 +++-
 pym/portage/dbapi/vartree.py                       |   31 ++++++++++++----
 .../util/_dyn_libs/PreservedLibsRegistry.py        |    2 +-
 pym/portage/util/movefile.py                       |   38 ++++++++++++-------
 pym/portage/util/mtimedb.py                        |    2 +-
 5 files changed, 55 insertions(+), 24 deletions(-)



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2012-03-30 18:55 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2012-03-30 18:55 UTC (permalink / raw
  To: gentoo-commits

commit:     269ac6cf72f48bcf4f8042a3b4d0448e72a1d3c3
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Fri Mar 30 18:55:26 2012 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Fri Mar 30 18:55:26 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=269ac6cf

Merge commit 'v2.2.0_alpha96' into multilib


 Makefile                                           |    5 +-
 bin/emerge-webrsync                                |   12 ++++-
 bin/etc-update                                     |    5 +-
 bin/repoman                                        |    4 +-
 pym/_emerge/BlockerCache.py                        |    2 +-
 pym/_emerge/CompositeTask.py                       |    2 +-
 pym/_emerge/EbuildFetcher.py                       |   14 ++----
 pym/_emerge/JobStatusDisplay.py                    |    2 +-
 pym/_emerge/Package.py                             |    4 +-
 pym/_emerge/PollScheduler.py                       |    2 +-
 pym/_emerge/QueueScheduler.py                      |    2 +-
 pym/_emerge/Scheduler.py                           |   10 ++--
 pym/_emerge/_flush_elog_mod_echo.py                |    2 +-
 pym/_emerge/actions.py                             |   45 ++++++++++----------
 pym/_emerge/depgraph.py                            |   12 +++---
 pym/_emerge/main.py                                |    2 +-
 pym/_emerge/resolver/output.py                     |    8 ++--
 pym/_emerge/unmerge.py                             |   14 ++++---
 pym/_emerge/userquery.py                           |    6 +-
 pym/portage/cache/mappings.py                      |    2 +-
 pym/portage/dbapi/_MergeProcess.py                 |   13 +----
 pym/portage/dbapi/bintree.py                       |    6 +-
 pym/portage/dbapi/porttree.py                      |    6 +-
 pym/portage/dbapi/vartree.py                       |   10 ++--
 pym/portage/dep/__init__.py                        |    2 +-
 pym/portage/env/loaders.py                         |    4 +-
 pym/portage/glsa.py                                |    8 ++--
 pym/portage/locks.py                               |   22 +++++++++-
 pym/portage/news.py                                |    2 +-
 pym/portage/package/ebuild/_ipc/QueryCommand.py    |    2 +-
 pym/portage/package/ebuild/digestcheck.py          |    2 +-
 pym/portage/package/ebuild/digestgen.py            |    2 +-
 pym/portage/package/ebuild/doebuild.py             |    4 +-
 pym/portage/process.py                             |   18 +++++++-
 pym/portage/tests/locks/test_lock_nonblock.py      |    5 ++-
 pym/portage/util/ExtractKernelVersion.py           |    2 +-
 pym/portage/util/__init__.py                       |    3 +-
 .../util/_dyn_libs/PreservedLibsRegistry.py        |    2 +-
 pym/portage/util/_eventloop/EventLoop.py           |    2 +-
 pym/portage/util/_pty.py                           |    2 +-
 pym/portage/util/lafilefixer.py                    |    2 +-
 pym/portage/util/listdir.py                        |    2 +-
 pym/portage/util/movefile.py                       |   23 ++++++----
 pym/repoman/utilities.py                           |    6 +-
 44 files changed, 170 insertions(+), 135 deletions(-)



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2012-04-01 22:00 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2012-04-01 22:00 UTC (permalink / raw
  To: gentoo-commits

commit:     0f71144b7d76f7ac11a168d821b490808ecccf64
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sun Apr  1 22:00:32 2012 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun Apr  1 22:00:32 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=0f71144b

Merge commit 'v2.2.0_alpha98' into multilib


 bin/ebuild-helpers/dosym     |    7 +-
 bin/ebuild-helpers/fowners   |   10 ++-
 bin/repoman                  |    2 +-
 man/portage.5                |    5 +-
 pym/portage/dispatch_conf.py |   24 ++--
 pym/portage/util/__init__.py |  104 +++++++++++--------
 pym/portage/xpak.py          |  247 +++++++++++++++++++++---------------------
 7 files changed, 214 insertions(+), 185 deletions(-)



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2012-04-04 12:42 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2012-04-04 12:42 UTC (permalink / raw
  To: gentoo-commits

commit:     3f0a9e438e41d40ad89bf752a5fd77c2fba3988a
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Wed Apr  4 12:41:58 2012 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Wed Apr  4 12:41:58 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=3f0a9e43

Merge commit 'v2.2.0_alpha99' into multilib


 bin/repoman                          |    2 +-
 pym/portage/package/ebuild/config.py |    2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2012-04-06 11:50 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2012-04-06 11:50 UTC (permalink / raw
  To: gentoo-commits

commit:     2aee99c23f5917605b86ff28b0c395916fe99ea1
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Fri Apr  6 11:49:41 2012 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Fri Apr  6 11:49:41 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=2aee99c2

Merge commit 'v2.2.0_alpha100' into multilib


 bin/misc-functions.sh                    |    6 ++++--
 pym/_emerge/Scheduler.py                 |    6 +++++-
 pym/_emerge/actions.py                   |    2 +-
 pym/_emerge/depgraph.py                  |   12 +++++++++++-
 pym/_emerge/resolver/slot_collision.py   |   18 +++++++++++++++---
 pym/_emerge/unmerge.py                   |   15 ++++++++++++++-
 pym/portage/package/ebuild/config.py     |    8 ++++----
 pym/portage/package/ebuild/doebuild.py   |    3 +--
 pym/portage/tests/util/test_getconfig.py |   26 +++++++++++++++++++++++++-
 9 files changed, 80 insertions(+), 16 deletions(-)



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2012-04-24 21:26 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2012-04-24 21:26 UTC (permalink / raw
  To: gentoo-commits

commit:     16f70cad3248d7dc91aa8143eb62d256591c13a3
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Tue Apr 24 21:26:15 2012 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Tue Apr 24 21:26:15 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=16f70cad

Merge commit 'v2.2.0_alpha101' into multilib


 bin/dohtml.py                                    |    3 +-
 bin/isolated-functions.sh                        |   12 ++++-
 bin/portageq                                     |   58 +++++++++++++--------
 bin/repoman                                      |   19 ++++---
 doc/package/ebuild/phases.docbook                |    9 +++
 man/ebuild.5                                     |    4 +-
 man/repoman.1                                    |    3 +-
 pym/_emerge/EbuildBinpkg.py                      |    6 ++-
 pym/_emerge/PackageVirtualDbapi.py               |   22 +++++---
 pym/_emerge/depgraph.py                          |    5 +-
 pym/_emerge/main.py                              |    8 ++-
 pym/portage/checksum.py                          |    2 +-
 pym/portage/dbapi/porttree.py                    |   36 ++++++--------
 pym/portage/dbapi/vartree.py                     |   14 +++---
 pym/portage/dbapi/virtual.py                     |   22 +++++---
 pym/portage/dep/__init__.py                      |    3 +-
 pym/portage/package/ebuild/doebuild.py           |    7 +++
 pym/portage/package/ebuild/prepare_build_dirs.py |   22 ++++++++-
 pym/portage/xml/metadata.py                      |    6 +-
 pym/repoman/checks.py                            |   36 ++++++++++----
 pym/repoman/herdbase.py                          |    4 +-
 21 files changed, 194 insertions(+), 107 deletions(-)



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2012-05-11 20:38 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2012-05-11 20:38 UTC (permalink / raw
  To: gentoo-commits

commit:     e3d837d79df8136334699020a16b1c39baa255b7
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Fri May 11 20:38:14 2012 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Fri May 11 20:38:14 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=e3d837d7

Merge commit 'v2.2.0_alpha103' into multilib


 bin/ebuild.sh                                      |   32 ++++----
 bin/isolated-functions.sh                          |    8 +-
 bin/misc-functions.sh                              |   67 +++++++---------
 bin/repoman                                        |   21 ++---
 cnf/make.globals                                   |    7 +-
 doc/package/ebuild/eapi/4-python.docbook           |    6 ++
 man/make.conf.5                                    |   14 ++--
 man/repoman.1                                      |    4 +-
 pym/_emerge/EbuildMetadataPhase.py                 |   83 +++++++++++++------
 pym/_emerge/actions.py                             |    8 +--
 pym/_emerge/depgraph.py                            |   15 +++-
 pym/portage/__init__.py                            |   34 ++++-----
 pym/portage/dbapi/bintree.py                       |    7 +-
 pym/portage/dbapi/porttree.py                      |   44 +++-------
 pym/portage/dbapi/vartree.py                       |   22 +++---
 pym/portage/dispatch_conf.py                       |   10 ++-
 pym/portage/glsa.py                                |   10 +--
 .../package/ebuild/_config/LocationsManager.py     |    1 +
 .../package/ebuild/_config/special_env_vars.py     |    5 +-
 pym/portage/package/ebuild/_eapi_invalid.py        |   46 +++++++++++
 pym/portage/package/ebuild/config.py               |    3 -
 pym/portage/package/ebuild/doebuild.py             |   76 +++++++-----------
 pym/portage/util/__init__.py                       |   21 +++++-
 pym/portage/util/_desktop_entry.py                 |   75 ++++++++++++++++++
 pym/repoman/checks.py                              |   15 ++--
 25 files changed, 386 insertions(+), 248 deletions(-)

diff --cc bin/misc-functions.sh
index ec72a0c,564af85..14684fd
--- a/bin/misc-functions.sh
+++ b/bin/misc-functions.sh
@@@ -151,9 -150,8 +151,9 @@@ prepcompress() 
  install_qa_check() {
  	local f i qa_var x
  	[[ " ${FEATURES} " == *" force-prefix "* ]] || \
- 		case "$EAPI" in 0|1|2) local ED=${D} ;; esac
+ 		case "$EAPI" in 0|1|2) local EPREFIX= ED=${D} ;; esac
  
 +	[[ -d "${ED}" ]] || return 0
  	cd "${ED}" || die "cd failed"
  
  	# Merge QA_FLAGS_IGNORED and QA_DT_HASH into a single array, since



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2012-05-12  7:57 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2012-05-12  7:57 UTC (permalink / raw
  To: gentoo-commits

commit:     13505ce8523bd7b0f8879a12a7216589f05733d9
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sat May 12 07:57:42 2012 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sat May 12 07:57:42 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=13505ce8

Merge commit 'v2.2.0_alpha104' into multilib


 bin/egencache                                      |    9 ++-
 pym/_emerge/EbuildMetadataPhase.py                 |   46 ++++++++++-----
 pym/_emerge/MetadataRegen.py                       |    8 +-
 pym/_emerge/PollScheduler.py                       |   14 ++++-
 pym/_emerge/QueueScheduler.py                      |    4 +-
 pym/_emerge/Scheduler.py                           |    2 +-
 pym/_emerge/TaskScheduler.py                       |    6 +-
 pym/_emerge/actions.py                             |    8 ---
 pym/_emerge/depgraph.py                            |    2 -
 pym/portage/dbapi/porttree.py                      |   60 +++-----------------
 .../package/ebuild/_config/LocationsManager.py     |   24 ++++++--
 pym/portage/package/ebuild/config.py               |   36 +++++++++---
 pym/portage/package/ebuild/doebuild.py             |    9 +--
 pym/portage/package/ebuild/getmaskingstatus.py     |    2 -
 pym/portage/repository/config.py                   |   21 +++----
 pym/portage/util/_eventloop/EventLoop.py           |   50 ++++++++++------
 16 files changed, 159 insertions(+), 142 deletions(-)



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2012-05-17 10:00 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2012-05-17 10:00 UTC (permalink / raw
  To: gentoo-commits

commit:     a284b20d0e63ea585d491fcc2b8ec14badc2bad0
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Thu May 17 10:00:08 2012 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Thu May 17 10:00:08 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=a284b20d

Merge commit 'v2.2.0_alpha107' into multilib


 RELEASE-NOTES                                      |    6 +
 bin/ebuild                                         |   10 +-
 bin/ebuild-helpers/ecompressdir                    |   30 ++-
 bin/ebuild-helpers/prepstrip                       |  115 +++++++---
 bin/egencache                                      |    6 +-
 bin/helper-functions.sh                            |   62 +++++
 bin/repoman                                        |   24 +-
 cnf/make.globals                                   |    3 +-
 doc/package/ebuild/eapi/4-python.docbook           |    6 +
 man/make.conf.5                                    |    5 +-
 pym/_emerge/BlockerCache.py                        |    9 +-
 pym/_emerge/Package.py                             |   32 ++--
 pym/_emerge/depgraph.py                            |  240 +++++++++-----------
 pym/_emerge/unmerge.py                             |   22 +-
 pym/portage/__init__.py                            |   12 +-
 pym/portage/_sets/dbapi.py                         |   14 +-
 pym/portage/_sets/security.py                      |    8 +-
 pym/portage/dbapi/__init__.py                      |   26 ++-
 pym/portage/dbapi/bintree.py                       |   33 ++-
 pym/portage/dbapi/porttree.py                      |    7 +-
 pym/portage/dbapi/vartree.py                       |   26 ++-
 pym/portage/dbapi/virtual.py                       |   10 +-
 pym/portage/dep/__init__.py                        |  166 +++++++++-----
 pym/portage/dep/dep_check.py                       |   36 ++--
 pym/portage/eapi.py                                |    6 +
 pym/portage/getbinpkg.py                           |   19 +-
 pym/portage/glsa.py                                |   21 +-
 .../package/ebuild/_config/KeywordsManager.py      |   21 +-
 .../package/ebuild/_config/LicenseManager.py       |    9 +-
 .../package/ebuild/_config/LocationsManager.py     |    8 +-
 pym/portage/package/ebuild/_config/UseManager.py   |   12 +-
 pym/portage/package/ebuild/_config/helper.py       |    4 +-
 pym/portage/package/ebuild/_eapi_invalid.py        |   16 +-
 pym/portage/package/ebuild/config.py               |   39 +++-
 pym/portage/package/ebuild/doebuild.py             |    2 +-
 pym/portage/package/ebuild/fetch.py                |    7 +-
 pym/portage/package/ebuild/getmaskingstatus.py     |   14 +-
 pym/portage/repository/config.py                   |    5 +-
 pym/portage/tests/dep/testStandalone.py            |    5 +-
 pym/portage/tests/resolver/test_simple.py          |    3 +-
 pym/portage/tests/util/test_digraph.py             |   50 ++++-
 pym/portage/tests/util/test_stackLists.py          |    4 +-
 pym/portage/util/__init__.py                       |   64 ++----
 pym/portage/util/_urlopen.py                       |   42 ++++
 pym/portage/util/digraph.py                        |   15 +-
 pym/portage/versions.py                            |  187 +++++++++++-----
 pym/portage/xpak.py                                |    8 +-
 47 files changed, 949 insertions(+), 520 deletions(-)



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2012-05-28 10:19 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2012-05-28 10:19 UTC (permalink / raw
  To: gentoo-commits

commit:     f3ef275a3908942468246ebf55dd4a393fbf6eb0
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Mon May 28 10:19:01 2012 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Mon May 28 10:19:01 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=f3ef275a

Merge commit 'v2.2.0_alpha108' into multilib


 bin/repoman                                        |    2 +-
 pym/portage/cache/template.py                      |   14 +++++-
 pym/portage/dbapi/vartree.py                       |    2 +-
 .../package/ebuild/_config/LocationsManager.py     |   46 ++++++++++++++++++-
 pym/portage/repository/config.py                   |    4 +-
 pym/portage/util/movefile.py                       |    6 +-
 6 files changed, 61 insertions(+), 13 deletions(-)



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2012-06-03 12:33 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2012-06-03 12:33 UTC (permalink / raw
  To: gentoo-commits

commit:     e66210264938ba53c5f7e6697e9fa3b72c3d8862
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sun Jun  3 12:33:25 2012 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun Jun  3 12:33:25 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=e6621026

Merge commit 'v2.2.0_alpha109' into multilib


 bin/ebuild-helpers/ecompressdir                    |   26 ++-
 bin/ebuild.sh                                      |    3 +
 bin/repoman                                        |   10 +-
 bin/save-ebuild-env.sh                             |    3 +-
 man/make.conf.5                                    |   24 ++
 man/repoman.1                                      |   12 +-
 pym/_emerge/depgraph.py                            |   38 ++--
 pym/portage/__init__.py                            |    3 +-
 pym/portage/const.py                               |    1 +
 pym/portage/dbapi/__init__.py                      |   17 +-
 pym/portage/dep/__init__.py                        |   23 +-
 .../package/ebuild/_config/special_env_vars.py     |    3 +-
 pym/portage/package/ebuild/config.py               |   56 +++-
 pym/portage/util/__init__.py                       |   15 +-
 pym/repoman/checks.py                              |  300 +++++++++++++++----
 pym/repoman/errors.py                              |    1 -
 16 files changed, 395 insertions(+), 140 deletions(-)



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2012-06-10 12:42 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2012-06-10 12:42 UTC (permalink / raw
  To: gentoo-commits

commit:     db01717b3f5efb9fd9e26348b659d423b66bcac0
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sun Jun 10 12:42:23 2012 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun Jun 10 12:42:23 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=db01717b

Merge commit 'v2.2.0_alpha110' into multilib


 bin/helper-functions.sh     |   30 +++++++++++++++++++++++++-
 bin/repoman                 |    8 +++++-
 pym/_emerge/EbuildPhase.py  |   13 +++++++++-
 pym/_emerge/FakeVartree.py  |    2 +-
 pym/_emerge/Package.py      |   49 +++++++++++++++++++++++++++++-------------
 pym/portage/__init__.py     |   10 --------
 pym/portage/xml/metadata.py |   10 +++++++-
 pym/repoman/checks.py       |    5 ++-
 pym/repoman/herdbase.py     |    6 ++++-
 9 files changed, 97 insertions(+), 36 deletions(-)



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2012-07-01 12:01 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2012-07-01 12:01 UTC (permalink / raw
  To: gentoo-commits

commit:     57847abbfcf4049abf5789493673a50ae798867c
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sun Jul  1 12:00:15 2012 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun Jul  1 12:00:15 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=57847abb

Merge commit 'v2.2.0_alpha114' into multilib


 NEWS                                               |    9 +
 RELEASE-NOTES                                      |    6 +
 bin/dohtml.py                                      |   49 +-
 bin/egencache                                      |    3 +
 bin/misc-functions.sh                              |    7 +-
 bin/repoman                                        |   32 +-
 bin/save-ebuild-env.sh                             |    3 +
 cnf/make.globals                                   |    1 +
 doc/package/ebuild.docbook                         |    1 +
 doc/package/ebuild/eapi/4-python.docbook           |  230 +++---
 doc/package/ebuild/eapi/4-slot-abi.docbook         |   70 ++
 doc/portage.docbook                                |    1 +
 man/emerge.1                                       |   36 +-
 man/make.conf.5                                    |    8 +
 man/portage.5                                      |   26 +-
 man/repoman.1                                      |    4 +
 pym/_emerge/AtomArg.py                             |    5 +-
 pym/_emerge/Dependency.py                          |    2 +-
 pym/_emerge/DependencyArg.py                       |   14 +-
 pym/_emerge/EbuildPhase.py                         |    4 +-
 pym/_emerge/FakeVartree.py                         |   32 +-
 pym/_emerge/Package.py                             |   56 +-
 pym/_emerge/PollScheduler.py                       |   13 +-
 pym/_emerge/Scheduler.py                           |    5 +-
 pym/_emerge/SetArg.py                              |    5 +-
 pym/_emerge/actions.py                             |   55 ++-
 pym/_emerge/create_depgraph_params.py              |   14 +
 pym/_emerge/depgraph.py                            |  840 ++++++++++++++------
 pym/_emerge/main.py                                |   32 +-
 pym/_emerge/resolver/backtracking.py               |   36 +-
 pym/_emerge/resolver/output.py                     |   25 +-
 pym/_emerge/resolver/slot_collision.py             |   44 +-
 pym/portage/__init__.py                            |    2 +-
 pym/portage/_sets/__init__.py                      |   12 +-
 pym/portage/_sets/files.py                         |   13 +-
 pym/portage/cache/fs_template.py                   |   22 +-
 pym/portage/cache/sqlite.py                        |   42 +-
 pym/portage/const.py                               |    5 +-
 pym/portage/dbapi/__init__.py                      |   49 +-
 pym/portage/dbapi/bintree.py                       |    1 -
 pym/portage/dbapi/porttree.py                      |   19 +-
 pym/portage/dbapi/vartree.py                       |   61 +-
 pym/portage/dbapi/virtual.py                       |   51 +-
 pym/portage/dep/__init__.py                        |  434 +++++++----
 pym/portage/dep/_slot_abi.py                       |   92 +++
 pym/portage/dep/dep_check.py                       |   15 +-
 pym/portage/eapi.py                                |   38 +
 .../package/ebuild/_config/special_env_vars.py     |    5 +-
 pym/portage/package/ebuild/_ipc/QueryCommand.py    |   10 +-
 pym/portage/package/ebuild/config.py               |   13 +-
 pym/portage/package/ebuild/doebuild.py             |  101 ++-
 pym/portage/repository/config.py                   |    6 +-
 pym/portage/tests/dbapi/test_fakedbapi.py          |    7 +-
 pym/portage/tests/dep/testAtom.py                  |   19 +
 pym/portage/tests/dep/test_isvalidatom.py          |    9 +
 pym/portage/tests/dep/test_match_from_list.py      |   31 +-
 pym/portage/tests/emerge/test_emerge_slot_abi.py   |  198 +++++
 pym/portage/tests/emerge/test_simple.py            |    6 +-
 pym/portage/tests/repoman/test_echangelog.py       |  110 +++
 pym/portage/tests/resolver/ResolverPlayground.py   |   57 +-
 pym/portage/tests/resolver/test_autounmask.py      |   17 +-
 pym/portage/tests/resolver/test_complete_graph.py  |    4 +-
 pym/portage/tests/resolver/test_merge_order.py     |    6 +-
 pym/portage/tests/resolver/test_simple.py          |   20 +-
 pym/portage/tests/resolver/test_slot_abi.py        |  376 +++++++++
 pym/portage/tests/resolver/test_slot_collisions.py |   12 +
 pym/portage/util/__init__.py                       |    2 +-
 pym/portage/versions.py                            |   54 +-
 pym/portage/xpak.py                                |    2 +-
 pym/repoman/checks.py                              |   10 +-
 pym/repoman/utilities.py                           |   68 +-
 runtests.sh                                        |    2 +-
 72 files changed, 2811 insertions(+), 858 deletions(-)



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2012-07-08 10:03 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2012-07-08 10:03 UTC (permalink / raw
  To: gentoo-commits

commit:     5c128c674867e13b4627a5ac873f87a9419ed288
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sun Jul  8 10:03:32 2012 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun Jul  8 10:03:32 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=5c128c67

Merge v2.2.0_alpha116


 bin/ebuild                                         |    9 +-
 bin/ebuild-ipc.py                                  |   11 +-
 bin/emaint                                         |    9 +-
 bin/emerge                                         |   11 +-
 bin/quickpkg                                       |   15 +-
 man/ebuild.5                                       |    6 +-
 man/emerge.1                                       |    3 +
 man/make.conf.5                                    |   13 +-
 pym/_emerge/depgraph.py                            |  109 +++++++---
 pym/_emerge/main.py                                |    6 +
 pym/portage/const.py                               |   24 ++-
 pym/portage/dbapi/bintree.py                       |    4 +-
 pym/portage/dbapi/vartree.py                       |  110 +++++++++-
 pym/portage/dep/__init__.py                        |   40 +++-
 pym/portage/tests/ebuild/test_config.py            |    4 +-
 .../tests/resolver/test_slot_abi_downgrade.py      |  225 ++++++++++++++++++++
 pym/portage/tests/runTests                         |   11 +-
 17 files changed, 517 insertions(+), 93 deletions(-)

diff --cc pym/portage/const.py
index ad7e2ec,ceef5c5..7c75381
--- a/pym/portage/const.py
+++ b/pym/portage/const.py
@@@ -91,8 -90,9 +91,9 @@@ SUPPORTED_FEATURES       = frozenset(
                             "ccache", "chflags", "clean-logs",
                             "collision-protect", "compress-build-logs", "compressdebug",
                             "config-protect-if-modified",
-                            "digest", "distcc", "distcc-pump", "distlocks", "ebuild-locks", "fakeroot",
+                            "digest", "distcc", "distcc-pump", "distlocks",
+                            "downgrade-backup", "ebuild-locks", "fakeroot",
 -                           "fail-clean", "force-mirror", "force-prefix", "getbinpkg",
 +                           "fail-clean", "force-mirror", "force-multilib", "force-prefix", "getbinpkg",
                             "installsources", "keeptemp", "keepwork", "fixlafiles", "lmirror",
                             "metadata-transfer", "mirror", "multilib-strict", "news",
                             "noauto", "noclean", "nodoc", "noinfo", "noman",



^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2012-09-08 12:55 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2012-09-08 12:55 UTC (permalink / raw
  To: gentoo-commits

commit:     a8270d3c73ce3c87e44744833be92e0ca55b2c4c
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sat Sep  8 12:32:31 2012 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sat Sep  8 12:32:31 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=a8270d3c

Merge tag 'v2.2.0_alpha117' into multilib


 bin/emaint                                        |    6 +-
 cnf/make.globals                                  |    2 +-
 man/ebuild.5                                      |   10 ++--
 man/emerge.1                                      |    4 +
 pym/_emerge/create_depgraph_params.py             |    5 ++
 pym/_emerge/depgraph.py                           |   26 +++++++--
 pym/_emerge/main.py                               |    6 ++
 pym/portage/checksum.py                           |   20 ++++++
 pym/portage/dbapi/vartree.py                      |   12 +++-
 pym/portage/manifest.py                           |    7 +-
 pym/portage/output.py                             |   42 +++++++++----
 pym/portage/package/ebuild/fetch.py               |   13 ++--
 pym/portage/tests/emerge/test_emerge_slot_abi.py  |    9 ++-
 pym/portage/tests/resolver/ResolverPlayground.py  |    3 +
 pym/portage/tests/resolver/test_complete_graph.py |   66 ++++++++++++++++++++-
 pym/portage/tests/runTests                        |    3 +
 16 files changed, 191 insertions(+), 43 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2012-09-08 12:55 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2012-09-08 12:55 UTC (permalink / raw
  To: gentoo-commits

commit:     09cb26569c2c4474a0bdd610dcd3a2ee69df78a6
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sat Sep  8 12:33:45 2012 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sat Sep  8 12:33:45 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=09cb2656

Merge tag 'v2.2.0_alpha118' into multilib


 pym/portage/_global_updates.py                     |   14 ++-
 pym/portage/dbapi/__init__.py                      |   28 +++-
 pym/portage/tests/emerge/test_global_updates.py    |    6 +-
 .../{util/_eventloop => tests/update}/__init__.py  |    0
 pym/portage/tests/{bin => update}/__test__         |    0
 pym/portage/tests/update/test_move_slot_ent.py     |  149 ++++++++++++++++++++
 pym/portage/update.py                              |   23 +++-
 7 files changed, 204 insertions(+), 16 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2012-09-08 12:55 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2012-09-08 12:55 UTC (permalink / raw
  To: gentoo-commits

commit:     d758279d0d922723583b2cc058f0e816744047d7
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sat Sep  8 12:34:25 2012 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sat Sep  8 12:34:25 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=d758279d

Merge tag 'v2.2.0_alpha121' into multilib


 Makefile                                       |    1 -
 bin/chpathtool.py                              |   10 +-
 bin/ebuild-helpers/prepstrip                   |    2 +-
 bin/emaint                                     |  659 +-----------------------
 bin/repoman                                    |    5 +-
 cnf/make.conf                                  |    5 +-
 cnf/make.globals                               |    2 +-
 man/ebuild.5                                   |    2 +-
 man/emaint.1                                   |   28 +-
 man/make.conf.5                                |    7 +
 man/portage.5                                  |   13 +-
 man/repoman.1                                  |    3 -
 pym/_emerge/main.py                            |   24 +-
 pym/portage/_selinux.py                        |   40 +-
 pym/portage/const.py                           |    2 +-
 pym/portage/dbapi/bintree.py                   |   56 ++-
 pym/portage/dbapi/vartree.py                   |   35 +-
 pym/portage/emaint/__init__.py                 |    7 +
 pym/portage/emaint/defaults.py                 |   18 +
 pym/portage/emaint/main.py                     |  218 ++++++++
 pym/portage/emaint/module.py                   |  194 +++++++
 pym/portage/emaint/modules/__init__.py         |    7 +
 pym/portage/emaint/modules/binhost/__init__.py |   22 +
 pym/portage/emaint/modules/binhost/binhost.py  |  163 ++++++
 pym/portage/emaint/modules/config/__init__.py  |   22 +
 pym/portage/emaint/modules/config/config.py    |  101 ++++
 pym/portage/emaint/modules/logs/__init__.py    |   51 ++
 pym/portage/emaint/modules/logs/logs.py        |  103 ++++
 pym/portage/emaint/modules/move/__init__.py    |   33 ++
 pym/portage/emaint/modules/move/move.py        |  162 ++++++
 pym/portage/emaint/modules/resume/__init__.py  |   22 +
 pym/portage/emaint/modules/resume/resume.py    |   58 ++
 pym/portage/emaint/modules/world/__init__.py   |   22 +
 pym/portage/emaint/modules/world/world.py      |   89 ++++
 pym/portage/emaint/progress.py                 |   61 +++
 pym/portage/output.py                          |   34 +-
 pym/portage/package/ebuild/doebuild.py         |   29 +
 pym/portage/util/_desktop_entry.py             |    6 +-
 pym/portage/util/_urlopen.py                   |   99 +++-
 pym/portage/util/movefile.py                   |   55 ++-
 pym/portage/util/whirlpool.py                  |    2 +
 pym/repoman/checks.py                          |   22 +-
 42 files changed, 1715 insertions(+), 779 deletions(-)

diff --cc pym/portage/const.py
index 7c75381,c2049f8..65f4625
--- a/pym/portage/const.py
+++ b/pym/portage/const.py
@@@ -90,10 -89,10 +90,10 @@@ SUPPORTED_FEATURES       = frozenset(
                             "assume-digests", "binpkg-logs", "buildpkg", "buildsyspkg", "candy",
                             "ccache", "chflags", "clean-logs",
                             "collision-protect", "compress-build-logs", "compressdebug",
-                            "config-protect-if-modified",
+                            "compress-index", "config-protect-if-modified",
                             "digest", "distcc", "distcc-pump", "distlocks",
                             "downgrade-backup", "ebuild-locks", "fakeroot",
 -                           "fail-clean", "force-mirror", "force-prefix", "getbinpkg",
 +                           "fail-clean", "force-mirror", "force-multilib", "force-prefix", "getbinpkg",
                             "installsources", "keeptemp", "keepwork", "fixlafiles", "lmirror",
                             "metadata-transfer", "mirror", "multilib-strict", "news",
                             "noauto", "noclean", "nodoc", "noinfo", "noman",


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2012-09-08 12:55 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2012-09-08 12:55 UTC (permalink / raw
  To: gentoo-commits

commit:     be2946fe248d6a519c3dfc67fe125d801d4e01e5
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sat Sep  8 12:33:58 2012 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sat Sep  8 12:33:58 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=be2946fe

Merge tag 'v2.2.0_alpha119' into multilib


 bin/ebuild-helpers/prepstrip                    |    1 +
 bin/emaint                                      |    7 +-
 pym/_emerge/FakeVartree.py                      |    5 +-
 pym/portage/dbapi/__init__.py                   |    7 +-
 pym/portage/dbapi/bintree.py                    |   13 ++-
 pym/portage/dbapi/vartree.py                    |   11 +-
 pym/portage/tests/update/test_move_ent.py       |  109 +++++++++++++
 pym/portage/tests/update/test_move_slot_ent.py  |    9 +-
 pym/portage/tests/update/test_update_dbentry.py |  184 +++++++++++++++++++++++
 pym/portage/update.py                           |   22 ++-
 pym/portage/versions.py                         |    2 +
 11 files changed, 347 insertions(+), 23 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2012-09-08 12:55 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2012-09-08 12:55 UTC (permalink / raw
  To: gentoo-commits

commit:     6177403a63872d05a9338b26d9907620782305e8
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sat Sep  8 12:34:10 2012 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sat Sep  8 12:34:10 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=6177403a

Merge tag 'v2.2.0_alpha120' into multilib


 bin/etc-update                                   |    7 ++
 bin/portageq                                     |   12 +--
 bin/quickpkg                                     |   13 ++--
 man/portage.5                                    |    3 +
 pym/_emerge/DependencyArg.py                     |    5 +-
 pym/_emerge/actions.py                           |   28 +++++--
 pym/_emerge/depgraph.py                          |    7 ++-
 pym/portage/dbapi/bintree.py                     |   15 +++-
 pym/portage/dbapi/vartree.py                     |   11 ++-
 pym/portage/dep/__init__.py                      |   89 +++++++++++++++++-----
 pym/portage/tests/dep/testAtom.py                |    4 +
 pym/portage/tests/dep/test_best_match_to_list.py |    2 +
 pym/portage/tests/dep/test_match_from_list.py    |    2 +
 pym/portage/update.py                            |   17 ++--
 14 files changed, 155 insertions(+), 60 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2012-09-08 12:55 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2012-09-08 12:55 UTC (permalink / raw
  To: gentoo-commits

commit:     08bd5f74925f499b840afcfd68181905ea226b49
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sat Sep  8 12:35:05 2012 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sat Sep  8 12:35:05 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=08bd5f74

Merge tag 'v2.2.0_alpha122' into multilib


 bin/dispatch-conf                                  |   10 +-
 bin/ebuild-helpers/doins                           |    4 +-
 bin/ebuild-helpers/newins                          |    4 +-
 bin/ebuild.sh                                      |    4 +-
 bin/egencache                                      |    2 +-
 bin/emerge-webrsync                                |  114 +++--
 bin/isolated-functions.sh                          |    4 +-
 bin/phase-functions.sh                             |   12 +-
 bin/phase-helpers.sh                               |    4 +-
 cnf/metadata.dtd                                   |    7 +-
 man/make.conf.5                                    |   24 +-
 misc/emerge-delta-webrsync                         |  613 ++++++++++++++++++++
 mkrelease.sh                                       |    2 +-
 pym/_emerge/BinpkgFetcher.py                       |   10 +-
 pym/_emerge/EbuildFetcher.py                       |    6 +-
 pym/_emerge/EbuildMetadataPhase.py                 |   13 +-
 pym/_emerge/PollScheduler.py                       |   18 +-
 pym/_emerge/Scheduler.py                           |    9 +-
 pym/_emerge/SpawnProcess.py                        |   17 +-
 pym/portage/checksum.py                            |   58 ++
 pym/portage/dbapi/bintree.py                       |    7 +-
 pym/portage/getbinpkg.py                           |    8 +-
 pym/portage/manifest.py                            |   15 +-
 .../package/ebuild/_config/special_env_vars.py     |    1 +
 pym/portage/package/ebuild/digestcheck.py          |   15 +-
 pym/portage/package/ebuild/doebuild.py             |   18 +-
 pym/portage/package/ebuild/fetch.py                |   23 +-
 pym/portage/process.py                             |    6 +-
 pym/portage/tests/lint/test_bash_syntax.py         |   12 +-
 pym/portage/util/_eventloop/EventLoop.py           |   65 ++-
 30 files changed, 967 insertions(+), 138 deletions(-)

diff --cc bin/phase-functions.sh
index 43e5ef8,3520199..8db6048
--- a/bin/phase-functions.sh
+++ b/bin/phase-functions.sh
@@@ -401,19 -362,9 +401,19 @@@ dyn_prepare() 
  		return 0
  	fi
  
 +	for LOOP_ABI in $(get_abi_list); do
 +		if [[ " ${FEATURES} " == *" force-multilib "* ]]; then
 +			is_ebuild && { set_abi ${LOOP_ABI}; source "${T}"/environment || die ; }
 +
 +			if [ "${PORTAGE_BUILDDIR}"/.prepared.${LOOP_ABI} -nt "${WORKDIR}" ]; then
 +				echo ">>> It appears that ${PN} is already prepared for ABI=${LOOP_ABI}; skipping."
 +				echo ">>> Remove '$PORTAGE_BUILDDIR/.prepared.${LOOP_ABI}' to force prepare."
 +				continue
 +			fi
 +		fi
  	if [[ -d $S ]] ; then
  		cd "${S}"
- 	elif has $EAPI 0 1 2 3 3_pre2 ; then
+ 	elif has $EAPI 0 1 2 3 ; then
  		cd "${WORKDIR}"
  	elif [[ -z ${A} ]] && ! has_phase_defined_up_to prepare; then
  		cd "${WORKDIR}"
@@@ -452,19 -393,9 +452,19 @@@ dyn_configure() 
  		return 0
  	fi
  
 +	for LOOP_ABI in $(get_abi_list); do
 +		if [[ " ${FEATURES} " == *" force-multilib "* ]]; then
 +			is_ebuild && { set_abi ${LOOP_ABI}; source "${T}"/environment || die ; }
 +
 +			if [ ${PORTAGE_BUILDDIR}/.configured.${LOOP_ABI} -nt "${WORKDIR}" ]; then
 +				echo ">>> It appears that ${PN} is already configured for ABI=${LOOP_ABI}; skipping."
 +				echo ">>> Remove '$PORTAGE_BUILDDIR/.configured.${LOOP_ABI}' to force configuration."
 +				continue
 +			fi
 +		fi
  	if [[ -d $S ]] ; then
  		cd "${S}"
- 	elif has $EAPI 0 1 2 3 3_pre2 ; then
+ 	elif has $EAPI 0 1 2 3 ; then
  		cd "${WORKDIR}"
  	elif [[ -z ${A} ]] && ! has_phase_defined_up_to configure; then
  		cd "${WORKDIR}"
@@@ -504,19 -426,9 +504,19 @@@ dyn_compile() 
  		return 0
  	fi
  
 +	for LOOP_ABI in $(get_abi_list); do
 +		if [[ " ${FEATURES} " == *" force-multilib "* ]]; then
 +			is_ebuild && { set_abi ${LOOP_ABI}; source "${T}"/environment || die ; }
 +
 +			if [ ${PORTAGE_BUILDDIR}/.compiled.${LOOP_ABI} -nt "${WORKDIR}" ]; then
 +				echo ">>> It appears that ${PN} is already compiled for ABI=${LOOP_ABI}; skipping."
 +				echo ">>> Remove '$PORTAGE_BUILDDIR/.compiled.${LOOP_ABI}' to force compilation."
 +				continue
 +			fi
 +		fi
  	if [[ -d $S ]] ; then
  		cd "${S}"
- 	elif has $EAPI 0 1 2 3 3_pre2 ; then
+ 	elif has $EAPI 0 1 2 3 ; then
  		cd "${WORKDIR}"
  	elif [[ -z ${A} ]] && ! has_phase_defined_up_to compile; then
  		cd "${WORKDIR}"


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2012-09-08 12:55 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2012-09-08 12:55 UTC (permalink / raw
  To: gentoo-commits

commit:     73ec94c112a7c0f088f63aa6b0e892be9d0ad381
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sat Sep  8 12:35:20 2012 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sat Sep  8 12:35:20 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=73ec94c1

Merge tag 'v2.2.0_alpha123' into multilib


 bin/ebuild-helpers/newbin                          |   23 +------
 bin/ebuild-helpers/newconfd                        |   23 +------
 bin/ebuild-helpers/newdoc                          |   23 +------
 bin/ebuild-helpers/newenvd                         |   23 +------
 bin/ebuild-helpers/newexe                          |   23 +------
 bin/ebuild-helpers/newinitd                        |   23 +------
 bin/ebuild-helpers/newins                          |   70 ++++++++++++------
 bin/ebuild-helpers/newlib.a                        |   23 +------
 bin/ebuild-helpers/newlib.so                       |   23 +------
 bin/ebuild-helpers/newman                          |   23 +------
 bin/ebuild-helpers/newsbin                         |   23 +------
 bin/ebuild-helpers/prepstrip                       |   30 ++++----
 pym/_emerge/Package.py                             |   19 ++++-
 pym/portage/dbapi/__init__.py                      |   16 ++--
 pym/portage/dbapi/porttree.py                      |    4 +-
 pym/portage/dbapi/virtual.py                       |    4 +-
 pym/portage/dep/dep_check.py                       |   19 +----
 pym/portage/eapi.py                                |   11 +++-
 .../package/ebuild/_config/KeywordsManager.py      |   42 +++++++++--
 pym/portage/package/ebuild/_config/UseManager.py   |   79 ++++++++++++++++++--
 pym/portage/package/ebuild/config.py               |   21 ++++-
 pym/portage/package/ebuild/getmaskingstatus.py     |    7 +-
 pym/portage/tests/ebuild/test_doebuild_spawn.py    |    2 +
 pym/portage/util/__init__.py                       |    7 ++
 pym/portage/util/_desktop_entry.py                 |   60 +++++++++++----
 pym/portage/versions.py                            |   27 ++++++-
 26 files changed, 322 insertions(+), 326 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2012-09-08 12:55 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2012-09-08 12:55 UTC (permalink / raw
  To: gentoo-commits

commit:     142c475fa532b191b254f325c9b48f54fb21dfeb
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sat Sep  8 12:53:25 2012 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sat Sep  8 12:53:25 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=142c475f

Merge v2.2.0_alpha124


 NEWS                                               |    4 +-
 bin/archive-conf                                   |   13 +-
 bin/banned-helper                                  |    6 -
 bin/binhost-snapshot                               |   13 +-
 bin/clean_locks                                    |   13 +-
 bin/dispatch-conf                                  |   12 +-
 bin/ebuild                                         |   11 +-
 bin/ebuild-helpers/4/dodoc                         |    1 -
 bin/ebuild-helpers/4/dohard                        |    1 -
 bin/ebuild-helpers/4/dosed                         |    1 -
 bin/ebuild-helpers/4/prepalldocs                   |    1 -
 bin/ebuild-helpers/{ => bsd}/sed                   |   14 +-
 bin/ebuild-helpers/dodoc                           |   13 +-
 bin/ebuild-helpers/dohard                          |   11 +-
 bin/ebuild-helpers/doheader                        |   21 ++
 bin/ebuild-helpers/doins                           |   16 +-
 bin/ebuild-helpers/dosed                           |   11 +-
 bin/ebuild-helpers/{newbin => newheader}           |    0
 bin/ebuild-helpers/newins                          |    2 +-
 bin/ebuild-helpers/prepalldocs                     |   11 +-
 bin/ebuild.sh                                      |    2 +-
 bin/egencache                                      |   11 +-
 bin/emaint                                         |   11 +-
 bin/emerge                                         |   11 +-
 bin/env-update                                     |   13 +-
 bin/fixpackages                                    |   13 +-
 bin/glsa-check                                     |   13 +-
 bin/phase-functions.sh                             |   34 ++-
 bin/phase-helpers.sh                               |  141 +++++++++--
 bin/portageq                                       |   58 +++--
 bin/quickpkg                                       |   11 +-
 bin/regenworld                                     |   13 +-
 bin/repoman                                        |   12 +-
 bin/save-ebuild-env.sh                             |   11 +-
 cnf/make.globals                                   |    2 +-
 doc/package/ebuild.docbook                         |    1 +
 doc/package/ebuild/eapi/4-slot-abi.docbook         |   12 +-
 doc/package/ebuild/eapi/5.docbook                  |  260 ++++++++++++++++++++
 doc/portage.docbook                                |    1 +
 man/emerge.1                                       |   16 +-
 man/make.conf.5                                    |    5 -
 pym/_emerge/EbuildMetadataPhase.py                 |    6 +-
 pym/_emerge/FakeVartree.py                         |   20 +-
 pym/_emerge/Package.py                             |   26 +-
 pym/_emerge/Scheduler.py                           |   19 +-
 pym/_emerge/create_depgraph_params.py              |   20 +-
 pym/_emerge/depgraph.py                            |  131 ++++++-----
 pym/_emerge/main.py                                |   16 +-
 pym/_emerge/resolver/backtracking.py               |   16 +-
 pym/_emerge/resolver/circular_dependency.py        |    9 +-
 pym/_emerge/resolver/slot_collision.py             |    4 +-
 pym/portage/__init__.py                            |    2 +-
 pym/portage/_sets/__init__.py                      |    5 +
 pym/portage/_sets/dbapi.py                         |   72 ++++++
 pym/portage/const.py                               |    3 +-
 pym/portage/dbapi/__init__.py                      |   15 +-
 pym/portage/dbapi/_expand_new_virt.py              |   10 +-
 pym/portage/dep/__init__.py                        |  141 ++++++-----
 .../dep/{_slot_abi.py => _slot_operator.py}        |   24 +-
 pym/portage/eapi.py                                |   23 ++-
 pym/portage/emaint/modules/config/config.py        |   66 ++----
 pym/portage/glsa.py                                |    3 +-
 .../package/ebuild/_config/special_env_vars.py     |    8 +-
 pym/portage/package/ebuild/_eapi_invalid.py        |   13 -
 pym/portage/package/ebuild/config.py               |  104 ++++++++-
 pym/portage/package/ebuild/doebuild.py             |   49 +++--
 pym/portage/tests/dep/testAtom.py                  |   16 +-
 pym/portage/tests/dep/testCheckRequiredUse.py      |   16 ++-
 .../tests/dep/test_get_required_use_flags.py       |    4 +-
 pym/portage/tests/dep/test_match_from_list.py      |    6 +-
 pym/portage/tests/emerge/test_simple.py            |    2 +-
 pym/portage/tests/resolver/test_complete_graph.py  |    4 +-
 pym/portage/tests/resolver/test_slot_abi.py        |   26 +-
 .../tests/resolver/test_slot_abi_downgrade.py      |    8 +-
 pym/portage/util/_desktop_entry.py                 |   14 +
 pym/portage/versions.py                            |   10 +-
 76 files changed, 1185 insertions(+), 552 deletions(-)

diff --cc bin/phase-functions.sh
index 8db6048,68a33a8..66418c2
--- a/bin/phase-functions.sh
+++ b/bin/phase-functions.sh
@@@ -311,15 -273,15 +311,16 @@@ dyn_clean() 
  	fi
  
  	if [[ $EMERGE_FROM = binary ]] || ! has keepwork $FEATURES; then
 -		rm -f "$PORTAGE_BUILDDIR"/.{ebuild_changed,logid,pretended,setuped,unpacked,prepared} \
 -			"$PORTAGE_BUILDDIR"/.{configured,compiled,tested,packaged} \
 +		rm -f "$PORTAGE_BUILDDIR"/.{ebuild_changed,logid,pretended*,setuped*,unpacked*,prepared*} \
 +			"$PORTAGE_BUILDDIR"/.{configured*,compiled*,tested*,packaged*} \
 +			"$PORTAGE_BUILDDIR"/.abi \
  			"$PORTAGE_BUILDDIR"/.die_hooks \
  			"$PORTAGE_BUILDDIR"/.ipc_{in,out,lock} \
- 			"$PORTAGE_BUILDDIR"/.exit_status
+ 			"$PORTAGE_BUILDDIR"/.exit_status \
+ 			"$PORTAGE_BUILDDIR"/.apply_user_patches
  
 -		rm -rf "${PORTAGE_BUILDDIR}/build-info"
 -		rm -rf "${WORKDIR}"
 +		rm -rf "${PORTAGE_BUILDDIR}"/{build-info,abi-code}
 +		rm -rf "${WORKDIR}"*
  	fi
  
  	if [ -f "${PORTAGE_BUILDDIR}/.unpacked" ]; then
diff --cc pym/portage/const.py
index 65f4625,3b8e350..a002c98
--- a/pym/portage/const.py
+++ b/pym/portage/const.py
@@@ -79,9 -79,10 +79,11 @@@ OS_HEADERS_PACKAGE_ATOM  = "virtual/os-
  INCREMENTALS             = ("USE", "USE_EXPAND", "USE_EXPAND_HIDDEN",
                             "FEATURES", "ACCEPT_KEYWORDS",
                             "CONFIG_PROTECT_MASK", "CONFIG_PROTECT",
+                            "IUSE_IMPLICIT",
                             "PRELINK_PATH", "PRELINK_PATH_MASK",
                             "PROFILE_ONLY_VARIABLES",
 -                           "USE_EXPAND_IMPLICIT", "USE_EXPAND_UNPREFIXED")
++                           "USE_EXPAND_IMPLICIT", "USE_EXPAND_UNPREFIXED",
 +                           "NO_AUTO_FLAG", "RESTRICT_MULTILIB_BINARIES")
  EBUILD_PHASES            = ("pretend", "setup", "unpack", "prepare", "configure",
                             "compile", "test", "install",
                             "package", "preinst", "postinst","prerm", "postrm",
diff --cc pym/portage/package/ebuild/doebuild.py
index 8d118c4,471a5da..254911a
--- a/pym/portage/package/ebuild/doebuild.py
+++ b/pym/portage/package/ebuild/doebuild.py
@@@ -1638,12 -1656,12 +1656,16 @@@ def _post_src_install_write_metadata(se
  
  	build_info_dir = os.path.join(settings['PORTAGE_BUILDDIR'], 'build-info')
  
- 	for k in ('IUSE',):
- 		v = settings.get(k)
+ 	metadata_keys = ['IUSE']
+ 	if eapi_attrs.iuse_effective:
+ 		metadata_keys.append('IUSE_EFFECTIVE')
+ 
+ 	for k in metadata_keys:
+ 		v = settings.configdict['pkg'].get(k)
 +		if "force-multilib" in settings.features:
 +			v = v + " abiwrapper"
 +			for i in settings.get('MULTILIB_ABIS').split():
 +				v = v + " multilib_abi_" + i
  		if v is not None:
  			write_atomic(os.path.join(build_info_dir, k), v + '\n')
  


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2012-09-17 17:07 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2012-09-17 17:07 UTC (permalink / raw
  To: gentoo-commits

commit:     ba7e40ba4ec4974a5469d707853dd41fcad13a55
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Mon Sep 17 17:06:54 2012 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Mon Sep 17 17:06:54 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=ba7e40ba

Merge tag 'v2.2.0_alpha128' into multilib


 DEVELOPING                                         |   13 +-
 bin/egencache                                      |   40 +++--
 bin/etc-update                                     |   15 +-
 bin/phase-functions.sh                             |   26 +---
 bin/phase-helpers.sh                               |   59 ++----
 bin/repoman                                        |  156 ++++++++++------
 bin/save-ebuild-env.sh                             |    3 +-
 cnf/dispatch-conf.conf                             |    1 +
 cnf/make.conf                                      |    2 +-
 doc/package/ebuild/eapi/5.docbook                  |   68 ++-----
 man/ebuild.5                                       |    7 +-
 man/emerge.1                                       |   25 ++-
 man/make.conf.5                                    |   11 +-
 man/portage.5                                      |   20 +-
 pym/_emerge/EbuildBuildDir.py                      |    7 +-
 pym/_emerge/EbuildPhase.py                         |   12 +-
 pym/_emerge/Scheduler.py                           |    5 +-
 pym/_emerge/depgraph.py                            |   21 ++-
 pym/_emerge/main.py                                |    6 +
 pym/_emerge/resolver/output.py                     |  152 ++++++----------
 pym/_emerge/resolver/output_helpers.py             |   76 +++++++-
 pym/portage/__init__.py                            |   46 +++--
 pym/portage/_sets/__init__.py                      |   12 ++
 pym/portage/_sets/dbapi.py                         |   36 +++--
 pym/portage/checksum.py                            |   17 ++-
 pym/portage/const.py                               |    2 +-
 pym/portage/data.py                                |   23 ++-
 .../package/ebuild/_config/LocationsManager.py     |    2 +-
 pym/portage/package/ebuild/_config/UseManager.py   |   86 +++++++--
 pym/portage/package/ebuild/config.py               |   11 +-
 pym/portage/package/ebuild/doebuild.py             |    7 +-
 pym/portage/proxy/objectproxy.py                   |    9 +-
 pym/portage/repository/config.py                   |   12 +-
 pym/portage/tests/dbapi/test_portdb_cache.py       |  193 ++++++++++++++++++++
 pym/portage/tests/lint/test_bash_syntax.py         |   16 ++-
 pym/portage/tests/lint/test_import_modules.py      |    2 +-
 pym/portage/tests/repoman/test_simple.py           |   35 ++++-
 pym/portage/tests/resolver/ResolverPlayground.py   |   12 +-
 .../tests/resolver/test_features_test_use.py       |   68 +++++++
 pym/portage/util/__init__.py                       |   21 ++-
 pym/portage/util/_desktop_entry.py                 |   52 +-----
 pym/portage/xml/metadata.py                        |    9 +-
 pym/repoman/herdbase.py                            |    5 +-
 pym/repoman/utilities.py                           |   34 +++-
 44 files changed, 938 insertions(+), 497 deletions(-)

diff --cc bin/phase-functions.sh
index 66418c2,e50b340..9a1679c
--- a/bin/phase-functions.sh
+++ b/bin/phase-functions.sh
@@@ -311,16 -273,14 +311,15 @@@ dyn_clean() 
  	fi
  
  	if [[ $EMERGE_FROM = binary ]] || ! has keepwork $FEATURES; then
 -		rm -f "$PORTAGE_BUILDDIR"/.{ebuild_changed,logid,pretended,setuped,unpacked,prepared} \
 -			"$PORTAGE_BUILDDIR"/.{configured,compiled,tested,packaged} \
 +		rm -f "$PORTAGE_BUILDDIR"/.{ebuild_changed,logid,pretended*,setuped*,unpacked*,prepared*} \
 +			"$PORTAGE_BUILDDIR"/.{configured*,compiled*,tested*,packaged*} \
 +			"$PORTAGE_BUILDDIR"/.abi \
  			"$PORTAGE_BUILDDIR"/.die_hooks \
  			"$PORTAGE_BUILDDIR"/.ipc_{in,out,lock} \
- 			"$PORTAGE_BUILDDIR"/.exit_status \
- 			"$PORTAGE_BUILDDIR"/.apply_user_patches
+ 			"$PORTAGE_BUILDDIR"/.exit_status
  
 -		rm -rf "${PORTAGE_BUILDDIR}/build-info"
 -		rm -rf "${WORKDIR}"
 +		rm -rf "${PORTAGE_BUILDDIR}"/{build-info,abi-code}
 +		rm -rf "${WORKDIR}"*
  	fi
  
  	if [ -f "${PORTAGE_BUILDDIR}/.unpacked" ]; then


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2012-09-22 15:23 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2012-09-22 15:23 UTC (permalink / raw
  To: gentoo-commits

commit:     baf9799818ebdd09c291c94419cd5a427a21c9f5
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sat Sep 22 15:22:31 2012 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sat Sep 22 15:22:31 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=baf97998

Merge 2.2_alpha130


 bin/bashrc-functions.sh                            |   59 +----
 bin/ebuild-helpers/dobin                           |    6 +-
 bin/ebuild-helpers/doconfd                         |    2 +-
 bin/ebuild-helpers/dodir                           |    2 +-
 bin/ebuild-helpers/dodoc                           |    4 +-
 bin/ebuild-helpers/doenvd                          |    2 +-
 bin/ebuild-helpers/doexe                           |    6 +-
 bin/ebuild-helpers/doheader                        |    4 +-
 bin/ebuild-helpers/dohtml                          |    2 +-
 bin/ebuild-helpers/doinfo                          |    6 +-
 bin/ebuild-helpers/doinitd                         |    2 +-
 bin/ebuild-helpers/doins                           |   14 +-
 bin/ebuild-helpers/dolib                           |    6 +-
 bin/ebuild-helpers/doman                           |    6 +-
 bin/ebuild-helpers/domo                            |    4 +-
 bin/ebuild-helpers/dosbin                          |    6 +-
 bin/ebuild-helpers/dosym                           |    4 +-
 bin/ebuild-helpers/ecompress                       |   14 +-
 bin/ebuild-helpers/ecompressdir                    |   22 +-
 bin/ebuild-helpers/emake                           |    2 +-
 bin/ebuild-helpers/fowners                         |    2 +-
 bin/ebuild-helpers/fperms                          |    2 +-
 bin/ebuild-helpers/newins                          |   10 +-
 bin/ebuild-helpers/prepalldocs                     |    2 +-
 bin/ebuild-helpers/prepinfo                        |    2 +-
 bin/ebuild-helpers/prepstrip                       |   22 +-
 bin/ebuild.sh                                      |   42 +--
 bin/egencache                                      |    4 +-
 bin/emerge-webrsync                                |   20 +-
 bin/helper-functions.sh                            |   26 +-
 bin/isolated-functions.sh                          |   82 ++---
 bin/misc-functions.sh                              |   90 +++---
 bin/phase-functions.sh                             |  332 ++++++++++----------
 bin/phase-helpers.sh                               |   80 +++---
 bin/save-ebuild-env.sh                             |   52 ++--
 doc/package/ebuild/eapi/5.docbook                  |   40 ++--
 man/ebuild.5                                       |  149 +++++++++-
 man/emerge.1                                       |    8 +-
 man/make.conf.5                                    |    9 -
 man/portage.5                                      |   89 ++++--
 misc/emerge-delta-webrsync                         |    4 +
 pym/_emerge/EbuildMetadataPhase.py                 |    9 +-
 pym/_emerge/MetadataRegen.py                       |    6 +-
 pym/_emerge/Package.py                             |   17 +-
 pym/portage/cache/sqlite.py                        |   16 +-
 pym/portage/const.py                               |    4 +-
 pym/portage/dbapi/__init__.py                      |   10 +
 pym/portage/dep/__init__.py                        |    2 +
 pym/portage/dep/dep_check.py                       |   13 +-
 pym/portage/package/ebuild/config.py               |   39 ++-
 .../package/ebuild/deprecated_profile_check.py     |   21 +-
 pym/portage/package/ebuild/doebuild.py             |   41 +++-
 pym/portage/tests/dep/testAtom.py                  |    1 -
 pym/portage/tests/dep/test_isvalidatom.py          |    2 +-
 pym/portage/tests/dep/test_match_from_list.py      |    2 -
 pym/portage/tests/repoman/test_simple.py           |    4 +-
 pym/portage/tests/update/test_update_dbentry.py    |   48 +++
 pym/portage/update.py                              |   82 ++++--
 58 files changed, 902 insertions(+), 655 deletions(-)

diff --cc bin/phase-functions.sh
index 9a1679c,2b93231..6ebcbe0
--- a/bin/phase-functions.sh
+++ b/bin/phase-functions.sh
@@@ -211,86 -208,51 +211,86 @@@ __ebuild_phase_with_hooks() 
  	done
  }
  
- dyn_pretend() {
+ __dyn_pretend() {
  	if [[ -e $PORTAGE_BUILDDIR/.pretended ]] ; then
- 		vecho ">>> It appears that '$PF' is already pretended; skipping."
- 		vecho ">>> Remove '$PORTAGE_BUILDDIR/.pretended' to force pretend."
+ 		__vecho ">>> It appears that '$PF' is already pretended; skipping."
+ 		__vecho ">>> Remove '$PORTAGE_BUILDDIR/.pretended' to force pretend."
  		return 0
  	fi
- 	ebuild_phase pre_pkg_pretend
- 	ebuild_phase pkg_pretend
+ 	__ebuild_phase pre_pkg_pretend
+ 	__ebuild_phase pkg_pretend
  	>> "$PORTAGE_BUILDDIR/.pretended" || \
  		die "Failed to create $PORTAGE_BUILDDIR/.pretended"
- 	ebuild_phase post_pkg_pretend
+ 	__ebuild_phase post_pkg_pretend
  }
  
- dyn_setup() {
+ __dyn_setup() {
 -	if [[ -e $PORTAGE_BUILDDIR/.setuped ]] ; then
 -		__vecho ">>> It appears that '$PF' is already setup; skipping."
 -		__vecho ">>> Remove '$PORTAGE_BUILDDIR/.setuped' to force setup."
 -		return 0
 +	if [[ " ${FEATURES} " == *" force-multilib "* ]]; then
 +		if ! is_auto-multilib && ! use multilib_abi_"${DEFAULT_ABI}" ; then
 +			ewarn
 +			ewarn "You disabled all ABIs"
 +			ewarn "You should enable at least one ABI"
 +			ewarn "Enabling the default ABI now"
 +			ewarn
 +		fi
  	fi
 +	for LOOP_ABI in $(get_abi_list); do
 +		if [[ " ${FEATURES} " == *" force-multilib "* ]]; then
 +			set_abi ${LOOP_ABI}
 +			if is_ebuild; then
 +				source "${T}"/environment || die
 +			else
 +				rm -f "${T}"/environment
 +			fi
 +			if [[ -e $PORTAGE_BUILDDIR/.setuped.${ABI} ]] ; then
- 				vecho ">>> It appears that '$PF' is already setup; skipping."
- 				vecho ">>> Remove '$PORTAGE_BUILDDIR/.setuped.${ABI}' to force setup."
++				__vecho ">>> It appears that '$PF' is already setup; skipping."
++				__vecho ">>> Remove '$PORTAGE_BUILDDIR/.setuped.${ABI}' to force setup."
 +				return 0
 +			fi
 +		fi
- 	ebuild_phase pre_pkg_setup
- 	ebuild_phase pkg_setup
+ 	__ebuild_phase pre_pkg_setup
+ 	__ebuild_phase pkg_setup
 +	>> "$PORTAGE_BUILDDIR/.setuped.${ABI}" || \
 +		die "Failed to create $PORTAGE_BUILDDIR/.setuped"
 +
 +		[[ " ${FEATURES} " == *" force-multilib "* ]] && is_ebuild && { unset_abi; source "${T}"/environment || die ; }
 +	done
 +
  	>> "$PORTAGE_BUILDDIR/.setuped" || \
  		die "Failed to create $PORTAGE_BUILDDIR/.setuped"
- 	ebuild_phase post_pkg_setup
+ 	__ebuild_phase post_pkg_setup
 +
 +	[[ " ${FEATURES} " == *" force-multilib "* ]] && is_ebuild && { rm "${T}"/environment || die ; }
  }
  
- dyn_unpack() {
+ __dyn_unpack() {
  	if [[ -f ${PORTAGE_BUILDDIR}/.unpacked ]] ; then
- 		vecho ">>> WORKDIR is up-to-date, keeping..."
+ 		__vecho ">>> WORKDIR is up-to-date, keeping..."
  		return 0
  	fi
  	if [ ! -d "${WORKDIR}" ]; then
  		install -m${PORTAGE_WORKDIR_MODE:-0700} -d "${WORKDIR}" || die "Failed to create dir '${WORKDIR}'"
  	fi
  	cd "${WORKDIR}" || die "Directory change failed: \`cd '${WORKDIR}'\`"
- 	ebuild_phase pre_src_unpack
- 	vecho ">>> Unpacking source$(_get_abi_string)..."
- 	ebuild_phase src_unpack
+ 	__ebuild_phase pre_src_unpack
 -	__vecho ">>> Unpacking source..."
++	__vecho ">>> Unpacking source$(_get_abi_string)..."
+ 	__ebuild_phase src_unpack
 +
 +		if [[ " ${FEATURES} " == *" force-multilib "* ]]; then
 +			if is_auto-multilib && is_ebuild; then
 +				>> "$PORTAGE_BUILDDIR"/.unpacked."${LOOP_ABI}" || die "IO Failure -- Failed to 'touch .unpacked.${LOOP_ABI}'"
 +			fi
 +			is_ebuild && { unset_abi; source "${T}"/environment || die ; }
 +
 +			is_ebuild && { rm "${T}"/environment || die ; }
 +		fi
  	>> "$PORTAGE_BUILDDIR/.unpacked" || \
  		die "Failed to create $PORTAGE_BUILDDIR/.unpacked"
- 	vecho ">>> Source unpacked in ${WORKDIR}"
- 	ebuild_phase post_src_unpack
+ 	__vecho ">>> Source unpacked in ${WORKDIR}"
+ 	__ebuild_phase post_src_unpack
  }
  
- dyn_clean() {
+ __dyn_clean() {
  	if [ -z "${PORTAGE_BUILDDIR}" ]; then
  		echo "Aborting clean phase because PORTAGE_BUILDDIR is unset!"
  		return 1
@@@ -421,25 -372,15 +421,25 @@@ __dyn_prepare() 
  		die "The source directory '${S}' doesn't exist"
  	fi
  
- 	trap abort_prepare SIGINT SIGQUIT
+ 	trap __abort_prepare SIGINT SIGQUIT
  
- 	ebuild_phase pre_src_prepare
- 	vecho ">>> Preparing source in $PWD$(_get_abi_string) ..."
- 	ebuild_phase src_prepare
+ 	__ebuild_phase pre_src_prepare
 -	__vecho ">>> Preparing source in $PWD ..."
++	__vecho ">>> Preparing source in $PWD$(_get_abi_string) ..."
+ 	__ebuild_phase src_prepare
 +
 +		if [[ " ${FEATURES} " == *" force-multilib "* ]]; then
 +			if is_auto-multilib && is_ebuild; then
 +				>> "$PORTAGE_BUILDDIR"/.prepared."${LOOP_ABI}" || die "IO Failure -- Failed to 'touch .prepared.${LOOP_ABI}'"
 +			fi
 +			is_ebuild && { unset_abi; source "${T}"/environment || die ; }
 +		fi
 +	done
 +	[[ " ${FEATURES} " == *" force-multilib "* ]] && is_ebuild && { rm "${T}"/environment || die ; }
 +
  	>> "$PORTAGE_BUILDDIR/.prepared" || \
  		die "Failed to create $PORTAGE_BUILDDIR/.prepared"
- 	vecho ">>> Source prepared."
- 	ebuild_phase post_src_prepare
+ 	__vecho ">>> Source prepared."
+ 	__ebuild_phase post_src_prepare
  
  	trap - SIGINT SIGQUIT
  }
@@@ -472,26 -403,17 +472,26 @@@ __dyn_configure() 
  		die "The source directory '${S}' doesn't exist"
  	fi
  
- 	trap abort_configure SIGINT SIGQUIT
+ 	trap __abort_configure SIGINT SIGQUIT
  
- 	ebuild_phase pre_src_configure
+ 	__ebuild_phase pre_src_configure
  
- 	vecho ">>> Configuring source in $PWD$(_get_abi_string) ..."
- 	ebuild_phase src_configure
 -	__vecho ">>> Configuring source in $PWD ..."
++	__vecho ">>> Configuring source in $PWD$(_get_abi_string) ..."
+ 	__ebuild_phase src_configure
 +
 +		if [[ " ${FEATURES} " == *" force-multilib "* ]]; then
 +			if is_auto-multilib && is_ebuild; then
 +				>> "$PORTAGE_BUILDDIR"/.configured."${LOOP_ABI}" || die "IO Failure -- Failed to 'touch .configured.${LOOP_ABI}'"
 +			fi
 +			is_ebuild && { unset_abi; source "${T}"/environment || die ; }
 +		fi
 +	done
 +	[[ " ${FEATURES} " == *" force-multilib "* ]] && is_ebuild && { rm "${T}"/environment || die ; }
  	>> "$PORTAGE_BUILDDIR/.configured" || \
  		die "Failed to create $PORTAGE_BUILDDIR/.configured"
- 	vecho ">>> Source configured."
+ 	__vecho ">>> Source configured."
  
- 	ebuild_phase post_src_configure
+ 	__ebuild_phase post_src_configure
  
  	trap - SIGINT SIGQUIT
  }
@@@ -533,24 -445,15 +533,24 @@@ __dyn_compile() 
  		fi
  	fi
  
- 	ebuild_phase pre_src_compile
+ 	__ebuild_phase pre_src_compile
  
- 	vecho ">>> Compiling source in $PWD$(_get_abi_string) ..."
- 	ebuild_phase src_compile
 -	__vecho ">>> Compiling source in $PWD ..."
++	__vecho ">>> Compiling source in $PWD$(_get_abi_string) ..."
+ 	__ebuild_phase src_compile
 +
 +		if [[ " ${FEATURES} " == *" force-multilib "* ]]; then
 +			if is_auto-multilib && is_ebuild; then
 +				>> "$PORTAGE_BUILDDIR"/.compiled."${LOOP_ABI}" || die "IO Failure -- Failed to 'touch .compiled.${LOOP_ABI}'"
 +			fi
 +			is_ebuild && { unset_abi; source "${T}"/environment || die ; }
 +		fi
 +	done
 +	[[ " ${FEATURES} " == *" force-multilib "* ]] && is_ebuild && { rm "${T}"/environment || die ; }
  	>> "$PORTAGE_BUILDDIR/.compiled" || \
  		die "Failed to create $PORTAGE_BUILDDIR/.compiled"
- 	vecho ">>> Source compiled."
+ 	__vecho ">>> Source compiled."
  
- 	ebuild_phase post_src_compile
+ 	__ebuild_phase post_src_compile
  
  	trap - SIGINT SIGQUIT
  }
@@@ -568,10 -472,7 +569,10 @@@ __dyn_test() 
  		! has test ${USE} && export USE="${USE} test"
  	fi
  
- 	trap "abort_test" SIGINT SIGQUIT
+ 	trap "__abort_test" SIGINT SIGQUIT
 +	for LOOP_ABI in $(get_abi_list); do
 +		[[ " ${FEATURES} " == *" force-multilib "* ]] && is_ebuild && { set_abi ${LOOP_ABI}; source "${T}"/environment || die ; }
 +
  	if [ -d "${S}" ]; then
  		cd "${S}"
  	else
@@@ -579,32 -480,18 +580,32 @@@
  	fi
  
  	if ! has test $FEATURES && [ "${EBUILD_FORCE_TEST}" != "1" ]; then
- 		vecho ">>> Test phase [not enabled]: ${CATEGORY}/${PF}"
+ 		__vecho ">>> Test phase [not enabled]: ${CATEGORY}/${PF}"
  	elif has test $RESTRICT; then
  		einfo "Skipping make test/check due to ebuild restriction."
- 		vecho ">>> Test phase [explicitly disabled]: ${CATEGORY}/${PF}"
+ 		__vecho ">>> Test phase [explicitly disabled]: ${CATEGORY}/${PF}"
  	else
 +		if [[ " ${FEATURES} " == *" force-multilib "* ]]; then
 +			if [ ${PORTAGE_BUILDDIR}/.tested.${LOOP_ABI} -nt "${WORKDIR}" ]; then
 +				echo ">>> It appears that ${PN} is already tested for ABI=${LOOP_ABI}; skipping."
 +				echo ">>> Remove '$PORTAGE_BUILDDIR/.tested.${LOOP_ABI}' to force testing."
 +				continue
 +			fi
 +		fi
 +
  		local save_sp=${SANDBOX_PREDICT}
  		addpredict /
- 		ebuild_phase pre_src_test
- 		ebuild_phase src_test
+ 		__ebuild_phase pre_src_test
+ 		__ebuild_phase src_test
 +
 +		if [[ " ${FEATURES} " == *" force-multilib "* ]]; then
 +			if is_auto-multilib && is_ebuild; then
 +				>> "$PORTAGE_BUILDDIR"/.tested."${LOOP_ABI}" || die "IO Failure -- Failed to 'touch .tested.${LOOP_ABI}'"
 +			fi
 +		fi
  		>> "$PORTAGE_BUILDDIR/.tested" || \
  			die "Failed to create $PORTAGE_BUILDDIR/.tested"
- 		ebuild_phase post_src_test
+ 		__ebuild_phase post_src_test
  		SANDBOX_PREDICT=${save_sp}
  	fi
  
@@@ -661,35 -541,12 +662,35 @@@ __dyn_install() 
  	export _E_EXEDESTTREE_=""
  	export _E_DOCDESTTREE_=""
  
- 	ebuild_phase src_install
+ 	__ebuild_phase src_install
 +
 +		if ( [[ " ${FEATURES} " == *" force-multilib "* ]] && is_auto-multilib ) ; then
 +			_finalize_abi_install
 +			cp "${T}"/environment "${PORTAGE_BUILDDIR}"/build-info/environment.${LOOP_ABI} || die
 +			if is_ebuild; then
 +				unset_abi; source "${T}"/environment || die
 +				touch "$PORTAGE_BUILDDIR"/.installed."${LOOP_ABI}" || die "IO Failure -- Failed to 'touch .installed.${LOOP_ABI}'"
 +			fi
 +		fi
 +	done
 +	if [[ -d "${D}" ]]; then
 +		if [[ " ${FEATURES} " == *" force-multilib "* ]]; then
 +			if [[ ${CATEGORY}/${PN} == sys-devel/libtool ]] ; then
 +				ewarn "Preserving libltdl.la because of extensive usage"
 +				ewarn "even in m4 macros of libtool"
 +			elif [[ ${CATEGORY}/${PN} == media-libs/gst-plugins-* ]] ; then
 +				ewarn "Preserving .la files for gst plugins"
 +				ewarn "because of broken Gentoo package"
 +			else
 +				find "${D}" -name '*.la' ! -exec grep -q shouldnotlink=yes {} \; -exec rm {} \;
 +			fi
 +		fi
 +
  	>> "$PORTAGE_BUILDDIR/.installed" || \
  		die "Failed to create $PORTAGE_BUILDDIR/.installed"
- 	vecho ">>> Completed installing ${PF} into ${D}"
- 	vecho
- 	ebuild_phase post_src_install
+ 	__vecho ">>> Completed installing ${PF} into ${D}"
+ 	__vecho
+ 	__ebuild_phase post_src_install
  
  	cd "${PORTAGE_BUILDDIR}"/build-info
  	set -f
@@@ -1042,98 -861,31 +1031,109 @@@ __ebuild_main() 
  
  	case ${1} in
  	nofetch)
- 		ebuild_phase_with_hooks pkg_nofetch
+ 		__ebuild_phase_with_hooks pkg_nofetch
  		;;
 -	prerm|postrm|preinst|postinst|config|info)
 +	config|info)
  		if has "${1}" config info && \
  			! declare -F "pkg_${1}" >/dev/null ; then
  			ewarn  "pkg_${1}() is not defined: '${EBUILD##*/}'"
  		fi
  		export SANDBOX_ON="0"
  		if [ "${PORTAGE_DEBUG}" != "1" ] || [ "${-/x/}" != "$-" ]; then
- 			ebuild_phase_with_hooks pkg_${1}
+ 			__ebuild_phase_with_hooks pkg_${1}
  		else
  			set -x
- 			ebuild_phase_with_hooks pkg_${1}
+ 			__ebuild_phase_with_hooks pkg_${1}
  			set +x
  		fi
+ 		if [[ -n $PORTAGE_UPDATE_ENV ]] ; then
+ 			# Update environment.bz2 in case installation phases
+ 			# need to pass some variables to uninstallation phases.
+ 			__save_ebuild_env --exclude-init-phases | \
+ 				__filter_readonly_variables --filter-path \
+ 				--filter-sandbox --allow-extra-vars \
+ 				| ${PORTAGE_BZIP2_COMMAND} -c -f9 > "$PORTAGE_UPDATE_ENV"
+ 			assert "__save_ebuild_env failed"
+ 		fi
  		;;
- 	prerm|postrm|postinst)
++	prerm|postrm|preinst|postinst)
 +		if [[ " ${FEATURES} " == *" force-multilib "* ]]; then
 +			for LOOP_ABI in $(get_abi_order); do
 +				if is_auto-multilib ; then
 +					case ${1} in
- 						postinst)
++						preinst|postinst)
 +							set_abi ${LOOP_ABI}
++							source "${T}"/environment
 +							;;
 +						prerm|postrm)
 +							# if = backward compactibility for previous versions, which did not
 +							# install a per-ABI environment
 +							if [[ -f "${ROOT}"var/db/pkg/${CATEGORY}/${PF}/environment.${LOOP_ABI}.bz2 ]] ; then
 +								bzcat "${ROOT}"var/db/pkg/${CATEGORY}/${PF}/environment.${LOOP_ABI}.bz2 > "${T}"/environment || die
 +								preprocess_ebuild_env --filter-metadata
 +							fi
 +							;;
 +					esac
 +					# >/dev/null = backward compactibility for prerm/postrm
 +					source "${T}"/environment 2>/dev/null || die
 +				fi
 +				export SANDBOX_ON="0"
 +				if [ "${PORTAGE_DEBUG}" != "1" ] || [ "${-/x/}" != "$-" ]; then
- 					ebuild_phase_with_hooks pkg_${1}
++					__ebuild_phase_with_hooks pkg_${1}
 +				else
 +					set -x
- 					ebuild_phase_with_hooks pkg_${1}
++					__ebuild_phase_with_hooks pkg_${1}
 +					set +x
 +				fi
 +
- 				if [[ $EBUILD_PHASE == postinst ]] && [[ -n $PORTAGE_UPDATE_ENV ]]; then
++				if [[ -n $PORTAGE_UPDATE_ENV ]] ; then
 +					# Update environment.bz2 in case installation phases
 +					# need to pass some variables to uninstallation phases.
- 					save_ebuild_env --exclude-init-phases | \
- 						filter_readonly_variables --filter-path \
++					__save_ebuild_env --exclude-init-phases | \
++						__filter_readonly_variables --filter-path \
 +						--filter-sandbox --allow-extra-vars \
 +						| ${PORTAGE_BZIP2_COMMAND} -c -f9 > "$PORTAGE_UPDATE_ENV"
- 					assert "save_ebuild_env failed"
++					assert "__save_ebuild_env failed"
 +				fi
 +				if is_auto-multilib ; then
 +					case ${1} in
- 						postinst)
++						preinst|postinst)
 +							unset_abi
++							source "${T}"/environment
 +							;;
 +						prerm|postrm)
 +							#if = backward compactibility for previous versions, which did not
 +							#install a per-ABI environment
 +							if [[ -f "${ROOT}"var/db/pkg/${CATEGORY}/${PF}/environment.${LOOP_ABI}.bz2 ]] ; then
 +								preprocess_ebuild_env --filter-metadata
 +								bzcat "${ROOT}"var/db/pkg/${CATEGORY}/${PF}/environment.${LOOP_ABI}.bz2 > "${T}"/environment || die
 +							fi
 +							;;
 +					esac
 +					# >/dev/null = backward compactibility for prerm/postrm
 +					source "${T}"/environment 2>/dev/null || die
 +				fi
 +			done
 +		else
 +			export SANDBOX_ON="0"
 +			if [ "${PORTAGE_DEBUG}" != "1" ] || [ "${-/x/}" != "$-" ]; then
- 				ebuild_phase_with_hooks pkg_${1}
++				__ebuild_phase_with_hooks pkg_${1}
 +			else
 +				set -x
- 				ebuild_phase_with_hooks pkg_${1}
++				__ebuild_phase_with_hooks pkg_${1}
 +				set +x
 +			fi
++			if [[ -n $PORTAGE_UPDATE_ENV ]] ; then
++				# Update environment.bz2 in case installation phases
++				# need to pass some variables to uninstallation phases.
++				__save_ebuild_env --exclude-init-phases | \
++					__filter_readonly_variables --filter-path \
++					--filter-sandbox --allow-extra-vars \
++					| ${PORTAGE_BZIP2_COMMAND} -c -f9 > "$PORTAGE_UPDATE_ENV"
++				assert "__save_ebuild_env failed"
++			fi
 +		fi
-                if [[ $EBUILD_PHASE == postinst ]] && [[ -n $PORTAGE_UPDATE_ENV ]]; then
-                        # Update environment.bz2 in case installation phases
-                        # need to pass some variables to uninstallation phases.
-                        save_ebuild_env --exclude-init-phases | \
-                                filter_readonly_variables --filter-path \
-                                --filter-sandbox --allow-extra-vars \
-                                | ${PORTAGE_BZIP2_COMMAND} -c -f9 > "$PORTAGE_UPDATE_ENV"
-                        assert "save_ebuild_env failed"
-                fi
 +		;;
  	unpack|prepare|configure|compile|test|clean|install)
  		if [[ ${SANDBOX_DISABLED:-0} = 0 ]] ; then
  			export SANDBOX_ON="1"


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2012-09-22 15:33 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2012-09-22 15:33 UTC (permalink / raw
  To: gentoo-commits

commit:     b07dd3e82b8bc2a50675861cbae59da912a09265
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sat Sep 22 15:32:55 2012 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sat Sep 22 15:32:55 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=b07dd3e8

Merge tag 'v2.2.0_alpha131' into multilib


 NEWS                                               |   13 ++++-
 RELEASE-NOTES                                      |   16 ++-----
 bin/dohtml.py                                      |    2 +-
 bin/ebuild.sh                                      |    6 +-
 bin/portageq                                       |    3 -
 cnf/make.globals                                   |    4 --
 doc/package/ebuild.docbook                         |    1 +
 doc/package/ebuild/eapi/4-python.docbook           |    7 ++-
 .../eapi/{4-python.docbook => 5-progress.docbook}  |   43 +++++++++++------
 doc/portage.docbook                                |    1 +
 man/portage.5                                      |    6 ++-
 pym/_emerge/actions.py                             |    7 ++-
 pym/_emerge/main.py                                |   23 ++++------
 pym/portage/__init__.py                            |    4 +-
 pym/portage/_sets/__init__.py                      |    4 ++
 pym/portage/const.py                               |   14 +-----
 pym/portage/dbapi/vartree.py                       |   13 +----
 pym/portage/eapi.py                                |   14 ++++--
 .../package/ebuild/_config/LocationsManager.py     |   49 +++++++++++---------
 pym/portage/package/ebuild/_config/UseManager.py   |   24 ++++------
 pym/portage/package/ebuild/doebuild.py             |    1 -
 pym/portage/package/ebuild/fetch.py                |   21 ++++----
 pym/portage/repository/config.py                   |   10 ++--
 pym/portage/tests/update/test_update_dbentry.py    |    2 +-
 24 files changed, 143 insertions(+), 145 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2012-09-24 20:38 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2012-09-24 20:38 UTC (permalink / raw
  To: gentoo-commits

commit:     7e7a5bfec70fa46f9b566486346dee6d6ca1fccd
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Mon Sep 24 20:38:13 2012 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Mon Sep 24 20:38:13 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=7e7a5bfe

Merge tag 'v2.2.0_alpha132' into multilib


 bin/misc-functions.sh                      |    9 +-
 bin/repoman                                |   23 +-
 doc/package/ebuild/eapi/5-progress.docbook |    1 +
 man/ebuild.5                               | 1165 ++++++++++++++--------------
 man/emerge.1                               |   23 +-
 pym/_emerge/depgraph.py                    |   11 +-
 pym/_emerge/is_valid_package_atom.py       |    4 +-
 pym/_emerge/resolver/output.py             |    5 +-
 pym/_emerge/resolver/output_helpers.py     |    6 +-
 pym/portage/dbapi/__init__.py              |    2 +-
 pym/portage/dep/__init__.py                |   10 +-
 pym/portage/eapi.py                        |    3 +-
 pym/portage/manifest.py                    |   38 +-
 pym/portage/package/ebuild/config.py       |   16 +-
 pym/portage/repository/config.py           |   22 +-
 pym/portage/util/env_update.py             |   38 +-
 pym/portage/versions.py                    |    4 +-
 17 files changed, 738 insertions(+), 642 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2012-09-29 12:51 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2012-09-29 12:51 UTC (permalink / raw
  To: gentoo-commits

commit:     80bfb6e67bb021d8b4cee741666570709ce12446
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sat Sep 29 12:50:48 2012 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sat Sep 29 12:50:48 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=80bfb6e6

Merge v2.2.0_alpha134


 bin/eapi.sh                                        |  113 ++++++++++
 bin/ebuild-helpers/dobin                           |    7 +-
 bin/ebuild-helpers/dodir                           |    7 +-
 bin/ebuild-helpers/dodoc                           |   23 +--
 bin/ebuild-helpers/doexe                           |    7 +-
 bin/ebuild-helpers/dohard                          |   19 +-
 bin/ebuild-helpers/doheader                        |    8 +-
 bin/ebuild-helpers/doinfo                          |    7 +-
 bin/ebuild-helpers/doins                           |   18 +-
 bin/ebuild-helpers/dolib                           |    7 +-
 bin/ebuild-helpers/doman                           |    7 +-
 bin/ebuild-helpers/domo                            |    7 +-
 bin/ebuild-helpers/dosbin                          |    7 +-
 bin/ebuild-helpers/dosed                           |   19 +-
 bin/ebuild-helpers/dosym                           |    5 +-
 bin/ebuild-helpers/ecompressdir                    |    7 +-
 bin/ebuild-helpers/fowners                         |    5 +-
 bin/ebuild-helpers/fperms                          |    7 +-
 bin/ebuild-helpers/newins                          |   17 +-
 bin/ebuild-helpers/prepall                         |    7 +-
 bin/ebuild-helpers/prepalldocs                     |   17 +-
 bin/ebuild-helpers/prepallinfo                     |    7 +-
 bin/ebuild-helpers/prepallman                      |    9 +-
 bin/ebuild-helpers/prepallstrip                    |    9 +-
 bin/ebuild-helpers/prepinfo                        |    9 +-
 bin/ebuild-helpers/preplib                         |    7 +-
 bin/ebuild-helpers/prepman                         |    9 +-
 bin/ebuild-helpers/prepstrip                       |    5 +-
 bin/ebuild.sh                                      |   58 +++--
 bin/isolated-functions.sh                          |   17 +-
 bin/misc-functions.sh                              |   80 ++++----
 bin/phase-functions.sh                             |   55 ++---
 bin/phase-helpers.sh                               |  155 ++++++--------
 bin/portageq                                       |    6 +-
 bin/repoman                                        |   80 ++++----
 bin/save-ebuild-env.sh                             |    9 +-
 doc/package/ebuild.docbook                         |    1 +
 doc/package/ebuild/eapi/5-hdepend.docbook          |   32 +++
 doc/portage.docbook                                |    1 +
 man/ebuild.5                                       |   68 +++++-
 man/emerge.1                                       |   10 +-
 man/make.conf.5                                    |   12 +-
 man/repoman.1                                      |   72 ++-----
 pym/_emerge/BlockerDB.py                           |    5 +-
 pym/_emerge/FakeVartree.py                         |    4 +-
 pym/_emerge/Package.py                             |   15 +-
 pym/_emerge/actions.py                             |    4 +-
 pym/_emerge/depgraph.py                            |   63 +++---
 pym/_emerge/main.py                                |    1 -
 pym/_emerge/resolver/circular_dependency.py        |    4 +-
 pym/portage/__init__.py                            |    4 +-
 pym/portage/_global_updates.py                     |   14 +-
 pym/portage/cache/flat_list.py                     |  134 ------------
 pym/portage/cache/metadata.py                      |    3 +-
 pym/portage/cache/sqlite.py                        |    9 +-
 pym/portage/dbapi/__init__.py                      |    3 +-
 pym/portage/dbapi/bintree.py                       |   12 +-
 pym/portage/dbapi/porttree.py                      |    3 +-
 pym/portage/dbapi/vartree.py                       |    2 +-
 pym/portage/dep/_slot_operator.py                  |   23 ++-
 pym/portage/eapi.py                                |   11 +-
 pym/portage/emaint/modules/move/move.py            |    4 +-
 .../package/ebuild/_config/LocationsManager.py     |    7 +-
 pym/portage/package/ebuild/_config/UseManager.py   |   20 ++-
 .../package/ebuild/_config/special_env_vars.py     |    3 +-
 pym/portage/package/ebuild/config.py               |   13 +-
 pym/portage/package/ebuild/doebuild.py             |    6 +-
 pym/portage/tests/dbapi/test_portdb_cache.py       |   15 --
 pym/portage/tests/ebuild/test_ipc_daemon.py        |    4 +-
 pym/portage/tests/emerge/test_emerge_slot_abi.py   |   22 --
 pym/portage/tests/emerge/test_simple.py            |   17 --
 pym/portage/tests/resolver/ResolverPlayground.py   |  228 +++++++++-----------
 pym/portage/tests/resolver/test_targetroot.py      |   85 ++++++++
 pym/portage/util/__init__.py                       |   16 +-
 pym/portage/util/_eventloop/EventLoop.py           |   30 ++--
 pym/portage/util/_eventloop/PollSelectAdapter.py   |    2 +-
 76 files changed, 945 insertions(+), 873 deletions(-)

diff --cc bin/misc-functions.sh
index a067642,986264e..2cf71a8
--- a/bin/misc-functions.sh
+++ b/bin/misc-functions.sh
@@@ -17,9 -17,9 +17,11 @@@ shift $
  source "${PORTAGE_BIN_PATH:-/usr/lib/portage/bin}/ebuild.sh"
  
  install_symlink_html_docs() {
 +	[[ " ${FEATURES} " == *" force-prefix "* ]] || \
- 		case "$EAPI" in 0|1|2) local ED=${D} ;; esac
+ 	if ! ___eapi_has_prefix_variables; then
+ 		local ED=${D}
+ 	fi
 +	[[ -e "${ED}" ]] || return 0
  	cd "${ED}" || die "cd failed"
  	#symlink the html documentation (if DOC_SYMLINKS_DIR is set in make.conf)
  	if [ -n "${DOC_SYMLINKS_DIR}" ] ; then
@@@ -150,14 -164,12 +166,13 @@@ prepcompress() 
  
  install_qa_check() {
  	local f i qa_var x
- 	[[ " ${FEATURES} " == *" force-prefix "* ]] || \
- 		case "$EAPI" in 0|1|2) local EPREFIX= ED=${D} ;; esac
+ 	if ! ___eapi_has_prefix_variables; then
+ 		local EPREFIX= ED=${D}
+ 	fi
  
 +	[[ -d "${ED}" ]] || return 0
  	cd "${ED}" || die "cd failed"
  
- 	# Merge QA_FLAGS_IGNORED and QA_DT_HASH into a single array, since
- 	# QA_DT_HASH is deprecated.
  	qa_var="QA_FLAGS_IGNORED_${ARCH/-/_}"
  	eval "[[ -n \${!qa_var} ]] && QA_FLAGS_IGNORED=(\"\${${qa_var}[@]}\")"
  	if [[ ${#QA_FLAGS_IGNORED[@]} -eq 1 ]] ; then
diff --cc bin/phase-functions.sh
index 1afa45e,7a0baf4..f80781f
--- a/bin/phase-functions.sh
+++ b/bin/phase-functions.sh
@@@ -401,19 -356,9 +395,19 @@@ __dyn_prepare() 
  		return 0
  	fi
  
 +	for LOOP_ABI in $(get_abi_list); do
 +		if [[ " ${FEATURES} " == *" force-multilib "* ]]; then
 +			is_ebuild && { set_abi ${LOOP_ABI}; source "${T}"/environment || die ; }
 +
 +			if [ "${PORTAGE_BUILDDIR}"/.prepared.${LOOP_ABI} -nt "${WORKDIR}" ]; then
 +				echo ">>> It appears that ${PN} is already prepared for ABI=${LOOP_ABI}; skipping."
 +				echo ">>> Remove '$PORTAGE_BUILDDIR/.prepared.${LOOP_ABI}' to force prepare."
 +				continue
 +			fi
 +		fi
  	if [[ -d $S ]] ; then
  		cd "${S}"
- 	elif has $EAPI 0 1 2 3 ; then
+ 	elif ___eapi_has_S_WORKDIR_fallback; then
  		cd "${WORKDIR}"
  	elif [[ -z ${A} ]] && ! __has_phase_defined_up_to prepare; then
  		cd "${WORKDIR}"
@@@ -452,19 -387,9 +446,19 @@@ __dyn_configure() 
  		return 0
  	fi
  
 +	for LOOP_ABI in $(get_abi_list); do
 +		if [[ " ${FEATURES} " == *" force-multilib "* ]]; then
 +			is_ebuild && { set_abi ${LOOP_ABI}; source "${T}"/environment || die ; }
 +
 +			if [ ${PORTAGE_BUILDDIR}/.configured.${LOOP_ABI} -nt "${WORKDIR}" ]; then
 +				echo ">>> It appears that ${PN} is already configured for ABI=${LOOP_ABI}; skipping."
 +				echo ">>> Remove '$PORTAGE_BUILDDIR/.configured.${LOOP_ABI}' to force configuration."
 +				continue
 +			fi
 +		fi
  	if [[ -d $S ]] ; then
  		cd "${S}"
- 	elif has $EAPI 0 1 2 3 ; then
+ 	elif ___eapi_has_S_WORKDIR_fallback; then
  		cd "${WORKDIR}"
  	elif [[ -z ${A} ]] && ! __has_phase_defined_up_to configure; then
  		cd "${WORKDIR}"
@@@ -504,19 -420,9 +498,19 @@@ __dyn_compile() 
  		return 0
  	fi
  
 +	for LOOP_ABI in $(get_abi_list); do
 +		if [[ " ${FEATURES} " == *" force-multilib "* ]]; then
 +			is_ebuild && { set_abi ${LOOP_ABI}; source "${T}"/environment || die ; }
 +
 +			if [ ${PORTAGE_BUILDDIR}/.compiled.${LOOP_ABI} -nt "${WORKDIR}" ]; then
 +				echo ">>> It appears that ${PN} is already compiled for ABI=${LOOP_ABI}; skipping."
 +				echo ">>> Remove '$PORTAGE_BUILDDIR/.compiled.${LOOP_ABI}' to force compilation."
 +				continue
 +			fi
 +		fi
  	if [[ -d $S ]] ; then
  		cd "${S}"
- 	elif has $EAPI 0 1 2 3 ; then
+ 	elif ___eapi_has_S_WORKDIR_fallback; then
  		cd "${WORKDIR}"
  	elif [[ -z ${A} ]] && ! __has_phase_defined_up_to compile; then
  		cd "${WORKDIR}"
@@@ -628,15 -504,14 +622,17 @@@ __dyn_install() 
  	trap "__abort_install" SIGINT SIGQUIT
  	__ebuild_phase pre_src_install
  
- 	_x=${ED}
- 	[[ " ${FEATURES} " == *" force-prefix "* ]] || \
- 		case "$EAPI" in 0|1|2) _x=${D} ;; esac
+ 	if ___eapi_has_prefix_variables; then
+ 		_x=${ED}
+ 	else
+ 		_x=${D}
+ 	fi
  	rm -rf "${D}"
 +	[[ " ${FEATURES} " == *" force-multilib "* ]] && is_auto-multilib && rm -rf "${D}".${ABI}
  	mkdir -p "${_x}"
  	unset _x
 +	for LOOP_ABI in $(get_abi_list); do
 +		[[ " ${FEATURES} " == *" force-multilib "* ]] && is_ebuild && { set_abi ${LOOP_ABI}; source "${T}"/environment || die ; }
  
  	if [[ -d $S ]] ; then
  		cd "${S}"


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2012-10-06 11:34 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2012-10-06 11:34 UTC (permalink / raw
  To: gentoo-commits

commit:     e565dbb49b6a69d083cd7dc3769c405bc83cab6d
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sat Oct  6 11:28:40 2012 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sat Oct  6 11:28:40 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=e565dbb4

Merge tag 'v2.2.0_alpha135' into multilib


 bin/ebuild-helpers/fowners                         |    5 -
 bin/ebuild-helpers/unprivileged/chgrp              |    1 +
 bin/ebuild-helpers/unprivileged/chown              |   33 ++++
 bin/ebuild.sh                                      |    4 +-
 bin/egencache                                      |  160 +++++++++++++++++++-
 bin/phase-functions.sh                             |    4 +-
 bin/repoman                                        |   12 ++-
 man/egencache.1                                    |   21 +++
 pym/_emerge/BlockerCache.py                        |    4 +-
 pym/_emerge/EbuildFetcher.py                       |   53 ++-----
 pym/_emerge/PollScheduler.py                       |    6 +-
 pym/_emerge/depgraph.py                            |   14 ++-
 pym/portage/cache/mappings.py                      |    6 +-
 pym/portage/dbapi/_MergeProcess.py                 |    6 +-
 pym/portage/dbapi/vartree.py                       |    4 +-
 pym/portage/getbinpkg.py                           |    4 +-
 pym/portage/manifest.py                            |   10 +-
 .../ebuild/_parallel_manifest/ManifestProcess.py   |   43 ++++++
 .../ebuild/_parallel_manifest/ManifestScheduler.py |   88 +++++++++++
 .../ebuild/_parallel_manifest/ManifestTask.py      |   93 +++++++++++
 .../ebuild/_parallel_manifest}/__init__.py         |    0
 pym/portage/package/ebuild/doebuild.py             |    4 +
 pym/portage/util/_async/AsyncScheduler.py          |  104 +++++++++++++
 pym/portage/util/_async/ForkProcess.py             |   50 ++++++
 .../{tests/update => util/_async}/__init__.py      |    0
 25 files changed, 659 insertions(+), 70 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2012-10-14  9:35 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2012-10-14  9:35 UTC (permalink / raw
  To: gentoo-commits

commit:     cf9860a6c155da9e7d8ea02ab42a8144fea3ee7f
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sun Oct 14 09:35:17 2012 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun Oct 14 09:35:17 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=cf9860a6

Merge tag 'v2.2.0_alpha137' into multilib


 bin/ebuild.sh                                      |    6 +-
 bin/egencache                                      |    5 +-
 bin/misc-functions.sh                              |    2 +-
 bin/phase-helpers.sh                               |   18 ++-
 bin/portageq                                       |    4 +-
 bin/repoman                                        |   11 +-
 man/emerge.1                                       |    3 +-
 man/portage.5                                      |    4 +-
 man/repoman.1                                      |    2 +-
 pym/_emerge/AbstractPollTask.py                    |    2 +-
 pym/_emerge/AsynchronousLock.py                    |    8 +-
 pym/_emerge/EbuildMetadataPhase.py                 |    2 +-
 pym/_emerge/FifoIpcDaemon.py                       |   10 +-
 pym/_emerge/MetadataRegen.py                       |   64 ++------
 pym/_emerge/PipeReader.py                          |    4 +-
 pym/_emerge/PollScheduler.py                       |  121 ++------------
 pym/_emerge/QueueScheduler.py                      |  105 ------------
 pym/_emerge/Scheduler.py                           |   63 ++++++--
 pym/_emerge/SpawnProcess.py                        |    2 +-
 pym/_emerge/SubProcess.py                          |    2 +-
 pym/_emerge/TaskScheduler.py                       |   26 ---
 pym/_emerge/actions.py                             |   41 +++--
 pym/_emerge/main.py                                |   14 ++
 pym/portage/dbapi/_MergeProcess.py                 |  177 ++++++++++----------
 pym/portage/dbapi/porttree.py                      |   17 ++-
 pym/portage/dbapi/vartree.py                       |   27 +++-
 pym/portage/dep/__init__.py                        |    4 +-
 pym/portage/package/ebuild/_ipc/QueryCommand.py    |    4 +-
 .../ebuild/_parallel_manifest/ManifestScheduler.py |    4 +-
 pym/portage/package/ebuild/_spawn_nofetch.py       |    8 +-
 pym/portage/package/ebuild/doebuild.py             |   16 +-
 pym/portage/package/ebuild/fetch.py                |    5 +-
 pym/portage/process.py                             |   42 +++--
 pym/portage/tests/dep/testAtom.py                  |    6 +-
 pym/portage/tests/dep/test_best_match_to_list.py   |    6 +-
 pym/portage/tests/ebuild/test_doebuild_spawn.py    |    7 +-
 pym/portage/tests/ebuild/test_ipc_daemon.py        |   74 +++++---
 pym/portage/tests/ebuild/test_spawn.py             |    5 +-
 .../test_lazy_import_portage_baseline.py           |    4 +-
 pym/portage/tests/locks/test_asynchronous_lock.py  |   10 +-
 pym/portage/tests/process/test_poll.py             |   17 +-
 pym/portage/util/_async/AsyncScheduler.py          |   22 +--
 pym/portage/util/_async/ForkProcess.py             |   65 +++++---
 pym/portage/util/_async/SchedulerInterface.py      |   86 ++++++++++
 pym/portage/util/_async/TaskScheduler.py           |   20 +++
 pym/repoman/checks.py                              |   25 ++-
 runtests.sh                                        |    2 +-
 47 files changed, 589 insertions(+), 583 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2012-10-22  8:57 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2012-10-22  8:57 UTC (permalink / raw
  To: gentoo-commits

commit:     1d7ef6f2f086bea07429d3d2a725b72f32715d17
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Mon Oct 22 08:56:18 2012 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Mon Oct 22 08:56:18 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=1d7ef6f2

Merge v2.2.0_alpha141


 bin/eapi.sh                                        |   20 +
 bin/ebuild                                         |    2 +-
 bin/ebuild.sh                                      |   14 +-
 bin/egencache                                      |    4 +
 bin/emerge                                         |   97 ++--
 bin/glsa-check                                     |    2 +-
 bin/misc-functions.sh                              |   36 +-
 bin/phase-helpers.sh                               |  163 ++++-
 bin/portageq                                       |  112 +++-
 bin/repoman                                        |   52 +-
 bin/save-ebuild-env.sh                             |    9 +-
 cnf/make.globals                                   |    3 -
 doc/package/ebuild/eapi/5-progress.docbook         |   30 +
 man/ebuild.5                                       |    7 +-
 man/emerge.1                                       |    4 +-
 man/make.conf.5                                    |   16 +-
 pym/_emerge/AbstractEbuildProcess.py               |   13 +-
 pym/_emerge/CompositeTask.py                       |    4 +
 pym/_emerge/MergeListItem.py                       |    6 +-
 pym/_emerge/PackageMerge.py                        |    7 +-
 pym/_emerge/Scheduler.py                           |   21 +-
 pym/_emerge/actions.py                             |  777 ++++++++++++++++++--
 pym/_emerge/chk_updated_cfg_files.py               |   42 ++
 pym/_emerge/create_world_atom.py                   |   25 +-
 pym/_emerge/depgraph.py                            |   32 +-
 pym/_emerge/main.py                                |  690 +-----------------
 pym/_emerge/post_emerge.py                         |  165 +++++
 pym/_emerge/resolver/output.py                     |  121 ++-
 pym/_emerge/resolver/output_helpers.py             |    4 +-
 pym/portage/__init__.py                            |   13 +-
 pym/portage/_sets/dbapi.py                         |   25 +-
 pym/portage/_sets/files.py                         |    4 +-
 pym/portage/_sets/libs.py                          |   10 +-
 pym/portage/_sets/security.py                      |    4 +-
 pym/portage/dbapi/bintree.py                       |   76 +--
 pym/portage/dbapi/porttree.py                      |    6 +-
 pym/portage/dbapi/vartree.py                       |   36 +-
 pym/portage/dep/__init__.py                        |   21 +-
 pym/portage/emaint/modules/move/move.py            |   18 +-
 pym/portage/getbinpkg.py                           |   40 +
 pym/portage/glsa.py                                |    9 +-
 .../package/ebuild/_config/LocationsManager.py     |    6 +-
 pym/portage/package/ebuild/_config/MaskManager.py  |   31 +-
 .../package/ebuild/_config/special_env_vars.py     |    2 +-
 pym/portage/package/ebuild/_ipc/QueryCommand.py    |   86 ++-
 .../ebuild/_parallel_manifest/ManifestScheduler.py |    6 +-
 .../ebuild/_parallel_manifest/ManifestTask.py      |   97 +++-
 pym/portage/package/ebuild/config.py               |    4 +-
 pym/portage/package/ebuild/doebuild.py             |    5 +-
 pym/portage/package/ebuild/getmaskingreason.py     |   20 +-
 pym/portage/proxy/lazyimport.py                    |    4 +-
 pym/portage/repository/config.py                   |    8 +-
 pym/portage/tests/process/test_PopenProcess.py     |   48 ++
 pym/portage/util/_async/PopenProcess.py            |   33 +
 .../util/_dyn_libs/display_preserved_libs.py       |   79 ++
 pym/portage/util/_info_files.py                    |  138 ++++
 56 files changed, 2205 insertions(+), 1102 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2012-10-29 12:23 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2012-10-29 12:23 UTC (permalink / raw
  To: gentoo-commits

commit:     9db5b4a84b2c0723fb8b39c540f6182e46eeb4c3
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Mon Oct 29 12:23:31 2012 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Mon Oct 29 12:23:31 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=9db5b4a8

Merge tag 'v2.2.0_alpha142' into multilib


 .gitignore                                         |    1 +
 bin/misc-functions.sh                              |   19 ++-
 cnf/make.globals                                   |    2 +-
 man/make.conf.5                                    |    5 +
 pym/_emerge/PipeReader.py                          |    6 +-
 pym/_emerge/SpawnProcess.py                        |  165 ++++----------------
 pym/_emerge/actions.py                             |   18 ++
 pym/_emerge/depgraph.py                            |   37 ++++-
 pym/_emerge/resolver/backtracking.py               |   26 +++-
 pym/portage/const.py                               |    1 +
 pym/portage/dbapi/_MergeProcess.py                 |    6 +
 pym/portage/dbapi/vartree.py                       |  140 ++++++++++++++++-
 pym/portage/emaint/modules/logs/__init__.py        |    2 +-
 pym/portage/tests/process/test_PopenProcess.py     |   44 +++++-
 .../tests/resolver/test_slot_conflict_rebuild.py   |  107 +++++++++++++
 .../resolver/test_slot_operator_unsatisfied.py     |   70 ++++++++
 pym/portage/util/_async/PipeLogger.py              |  146 +++++++++++++++++
 pym/portage/util/_ctypes.py                        |   47 ++++++
 18 files changed, 688 insertions(+), 154 deletions(-)

diff --cc pym/portage/const.py
index 58ec887,8c5bbf3..fe53907
--- a/pym/portage/const.py
+++ b/pym/portage/const.py
@@@ -95,8 -94,9 +95,9 @@@ SUPPORTED_FEATURES       = frozenset(
                             "compress-index", "config-protect-if-modified",
                             "digest", "distcc", "distcc-pump", "distlocks",
                             "downgrade-backup", "ebuild-locks", "fakeroot",
 -                           "fail-clean", "force-mirror", "force-prefix", "getbinpkg",
 +                           "fail-clean", "force-mirror", "force-multilib", "force-prefix", "getbinpkg",
                             "installsources", "keeptemp", "keepwork", "fixlafiles", "lmirror",
+                            "merge-sync",
                             "metadata-transfer", "mirror", "multilib-strict", "news",
                             "noauto", "noclean", "nodoc", "noinfo", "noman",
                             "nostrip", "notitles", "parallel-fetch", "parallel-install",


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2012-11-30 16:44 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2012-11-30 16:44 UTC (permalink / raw
  To: gentoo-commits

commit:     56e08beb42f99cdeddaa11bf1fe012a5b1c475b1
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Fri Nov 30 16:44:06 2012 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Fri Nov 30 16:44:06 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=56e08beb

Merge 2.2.0_alpha143


 bin/archive-conf                                   |    2 +-
 bin/eapi.sh                                        |    8 +
 bin/ebuild-helpers/dodoc                           |    2 +-
 bin/ebuild-helpers/doinfo                          |    2 +-
 bin/ebuild-helpers/prepman                         |    2 +-
 bin/ebuild-helpers/prepstrip                       |   75 +++++---
 bin/ebuild.sh                                      |    3 +-
 bin/egencache                                      |    2 +-
 bin/emerge-webrsync                                |    9 +-
 bin/glsa-check                                     |   14 +-
 bin/isolated-functions.sh                          |    2 +
 bin/misc-functions.sh                              |   21 +-
 bin/phase-functions.sh                             |    3 +-
 bin/phase-helpers.sh                               |   28 ++-
 bin/repoman                                        |   61 +++++--
 bin/save-ebuild-env.sh                             |    2 +
 cnf/make.globals                                   |    2 +-
 doc/package/ebuild/eapi/4-python.docbook           |   36 ++++
 doc/package/ebuild/eapi/5-progress.docbook         |   78 ++++++++
 man/egencache.1                                    |   28 ++-
 man/emerge.1                                       |   11 +-
 man/portage.5                                      |    8 +-
 man/repoman.1                                      |    5 +-
 misc/emerge-delta-webrsync                         |    9 +-
 pym/_emerge/AbstractEbuildProcess.py               |    4 +-
 pym/_emerge/BlockerDB.py                           |    7 +-
 pym/_emerge/EbuildBuild.py                         |    4 +-
 pym/_emerge/EbuildBuildDir.py                      |    4 +-
 pym/_emerge/EbuildExecuter.py                      |    2 +-
 pym/_emerge/EbuildMetadataPhase.py                 |    9 +
 pym/_emerge/FakeVartree.py                         |   32 ++--
 pym/_emerge/Package.py                             |  151 ++++++++++-----
 pym/_emerge/PackageVirtualDbapi.py                 |    4 +-
 pym/_emerge/Scheduler.py                           |   32 ++--
 pym/_emerge/actions.py                             |  120 ++++++++----
 pym/_emerge/depgraph.py                            |  205 ++++++++------------
 pym/_emerge/main.py                                |   10 +
 pym/_emerge/resolver/circular_dependency.py        |   14 +-
 pym/_emerge/resolver/output.py                     |   14 +-
 pym/_emerge/resolver/slot_collision.py             |    7 +-
 pym/portage/__init__.py                            |    1 +
 pym/portage/_sets/base.py                          |    4 +-
 pym/portage/cache/flat_hash.py                     |   10 +-
 pym/portage/dbapi/__init__.py                      |   19 ++-
 pym/portage/dbapi/_similar_name_search.py          |   57 ++++++
 pym/portage/dbapi/bintree.py                       |    2 +-
 pym/portage/dbapi/porttree.py                      |    7 +
 pym/portage/dbapi/vartree.py                       |   29 ++--
 pym/portage/dep/__init__.py                        |   67 ++++++-
 pym/portage/dep/_slot_operator.py                  |    4 +-
 pym/portage/dep/dep_check.py                       |    4 +-
 pym/portage/eapi.py                                |    6 +
 pym/portage/elog/mod_save.py                       |   24 ++-
 pym/portage/elog/mod_save_summary.py               |   21 ++-
 pym/portage/emaint/modules/move/move.py            |   22 ++-
 pym/portage/package/ebuild/_config/UseManager.py   |  119 +++++++++++-
 .../package/ebuild/_config/special_env_vars.py     |    7 +-
 .../package/ebuild/_config/unpack_dependencies.py  |   38 ++++
 pym/portage/package/ebuild/_spawn_nofetch.py       |    2 +-
 pym/portage/package/ebuild/config.py               |    5 +-
 pym/portage/package/ebuild/doebuild.py             |   38 +++--
 pym/portage/package/ebuild/getmaskingstatus.py     |    2 +-
 pym/portage/repository/config.py                   |   13 +-
 pym/portage/tests/dbapi/test_portdb_cache.py       |   16 +-
 pym/portage/tests/emerge/test_simple.py            |    2 +-
 pym/portage/tests/repoman/test_simple.py           |    2 +-
 pym/portage/tests/resolver/ResolverPlayground.py   |   17 +-
 .../tests/resolver/test_unpack_dependencies.py     |   65 ++++++
 pym/portage/tests/resolver/test_use_aliases.py     |  131 +++++++++++++
 pym/portage/tests/update/test_update_dbentry.py    |   45 +++++
 pym/portage/update.py                              |   32 +++-
 pym/portage/util/_desktop_entry.py                 |    5 +-
 pym/portage/util/_eventloop/EventLoop.py           |   27 ++-
 pym/portage/util/movefile.py                       |    7 +-
 pym/repoman/checks.py                              |   40 ++---
 75 files changed, 1411 insertions(+), 511 deletions(-)

diff --cc pym/_emerge/Package.py
index f1b865c,86ed5f7..aac309a
--- a/pym/_emerge/Package.py
+++ b/pym/_emerge/Package.py
@@@ -72,14 -79,9 +79,17 @@@ class Package(Task)
  			implicit_match = self.root_config.settings._iuse_effective_match
  		else:
  			implicit_match = self.root_config.settings._iuse_implicit_match
 +		iuse = self.metadata["IUSE"]
 +		if 'force-multilib' in self.root_config.settings.features:
 +			if self.built is False:
 +				for multilib_abis in self.root_config.settings.get("MULTILIB_ABIS", '').split():
 +					iuse += " multilib_abi_" + multilib_abis
 +				iuse += " abiwrapper"
 +				self.metadata["IUSE"] = iuse
- 		self.iuse = self._iuse(iuse.split(), implicit_match)
+ 		usealiases = self.root_config.settings._use_manager.getUseAliases(self)
 -		self.iuse = self._iuse(self, self._metadata["IUSE"].split(), implicit_match,
++		self.iuse = self._iuse(self, iuse.split(), implicit_match,
+ 			usealiases, self.eapi)
++>>>>>>> v2.2.0_alpha143
  
  		if (self.iuse.enabled or self.iuse.disabled) and \
  			not eapi_attrs.iuse_defaults:


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2012-12-07 22:24 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2012-12-07 22:24 UTC (permalink / raw
  To: gentoo-commits

commit:     2cff6e2b14e2b173f1f56869551bf968cf0a41cf
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Fri Dec  7 22:24:35 2012 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Fri Dec  7 22:24:35 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=2cff6e2b

Merge tag 'v2.2.0_alpha144' into multilib


 bin/ebuild-helpers/prepstrip    |    7 +++++--
 pym/_emerge/AsynchronousLock.py |    1 +
 pym/_emerge/actions.py          |    2 +-
 pym/portage/util/movefile.py    |   12 +++++++++---
 4 files changed, 16 insertions(+), 6 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2012-12-09 10:54 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2012-12-09 10:54 UTC (permalink / raw
  To: gentoo-commits

commit:     d9f6551e0b7f7b1b138cc40c51faa72be4bdf09d
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sun Dec  9 10:54:03 2012 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun Dec  9 10:54:03 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=d9f6551e

Merge tag 'v2.2.0_alpha145' into multilib


 man/emerge.1                                       |    4 +-
 pym/_emerge/actions.py                             |   15 ++--
 pym/_emerge/depgraph.py                            |   12 +++-
 pym/_emerge/main.py                                |   17 ++++-
 pym/portage/package/ebuild/doebuild.py             |    2 +-
 pym/portage/package/ebuild/getmaskingstatus.py     |    7 ++
 .../resolver/test_depclean_slot_unavailable.py     |   79 ++++++++++++++++++++
 7 files changed, 123 insertions(+), 13 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2012-12-14 20:14 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2012-12-14 20:14 UTC (permalink / raw
  To: gentoo-commits

commit:     d69ed258bab311ac51f1e2e4c0caaa14677d9b08
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Fri Dec 14 20:14:19 2012 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Fri Dec 14 20:14:19 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=d69ed258

Merge tag 'v2.2.0_alpha147' into multilib


 pym/_emerge/Package.py                 |   12 +++++++++---
 pym/_emerge/actions.py                 |   15 +++++++++------
 pym/_emerge/depgraph.py                |    3 +++
 pym/_emerge/resolver/slot_collision.py |    3 +++
 4 files changed, 24 insertions(+), 9 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2012-12-14 20:16 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2012-12-14 20:16 UTC (permalink / raw
  To: gentoo-commits

commit:     f4dccb3dc61bd45187f7491fa21d277704c39393
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Fri Dec 14 20:16:15 2012 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Fri Dec 14 20:16:15 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=f4dccb3d

Merge tag 'v2.2.0_alpha148' into multilib


 bin/ebuild-helpers/prepstrip           |   48 ++++++++--
 bin/phase-functions.sh                 |    3 +-
 bin/xattr-helper.py                    |  176 ++++++++++++++++++++++++++++++++
 man/ebuild.5                           |    7 +-
 pym/portage/dbapi/_MergeProcess.py     |    3 +
 pym/portage/dbapi/vartree.py           |    5 +-
 pym/portage/dep/__init__.py            |    2 +-
 pym/portage/package/ebuild/doebuild.py |   33 +++++-
 8 files changed, 262 insertions(+), 15 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2012-12-16 10:49 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2012-12-16 10:49 UTC (permalink / raw
  To: gentoo-commits

commit:     5728c6f5e9099f8b8076d0b8315be059a1244bda
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sun Dec 16 10:49:27 2012 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun Dec 16 10:49:27 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=5728c6f5

Merge tag 'v2.2.0_alpha149' into multilib


 bin/dispatch-conf                      |    2 +-
 bin/repoman                            |   35 +++++++++++++++++++++++++------
 pym/_emerge/BinpkgFetcher.py           |    2 +-
 pym/_emerge/SpawnProcess.py            |    2 +-
 pym/portage/__init__.py                |   11 ++++++++++
 pym/portage/getbinpkg.py               |    2 +-
 pym/portage/package/ebuild/doebuild.py |    4 +-
 pym/portage/package/ebuild/fetch.py    |    2 +-
 pym/portage/process.py                 |    2 +-
 pym/repoman/checks.py                  |   10 +++++++-
 10 files changed, 55 insertions(+), 17 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2013-01-12 11:21 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2013-01-12 11:21 UTC (permalink / raw
  To: gentoo-commits

commit:     69dc95fb27bbe290ef60e5d826ec868d6baee4b5
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sat Jan 12 11:20:06 2013 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sat Jan 12 11:20:06 2013 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=69dc95fb

Merge 2.2.0_alpha151


 .gitignore                                         |    2 +
 Makefile                                           |    2 +-
 bin/archive-conf                                   |    3 +-
 bin/binhost-snapshot                               |    3 +-
 bin/clean_locks                                    |    3 +-
 bin/dispatch-conf                                  |    3 +-
 bin/ebuild                                         |    4 +-
 bin/ebuild-ipc.py                                  |  175 ++----
 bin/egencache                                      |   67 +--
 bin/emaint                                         |    3 +-
 bin/emerge                                         |    5 +-
 bin/emirrordist                                    |   13 +
 bin/env-update                                     |    3 +-
 bin/fixpackages                                    |    3 +-
 bin/glsa-check                                     |    3 +-
 bin/lock-helper.py                                 |    3 +-
 bin/phase-functions.sh                             |    6 +-
 bin/phase-helpers.sh                               |   10 +-
 bin/portageq                                       |    3 +-
 bin/quickpkg                                       |    3 +-
 bin/regenworld                                     |    3 +-
 bin/repoman                                        |   27 +-
 bin/xpak-helper.py                                 |    3 +-
 man/color.map.5                                    |    4 +-
 man/ebuild.1                                       |    4 +-
 man/ebuild.5                                       |   11 +-
 man/egencache.1                                    |    4 +-
 man/emerge.1                                       |    8 +-
 man/emirrordist.1                                  |  143 +++++
 man/make.conf.5                                    |    8 +-
 man/portage.5                                      |    2 +-
 man/quickpkg.1                                     |   20 +-
 pym/_emerge/AbstractEbuildProcess.py               |    2 +-
 pym/_emerge/AsynchronousLock.py                    |   58 +--
 pym/_emerge/AsynchronousTask.py                    |   14 +
 pym/_emerge/BinpkgFetcher.py                       |    2 +-
 pym/_emerge/BinpkgVerifier.py                      |  143 +++--
 pym/_emerge/EbuildBuild.py                         |    4 +-
 pym/_emerge/EbuildFetcher.py                       |    6 +-
 pym/_emerge/EbuildMetadataPhase.py                 |   21 +-
 pym/_emerge/FakeVartree.py                         |   72 ++-
 pym/_emerge/FifoIpcDaemon.py                       |   29 +-
 pym/_emerge/MergeListItem.py                       |    2 +-
 pym/_emerge/MetadataRegen.py                       |   23 +-
 pym/_emerge/PackageUninstall.py                    |    6 +-
 pym/_emerge/PipeReader.py                          |   22 +-
 pym/_emerge/PollScheduler.py                       |    6 +-
 pym/_emerge/Scheduler.py                           |   13 +-
 pym/_emerge/SpawnProcess.py                        |   26 +-
 pym/_emerge/actions.py                             |  105 ++--
 pym/_emerge/depgraph.py                            |  104 +++-
 pym/_emerge/help.py                                |    6 +-
 pym/_emerge/is_valid_package_atom.py               |    2 +-
 pym/_emerge/main.py                                |    6 +-
 pym/portage/__init__.py                            |    4 +-
 pym/portage/_emirrordist/Config.py                 |  132 +++++
 pym/portage/_emirrordist/DeletionIterator.py       |   83 +++
 pym/portage/_emirrordist/DeletionTask.py           |  129 ++++
 pym/portage/_emirrordist/FetchIterator.py          |  147 +++++
 pym/portage/_emirrordist/FetchTask.py              |  620 ++++++++++++++++++++
 pym/portage/_emirrordist/MirrorDistTask.py         |  218 +++++++
 .../resolver => portage/_emirrordist}/__init__.py  |    2 +-
 pym/portage/_emirrordist/main.py                   |  437 ++++++++++++++
 pym/portage/cache/flat_hash.py                     |    9 +-
 pym/portage/checksum.py                            |   17 +-
 pym/portage/dbapi/_MergeProcess.py                 |   18 +-
 pym/portage/dbapi/_SyncfsProcess.py                |   53 ++
 pym/portage/dbapi/bintree.py                       |   48 +-
 pym/portage/dbapi/dep_expand.py                    |    4 +-
 pym/portage/dbapi/porttree.py                      |   29 +-
 pym/portage/dbapi/vartree.py                       |   74 ++--
 pym/portage/dep/__init__.py                        |   14 +-
 pym/portage/locks.py                               |   11 +-
 pym/portage/manifest.py                            |   47 +-
 .../{_eapi_invalid.py => _metadata_invalid.py}     |    0
 .../ebuild/_parallel_manifest/ManifestScheduler.py |   19 +-
 .../ebuild/_parallel_manifest/ManifestTask.py      |   10 +-
 pym/portage/package/ebuild/_spawn_nofetch.py       |    7 +-
 pym/portage/package/ebuild/config.py               |   18 +-
 pym/portage/package/ebuild/doebuild.py             |   58 ++-
 pym/portage/process.py                             |   14 +-
 pym/portage/tests/dep/test_paren_reduce.py         |   11 +-
 pym/portage/tests/ebuild/test_doebuild_spawn.py    |   39 +-
 pym/portage/tests/emerge/test_simple.py            |    8 +-
 pym/portage/tests/process/test_PopenProcess.py     |    7 +-
 .../tests/process/test_PopenProcessBlockingIO.py   |   63 ++
 pym/portage/tests/repoman/test_echangelog.py       |    6 +-
 pym/portage/tests/runTests                         |    1 +
 pym/portage/util/_ShelveUnicodeWrapper.py          |   45 ++
 pym/portage/util/_async/AsyncScheduler.py          |    4 +-
 pym/portage/util/_async/FileCopier.py              |   17 +
 pym/portage/util/_async/FileDigester.py            |   73 +++
 pym/portage/util/_async/PipeLogger.py              |   36 +-
 pym/portage/util/_async/PipeReaderBlockingIO.py    |   91 +++
 pym/portage/util/_async/SchedulerInterface.py      |   25 +-
 pym/portage/util/_async/run_main_scheduler.py      |   41 ++
 pym/portage/util/_eventloop/EventLoop.py           |  271 ++++++---
 pym/repoman/checks.py                              |   17 +-
 runtests.sh                                        |   34 +-
 99 files changed, 3467 insertions(+), 770 deletions(-)

diff --cc bin/phase-functions.sh
index 50955af,01c6f55..32dd307
--- a/bin/phase-functions.sh
+++ b/bin/phase-functions.sh
@@@ -703,16 -562,11 +703,20 @@@ __dyn_install() 
  			x=$(echo -n ${!f})
  			[[ -n $x ]] && echo "$x" > $f
  		done
+ 		# whitespace preserved
+ 		for f in QA_AM_MAINTAINER_MODE ; do
+ 			[[ -n ${!f} ]] && echo "${!f}" > $f
+ 		done
  	fi
 +	if [[ " ${FEATURES} " == *" force-multilib "* ]]; then
 +		#IUSE is changed in _post_src_install_chost_fix
 +		#in pym/portage/package/ebuild/doebuild.py
 +		#which is run after dyn_install, so useless to
 +		#add internal USE flags here 
 +		if is_auto-multilib; then
 +			echo "$(get_abi_order)" > MULTILIB_ABIS
 +		fi
 +	fi
  	echo "${USE}"       > USE
  	echo "${EAPI:-0}"   > EAPI
  
diff --cc bin/phase-helpers.sh
index 0ab8534,383f9ff..c7c3963
--- a/bin/phase-helpers.sh
+++ b/bin/phase-helpers.sh
@@@ -212,10 -212,15 +212,16 @@@ use() 
  
  	# Make sure we have this USE flag in IUSE
  	elif [[ -n $PORTAGE_IUSE && -n $EBUILD_PHASE ]] ; then
- 		[[ " ${FEATURES} " == *" force-multilib "* && $u == multilib ]] || \
- 			[[ $u =~ $PORTAGE_IUSE ]] || \
 -		if [[ ! $u =~ $PORTAGE_IUSE ]] ; then
++		if ( [[ ! " ${FEATURES} " == *" force-multilib "* && $u == multilib ]] && \
++			[[ ! $u =~ $PORTAGE_IUSE ]] ) ; then
+ 			if [[ ! ${EAPI} =~ ^(0|1|2|3|4|4-python|4-slot-abi)$ ]] ; then
+ 				# This is only strict starting with EAPI 5, since implicit IUSE
+ 				# is not well defined for earlier EAPIs (see bug #449708).
+ 				die "USE Flag '${u}' not in IUSE for ${CATEGORY}/${PF}"
+ 			fi
  			eqawarn "QA Notice: USE Flag '${u}' not" \
  				"in IUSE for ${CATEGORY}/${PF}"
+ 		fi
  	fi
  
  	local IFS=$' \t\n' prev_shopts=$- ret


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2013-01-26 17:19 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2013-01-26 17:19 UTC (permalink / raw
  To: gentoo-commits

commit:     7e7e8662ba9d189730f6ca6a8900e3823f9c4ee9
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sat Jan 26 17:17:38 2013 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sat Jan 26 17:17:38 2013 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=7e7e8662

Merge tag 'v2.2.0_alpha152' into multilib


 Makefile                |   14 ++-
 bin/misc-functions.sh   |    4 +
 man/ru/ebuild.1         |  242 +++++++++++++++++++++++++++++++++++++++++++++++
 pym/portage/__init__.py |    4 +
 pym/portage/_selinux.py |   53 +++++-----
 5 files changed, 286 insertions(+), 31 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2013-01-26 17:19 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2013-01-26 17:19 UTC (permalink / raw
  To: gentoo-commits

commit:     68f6c327ce05172ce970ff7933a1760821aa1fe2
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sat Jan 26 17:17:49 2013 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sat Jan 26 17:17:49 2013 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=68f6c327

Merge tag 'v2.2.0_alpha153' into multilib


 Makefile                                           |   17 ++++++++++-------
 man/ebuild.1                                       |   12 ++++++------
 pym/_emerge/EbuildPhase.py                         |    9 ++++++++-
 pym/_emerge/SpawnProcess.py                        |   10 ++++++++--
 .../package/ebuild/_config/LocationsManager.py     |   18 +++++++++++++++---
 pym/portage/package/ebuild/config.py               |   18 ++++++++++++++++--
 6 files changed, 63 insertions(+), 21 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2013-01-26 17:19 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2013-01-26 17:19 UTC (permalink / raw
  To: gentoo-commits

commit:     388a8c146ee5add6763ac8d2374c852c79f209c3
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sat Jan 26 17:18:03 2013 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sat Jan 26 17:18:03 2013 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=388a8c14

Merge tag 'v2.2.0_alpha156' into multilib


 .../package/ebuild/_config/KeywordsManager.py      |   28 ++++++++++-----
 pym/portage/tests/repoman/test_simple.py           |   15 ++++++++
 pym/portage/versions.py                            |    5 ++-
 pym/repoman/utilities.py                           |   38 +++++++++++++++----
 4 files changed, 68 insertions(+), 18 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2013-01-26 17:19 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2013-01-26 17:19 UTC (permalink / raw
  To: gentoo-commits

commit:     2062fd1c2f7fdb6c4fa15e3a87cf07f917872fab
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sat Jan 26 17:18:07 2013 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sat Jan 26 17:18:07 2013 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=2062fd1c

Merge tag 'v2.2.0_alpha157' into multilib


 .../package/ebuild/_config/KeywordsManager.py      |    6 +++-
 pym/portage/package/ebuild/_config/UseManager.py   |   36 ++++++++++++++------
 pym/portage/package/ebuild/config.py               |    3 +-
 pym/portage/versions.py                            |   10 +++--
 4 files changed, 38 insertions(+), 17 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2013-01-26 17:19 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2013-01-26 17:19 UTC (permalink / raw
  To: gentoo-commits

commit:     a7cd0525f2c96780d3b1c4068a5116f34ff5dc92
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sat Jan 26 17:18:12 2013 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sat Jan 26 17:18:12 2013 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=a7cd0525

Merge tag 'v2.2.0_alpha158' into multilib


 bin/repoman |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2013-01-26 17:19 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2013-01-26 17:19 UTC (permalink / raw
  To: gentoo-commits

commit:     a8084e7f0be5e7b8f37bd040c3b98d2037d37631
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sat Jan 26 17:17:58 2013 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sat Jan 26 17:17:58 2013 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=a8084e7f

Merge tag 'v2.2.0_alpha155' into multilib


 bin/egencache                                      |   30 +-
 bin/glsa-check                                     |  107 ++++---
 bin/portageq                                       |   10 +-
 bin/repoman                                        |    2 +-
 pym/_emerge/DependencyArg.py                       |   10 +-
 pym/_emerge/FakeVartree.py                         |    4 +-
 pym/_emerge/JobStatusDisplay.py                    |   41 ++--
 pym/_emerge/Package.py                             |   23 +-
 pym/_emerge/Scheduler.py                           |    8 +-
 pym/_emerge/UseFlagDisplay.py                      |   10 +-
 pym/_emerge/actions.py                             |   23 +-
 pym/_emerge/depgraph.py                            |   32 +-
 pym/_emerge/emergelog.py                           |   12 +-
 pym/_emerge/resolver/circular_dependency.py        |    4 +-
 pym/_emerge/resolver/output.py                     |   13 +-
 pym/_emerge/resolver/output_helpers.py             |    5 +-
 pym/_emerge/resolver/slot_collision.py             |   55 +++--
 pym/portage/__init__.py                            |   11 +
 pym/portage/_sets/__init__.py                      |    4 +
 pym/portage/cache/ebuild_xattr.py                  |    2 +-
 pym/portage/cache/flat_hash.py                     |   14 +-
 pym/portage/cache/sqlite.py                        |    7 +-
 pym/portage/const.py                               |    4 +-
 pym/portage/dbapi/__init__.py                      |    4 +-
 pym/portage/dbapi/_expand_new_virt.py              |    4 +-
 pym/portage/dbapi/bintree.py                       |   12 +-
 pym/portage/dbapi/cpv_expand.py                    |    4 +-
 pym/portage/dbapi/dep_expand.py                    |    4 +-
 pym/portage/dbapi/porttree.py                      |    6 +-
 pym/portage/dbapi/vartree.py                       |  126 ++++-----
 pym/portage/dbapi/virtual.py                       |    3 +-
 pym/portage/dep/__init__.py                        |    2 +
 pym/portage/dep/_slot_operator.py                  |    4 +-
 pym/portage/dep/dep_check.py                       |   11 +-
 pym/portage/elog/mod_save_summary.py               |   21 +-
 pym/portage/getbinpkg.py                           |    4 +-
 pym/portage/glsa.py                                |  301 +++++++++++---------
 pym/portage/localization.py                        |   12 +-
 pym/portage/manifest.py                            |    2 +
 pym/portage/news.py                                |   10 +-
 .../package/ebuild/_config/special_env_vars.py     |    4 +-
 pym/portage/package/ebuild/_ipc/QueryCommand.py    |    7 +-
 pym/portage/package/ebuild/config.py               |    4 +-
 pym/portage/package/ebuild/doebuild.py             |   17 +-
 pym/portage/package/ebuild/prepare_build_dirs.py   |    8 +-
 pym/portage/process.py                             |   55 +++-
 pym/portage/repository/config.py                   |   14 +-
 .../{_emirrordist => tests/glsa}/__init__.py       |    0
 pym/portage/tests/{bin => glsa}/__test__           |    0
 pym/portage/tests/glsa/test_security_set.py        |  144 ++++++++++
 pym/portage/tests/unicode/test_string_format.py    |   51 ++--
 pym/portage/update.py                              |    4 +-
 pym/portage/util/digraph.py                        |   12 +-
 pym/portage/util/movefile.py                       |   12 +-
 pym/portage/versions.py                            |    6 +-
 pym/portage/xml/metadata.py                        |    8 +-
 pym/repoman/checks.py                              |    7 +-
 pym/repoman/errors.py                              |    4 +-
 pym/repoman/herdbase.py                            |    6 +-
 pym/repoman/utilities.py                           |   24 +-
 60 files changed, 829 insertions(+), 519 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2013-01-26 17:19 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2013-01-26 17:19 UTC (permalink / raw
  To: gentoo-commits

commit:     1874bf1ac75822b7f7c0af76b2e2697b48cda618
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sat Jan 26 17:17:54 2013 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sat Jan 26 17:17:54 2013 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=1874bf1a

Merge tag 'v2.2.0_alpha154' into multilib


 bin/ebuild                                         |    2 +-
 bin/ebuild.sh                                      |   11 ++-
 man/make.conf.5                                    |    3 +
 man/portage.5                                      |    6 +-
 man/ru/ebuild.1                                    |   36 +++++----
 pym/_emerge/EbuildMetadataPhase.py                 |    5 +-
 pym/_emerge/EbuildProcess.py                       |   12 ++-
 pym/_emerge/EbuildSpawnProcess.py                  |   10 ++-
 pym/_emerge/MiscFunctionsProcess.py                |    7 ++-
 pym/_emerge/SpawnProcess.py                        |   23 +++---
 pym/_emerge/SubProcess.py                          |    9 +--
 pym/_emerge/actions.py                             |   13 +++
 pym/_emerge/depgraph.py                            |   17 ++--
 .../package/ebuild/_config/special_env_vars.py     |    4 +-
 pym/portage/package/ebuild/doebuild.py             |   52 +++----------
 pym/portage/process.py                             |   15 ++++
 pym/portage/util/_get_vm_info.py                   |   80 ++++++++++++++++++++
 17 files changed, 202 insertions(+), 103 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2013-01-26 17:19 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2013-01-26 17:19 UTC (permalink / raw
  To: gentoo-commits

commit:     b232963a887bf2fcbbe54eab385b6cbfe7619df4
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sat Jan 26 17:18:22 2013 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sat Jan 26 17:18:22 2013 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=b232963a

Merge tag 'v2.2.0_alpha160' into multilib


 pym/_emerge/Package.py                 |   69 ++++++++++++++++++-------------
 pym/_emerge/resolver/slot_collision.py |   20 +++++++++
 pym/portage/dbapi/__init__.py          |    4 +-
 3 files changed, 63 insertions(+), 30 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2013-01-26 17:19 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2013-01-26 17:19 UTC (permalink / raw
  To: gentoo-commits

commit:     5f1383f2a237de3e2ac8aa98a1eae9ce4fc2eea6
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sat Jan 26 17:18:17 2013 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sat Jan 26 17:18:17 2013 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=5f1383f2

Merge tag 'v2.2.0_alpha159' into multilib


 cnf/make.conf                 |   15 +++++++++++++--
 man/make.conf.5               |   12 ++++++------
 pym/_emerge/depgraph.py       |    7 +++++--
 pym/portage/dbapi/__init__.py |   16 ++++++++++++----
 pym/portage/dep/__init__.py   |    8 +++++---
 5 files changed, 41 insertions(+), 17 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2013-01-26 17:19 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2013-01-26 17:19 UTC (permalink / raw
  To: gentoo-commits

commit:     d4ea33518c44aa4d07f3f5dcc900a7b5a2d7436a
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sat Jan 26 17:18:26 2013 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sat Jan 26 17:18:26 2013 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=d4ea3351

Merge tag 'v2.2.0_alpha161' into multilib


 pym/portage/dbapi/vartree.py                       |    2 +-
 .../package/ebuild/_config/LocationsManager.py     |   15 ++++++-----
 pym/portage/package/ebuild/config.py               |    7 +++--
 pym/portage/repository/config.py                   |    7 +++--
 pym/portage/util/_path.py                          |   27 ++++++++++++++++++++
 5 files changed, 44 insertions(+), 14 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2013-02-16 18:47 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2013-02-16 18:47 UTC (permalink / raw
  To: gentoo-commits

commit:     7f5b665406eae057457f519ca8fc837f56aba8e2
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sat Feb 16 18:46:50 2013 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sat Feb 16 18:46:50 2013 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=7f5b6654

Merge v2.2.0_alpha163


 bin/archive-conf                                   |    4 +-
 bin/ebuild                                         |    3 +-
 bin/isolated-functions.sh                          |    3 +-
 bin/misc-functions.sh                              |   30 +-
 bin/phase-functions.sh                             |    2 +-
 bin/phase-helpers.sh                               |   11 +-
 bin/repoman                                        |   35 +-
 man/ebuild.1                                       |    2 +-
 man/ebuild.5                                       |    2 +-
 man/emerge.1                                       |   15 +-
 man/env-update.1                                   |   14 +-
 man/etc-update.1                                   |   44 +--
 man/portage.5                                      |   18 +-
 man/ru/ebuild.1                                    |    3 +-
 man/ru/env-update.1                                |   35 ++
 man/ru/etc-update.1                                |   63 ++++
 man/ru/fixpackages.1                               |   22 ++
 misc/emerge-delta-webrsync                         |    2 +-
 pym/_emerge/SpawnProcess.py                        |    2 +-
 pym/_emerge/actions.py                             |   73 ++--
 pym/_emerge/depgraph.py                            |  392 +++++++++++++++++---
 pym/_emerge/getloadavg.py                          |    5 +-
 pym/_emerge/resolver/slot_collision.py             |    2 +-
 pym/portage/__init__.py                            |   58 ++-
 pym/portage/data.py                                |   36 ++-
 pym/portage/dbapi/__init__.py                      |    6 +-
 pym/portage/dbapi/vartree.py                       |    6 +-
 pym/portage/package/ebuild/_config/UseManager.py   |   12 +-
 .../package/ebuild/_config/special_env_vars.py     |    4 +-
 pym/portage/package/ebuild/config.py               |   50 ++-
 .../package/ebuild/deprecated_profile_check.py     |   46 ++-
 pym/portage/package/ebuild/doebuild.py             |   26 ++-
 pym/portage/process.py                             |    2 +-
 pym/portage/tests/emerge/test_simple.py            |    2 +-
 ...test_complete_if_new_subslot_without_revbump.py |   74 ++++
 .../test_regular_slot_change_without_revbump.py    |   59 +++
 .../resolver/test_slot_change_without_revbump.py   |   69 ++++
 .../tests/resolver/test_slot_operator_unsolved.py  |   88 +++++
 pym/portage/tests/runTests                         |   14 +-
 pym/portage/util/__init__.py                       |    4 +-
 pym/repoman/checks.py                              |   23 +-
 pym/repoman/utilities.py                           |    5 +-
 42 files changed, 1124 insertions(+), 242 deletions(-)

diff --cc bin/phase-helpers.sh
index c7c3963,ac1c076..68496c2
--- a/bin/phase-helpers.sh
+++ b/bin/phase-helpers.sh
@@@ -210,10 -210,12 +210,13 @@@ use() 
  		#fi
  		true
  
- 	# Make sure we have this USE flag in IUSE
- 	elif [[ -n $PORTAGE_IUSE && -n $EBUILD_PHASE ]] ; then
+ 	# Make sure we have this USE flag in IUSE, but exempt binary
+ 	# packages for API consumers like Entropy which do not require
+ 	# a full profile with IUSE_IMPLICIT and stuff (see bug #456830).
+ 	elif [[ -n $PORTAGE_IUSE && -n $EBUILD_PHASE &&
+ 		-n $PORTAGE_INTERNAL_CALLER ]] ; then
 -		if [[ ! $u =~ $PORTAGE_IUSE ]] ; then
 +		if ( [[ ! " ${FEATURES} " == *" force-multilib "* && $u == multilib ]] && \
 +			[[ ! $u =~ $PORTAGE_IUSE ]] ) ; then
  			if [[ ! ${EAPI} =~ ^(0|1|2|3|4|4-python|4-slot-abi)$ ]] ; then
  				# This is only strict starting with EAPI 5, since implicit IUSE
  				# is not well defined for earlier EAPIs (see bug #449708).
diff --cc pym/portage/package/ebuild/config.py
index aee20b0,fb7b741..c5ff688
--- a/pym/portage/package/ebuild/config.py
+++ b/pym/portage/package/ebuild/config.py
@@@ -843,20 -844,9 +844,16 @@@ class config(object)
  					self[var] = default_val
  				self.backup_changes(var)
  
- 			features = []
- 			for x in ("globals", "defaults", "conf", "env"):
- 				v = self.configdict[x].get("FEATURES")
- 				if v is not None:
- 					features.append(v.split())
- 			features = stack_lists(features)
- 
+ 			if portage._internal_caller:
+ 				self["PORTAGE_INTERNAL_CALLER"] = "1"
+ 				self.backup_changes("PORTAGE_INTERNAL_CALLER")
 +			if 'force-multilib' in features:
 +				#add multilib_abi internally to list of USE_EXPANDed vars
 +				self["USE_EXPAND"] = "MULTILIB_ABI" + " " + self.get("USE_EXPAND", "")
 +				self.backup_changes("USE_EXPAND")
 +				default_abi = self.configdict["defaults"].get('DEFAULT_ABI', '').strip()
 +				if default_abi:
 +					self.configdict["defaults"]["USE"] = self.configdict["defaults"].get("USE", "") + " multilib_abi_" + default_abi
  
  			# initialize self.features
  			self.regenerate()
@@@ -1722,17 -1737,13 +1746,17 @@@
  		# FEATURES=test for all ebuilds, regardless of explicit IUSE.
  		iuse_implicit.add("test")
  
 +		if 'force-multilib' in self.features:
 +			for multilib_abis in self.get('MULTILIB_ABIS', '').split():
 +				iuse_implicit.add("multilib_abi_" + multilib_abis)
 +
  		return iuse_implicit
  
- 	def _getUseMask(self, pkg):
- 		return self._use_manager.getUseMask(pkg)
+ 	def _getUseMask(self, pkg, stable=None):
+ 		return self._use_manager.getUseMask(pkg, stable=stable)
  
- 	def _getUseForce(self, pkg):
- 		return self._use_manager.getUseForce(pkg)
+ 	def _getUseForce(self, pkg, stable=None):
+ 		return self._use_manager.getUseForce(pkg, stable=stable)
  
  	def _getMaskAtom(self, cpv, metadata):
  		"""


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2013-03-03 13:44 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2013-03-03 13:44 UTC (permalink / raw
  To: gentoo-commits

commit:     fe63300c9dcf440748c88a5606013b81ff9217c0
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sun Mar  3 13:43:20 2013 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun Mar  3 13:43:20 2013 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=fe63300c

Merge tag 'v2.2.0_alpha164' into multilib


 bin/ebuild-helpers/preplib                     |   32 --
 bin/misc-functions.sh                          |    2 +-
 bin/phase-helpers.sh                           |    5 +-
 bin/portageq                                   |   38 +-
 bin/repoman                                    |  481 ++++++++++++------------
 doc/qa.docbook                                 |    2 +-
 man/emerge.1                                   |    4 +-
 man/portage.5                                  |   11 +-
 man/ru/ebuild.1                                |    2 +-
 man/ru/env-update.1                            |    6 +-
 pym/_emerge/Scheduler.py                       |   20 +-
 pym/_emerge/depgraph.py                        |   40 ++-
 pym/_emerge/help.py                            |    2 +-
 pym/_emerge/resolver/output.py                 |  114 +++---
 pym/_emerge/resolver/output_helpers.py         |    3 +-
 pym/portage/__init__.py                        |   10 +-
 pym/portage/_sets/files.py                     |    6 +-
 pym/portage/package/ebuild/config.py           |   34 ++-
 pym/portage/package/ebuild/digestgen.py        |  107 +++---
 pym/portage/process.py                         |    4 +
 pym/portage/tests/lint/test_compile_modules.py |   20 +-
 pym/portage/util/_dyn_libs/LinkageMapELF.py    |    6 +-
 pym/portage/util/_eventloop/EventLoop.py       |    8 +-
 23 files changed, 494 insertions(+), 463 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2013-03-08 17:46 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2013-03-08 17:46 UTC (permalink / raw
  To: gentoo-commits

commit:     6e28e4f677db82944f5658b47452f195641841bb
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Fri Mar  8 17:46:31 2013 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Fri Mar  8 17:46:31 2013 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=6e28e4f6

Merge tag 'v2.2.0_alpha166' into multilib


 bin/repoman                                 |   95 +++++++++++++++++++++------
 pym/_emerge/actions.py                      |    3 +-
 pym/_emerge/depgraph.py                     |   34 +++++++++-
 pym/portage/tests/resolver/test_slot_abi.py |   85 +++++++++++++++++++++++-
 4 files changed, 191 insertions(+), 26 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2013-03-23 16:24 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2013-03-23 16:24 UTC (permalink / raw
  To: gentoo-commits

commit:     5a1193e5acd717b0afa77b56ef15f47036bd3c31
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sat Mar 23 16:24:03 2013 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sat Mar 23 16:24:03 2013 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=5a1193e5

Merge tag 'v2.2.0_alpha169' into multilib


 bin/ebuild-helpers/ecompressdir                    |   33 ++-
 bin/ebuild-helpers/prepallman                      |    5 +-
 bin/ebuild-helpers/prepman                         |    5 +-
 bin/ebuild-helpers/prepstrip                       |    9 +-
 bin/emaint                                         |    3 +-
 bin/etc-update                                     |    4 +-
 bin/misc-functions.sh                              |   12 +-
 bin/portageq                                       |  304 ++++++++++++++++++--
 bin/repoman                                        |    8 +-
 pym/_emerge/Task.py                                |    9 +-
 pym/_emerge/actions.py                             |   32 ++-
 pym/_emerge/depgraph.py                            |  125 +++++++--
 pym/_emerge/is_valid_package_atom.py               |    5 +-
 pym/_emerge/resolver/output.py                     |   45 ++--
 pym/_emerge/stdout_spinner.py                      |   13 +-
 pym/portage/const.py                               |    6 +-
 pym/portage/dbapi/vartree.py                       |   40 ++-
 pym/portage/dep/__init__.py                        |   21 +--
 pym/portage/emaint/__init__.py                     |    4 +-
 pym/portage/emaint/modules/__init__.py             |    4 +-
 pym/portage/emaint/modules/binhost/__init__.py     |    8 +-
 pym/portage/emaint/modules/config/__init__.py      |    8 +-
 pym/portage/emaint/modules/logs/__init__.py        |    8 +-
 pym/portage/emaint/modules/move/__init__.py        |    9 +-
 pym/portage/emaint/modules/resume/__init__.py      |    6 +-
 pym/portage/emaint/modules/world/__init__.py       |    8 +-
 pym/portage/manifest.py                            |    3 +-
 .../package/ebuild/_config/LocationsManager.py     |   17 +-
 pym/portage/package/ebuild/config.py               |    2 +-
 pym/portage/repository/config.py                   |   38 ++-
 pym/portage/tests/__init__.py                      |   11 +-
 pym/portage/tests/bin/setup_env.py                 |   12 +-
 pym/portage/tests/emerge/test_simple.py            |   15 +-
 .../resolver/test_slot_operator_autounmask.py      |  120 ++++++++
 pym/portage/tests/runTests                         |    2 +-
 pym/portage/update.py                              |   26 ++-
 pym/portage/util/__init__.py                       |   19 +-
 .../util/_dyn_libs/display_preserved_libs.py       |   35 ++-
 pym/portage/util/listdir.py                        |    8 +-
 pym/portage/versions.py                            |   23 ++-
 pym/repoman/checks.py                              |    6 +-
 41 files changed, 831 insertions(+), 240 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2013-03-28 19:31 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2013-03-28 19:31 UTC (permalink / raw
  To: gentoo-commits

commit:     efee005bc838284ded7d7672c49b66fd2f5ae799
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Thu Mar 28 19:30:46 2013 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Thu Mar 28 19:30:46 2013 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=efee005b

Merge tag 'v2.2.0_alpha170' into multilib


 bin/ebuild-helpers/prepstrip                       |    3 +-
 bin/repoman                                        |    2 +-
 cnf/make.globals                                   |    5 +-
 man/ebuild.1                                       |    4 +-
 man/ebuild.5                                       |    9 ++-
 man/make.conf.5                                    |   11 +++-
 pym/_emerge/SpawnProcess.py                        |    9 ++-
 pym/_emerge/depgraph.py                            |   27 +++++--
 pym/portage/locks.py                               |   42 +++++++++---
 .../package/ebuild/_config/special_env_vars.py     |    3 +-
 pym/portage/package/ebuild/config.py               |   14 ++--
 pym/portage/util/__init__.py                       |   65 ++++++++++++++++-
 pym/portage/util/movefile.py                       |   75 ++++++++++++++++++--
 13 files changed, 224 insertions(+), 45 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2013-04-03 11:51 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2013-04-03 11:51 UTC (permalink / raw
  To: gentoo-commits

commit:     359a0020ed0f10e598faa8337f1b308b9bcfbe56
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Wed Apr  3 11:51:01 2013 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Wed Apr  3 11:51:01 2013 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=359a0020

Merge tag 'v2.2.0_alpha171' into multilib


 bin/ebuild                       |   23 ++++++++++-------------
 bin/ebuild-helpers/ecompressdir  |    4 ++--
 bin/egencache                    |   11 ++++++++---
 pym/portage/_emirrordist/main.py |   12 ++++++++----
 pym/portage/dbapi/bintree.py     |   19 +++++++++++++++++++
 pym/portage/repository/config.py |    8 ++++++++
 6 files changed, 55 insertions(+), 22 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2013-04-14 13:20 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2013-04-14 13:20 UTC (permalink / raw
  To: gentoo-commits

commit:     e1a20a8ef35e00a1fbeeaae1a9babfba8828ea4f
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sun Apr 14 09:12:45 2013 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun Apr 14 09:12:45 2013 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=e1a20a8e

Merge tag 'v2.2.0_alpha173' into multilib


 bin/misc-functions.sh   |   10 ----------
 bin/repoman             |   10 ++++++++--
 man/ebuild.5            |    1 +
 man/emerge.1            |    5 +++++
 man/make.conf.5         |    6 ++++--
 man/portage.5           |    7 ++++++-
 pym/_emerge/depgraph.py |   18 ++++++++++++++++--
 7 files changed, 40 insertions(+), 17 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2013-05-10  8:01 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2013-05-10  8:01 UTC (permalink / raw
  To: gentoo-commits

commit:     6d529d8fc81dd0d77bf19100db5e1dbea49abe7b
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Fri May 10 08:01:27 2013 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Fri May 10 08:01:27 2013 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=6d529d8f

Merge tag 'v2.2.0_alpha174' into multilib


 bin/ebuild                                         |    8 +-
 bin/misc-functions.sh                              |   13 +-
 bin/phase-functions.sh                             |    2 +-
 bin/repoman                                        |   48 ++-
 cnf/make.globals                                   |    1 +
 man/dispatch-conf.1                                |   75 ++--
 man/ebuild.5                                       |    5 +
 man/emerge.1                                       |   39 ++-
 man/make.conf.5                                    |   21 +
 man/portage.5                                      |   11 +
 man/repoman.1                                      |    4 +
 man/ru/dispatch-conf.1                             |  100 ++++
 pym/_emerge/Package.py                             |   12 +-
 pym/_emerge/actions.py                             |   24 +-
 pym/_emerge/main.py                                |    7 +
 pym/_emerge/search.py                              |    4 +-
 pym/portage/_sets/libs.py                          |    9 +-
 pym/portage/dbapi/bintree.py                       |    2 +-
 pym/portage/dbapi/porttree.py                      |    2 +
 pym/portage/dbapi/vartree.py                       |   87 +++-
 .../package/ebuild/_config/special_env_vars.py     |    4 +-
 pym/portage/package/ebuild/config.py               |  133 ++++--
 pym/portage/package/ebuild/getmaskingstatus.py     |   15 +-
 pym/portage/process.py                             |   11 +-
 pym/portage/tests/__init__.py                      |   20 +-
 pym/portage/tests/bin/setup_env.py                 |   44 +-
 pym/portage/tests/dep/testAtom.py                  |  254 +++++-----
 pym/portage/tests/dep/testCheckRequiredUse.py      |  188 ++++----
 pym/portage/tests/dep/testStandalone.py            |   26 +-
 pym/portage/tests/dep/test_best_match_to_list.py   |   46 +-
 pym/portage/tests/dep/test_dep_getcpv.py           |   16 +-
 pym/portage/tests/dep/test_dep_getrepo.py          |    6 +-
 pym/portage/tests/dep/test_dep_getslot.py          |   10 +-
 pym/portage/tests/dep/test_dep_getusedeps.py       |   12 +-
 pym/portage/tests/dep/test_get_operator.py         |   24 +-
 pym/portage/tests/dep/test_isjustname.py           |   14 +-
 pym/portage/tests/dep/test_isvalidatom.py          |    6 +-
 pym/portage/tests/dep/test_match_from_list.py      |  120 +++---
 pym/portage/tests/dep/test_paren_reduce.py         |   50 +-
 pym/portage/tests/dep/test_use_reduce.py           |  519 ++++++++++----------
 pym/portage/tests/ebuild/test_config.py            |    4 +-
 .../tests/env/config/test_PackageKeywordsFile.py   |    8 +-
 .../tests/env/config/test_PackageUseFile.py        |    6 +-
 .../tests/env/config/test_PortageModulesFile.py    |   11 +-
 pym/portage/tests/resolver/ResolverPlayground.py   |   18 +-
 pym/portage/tests/resolver/test_autounmask.py      |  304 ++++++------
 pym/portage/tests/resolver/test_backtracking.py    |    6 +-
 pym/portage/tests/resolver/test_depclean.py        |  100 ++--
 .../resolver/test_depclean_slot_unavailable.py     |   15 +-
 pym/portage/tests/resolver/test_multirepo.py       |    4 +-
 pym/portage/tests/util/test_stackDictList.py       |   12 +-
 pym/portage/tests/util/test_stackDicts.py          |   41 +-
 pym/portage/tests/util/test_stackLists.py          |   18 +-
 pym/portage/tests/util/test_uniqueArray.py         |   14 +-
 pym/portage/tests/util/test_varExpand.py           |   80 ++--
 pym/portage/tests/versions/test_cpv_sort_key.py    |    7 +-
 pym/portage/tests/versions/test_vercmp.py          |   38 +-
 pym/portage/util/_dyn_libs/LinkageMapELF.py        |   18 +-
 .../util/_dyn_libs/display_preserved_libs.py       |    2 +-
 pym/portage/util/movefile.py                       |   10 +
 pym/repoman/checks.py                              |    2 +
 61 files changed, 1538 insertions(+), 1172 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2013-05-20 10:41 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2013-05-20 10:41 UTC (permalink / raw
  To: gentoo-commits

commit:     dff820f4c52ba830543c00e2d335e531bf7de8c0
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Mon May 20 10:40:10 2013 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Mon May 20 10:40:10 2013 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=dff820f4

Merge v2.2.0_alpha176


 NEWS                                               |    2 +-
 RELEASE-NOTES                                      |    7 +-
 bin/archive-conf                                   |   16 ++--
 bin/clean_locks                                    |    2 -
 bin/dispatch-conf                                  |    9 +-
 bin/dohtml.py                                      |    5 +-
 bin/ebuild-helpers/dohtml                          |    7 +-
 bin/ebuild-helpers/portageq                        |    4 +-
 bin/ebuild-ipc                                     |    4 +-
 bin/ebuild.sh                                      |    8 +-
 bin/egencache                                      |   10 +-
 bin/emerge                                         |    1 -
 bin/misc-functions.sh                              |    6 +-
 bin/phase-functions.sh                             |   34 +++++--
 bin/phase-helpers.sh                               |   23 ++---
 bin/repoman                                        |  104 +++++++-------------
 cnf/make.globals                                   |    8 +-
 cnf/metadata.dtd                                   |    2 +-
 man/ebuild.5                                       |    6 +-
 man/egencache.1                                    |    8 +-
 man/emerge.1                                       |    4 +-
 man/make.conf.5                                    |   36 +++++--
 pym/_emerge/BinpkgFetcher.py                       |    8 ++-
 pym/_emerge/EbuildBuild.py                         |   10 ++-
 pym/_emerge/EbuildFetcher.py                       |    3 +-
 pym/_emerge/JobStatusDisplay.py                    |    3 +-
 pym/_emerge/actions.py                             |    6 +
 pym/portage/dbapi/bintree.py                       |   89 +++++++++++------
 pym/portage/getbinpkg.py                           |   33 +++++--
 .../package/ebuild/_config/special_env_vars.py     |    2 +-
 pym/portage/package/ebuild/doebuild.py             |   21 ++---
 pym/portage/package/ebuild/fetch.py                |    9 ++-
 pym/portage/tests/util/test_getconfig.py           |    4 +-
 pym/portage/util/env_update.py                     |   63 ++++++++-----
 34 files changed, 324 insertions(+), 233 deletions(-)

diff --cc bin/phase-functions.sh
index 3031a5a,6d75ef1..828f929
--- a/bin/phase-functions.sh
+++ b/bin/phase-functions.sh
@@@ -558,36 -461,29 +558,40 @@@ __dyn_test() 
  		return
  	fi
  
- 	if [[ ${EBUILD_FORCE_TEST} == 1 && test =~ $PORTAGE_IUSE ]]; then
- 		# If USE came from ${T}/environment then it might not have USE=test
- 		# like it's supposed to here.
- 		! has test ${USE} && export USE="${USE} test"
- 	fi
- 
  	trap "__abort_test" SIGINT SIGQUIT
 +	for LOOP_ABI in $(get_abi_list); do
 +		[[ " ${FEATURES} " == *" force-multilib "* ]] && is_ebuild && { set_abi ${LOOP_ABI}; source "${T}"/environment || die ; }
 +
  	if [ -d "${S}" ]; then
  		cd "${S}"
  	else
  		cd "${WORKDIR}"
  	fi
  
- 	if ! has test $FEATURES && [ "${EBUILD_FORCE_TEST}" != "1" ]; then
- 		__vecho ">>> Test phase [not enabled]: ${CATEGORY}/${PF}"
- 	elif has test $RESTRICT; then
+ 	if has test ${RESTRICT} ; then
  		einfo "Skipping make test/check due to ebuild restriction."
- 		__vecho ">>> Test phase [explicitly disabled]: ${CATEGORY}/${PF}"
+ 		__vecho ">>> Test phase [disabled because of RESTRICT=test]: ${CATEGORY}/${PF}"
+ 
+ 	# If ${EBUILD_FORCE_TEST} == 1 and FEATURES came from ${T}/environment
+ 	# then it might not have FEATURES=test like it's supposed to here.
+ 	elif [[ ${EBUILD_FORCE_TEST} != 1 ]] && ! has test ${FEATURES} ; then
+ 		__vecho ">>> Test phase [not enabled]: ${CATEGORY}/${PF}"
  	else
+ 		# If ${EBUILD_FORCE_TEST} == 1 and USE came from ${T}/environment
+ 		# then it might not have USE=test like it's supposed to here.
+ 		if [[ ${EBUILD_FORCE_TEST} == 1 && test =~ ${PORTAGE_IUSE} ]] && \
+ 			! has test ${USE} ; then
+ 			export USE="${USE} test"
+ 		fi
+ 
 +		if [[ " ${FEATURES} " == *" force-multilib "* ]]; then
 +			if [ ${PORTAGE_BUILDDIR}/.tested.${LOOP_ABI} -nt "${WORKDIR}" ]; then
 +				echo ">>> It appears that ${PN} is already tested for ABI=${LOOP_ABI}; skipping."
 +				echo ">>> Remove '$PORTAGE_BUILDDIR/.tested.${LOOP_ABI}' to force testing."
 +				continue
 +			fi
 +		fi
 +
  		local save_sp=${SANDBOX_PREDICT}
  		addpredict /
  		__ebuild_phase pre_src_test


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2013-05-31 12:16 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2013-05-31 12:16 UTC (permalink / raw
  To: gentoo-commits

commit:     d14f303a43f380ea8054f2b25b7409c5850eb142
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Fri May 31 12:15:47 2013 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Fri May 31 12:15:47 2013 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=d14f303a

Merge tag 'v2.2.0_alpha177' into multilib


 bin/ebuild                          |  3 ++-
 bin/ebuild-helpers/ecompressdir     | 15 +++++++++++++++
 bin/egencache                       |  3 ++-
 bin/quickpkg                        |  3 ++-
 bin/repoman                         | 16 +++++++++++++++-
 man/emerge.1                        |  3 +++
 man/portage.5                       |  8 +++++++-
 man/repoman.1                       | 10 +++++++++-
 pym/_emerge/main.py                 |  3 ++-
 pym/portage/dbapi/porttree.py       | 11 ++++++++++-
 pym/portage/package/ebuild/fetch.py | 13 ++++++++++++-
 pym/portage/repository/config.py    | 15 ++++++++++++++-
 12 files changed, 93 insertions(+), 10 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2013-08-04 11:19 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2013-08-04 11:19 UTC (permalink / raw
  To: gentoo-commits

commit:     38858c9d01ae9d713b7124c2cb5db63ba137c6b8
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sun Aug  4 11:16:52 2013 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun Aug  4 11:16:52 2013 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=38858c9d

Merge tag 'v2.2.0_alpha193' into multilib


 bin/isolated-functions.sh | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2013-08-04 11:19 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2013-08-04 11:19 UTC (permalink / raw
  To: gentoo-commits

commit:     ed2bdce054f8c05045da13241896e2ada5babb6d
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sun Aug  4 11:14:27 2013 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun Aug  4 11:14:27 2013 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=ed2bdce0

Merge v2.2.0_alpha192


 Makefile                                           |  14 +-
 RELEASE-NOTES                                      |   8 +
 bin/bashrc-functions.sh                            |   4 +-
 bin/binhost-snapshot                               |  13 +-
 bin/chpathtool.py                                  |  11 +-
 bin/dispatch-conf                                  |   2 +-
 bin/ebuild                                         |  53 +-
 bin/ebuild-helpers/dohtml                          |   2 +-
 bin/ebuild-helpers/portageq                        |   2 +-
 bin/ebuild-helpers/prepstrip                       |   5 +-
 bin/ebuild-helpers/{portageq => xattr/install}     |   8 +-
 bin/ebuild-ipc                                     |   2 +-
 bin/ebuild.sh                                      |  36 +-
 bin/egencache                                      | 106 ++-
 bin/emerge-webrsync                                |  65 +-
 bin/filter-bash-environment.py                     |  18 +-
 bin/fixpackages                                    |   8 +
 bin/glsa-check                                     |  61 +-
 bin/helper-functions.sh                            |   6 +-
 bin/install.py                                     | 248 +++++++
 bin/isolated-functions.sh                          |  51 +-
 bin/misc-functions.sh                              |   4 +-
 bin/phase-functions.sh                             |   9 +-
 bin/phase-helpers.sh                               |  18 +-
 bin/portageq                                       | 241 ++++---
 bin/quickpkg                                       |  18 +-
 bin/repoman                                        | 243 +++----
 bin/save-ebuild-env.sh                             |   4 +-
 bin/xattr-helper.py                                |  16 +-
 bin/xpak-helper.py                                 |   6 +-
 cnf/{make.conf => make.conf.example}               |   2 +-
 ...onf.alpha.diff => make.conf.example.alpha.diff} |  18 +-
 ...fbsd.diff => make.conf.example.amd64-fbsd.diff} |  18 +-
 ...onf.amd64.diff => make.conf.example.amd64.diff} |  18 +-
 ...ke.conf.arm.diff => make.conf.example.arm.diff} |  12 +-
 ....conf.hppa.diff => make.conf.example.hppa.diff} |  28 +-
 ....conf.ia64.diff => make.conf.example.ia64.diff} |  10 +-
 ....conf.m68k.diff => make.conf.example.m68k.diff} |  14 +-
 ....conf.mips.diff => make.conf.example.mips.diff} |  18 +-
 ...ke.conf.ppc.diff => make.conf.example.ppc.diff} |  26 +-
 ...onf.ppc64.diff => make.conf.example.ppc64.diff} |  24 +-
 ....conf.s390.diff => make.conf.example.s390.diff} |  10 +-
 ...make.conf.sh.diff => make.conf.example.sh.diff} |  17 +-
 ...fbsd.diff => make.conf.example.sparc-fbsd.diff} |  12 +-
 ...onf.sparc.diff => make.conf.example.sparc.diff} |  18 +-
 ...6-fbsd.diff => make.conf.example.x86-fbsd.diff} |  18 +-
 ...ke.conf.x86.diff => make.conf.example.x86.diff} |  18 +-
 cnf/make.globals                                   |  21 +-
 cnf/repos.conf                                     |   7 +
 make.conf-repatch.sh                               |  40 --
 make.conf.example-repatch.sh                       |  41 ++
 man/color.map.5                                    |  16 +-
 man/dispatch-conf.1                                |   2 +-
 man/ebuild.1                                       |  18 +-
 man/ebuild.5                                       |  86 +--
 man/egencache.1                                    |  23 +-
 man/emaint.1                                       |  15 +-
 man/emerge.1                                       | 252 ++++---
 man/emirrordist.1                                  |  17 +-
 man/env-update.1                                   |   9 +-
 man/etc-update.1                                   |   2 +-
 man/make.conf.5                                    | 127 ++--
 man/portage.5                                      | 370 ++++++----
 man/quickpkg.1                                     |  14 +-
 man/repoman.1                                      |  43 +-
 man/ru/color.map.5                                 | 217 ++++++
 man/xpak.5                                         |   5 +-
 misc/emerge-delta-webrsync                         | 523 ++++++++++-----
 pym/_emerge/AbstractDepPriority.py                 |   5 +-
 pym/_emerge/AsynchronousLock.py                    |   2 +-
 pym/_emerge/Binpkg.py                              |   6 +-
 pym/_emerge/DepPriority.py                         |  29 +-
 pym/_emerge/DepPrioritySatisfiedRange.py           |  24 +-
 pym/_emerge/EbuildBuild.py                         |  18 +-
 pym/_emerge/EbuildMetadataPhase.py                 |   1 -
 pym/_emerge/EbuildPhase.py                         |  44 +-
 pym/_emerge/MetadataRegen.py                       |   2 +
 pym/_emerge/RootConfig.py                          |  13 +-
 pym/_emerge/Scheduler.py                           |  51 +-
 pym/_emerge/SpawnProcess.py                        |   3 +-
 pym/_emerge/UnmergeDepPriority.py                  |  27 +-
 pym/_emerge/actions.py                             | 742 ++++++++++++---------
 pym/_emerge/clear_caches.py                        |   4 +-
 pym/_emerge/depgraph.py                            | 184 +++--
 pym/_emerge/main.py                                | 112 ++--
 pym/_emerge/resolver/circular_dependency.py        |   3 +-
 pym/portage/__init__.py                            |  83 +--
 pym/portage/_emirrordist/FetchTask.py              |  19 +-
 pym/portage/_emirrordist/main.py                   |  69 +-
 pym/portage/_legacy_globals.py                     |   3 +-
 pym/portage/_sets/__init__.py                      |   5 +-
 pym/portage/cache/sqlite.py                        |  12 +-
 pym/portage/cache/template.py                      |  13 +-
 pym/portage/checksum.py                            |   8 +-
 pym/portage/const.py                               |   6 +
 pym/portage/data.py                                |  18 +-
 pym/portage/dbapi/_MergeProcess.py                 |   9 +-
 pym/portage/dbapi/__init__.py                      |  57 +-
 pym/portage/dbapi/bintree.py                       |   2 +-
 pym/portage/dbapi/porttree.py                      |  56 +-
 pym/portage/dbapi/vartree.py                       |  12 +-
 pym/portage/dep/__init__.py                        |  38 +-
 pym/portage/dep/dep_check.py                       |  39 +-
 pym/portage/dispatch_conf.py                       |  18 +-
 pym/portage/eclass_cache.py                        |  14 +-
 pym/portage/emaint/defaults.py                     |  11 +-
 pym/portage/emaint/main.py                         | 134 ++--
 pym/portage/emaint/modules/logs/__init__.py        |  12 +-
 pym/portage/output.py                              |  13 +-
 .../package/ebuild/_config/LocationsManager.py     |  33 +-
 pym/portage/package/ebuild/_config/UseManager.py   |   2 +-
 .../package/ebuild/_config/special_env_vars.py     |  20 +-
 pym/portage/package/ebuild/_spawn_nofetch.py       |  10 +-
 pym/portage/package/ebuild/config.py               | 129 ++--
 pym/portage/package/ebuild/doebuild.py             | 102 ++-
 pym/portage/package/ebuild/fetch.py                |   8 +-
 pym/portage/package/ebuild/getmaskingreason.py     |  12 +-
 pym/portage/process.py                             |  67 +-
 pym/portage/repository/config.py                   | 414 +++++++++---
 pym/portage/tests/__init__.py                      |   8 +-
 pym/portage/tests/dbapi/test_fakedbapi.py          |  10 +-
 pym/portage/tests/dbapi/test_portdb_cache.py       |  11 +-
 pym/portage/tests/dep/test_isvalidatom.py          |   5 +-
 pym/portage/tests/dep/test_match_from_list.py      |   7 +-
 pym/portage/tests/ebuild/test_config.py            |  20 +-
 pym/portage/tests/ebuild/test_doebuild_fd_pipes.py | 137 ++++
 pym/portage/tests/ebuild/test_spawn.py             |  10 +-
 pym/portage/tests/emerge/test_emerge_slot_abi.py   |   4 +-
 pym/portage/tests/emerge/test_simple.py            |  55 +-
 pym/portage/tests/lint/test_bash_syntax.py         |   8 +-
 pym/portage/tests/repoman/test_simple.py           |  26 +-
 pym/portage/tests/resolver/ResolverPlayground.py   |  52 +-
 pym/portage/tests/resolver/test_backtracking.py    |  31 -
 pym/portage/tests/resolver/test_depclean_order.py  |  57 ++
 pym/portage/tests/resolver/test_merge_order.py     |  35 +-
 pym/portage/tests/resolver/test_or_choices.py      |  79 +++
 .../resolver/test_slot_conflict_mask_update.py     |  41 ++
 .../tests/resolver/test_slot_conflict_update.py    |  98 +++
 pym/portage/tests/update/test_move_ent.py          |   6 +-
 pym/portage/tests/update/test_move_slot_ent.py     |   6 +-
 pym/portage/tests/update/test_update_dbentry.py    |   6 +-
 pym/portage/util/__init__.py                       | 206 +++---
 pym/portage/util/_argparse.py                      |  42 ++
 pym/portage/util/_async/ForkProcess.py             |   6 +-
 pym/portage/util/_desktop_entry.py                 |  16 +-
 pym/portage/util/listdir.py                        | 122 ++--
 pym/portage/util/movefile.py                       |  10 +-
 pym/repoman/checks.py                              |   1 +
 pym/repoman/utilities.py                           |   7 +-
 149 files changed, 4709 insertions(+), 2542 deletions(-)

diff --cc pym/_emerge/actions.py
index b795f0e,4c53c25..f3874ec
--- a/pym/_emerge/actions.py
+++ b/pym/_emerge/actions.py
@@@ -3582,26 -3615,33 +3615,41 @@@ def run_action(emerge_config)
  		# it cancels all binary package options.
  		for opt in ("--getbinpkg", "--getbinpkgonly",
  			"--usepkg", "--usepkgonly"):
- 			myopts.pop(opt, None)
+ 			emerge_config.opts.pop(opt, None)
  
- 	adjust_configs(myopts, trees)
- 	apply_priorities(settings)
+ 	adjust_configs(emerge_config.opts, emerge_config.trees)
+ 	apply_priorities(emerge_config.target_config.settings)
  
 +	if 'force-multilib' in settings.features:
 +		if settings.get("NO_AUTO_FLAG", "") is "":
 +			writemsg_level(bad("!!! Failed to find vars from extra profile") + "\n",level=logging.ERROR, noiselevel=-1)
 +			writemsg_level(bad("!!! Please make sure that you did follow the instructions and included the extra profile\n"),level=logging.ERROR, noiselevel=-1)
 +			writemsg_level(bad("!!! http://git.overlays.gentoo.org/gitweb/?p=proj/multilib-portage.git;a=blob;f=doc/portage-multilib-instructions\n"),level=logging.ERROR, noiselevel=-1)
 +			writemsg_level(bad("!!! has some basic instructions for the setup\n"),level=logging.ERROR, noiselevel=-1)
 +			return 1
 +
- 	if myaction == 'version':
+ 	for fmt in emerge_config.target_config.settings["PORTAGE_BINPKG_FORMAT"].split():
+ 		if not fmt in portage.const.SUPPORTED_BINPKG_FORMATS:
+ 			if "--pkg-format" in emerge_config.opts:
+ 				problematic="--pkg-format"
+ 			else:
+ 				problematic="PORTAGE_BINPKG_FORMAT"
+ 
+ 			writemsg_level(("emerge: %s is not set correctly. Format " + \
+ 				"'%s' is not supported.\n") % (problematic, fmt),
+ 				level=logging.ERROR, noiselevel=-1)
+ 			return 1
+ 
+ 	if emerge_config.action == 'version':
  		writemsg_stdout(getportageversion(
- 			settings["PORTDIR"], None,
- 			settings.profile_path, settings["CHOST"],
- 			trees[settings['EROOT']]['vartree'].dbapi) + '\n', noiselevel=-1)
+ 			emerge_config.target_config.settings["PORTDIR"],
+ 			None,
+ 			emerge_config.target_config.settings.profile_path,
+ 			emerge_config.target_config.settings["CHOST"],
+ 			emerge_config.target_config.trees['vartree'].dbapi) + '\n',
+ 			noiselevel=-1)
  		return 0
- 	elif myaction == 'help':
+ 	elif emerge_config.action == 'help':
  		emerge_help()
  		return 0
  


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2013-08-18 20:55 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2013-08-18 20:55 UTC (permalink / raw
  To: gentoo-commits

commit:     2efeb36f8e3fff17de8230d84081bf6b8a733ea2
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sun Aug 18 20:55:28 2013 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun Aug 18 20:55:28 2013 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=2efeb36f

Merge tag 'v2.2.0' into multilib


 bin/egencache                          | 15 ++++++--
 bin/repoman                            | 30 +++++++++++++--
 man/emerge.1                           |  6 +--
 man/make.conf.5                        | 15 ++++++--
 man/portage.5                          | 13 +++++--
 man/repoman.1                          |  7 ++++
 man/ru/ebuild.1                        |  4 +-
 pym/_emerge/actions.py                 | 12 ++++--
 pym/_emerge/depgraph.py                |  3 +-
 pym/portage/__init__.py                | 18 ---------
 pym/portage/_emirrordist/main.py       | 15 ++++++--
 pym/portage/cache/fs_template.py       |  5 ++-
 pym/portage/const.py                   |  2 -
 pym/portage/data.py                    |  2 +-
 pym/portage/dbapi/bintree.py           | 14 ++++++-
 pym/portage/dbapi/vartree.py           |  4 +-
 pym/portage/locks.py                   |  7 +++-
 pym/portage/package/ebuild/config.py   |  9 +++--
 pym/portage/package/ebuild/doebuild.py |  6 ++-
 pym/portage/process.py                 |  6 ++-
 pym/portage/repository/config.py       |  2 +
 pym/portage/util/__init__.py           |  4 ++
 pym/portage/util/_desktop_entry.py     | 13 +++++++
 pym/repoman/checks.py                  | 67 +++++++++++++++++++---------------
 pym/repoman/errors.py                  |  2 +-
 25 files changed, 188 insertions(+), 93 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2013-08-25 19:50 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2013-08-25 19:50 UTC (permalink / raw
  To: gentoo-commits

commit:     af379d621327813e4a3e41af885c0d13c42999ac
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sun Aug 25 19:50:00 2013 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun Aug 25 19:50:00 2013 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=af379d62

Merge v2.2.1


 NEWS                                               |  5 ++
 bin/archive-conf                                   | 26 +------
 bin/ebuild-helpers/doins                           |  1 +
 bin/repoman                                        | 17 ++++-
 man/make.conf.5                                    | 12 +++
 man/repoman.1                                      |  5 +-
 pym/_emerge/AbstractEbuildProcess.py               | 39 ++++++++++
 pym/_emerge/SpawnProcess.py                        | 38 +++++++++-
 pym/portage/const.py                               |  8 +-
 pym/portage/dep/dep_check.py                       | 31 +++++---
 pym/portage/package/ebuild/doebuild.py             | 32 +++++++-
 pym/portage/process.py                             | 80 ++++++++++++++++++--
 .../tests/resolver/test_autounmask_multilib_use.py | 85 ++++++++++++++++++++++
 pym/portage/tests/resolver/test_or_choices.py      | 55 ++++++++++++++
 pym/portage/util/_desktop_entry.py                 |  7 +-
 15 files changed, 391 insertions(+), 50 deletions(-)

diff --cc pym/portage/const.py
index 38741f8,214ede4..b6aac96
--- a/pym/portage/const.py
+++ b/pym/portage/const.py
@@@ -102,10 -101,12 +102,12 @@@ SUPPORTED_FEATURES       = frozenset(
                             "compress-index", "config-protect-if-modified",
                             "digest", "distcc", "distcc-pump", "distlocks",
                             "downgrade-backup", "ebuild-locks", "fakeroot",
 -                           "fail-clean", "force-mirror", "force-prefix", "getbinpkg",
 +                           "fail-clean", "force-mirror", "force-multilib", "force-prefix", "getbinpkg",
-                            "installsources", "keeptemp", "keepwork", "fixlafiles", "lmirror",
+                            "installsources", "ipc-sandbox",
+                            "keeptemp", "keepwork", "fixlafiles", "lmirror",
                             "merge-sync",
-                            "metadata-transfer", "mirror", "multilib-strict", "news",
+                            "metadata-transfer", "mirror", "multilib-strict",
+                            "network-sandbox", "news",
                             "noauto", "noclean", "nodoc", "noinfo", "noman",
                             "nostrip", "notitles", "parallel-fetch", "parallel-install",
                             "prelink-checksums", "preserve-libs",


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2013-09-10 16:53 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2013-09-10 16:53 UTC (permalink / raw
  To: gentoo-commits

commit:     ccdd40c3588b47a3048ec51c2bc0eb28f9023930
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Tue Sep 10 16:52:40 2013 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Tue Sep 10 16:52:40 2013 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=ccdd40c3

Merge tag 'v2.2.2' into multilib


 bin/dohtml.py                              |  46 ++++++++++--
 bin/eapi.sh                                |   4 +
 bin/ebuild-helpers/doexe                   |   3 +-
 bin/ebuild-helpers/doins                   |   2 +-
 bin/ebuild-helpers/keepdir                 |  20 +++++
 bin/ebuild-helpers/newins                  |  10 +--
 bin/ebuild-helpers/unprivileged/chown      |  10 ++-
 bin/ebuild.sh                              |   2 +-
 bin/install.py                             |   5 ++
 bin/phase-helpers.sh                       | 116 +++++++++++++++++++++--------
 bin/save-ebuild-env.sh                     |   2 +-
 doc/package/ebuild/eapi/4-python.docbook   |   1 -
 doc/package/ebuild/eapi/5-progress.docbook |   1 -
 pym/_emerge/AsynchronousLock.py            |  21 +++---
 pym/_emerge/EbuildMetadataPhase.py         |  20 ++---
 pym/_emerge/FakeVartree.py                 |  11 ++-
 pym/_emerge/FifoIpcDaemon.py               |  16 ++--
 pym/_emerge/PipeReader.py                  |  25 ++++---
 pym/_emerge/SpawnProcess.py                |  30 +++++---
 pym/_emerge/SubProcess.py                  |  19 ++++-
 pym/_emerge/actions.py                     |  63 ++++++++++++----
 pym/portage/dbapi/_MergeProcess.py         |  21 +++---
 pym/portage/locks.py                       |  16 ++--
 pym/portage/package/ebuild/doebuild.py     |  19 +++++
 pym/portage/process.py                     |  40 +++++++++-
 pym/portage/repository/config.py           |   2 +-
 pym/portage/tests/process/test_poll.py     |  36 ++++-----
 pym/portage/util/__init__.py               |  43 +++++++----
 pym/portage/util/_async/PipeLogger.py      |  21 +++---
 pym/portage/util/_eventloop/EventLoop.py   |  29 +++++---
 pym/portage/util/movefile.py               |  14 +++-
 31 files changed, 475 insertions(+), 193 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2013-09-15 11:06 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2013-09-15 11:06 UTC (permalink / raw
  To: gentoo-commits

commit:     b8889dd3884d43f911ff0d7faffa1fd836ad28b0
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sun Sep 15 11:06:10 2013 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun Sep 15 11:06:10 2013 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=b8889dd3

Merge tag 'v2.2.4' into multilib


 bin/dohtml.py                              | 5 +++--
 bin/eapi.sh                                | 2 +-
 doc/package/ebuild/eapi/5-progress.docbook | 6 ++++++
 pym/portage/util/_ctypes.py                | 2 +-
 4 files changed, 11 insertions(+), 4 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2013-09-15 11:39 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2013-09-15 11:39 UTC (permalink / raw
  To: gentoo-commits

commit:     64e7d296a0dc87d73bcc9d28b09dae71769e2aa1
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sun Sep 15 11:39:10 2013 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun Sep 15 11:39:10 2013 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=64e7d296

Merge tag 'v2.2.5' into multilib


 bin/misc-functions.sh            |  1 +
 pym/portage/repository/config.py | 15 ++++++++++-----
 pym/portage/util/movefile.py     | 15 +++++++--------
 3 files changed, 18 insertions(+), 13 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2013-09-15 20:54 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2013-09-15 20:54 UTC (permalink / raw
  To: gentoo-commits

commit:     5e951e83a79c1e7e6ae64d60f768b4b46e4c6f9e
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sun Sep 15 20:54:25 2013 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun Sep 15 20:54:25 2013 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=5e951e83

Merge tag 'v2.2.6' into multilib


 pym/portage/repository/config.py | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2014-06-02 20:00 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2014-06-02 20:00 UTC (permalink / raw
  To: gentoo-commits

commit:     aa18688b2ff79a1d2c6b2036a3beb79781363051
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Mon Jun  2 19:59:31 2014 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Mon Jun  2 19:59:31 2014 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=aa18688b

Merge v2.2.10


 doc/fragment/date => .portage_not_installed        |    0
 DEVELOPING                                         |   32 +-
 README                                             |   49 +
 RELEASE-NOTES                                      |   28 +-
 bin/archive-conf                                   |    4 +-
 bin/binhost-snapshot                               |    6 +-
 bin/check-implicit-pointer-usage.py                |    2 +-
 bin/chpathtool.py                                  |   65 +-
 bin/clean_locks                                    |   10 +-
 bin/dispatch-conf                                  |    4 +-
 bin/dohtml.py                                      |    4 +-
 bin/ebuild                                         |   10 +-
 bin/ebuild-helpers/prepstrip                       |   15 +-
 bin/ebuild-ipc.py                                  |    6 +-
 bin/ebuild.sh                                      |    2 +-
 bin/egencache                                      |  142 +--
 bin/emaint                                         |    8 +-
 bin/emerge                                         |    8 +-
 bin/emerge-webrsync                                |    6 +-
 bin/emirrordist                                    |    4 +-
 bin/env-update                                     |    4 +-
 bin/filter-bash-environment.py                     |    4 +-
 bin/fixpackages                                    |    4 +-
 bin/glsa-check                                     |    6 +-
 bin/helper-functions.sh                            |   57 +-
 bin/install.py                                     |    6 +-
 bin/isolated-functions.sh                          |   13 +-
 bin/lock-helper.py                                 |    4 +-
 bin/misc-functions.sh                              |   22 +-
 bin/phase-functions.sh                             |    4 +-
 bin/phase-helpers.sh                               |   19 +-
 bin/portageq                                       |   62 +-
 bin/quickpkg                                       |    4 +-
 bin/regenworld                                     |    4 +-
 bin/repoman                                        |  300 +++---
 bin/save-ebuild-env.sh                             |    7 +-
 bin/xattr-helper.py                                |  116 ++-
 bin/xpak-helper.py                                 |    4 +-
 cnf/sets/portage.conf                              |    2 +-
 doc/config/sets.docbook                            |    5 +-
 man/ebuild.5                                       |   30 +-
 man/emerge.1                                       |   31 +-
 man/make.conf.5                                    |   30 +-
 man/portage.5                                      |  134 ++-
 man/ru/ebuild.1                                    |   16 +-
 misc/emerge-delta-webrsync                         |    4 +-
 mkrelease.sh                                       |   89 +-
 pym/_emerge/Binpkg.py                              |    1 +
 pym/_emerge/BinpkgExtractorAsync.py                |   15 +-
 pym/_emerge/BlockerCache.py                        |    6 +-
 pym/_emerge/EbuildExecuter.py                      |   11 +-
 pym/_emerge/MergeListItem.py                       |   14 +-
 pym/_emerge/Package.py                             |    5 +-
 pym/_emerge/Scheduler.py                           |    7 +-
 pym/_emerge/SpawnProcess.py                        |    8 +-
 pym/_emerge/actions.py                             |   31 +-
 pym/_emerge/countdown.py                           |   18 +-
 pym/_emerge/create_depgraph_params.py              |    3 +-
 pym/_emerge/depgraph.py                            | 1067 ++++++++++++++------
 pym/_emerge/help.py                                |    4 +-
 pym/_emerge/main.py                                |   17 +-
 pym/_emerge/resolver/output.py                     |  109 +-
 pym/_emerge/resolver/output_helpers.py             |    7 +-
 pym/_emerge/resolver/package_tracker.py            |  301 ++++++
 pym/_emerge/resolver/slot_collision.py             |  149 ++-
 pym/_emerge/unmerge.py                             |    5 +-
 pym/portage/__init__.py                            |   20 +-
 pym/portage/_emirrordist/MirrorDistTask.py         |    3 +-
 pym/portage/_emirrordist/main.py                   |   20 +-
 pym/portage/_global_updates.py                     |  224 ++--
 pym/portage/_selinux.py                            |    4 +-
 pym/portage/_sets/__init__.py                      |    2 +-
 pym/portage/_sets/base.py                          |    3 +-
 pym/portage/cache/flat_hash.py                     |    3 +-
 pym/portage/cache/fs_template.py                   |    3 +-
 pym/portage/cache/metadata.py                      |    3 +-
 pym/portage/cache/sqlite.py                        |    3 +-
 pym/portage/cache/template.py                      |    3 +-
 pym/portage/checksum.py                            |   12 +-
 pym/portage/const.py                               |  169 +++-
 pym/portage/cvstree.py                             |  274 ++---
 pym/portage/data.py                                |   15 +-
 pym/portage/dbapi/bintree.py                       |   15 +-
 pym/portage/dbapi/porttree.py                      |    9 +-
 pym/portage/dbapi/vartree.py                       |   54 +-
 pym/portage/debug.py                               |   10 +-
 pym/portage/dep/__init__.py                        |    3 +-
 pym/portage/dispatch_conf.py                       |  334 +++---
 pym/portage/eclass_cache.py                        |   14 +-
 pym/portage/elog/__init__.py                       |    3 +-
 pym/portage/elog/mod_echo.py                       |    3 +-
 pym/portage/elog/mod_syslog.py                     |   13 +-
 pym/portage/emaint/main.py                         |   23 +-
 pym/portage/emaint/module.py                       |    8 +-
 pym/portage/emaint/modules/binhost/binhost.py      |    4 +-
 pym/portage/env/loaders.py                         |   26 +-
 pym/portage/exception.py                           |   54 +-
 pym/portage/getbinpkg.py                           |  172 ++--
 pym/portage/glsa.py                                |    4 +-
 pym/portage/localization.py                        |    7 +-
 pym/portage/locks.py                               |   44 +-
 pym/portage/mail.py                                |    7 +-
 pym/portage/manifest.py                            |    3 +-
 pym/portage/output.py                              |   32 +-
 .../package/ebuild/_config/LocationsManager.py     |    4 +-
 pym/portage/package/ebuild/_config/MaskManager.py  |    4 +-
 pym/portage/package/ebuild/_config/UseManager.py   |    2 +-
 pym/portage/package/ebuild/config.py               |   18 +-
 pym/portage/package/ebuild/fetch.py                |    7 +-
 pym/portage/package/ebuild/getmaskingreason.py     |    2 +-
 pym/portage/package/ebuild/getmaskingstatus.py     |    3 +-
 pym/portage/process.py                             |    7 +-
 pym/portage/proxy/lazyimport.py                    |    3 +-
 pym/portage/repository/config.py                   |   35 +-
 pym/portage/tests/__init__.py                      |   54 +-
 pym/portage/tests/dbapi/test_portdb_cache.py       |   12 +-
 pym/portage/tests/dep/test_match_from_list.py      |    3 +-
 pym/portage/tests/ebuild/test_config.py            |    5 +-
 pym/portage/tests/emerge/test_emerge_slot_abi.py   |    6 +-
 pym/portage/tests/emerge/test_simple.py            |   23 +-
 pym/portage/tests/lint/test_compile_modules.py     |   22 +-
 pym/portage/tests/repoman/test_simple.py           |    7 +-
 pym/portage/tests/resolver/ResolverPlayground.py   |  113 +--
 pym/portage/tests/resolver/test_backtracking.py    |   13 +-
 pym/portage/tests/resolver/test_blocker.py         |   48 +
 pym/portage/tests/resolver/test_multirepo.py       |   84 +-
 pym/portage/tests/resolver/test_onlydeps.py        |   34 +
 pym/portage/tests/resolver/test_package_tracker.py |  261 +++++
 pym/portage/tests/resolver/test_slot_collisions.py |  106 +-
 .../tests/resolver/test_slot_conflict_rebuild.py   |  303 +++++-
 pym/portage/tests/resolver/test_useflags.py        |   78 ++
 pym/portage/tests/runTests                         |    4 +-
 pym/portage/tests/unicode/test_string_format.py    |    3 +-
 pym/portage/tests/util/test_getconfig.py           |   27 +-
 pym/portage/tests/util/test_whirlpool.py           |    4 +-
 pym/portage/update.py                              |    3 +-
 pym/portage/util/ExtractKernelVersion.py           |    6 +-
 pym/portage/util/SlotObject.py                     |    1 -
 pym/portage/util/__init__.py                       |  123 +--
 .../util/_dyn_libs/PreservedLibsRegistry.py        |    3 +-
 pym/portage/util/_info_files.py                    |   20 +-
 pym/portage/util/_urlopen.py                       |    5 +-
 pym/portage/util/digraph.py                        |   36 +-
 pym/portage/util/env_update.py                     |   11 +-
 pym/portage/util/lafilefixer.py                    |   10 +-
 pym/portage/util/movefile.py                       |   34 +-
 pym/portage/util/writeable_check.py                |   79 ++
 pym/portage/versions.py                            |   14 +-
 pym/portage/xpak.py                                |    8 +-
 pym/repoman/checks.py                              |   33 +-
 pym/repoman/utilities.py                           |   44 +
 runtests.sh                                        |   17 +-
 tabcheck.py                                        |    2 +-
 153 files changed, 4585 insertions(+), 1926 deletions(-)

diff --cc pym/portage/const.py
index b6aac96,1785bff..d71bbf2
--- a/pym/portage/const.py
+++ b/pym/portage/const.py
@@@ -83,42 -84,117 +84,119 @@@ CVS_PACKAGE_ATOM         = "dev-vcs/cvs
  GIT_PACKAGE_ATOM         = "dev-vcs/git"
  RSYNC_PACKAGE_ATOM       = "net-misc/rsync"
  
- INCREMENTALS             = ("USE", "USE_EXPAND", "USE_EXPAND_HIDDEN",
-                            "FEATURES", "ACCEPT_KEYWORDS",
-                            "CONFIG_PROTECT_MASK", "CONFIG_PROTECT",
-                            "IUSE_IMPLICIT",
-                            "PRELINK_PATH", "PRELINK_PATH_MASK",
-                            "PROFILE_ONLY_VARIABLES",
-                            "USE_EXPAND_IMPLICIT", "USE_EXPAND_UNPREFIXED",
-                            "NO_AUTO_FLAG", "RESTRICT_MULTILIB_BINARIES")
- EBUILD_PHASES            = ("pretend", "setup", "unpack", "prepare", "configure",
-                            "compile", "test", "install",
-                            "package", "preinst", "postinst","prerm", "postrm",
-                            "nofetch", "config", "info", "other")
+ INCREMENTALS             = (
+ 	"ACCEPT_KEYWORDS",
+ 	"CONFIG_PROTECT",
+ 	"CONFIG_PROTECT_MASK",
+ 	"FEATURES",
+ 	"IUSE_IMPLICIT",
+ 	"PRELINK_PATH",
+ 	"PRELINK_PATH_MASK",
+ 	"PROFILE_ONLY_VARIABLES",
+ 	"USE",
+ 	"USE_EXPAND",
+ 	"USE_EXPAND_HIDDEN",
+ 	"USE_EXPAND_IMPLICIT",
+ 	"USE_EXPAND_UNPREFIXED",
++	"NO_AUTO_FLAG", "RESTRICT_MULTILIB_BINARIES"
+ )
+ EBUILD_PHASES            = (
+ 	"pretend",
+ 	"setup",
+ 	"unpack",
+ 	"prepare",
+ 	"configure",
+ 	"compile",
+ 	"test",
+ 	"install",
+ 	"package",
+ 	"preinst",
+ 	"postinst",
+ 	"prerm",
+ 	"postrm",
+ 	"nofetch",
+ 	"config",
+ 	"info",
+ 	"other",
+ )
  SUPPORTED_FEATURES       = frozenset([
-                            "assume-digests", "binpkg-logs", "buildpkg", "buildsyspkg", "candy",
-                            "ccache", "cgroup", "chflags", "clean-logs",
-                            "collision-protect", "compress-build-logs", "compressdebug",
-                            "compress-index", "config-protect-if-modified",
-                            "digest", "distcc", "distcc-pump", "distlocks",
-                            "downgrade-backup", "ebuild-locks", "fakeroot",
-                            "fail-clean", "force-mirror", "force-multilib", "force-prefix", "getbinpkg",
-                            "installsources", "ipc-sandbox",
-                            "keeptemp", "keepwork", "fixlafiles", "lmirror",
-                            "merge-sync",
-                            "metadata-transfer", "mirror", "multilib-strict",
-                            "network-sandbox", "news",
-                            "noauto", "noclean", "nodoc", "noinfo", "noman",
-                            "nostrip", "notitles", "parallel-fetch", "parallel-install",
-                            "prelink-checksums", "preserve-libs",
-                            "protect-owned", "python-trace", "sandbox",
-                            "selinux", "sesandbox", "sfperms",
-                            "sign", "skiprocheck", "split-elog", "split-log", "splitdebug",
-                            "strict", "stricter", "suidctl", "test", "test-fail-continue",
-                            "unknown-features-filter", "unknown-features-warn",
-                            "unmerge-backup",
-                            "unmerge-logs", "unmerge-orphans", "userfetch", "userpriv",
-                            "usersandbox", "usersync", "webrsync-gpg", "xattr"])
+ 	"assume-digests",
+ 	"binpkg-logs",
+ 	"buildpkg",
+ 	"buildsyspkg",
+ 	"candy",
+ 	"ccache",
+ 	"cgroup",
+ 	"chflags",
+ 	"clean-logs",
+ 	"collision-protect",
+ 	"compress-build-logs",
+ 	"compressdebug",
+ 	"compress-index",
+ 	"config-protect-if-modified",
+ 	"digest",
+ 	"distcc",
+ 	"distcc-pump",
+ 	"distlocks",
+ 	"downgrade-backup",
+ 	"ebuild-locks",
+ 	"fail-clean",
+ 	"fakeroot",
+ 	"fixlafiles",
+ 	"force-mirror",
++	"force-multilib",
+ 	"force-prefix",
+ 	"getbinpkg",
+ 	"installsources",
+ 	"ipc-sandbox",
+ 	"keeptemp",
+ 	"keepwork",
+ 	"lmirror",
+ 	"merge-sync",
+ 	"metadata-transfer",
+ 	"mirror",
+ 	"multilib-strict",
+ 	"network-sandbox",
+ 	"news",
+ 	"noauto",
+ 	"noclean",
+ 	"nodoc",
+ 	"noinfo",
+ 	"noman",
+ 	"nostrip",
+ 	"notitles",
+ 	"parallel-fetch",
+ 	"parallel-install",
+ 	"prelink-checksums",
+ 	"preserve-libs",
+ 	"protect-owned",
+ 	"python-trace",
+ 	"sandbox",
+ 	"selinux",
+ 	"sesandbox",
+ 	"sfperms",
+ 	"sign",
+ 	"skiprocheck",
+ 	"splitdebug",
+ 	"split-elog",
+ 	"split-log",
+ 	"strict",
+ 	"stricter",
+ 	"suidctl",
+ 	"test",
+ 	"test-fail-continue",
+ 	"unknown-features-filter",
+ 	"unknown-features-warn",
+ 	"unmerge-backup",
+ 	"unmerge-logs",
+ 	"unmerge-orphans",
+ 	"userfetch",
+ 	"userpriv",
+ 	"usersandbox",
+ 	"usersync",
+ 	"webrsync-gpg",
+ 	"xattr",
+ ])
  
  EAPI                     = 5
  


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2014-12-12 20:23 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2014-12-12 20:23 UTC (permalink / raw
  To: gentoo-commits

commit:     07ca37d0205f4938d99d387f082d46b9e67e5fb4
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Fri Dec 12 20:21:32 2014 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Fri Dec 12 20:21:32 2014 +0000
URL:        http://sources.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=07ca37d0

Merge tag 'v2.2.14' into multilib


 NEWS                                               |   9 +
 RELEASE-NOTES                                      |  36 +
 bin/archive-conf                                   |   4 +-
 bin/binhost-snapshot                               |   4 +-
 bin/chpathtool.py                                  |   8 +-
 bin/clean_locks                                    |   4 +-
 bin/deprecated-path                                |  28 +
 bin/dispatch-conf                                  |   4 +-
 bin/ebuild                                         |   4 +-
 bin/ebuild-helpers/portageq                        |  20 +-
 bin/ebuild-ipc.py                                  |  84 +-
 bin/ebuild.sh                                      | 131 +--
 bin/egencache                                      |   4 +-
 bin/emaint                                         |   4 +-
 bin/emerge                                         |   5 +-
 bin/emerge-webrsync                                |   4 +-
 bin/env-update                                     |   4 +-
 bin/fixpackages                                    |   4 +-
 bin/glsa-check                                     |   4 +-
 bin/install-qa-check.d/05double-D                  |  17 +
 bin/install-qa-check.d/05prefix                    | 117 +++
 bin/install-qa-check.d/10executable-issues         | 140 +++
 bin/install-qa-check.d/10ignored-flags             |  99 +++
 bin/install-qa-check.d/20deprecated-directories    |  18 +
 bin/install-qa-check.d/20runtime-directories       |  26 +
 bin/install-qa-check.d/60bash-completion           | 130 +++
 bin/install-qa-check.d/60openrc                    |  41 +
 bin/install-qa-check.d/60pkgconfig                 |  15 +
 bin/install-qa-check.d/60pngfix                    |  35 +
 bin/install-qa-check.d/60systemd                   |  25 +
 bin/install-qa-check.d/60udev                      |  21 +
 bin/install-qa-check.d/80libraries                 | 158 ++++
 bin/install-qa-check.d/80multilib-strict           |  50 ++
 bin/install-qa-check.d/90gcc-warnings              | 168 ++++
 bin/install-qa-check.d/90world-writable            |  25 +
 bin/misc-functions.sh                              | 948 +--------------------
 bin/phase-functions.sh                             |   6 +
 bin/phase-helpers.sh                               |   4 +
 bin/portageq                                       | 347 +++++---
 bin/quickpkg                                       |   4 +-
 bin/regenworld                                     |   4 +-
 bin/repoman                                        |   4 +-
 bin/xattr-helper.py                                |   6 +-
 man/emerge.1                                       |  10 +-
 misc/emerge-delta-webrsync                         |   6 +-
 pym/_emerge/actions.py                             |  17 +-
 pym/_emerge/depgraph.py                            | 134 ++-
 pym/_emerge/main.py                                |  15 +-
 pym/_emerge/post_emerge.py                         |   5 +-
 pym/portage/dbapi/vartree.py                       |  42 +-
 pym/portage/emaint/modules/binhost/__init__.py     |   8 +-
 pym/portage/emaint/modules/config/__init__.py      |   8 +-
 pym/portage/emaint/modules/logs/__init__.py        |   8 +-
 pym/portage/emaint/modules/merges/__init__.py      |   7 +-
 pym/portage/emaint/modules/move/__init__.py        |   8 +-
 pym/portage/emaint/modules/resume/__init__.py      |   6 +-
 pym/portage/emaint/modules/world/__init__.py       |   8 +-
 pym/portage/tests/__init__.py                      |   4 +-
 pym/portage/tests/emerge/test_simple.py            |  29 +-
 pym/portage/tests/resolver/ResolverPlayground.py   |  30 +-
 ...uild.py => test_slot_conflict_force_rebuild.py} |  24 +-
 ...build.py => test_slot_operator_required_use.py} |  40 +-
 ...test_solve_non_slot_operator_slot_conflicts.py} |  45 +-
 setup.py                                           |  41 +-
 testpath                                           |  11 +
 65 files changed, 1942 insertions(+), 1337 deletions(-)

diff --cc bin/misc-functions.sh
index e8e9d4e,cc652a9..416e2bf
--- a/bin/misc-functions.sh
+++ b/bin/misc-functions.sh
@@@ -170,66 -168,34 +170,35 @@@ install_qa_check() 
  		local EPREFIX= ED=${D}
  	fi
  
 +	[[ -d "${ED}" ]] || return 0
  	cd "${ED}" || die "cd failed"
  
- 	qa_var="QA_FLAGS_IGNORED_${ARCH/-/_}"
- 	eval "[[ -n \${!qa_var} ]] && QA_FLAGS_IGNORED=(\"\${${qa_var}[@]}\")"
- 	if [[ ${#QA_FLAGS_IGNORED[@]} -eq 1 ]] ; then
- 		local shopts=$-
- 		set -o noglob
- 		QA_FLAGS_IGNORED=(${QA_FLAGS_IGNORED})
- 		set +o noglob
- 		set -${shopts}
- 	fi
+ 	# 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"
+ 		)
+ 	done
  
- 	# Check for files built without respecting *FLAGS. Note that
- 	# -frecord-gcc-switches must be in all *FLAGS variables, in
- 	# order to avoid false positive results here.
- 	# NOTE: This check must execute before prepall/prepstrip, since
- 	# prepstrip strips the .GCC.command.line sections.
- 	if type -P scanelf > /dev/null && ! has binchecks ${RESTRICT} && \
- 		[[ "${CFLAGS}" == *-frecord-gcc-switches* ]] && \
- 		[[ "${CXXFLAGS}" == *-frecord-gcc-switches* ]] && \
- 		[[ "${FFLAGS}" == *-frecord-gcc-switches* ]] && \
- 		[[ "${FCFLAGS}" == *-frecord-gcc-switches* ]] ; then
- 		rm -f "${T}"/scanelf-ignored-CFLAGS.log
- 		for x in $(scanelf -qyRF '#k%p' -k '!.GCC.command.line' "${ED}") ; do
- 			# Separate out file types that are known to support
- 			# .GCC.command.line sections, using the `file` command
- 			# similar to how prepstrip uses it.
- 			f=$(file "${x}") || continue
- 			[[ -z ${f} ]] && continue
- 			if [[ ${f} == *"SB executable"* ||
- 				${f} == *"SB shared object"* ]] ; then
- 				echo "${x}" >> "${T}"/scanelf-ignored-CFLAGS.log
+ 	# Run QA checks from repositories
+ 	# (yes, PORTAGE_ECLASS_LOCATIONS contains repo paths...)
+ 	local repo_location
+ 	for repo_location in "${PORTAGE_ECLASS_LOCATIONS[@]}"; do
+ 		for f in "${repo_location}"/metadata/install-qa-check.d/*; do
+ 			if [[ -f ${f} ]]; then
+ 				(
+ 					# allow inheriting eclasses
+ 					_IN_INSTALL_QA_CHECK=1
+ 					source "${f}" || eerror "Post-install QA check ${f##*/} failed to run"
+ 				)
  			fi
  		done
- 
- 		if [[ -f "${T}"/scanelf-ignored-CFLAGS.log ]] ; then
- 
- 			if [ "${QA_STRICT_FLAGS_IGNORED-unset}" = unset ] ; then
- 				for x in "${QA_FLAGS_IGNORED[@]}" ; do
- 					sed -e "s#^${x#/}\$##" -i "${T}"/scanelf-ignored-CFLAGS.log
- 				done
- 			fi
- 			# Filter anything under /usr/lib/debug/ in order to avoid
- 			# duplicate warnings for splitdebug files.
- 			sed -e "s#^usr/lib/debug/.*##" -e "/^\$/d" -e "s#^#/#" \
- 				-i "${T}"/scanelf-ignored-CFLAGS.log
- 			f=$(<"${T}"/scanelf-ignored-CFLAGS.log)
- 			if [[ -n ${f} ]] ; then
- 				__vecho -ne '\n'
- 				eqawarn "${BAD}QA Notice: Files built without respecting CFLAGS have been detected${NORMAL}"
- 				eqawarn " Please include the following list of files in your report:"
- 				eqawarn "${f}"
- 				__vecho -ne '\n'
- 				sleep 1
- 			else
- 				rm -f "${T}"/scanelf-ignored-CFLAGS.log
- 			fi
- 		fi
- 	fi
+ 	done
  
  	export STRIP_MASK
  	prepall


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2014-12-12 20:23 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2014-12-12 20:23 UTC (permalink / raw
  To: gentoo-commits

commit:     5552a997355cd5937c62f5b155ab878dd94894d3
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Fri Dec 12 20:20:54 2014 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Fri Dec 12 20:20:54 2014 +0000
URL:        http://sources.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=5552a997

Merge tag 'v2.2.13' into multilib


 .gitignore                                         |   1 +
 .travis.yml                                        |  13 +
 DEVELOPING                                         |  22 +-
 MANIFEST.in                                        |  18 +
 Makefile                                           | 215 -------
 NEWS                                               |  12 +-
 RELEASE-NOTES                                      |  27 +
 bin/misc-functions.sh                              | 126 +++-
 bin/phase-functions.sh                             | 146 ++---
 bin/phase-helpers.sh                               |  28 +-
 bin/repoman                                        |  12 -
 bin/save-ebuild-env.sh                             |   2 +-
 cnf/sets/portage.conf                              |   5 +
 doc/Makefile                                       |  11 -
 doc/fragment/version                               |   1 -
 mkrelease.sh                                       | 141 -----
 pym/_emerge/Binpkg.py                              |   7 +-
 pym/_emerge/EbuildBuild.py                         |   6 +-
 pym/_emerge/FakeVartree.py                         |   4 +-
 pym/_emerge/MiscFunctionsProcess.py                |   6 +-
 pym/_emerge/actions.py                             |   4 +-
 pym/_emerge/depgraph.py                            | 207 +++++--
 pym/_emerge/resolver/output_helpers.py             |   2 +-
 pym/_emerge/resolver/package_tracker.py            |   2 +-
 pym/portage/__init__.py                            |  16 +-
 pym/portage/_global_updates.py                     |   4 +-
 pym/portage/_sets/dbapi.py                         |  81 ++-
 pym/portage/const.py                               |   9 +-
 pym/portage/dbapi/vartree.py                       |   5 +-
 pym/portage/dep/_slot_operator.py                  |  27 +-
 pym/portage/dep/dep_check.py                       |  20 +-
 pym/portage/emaint/modules/merges/merges.py        |   8 +-
 pym/portage/emaint/modules/move/move.py            |   5 +-
 pym/portage/mail.py                                |  12 +-
 pym/portage/news.py                                |   8 +-
 pym/portage/package/ebuild/config.py               |   4 +
 pym/portage/package/ebuild/doebuild.py             |   8 +-
 pym/portage/tests/__init__.py                      |  24 +-
 .../date => pym/portage/tests/bin/__test__.py      |   0
 .../tests/{bin/__test__ => dbapi/__test__.py}      |   0
 pym/portage/tests/dbapi/test_portdb_cache.py       |  23 +-
 .../tests/{dbapi/__test__ => dep/__test__.py}      |   0
 .../tests/{dep/__test__ => ebuild/__test__.py}     |   0
 pym/portage/tests/ebuild/test_config.py            |  71 ++-
 .../tests/{ebuild/__test__ => emerge/__test__.py}  |   0
 pym/portage/tests/emerge/test_emerge_slot_abi.py   |   7 +-
 pym/portage/tests/emerge/test_simple.py            |  26 +-
 .../tests/{emerge/__test__ => env/__test__.py}     |   0
 .../tests/env/{__test__ => config/__test__.py}     |   0
 .../{env/config/__test__ => glsa/__test__.py}      |   0
 pym/portage/tests/glsa/test_security_set.py        |   3 +-
 .../{glsa/__test__ => lafilefixer/__test__.py}     |   0
 .../__test__ => lazyimport/__test__.py}            |   0
 .../{lazyimport/__test__ => lint/__test__.py}      |   0
 pym/portage/tests/lint/test_compile_modules.py     |  10 +-
 pym/portage/tests/lint/test_import_modules.py      |   8 +-
 .../tests/{lint/__test__ => locks/__test__.py}     |   0
 .../tests/{locks/__test__ => news/__test__.py}     |   0
 .../tests/{news/__test__ => process/__test__.py}   |   0
 .../{process/__test__ => repoman/__test__.py}      |   0
 pym/portage/tests/repoman/test_simple.py           |   8 +-
 pym/portage/tests/resolver/ResolverPlayground.py   |  35 +-
 .../{repoman/__test__ => resolver/__test__.py}     |   0
 .../tests/resolver/test_autounmask_use_breakage.py |  63 ++
 pym/portage/tests/resolver/test_or_choices.py      |  73 +++
 .../test_slot_conflict_unsatisfied_deep_deps.py    | 115 ++++
 ...nsatisfied.py => test_slot_operator_rebuild.py} |  52 +-
 pym/portage/tests/{runTests => runTests.py}        |   0
 .../{resolver/__test__ => sets/base/__test__.py}   |   0
 .../sets/{base/__test__ => files/__test__.py}      |   0
 .../sets/{files/__test__ => shell/__test__.py}     |   0
 .../{sets/shell/__test__ => unicode/__test__.py}   |   0
 .../tests/{unicode/__test__ => update/__test__.py} |   0
 .../tests/{update/__test__ => util/__test__.py}    |   0
 pym/portage/tests/util/test_getconfig.py           |   4 +-
 .../tests/{util/__test__ => versions/__test__.py}  |   0
 pym/portage/tests/xpak/__test__                    |   0
 .../tests/{versions/__test__ => xpak/__test__.py}  |   0
 pym/repoman/checks.py                              |  16 -
 runtests.sh                                        |   8 +-
 setup.py                                           | 657 +++++++++++++++++++++
 81 files changed, 1758 insertions(+), 670 deletions(-)

diff --cc bin/phase-functions.sh
index 03b4c6f,9bc3eb5..73f9692
--- a/bin/phase-functions.sh
+++ b/bin/phase-functions.sh
@@@ -561,8 -472,7 +569,9 @@@ __dyn_test() 
  	fi
  
  	trap "__abort_test" SIGINT SIGQUIT
 -	__start_distcc
 +	for LOOP_ABI in $(get_abi_list); do
 +		[[ " ${FEATURES} " == *" force-multilib "* ]] && is_ebuild && { set_abi ${LOOP_ABI}; source "${T}"/environment || die ; }
++		__start_distcc
  
  	if [ -d "${S}" ]; then
  		cd "${S}"
@@@ -597,13 -499,11 +606,17 @@@
  		local save_sp=${SANDBOX_PREDICT}
  		addpredict /
  		__ebuild_phase pre_src_test
+ 
+ 		__vecho ">>> Test phase: ${CATEGORY}/${PF}"
  		__ebuild_phase src_test
 +
 +		if [[ " ${FEATURES} " == *" force-multilib "* ]]; then
 +			if is_auto-multilib && is_ebuild; then
 +				>> "$PORTAGE_BUILDDIR"/.tested."${LOOP_ABI}" || die "IO Failure -- Failed to 'touch .tested.${LOOP_ABI}'"
 +			fi
 +		fi
+ 		__vecho ">>> Completed testing ${CATEGORY}/${PF}"
+ 
  		>> "$PORTAGE_BUILDDIR/.tested" || \
  			die "Failed to create $PORTAGE_BUILDDIR/.tested"
  		__ebuild_phase post_src_test


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2014-12-12 20:23 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2014-12-12 20:23 UTC (permalink / raw
  To: gentoo-commits

commit:     6a8389a3a9f6af80bbb4108d5bb6f4b847b44577
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Fri Dec 12 20:22:45 2014 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Fri Dec 12 20:22:45 2014 +0000
URL:        http://sources.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=6a8389a3

Merge tag 'v2.2.15' into multilib

Portage-2.2.15 release


 RELEASE-NOTES                                      |  52 +++
 bin/bashrc-functions.sh                            |   7 +-
 bin/dispatch-conf                                  |  63 ++--
 bin/ebuild                                         |   6 +-
 bin/ebuild.sh                                      |  85 +++--
 bin/etc-update                                     | 164 +++++++++-
 bin/install-qa-check.d/05double-D                  |   9 +-
 bin/install-qa-check.d/90world-writable            |  27 +-
 bin/install.py                                     |   2 +-
 bin/isolated-functions.sh                          |  68 ++++
 bin/misc-functions.sh                              |  71 ++--
 bin/phase-functions.sh                             |   2 +-
 bin/portageq                                       |  14 +-
 bin/quickpkg                                       |   4 +-
 bin/save-ebuild-env.sh                             |   4 +-
 cnf/make.globals                                   |   3 +-
 man/ebuild.5                                       |   7 +-
 man/emerge.1                                       |  28 +-
 man/make.conf.5                                    |   6 +
 man/portage.5                                      |  30 +-
 pym/_emerge/Package.py                             |  18 +-
 pym/_emerge/actions.py                             | 103 +++++-
 pym/_emerge/create_depgraph_params.py              |   5 +
 pym/_emerge/depgraph.py                            | 232 ++++++++++---
 pym/_emerge/main.py                                |  13 +-
 pym/_emerge/sync/old_tree_timestamp.py             |   5 +-
 pym/_emerge/unmerge.py                             |  42 ++-
 pym/portage/__init__.py                            |  27 ++
 pym/portage/_global_updates.py                     |   4 +-
 pym/portage/_selinux.py                            |  14 +-
 pym/portage/cache/fs_template.py                   |  25 +-
 pym/portage/const.py                               |   2 +
 pym/portage/data.py                                | 134 ++++++--
 .../dbapi/_ContentsCaseSensitivityManager.py       |  93 ++++++
 pym/portage/dbapi/bintree.py                       |  28 ++
 pym/portage/dbapi/vartree.py                       | 361 ++++++++++++---------
 pym/portage/dep/dep_check.py                       |  53 ++-
 pym/portage/dispatch_conf.py                       | 157 +++++++--
 pym/portage/exception.py                           |   1 +
 pym/portage/locks.py                               |   9 +-
 pym/portage/news.py                                |   9 +-
 .../package/ebuild/_config/LocationsManager.py     |  11 +-
 .../package/ebuild/_config/special_env_vars.py     |   4 +-
 pym/portage/package/ebuild/config.py               | 110 +++++--
 pym/portage/package/ebuild/doebuild.py             |  24 +-
 pym/portage/package/ebuild/prepare_build_dirs.py   |   9 +-
 pym/portage/repository/config.py                   |   2 +-
 pym/portage/tests/__init__.py                      |   4 +-
 .../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/resolver/ResolverPlayground.py   |  10 +
 .../tests/resolver/test_onlydeps_circular.py       |  51 +++
 pym/portage/tests/resolver/test_or_choices.py      |  59 +++-
 ..._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/portage/update.py                              |   6 +-
 pym/portage/util/__init__.py                       |  49 ++-
 pym/portage/util/movefile.py                       |   2 +-
 pym/portage/util/path.py                           |  48 +++
 pym/portage/util/writeable_check.py                |   2 +-
 setup.py                                           |  25 +-
 63 files changed, 2524 insertions(+), 500 deletions(-)

diff --cc bin/misc-functions.sh
index 416e2bf,e08c228..22ab339
--- a/bin/misc-functions.sh
+++ b/bin/misc-functions.sh
@@@ -170,18 -168,21 +170,22 @@@ install_qa_check() 
  		local EPREFIX= ED=${D}
  	fi
  
 +	[[ -d "${ED}" ]] || return 0
  	cd "${ED}" || die "cd failed"
  
- 	# 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 pym/portage/package/ebuild/config.py
index a7e8bd6,59e239b..f9603e7
--- a/pym/portage/package/ebuild/config.py
+++ b/pym/portage/package/ebuild/config.py
@@@ -880,13 -915,8 +915,15 @@@ class config(object)
  			# initialize self.features
  			self.regenerate()
  
 +			if 'force-multilib' in self.features:
 +				#add multilib_abi internally to list of USE_EXPANDed vars
 +				self["USE_EXPAND"] = "MULTILIB_ABI" + " " + self.get("USE_EXPAND", "")
 +				self.backup_changes("USE_EXPAND")
 +				default_abi = self.configdict["defaults"].get('DEFAULT_ABI', '').strip()
 +				if default_abi:
 +					self.configdict["defaults"]["USE"] = self.configdict["defaults"].get("USE", "") + " multilib_abi_" + default_abi
+ 			if unprivileged:
+ 				self.features.add('unprivileged')
  
  			if bsd_chflags:
  				self.features.add('chflags')


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2014-12-12 20:23 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2014-12-12 20:23 UTC (permalink / raw
  To: gentoo-commits

commit:     26b0a5471a0f42cd331351b43506930e46160960
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Fri Dec 12 20:16:52 2014 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Fri Dec 12 20:16:52 2014 +0000
URL:        http://sources.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=26b0a547

Merge tag 'v2.2.11' into multilib


 DEVELOPING                                         |  97 ++++++++++------
 RELEASE-NOTES                                      |  34 +++++-
 bin/chpathtool.py                                  |   9 +-
 bin/ebuild-helpers/xattr/install                   |  27 ++++-
 bin/emerge                                         |   9 +-
 bin/repoman                                        |  23 +++-
 man/emerge.1                                       |  14 +++
 man/make.conf.5                                    | 127 ++++++++++-----------
 man/repoman.1                                      |   4 +
 pym/_emerge/Binpkg.py                              |   2 +-
 pym/_emerge/EbuildBuild.py                         |   9 +-
 pym/_emerge/PackageMerge.py                        |   5 +-
 pym/_emerge/TaskSequence.py                        |  25 +++-
 pym/_emerge/UserQuery.py                           |  71 ++++++++++++
 pym/_emerge/actions.py                             |  31 ++---
 pym/_emerge/depgraph.py                            |  53 +++++++--
 pym/_emerge/main.py                                |  17 +++
 pym/_emerge/resolver/output.py                     |   5 +-
 pym/_emerge/resolver/output_helpers.py             |  20 +---
 pym/_emerge/search.py                              |  10 +-
 pym/_emerge/unmerge.py                             |   5 +-
 pym/_emerge/userquery.py                           |  55 ---------
 pym/portage/dbapi/vartree.py                       |  42 +++----
 pym/portage/dep/dep_check.py                       |  14 ---
 pym/portage/dispatch_conf.py                       |   3 +-
 pym/portage/emaint/module.py                       |   2 +-
 pym/portage/exception.py                           |   4 +
 pym/portage/glsa.py                                |   1 +
 pym/portage/localization.py                        |  12 ++
 pym/portage/package/ebuild/config.py               |  13 ++-
 .../tests/resolver/test_slot_conflict_rebuild.py   |  41 +++++++
 pym/portage/util/__init__.py                       |   3 +-
 pym/portage/util/writeable_check.py                |  29 +++--
 pym/repoman/checks.py                              |  10 --
 pym/repoman/utilities.py                           |   2 +-
 35 files changed, 546 insertions(+), 282 deletions(-)

diff --cc pym/_emerge/actions.py
index e7b3622,b935139..5598b3c
--- a/pym/_emerge/actions.py
+++ b/pym/_emerge/actions.py
@@@ -3051,8 -3055,8 +3055,8 @@@ def getportageversion(portdir, _unused
  	gccver = getgccversion(chost)
  	unameout=platform.release()+" "+platform.machine()
  
- 	return "Portage %s (%s, %s, %s, %s)" % \
- 		(portage.VERSION + "-multilib", profilever, gccver, ",".join(libcver), unameout)
+ 	return "Portage %s (%s, %s, %s, %s, %s)" % \
 -		(portage.VERSION, pythonver, profilever, gccver, ",".join(libcver), unameout)
++		(portage.VERSION + "-multilib", pythonver, profilever, gccver, ",".join(libcver), unameout)
  
  def git_sync_timestamps(portdb, portdir):
  	"""


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2014-12-12 20:23 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2014-12-12 20:23 UTC (permalink / raw
  To: gentoo-commits

commit:     723161745437fcc4a90a7307f6412201f5edd225
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Fri Dec 12 20:17:36 2014 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Fri Dec 12 20:17:36 2014 +0000
URL:        http://sources.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=72316174

Merge tag 'v2.2.12' into multilib


 NEWS                                             |  17 +-
 RELEASE-NOTES                                    |  21 ++
 bin/chpathtool.py                                |   9 +-
 bin/ebuild-helpers/emake                         |   4 +-
 bin/misc-functions.sh                            |  44 +++-
 bin/phase-helpers.sh                             |   8 +-
 bin/quickpkg                                     |   4 +-
 bin/repoman                                      |  12 +-
 pym/_emerge/Scheduler.py                         |   2 +-
 pym/_emerge/actions.py                           |  13 +-
 pym/_emerge/depgraph.py                          |   7 +-
 pym/_emerge/main.py                              |   5 +-
 pym/_emerge/sync/old_tree_timestamp.py           |  12 +-
 pym/_emerge/unmerge.py                           |   3 +-
 pym/portage/_emirrordist/FetchTask.py            |   6 +-
 pym/portage/_sets/dbapi.py                       |   4 +-
 pym/portage/cache/sqlite.py                      |   4 +-
 pym/portage/const.py                             |   3 +-
 pym/portage/dbapi/__init__.py                    |   6 +-
 pym/portage/dbapi/vartree.py                     |  10 +-
 pym/portage/emaint/main.py                       |   6 +-
 pym/portage/emaint/modules/merges/__init__.py    |  30 +++
 pym/portage/emaint/modules/merges/merges.py      | 290 +++++++++++++++++++++++
 pym/portage/localization.py                      |   7 +-
 pym/portage/output.py                            |   6 +-
 pym/portage/util/_eventloop/EventLoop.py         |   8 +-
 pym/portage/util/_eventloop/PollSelectAdapter.py |   6 +-
 27 files changed, 481 insertions(+), 66 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2015-05-05 11:29 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2015-05-05 11:29 UTC (permalink / raw
  To: gentoo-commits

commit:     600cb1fd9daed3b01d8f51b38c29f000376b6513
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Tue May  5 11:30:56 2015 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Tue May  5 11:30:56 2015 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=600cb1fd

Merge tag 'v2.2.18' into multilib

Portage-2.2.18 release

 NEWS                                               |   11 +
 RELEASE-NOTES                                      |   69 ++
 bin/chpathtool.py                                  |   22 +-
 bin/eapi.sh                                        |  114 +-
 bin/ebuild                                         |    1 +
 bin/ebuild-helpers/dohtml                          |    4 +
 bin/ebuild.sh                                      |   13 +-
 bin/egencache                                      |   38 +-
 bin/emerge-webrsync                                |    4 +-
 bin/isolated-functions.sh                          |   21 +-
 bin/phase-functions.sh                             |   13 +-
 bin/phase-helpers.sh                               |  315 +++++-
 bin/portageq                                       |   16 +-
 bin/regenworld                                     |    4 +-
 bin/repoman                                        |   15 +-
 bin/save-ebuild-env.sh                             |    5 +-
 bin/socks5-server.py                               |  227 ++++
 cnf/make.conf.example                              |    2 +-
 cnf/repo.postsync.d/example                        |   51 +
 cnf/repos.conf                                     |    1 +
 cnf/sets/portage.conf                              |   12 +-
 doc/config/sets.docbook                            |   47 +-
 man/ebuild.5                                       |   21 +-
 man/egencache.1                                    |   15 +-
 man/emaint.1                                       |   71 +-
 man/emerge.1                                       |   91 +-
 man/make.conf.5                                    |   14 +-
 man/portage.5                                      |  232 ++++-
 man/repoman.1                                      |    2 +-
 pym/_emerge/AbstractPollTask.py                    |   52 +-
 pym/_emerge/BinpkgExtractorAsync.py                |   25 +-
 pym/_emerge/FakeVartree.py                         |   16 +-
 pym/_emerge/Package.py                             |   58 +-
 pym/_emerge/Scheduler.py                           |    1 +
 pym/_emerge/actions.py                             | 1095 ++------------------
 pym/_emerge/create_depgraph_params.py              |   22 +
 pym/_emerge/create_world_atom.py                   |    6 +-
 pym/_emerge/depgraph.py                            |  550 +++++++---
 pym/_emerge/help.py                                |    2 +-
 pym/_emerge/main.py                                |   81 +-
 pym/_emerge/resolver/DbapiProvidesIndex.py         |  101 ++
 pym/_emerge/resolver/output.py                     |   19 +-
 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/portage/__init__.py                            |    4 +-
 pym/portage/_sets/ProfilePackageSet.py             |   34 +
 pym/portage/_sets/__init__.py                      |   19 +-
 pym/portage/_sets/files.py                         |  157 ++-
 pym/portage/_sets/profiles.py                      |   27 +-
 pym/portage/cache/index/IndexStreamIterator.py     |   27 +
 .../sync => portage/cache/index}/__init__.py       |    2 +-
 pym/portage/cache/index/pkg_desc_index.py          |   59 ++
 pym/portage/dbapi/DummyTree.py                     |   16 +
 pym/portage/dbapi/IndexedPortdb.py                 |  171 +++
 pym/portage/dbapi/IndexedVardb.py                  |  114 ++
 pym/portage/dbapi/_VdbMetadataDelta.py             |  153 +++
 pym/portage/dbapi/bintree.py                       |   38 +-
 pym/portage/dbapi/vartree.py                       |   72 +-
 pym/portage/dep/__init__.py                        |   31 +-
 pym/portage/dep/_slot_operator.py                  |   13 +
 pym/portage/dep/dep_check.py                       |   16 +-
 pym/portage/dep/soname/SonameAtom.py               |   72 ++
 .../resolver => 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                       |   68 +-
 pym/portage/eapi.py                                |    2 +-
 pym/portage/emaint/main.py                         |   33 +-
 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/locks.py                               |    2 +-
 pym/portage/metadata.py                            |  208 ++++
 pym/portage/{emaint => }/module.py                 |   40 +-
 pym/portage/news.py                                |    6 +-
 .../package/ebuild/_config/KeywordsManager.py      |    6 +-
 .../package/ebuild/_config/LocationsManager.py     |   37 +-
 pym/portage/package/ebuild/_config/MaskManager.py  |   12 +-
 pym/portage/package/ebuild/_config/UseManager.py   |  112 +-
 .../package/ebuild/_config/special_env_vars.py     |    6 +-
 pym/portage/package/ebuild/config.py               |   35 +-
 pym/portage/package/ebuild/doebuild.py             |  165 ++-
 pym/portage/package/ebuild/fetch.py                |    7 +-
 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                     |    0
 pym/portage/sync/syncbase.py                       |  136 +++
 pym/portage/tests/dbapi/test_fakedbapi.py          |   11 +-
 pym/portage/tests/dbapi/test_portdb_cache.py       |   18 +-
 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   |   11 +-
 .../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 +++
 pym/portage/tests/resolver/test_or_choices.py      |   80 +-
 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 +++
 .../resolver => portage/tests/sync}/__init__.py    |    2 +-
 pym/portage/tests/sync/test_sync_local.py          |  189 ++++
 pym/portage/util/__init__.py                       |   57 +-
 pym/portage/util/_dyn_libs/LinkageMapELF.py        |   61 +-
 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 +
 .../resolver => portage/util/elf}/__init__.py      |    2 +-
 pym/portage/util/elf/constants.py                  |   45 +
 pym/portage/util/elf/header.py                     |   65 ++
 .../resolver => portage/util/endian}/__init__.py   |    2 +-
 pym/portage/util/endian/decode.py                  |   48 +
 pym/portage/util/iterators/MultiIterGroupBy.py     |   94 ++
 .../util/iterators}/__init__.py                    |    2 +-
 pym/portage/util/socks5.py                         |   81 ++
 pym/repoman/check_missingslot.py                   |   31 +
 pym/repoman/utilities.py                           |    7 +-
 setup.py                                           |    4 +-
 148 files changed, 8855 insertions(+), 1847 deletions(-)

diff --cc pym/_emerge/actions.py
index 1385d34,b667537..614144a
--- a/pym/_emerge/actions.py
+++ b/pym/_emerge/actions.py
@@@ -3139,147 -2301,8 +2301,8 @@@ def getportageversion(portdir, _unused
  	unameout=platform.release()+" "+platform.machine()
  
  	return "Portage %s (%s, %s, %s, %s, %s)" % \
 -		(portage.VERSION, pythonver, profilever, gccver, ",".join(libcver), unameout)
 +		(portage.VERSION + "-multilib", pythonver, profilever, gccver, ",".join(libcver), unameout)
  
- def git_sync_timestamps(portdb, portdir):
- 	"""
- 	Since git doesn't preserve timestamps, synchronize timestamps between
- 	entries and ebuilds/eclasses. Assume the cache has the correct timestamp
- 	for a given file as long as the file in the working tree is not modified
- 	(relative to HEAD).
- 	"""
- 
- 	cache_db = portdb._pregen_auxdb.get(portdir)
- 
- 	try:
- 		if cache_db is None:
- 			# portdbapi does not populate _pregen_auxdb
- 			# when FEATURES=metadata-transfer is enabled
- 			cache_db = portdb._create_pregen_cache(portdir)
- 	except CacheError as e:
- 		writemsg_level("!!! Unable to instantiate cache: %s\n" % (e,),
- 			level=logging.ERROR, noiselevel=-1)
- 		return 1
- 
- 	if cache_db is None:
- 		return os.EX_OK
- 
- 	if cache_db.validation_chf != 'mtime':
- 		# newer formats like md5-dict do not require mtime sync
- 		return os.EX_OK
- 
- 	writemsg_level(">>> Synchronizing timestamps...\n")
- 
- 	ec_dir = os.path.join(portdir, "eclass")
- 	try:
- 		ec_names = set(f[:-7] for f in os.listdir(ec_dir) \
- 			if f.endswith(".eclass"))
- 	except OSError as e:
- 		writemsg_level("!!! Unable to list eclasses: %s\n" % (e,),
- 			level=logging.ERROR, noiselevel=-1)
- 		return 1
- 
- 	args = [portage.const.BASH_BINARY, "-c",
- 		"cd %s && git diff-index --name-only --diff-filter=M HEAD" % \
- 		portage._shell_quote(portdir)]
- 	proc = subprocess.Popen(args, stdout=subprocess.PIPE)
- 	modified_files = set(_unicode_decode(l).rstrip("\n") for l in proc.stdout)
- 	rval = proc.wait()
- 	proc.stdout.close()
- 	if rval != os.EX_OK:
- 		return rval
- 
- 	modified_eclasses = set(ec for ec in ec_names \
- 		if os.path.join("eclass", ec + ".eclass") in modified_files)
- 
- 	updated_ec_mtimes = {}
- 
- 	for cpv in cache_db:
- 		cpv_split = portage.catpkgsplit(cpv)
- 		if cpv_split is None:
- 			writemsg_level("!!! Invalid cache entry: %s\n" % (cpv,),
- 				level=logging.ERROR, noiselevel=-1)
- 			continue
- 
- 		cat, pn, ver, rev = cpv_split
- 		cat, pf = portage.catsplit(cpv)
- 		relative_eb_path = os.path.join(cat, pn, pf + ".ebuild")
- 		if relative_eb_path in modified_files:
- 			continue
- 
- 		try:
- 			cache_entry = cache_db[cpv]
- 			eb_mtime = cache_entry.get("_mtime_")
- 			ec_mtimes = cache_entry.get("_eclasses_")
- 		except KeyError:
- 			writemsg_level("!!! Missing cache entry: %s\n" % (cpv,),
- 				level=logging.ERROR, noiselevel=-1)
- 			continue
- 		except CacheError as e:
- 			writemsg_level("!!! Unable to access cache entry: %s %s\n" % \
- 				(cpv, e), level=logging.ERROR, noiselevel=-1)
- 			continue
- 
- 		if eb_mtime is None:
- 			writemsg_level("!!! Missing ebuild mtime: %s\n" % (cpv,),
- 				level=logging.ERROR, noiselevel=-1)
- 			continue
- 
- 		try:
- 			eb_mtime = long(eb_mtime)
- 		except ValueError:
- 			writemsg_level("!!! Invalid ebuild mtime: %s %s\n" % \
- 				(cpv, eb_mtime), level=logging.ERROR, noiselevel=-1)
- 			continue
- 
- 		if ec_mtimes is None:
- 			writemsg_level("!!! Missing eclass mtimes: %s\n" % (cpv,),
- 				level=logging.ERROR, noiselevel=-1)
- 			continue
- 
- 		if modified_eclasses.intersection(ec_mtimes):
- 			continue
- 
- 		missing_eclasses = set(ec_mtimes).difference(ec_names)
- 		if missing_eclasses:
- 			writemsg_level("!!! Non-existent eclass(es): %s %s\n" % \
- 				(cpv, sorted(missing_eclasses)), level=logging.ERROR,
- 				noiselevel=-1)
- 			continue
- 
- 		eb_path = os.path.join(portdir, relative_eb_path)
- 		try:
- 			current_eb_mtime = os.stat(eb_path)
- 		except OSError:
- 			writemsg_level("!!! Missing ebuild: %s\n" % \
- 				(cpv,), level=logging.ERROR, noiselevel=-1)
- 			continue
- 
- 		inconsistent = False
- 		for ec, (ec_path, ec_mtime) in ec_mtimes.items():
- 			updated_mtime = updated_ec_mtimes.get(ec)
- 			if updated_mtime is not None and updated_mtime != ec_mtime:
- 				writemsg_level("!!! Inconsistent eclass mtime: %s %s\n" % \
- 					(cpv, ec), level=logging.ERROR, noiselevel=-1)
- 				inconsistent = True
- 				break
- 
- 		if inconsistent:
- 			continue
- 
- 		if current_eb_mtime != eb_mtime:
- 			os.utime(eb_path, (eb_mtime, eb_mtime))
- 
- 		for ec, (ec_path, ec_mtime) in ec_mtimes.items():
- 			if ec in updated_ec_mtimes:
- 				continue
- 			ec_path = os.path.join(ec_dir, ec + ".eclass")
- 			current_mtime = os.stat(ec_path)[stat.ST_MTIME]
- 			if current_mtime != ec_mtime:
- 				os.utime(ec_path, (ec_mtime, ec_mtime))
- 			updated_ec_mtimes[ec] = ec_mtime
- 
- 	return os.EX_OK
  
  class _emerge_config(SlotObject):
  


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2015-10-04 11:38 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2015-10-04 11:38 UTC (permalink / raw
  To: gentoo-commits

commit:     80edd8061fe4571eb8749bba1f3c452ac0a22042
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sun Oct  4 11:35:31 2015 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun Oct  4 11:35:31 2015 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=80edd806

Merge tag 'v2.2.20' into multilib

Release 2.2.20

 NEWS                                               |   6 +
 RELEASE-NOTES                                      |  11 +
 bin/ebuild-helpers/doconfd                         |   5 +-
 bin/ebuild-helpers/dodoc                           |   5 +-
 bin/ebuild-helpers/doenvd                          |   5 +-
 bin/ebuild-helpers/doheader                        |   5 +-
 bin/ebuild-helpers/doinitd                         |   5 +-
 bin/ebuild-helpers/dolib.a                         |   3 +-
 bin/ebuild-helpers/dolib.so                        |   3 +-
 bin/egencache                                      |  17 +-
 bin/repoman                                        |   9 +-
 cnf/make.conf.example                              |   6 +-
 man/make.conf.5                                    |   4 +-
 man/repoman.1                                      |   5 +-
 pym/portage/dbapi/bintree.py                       |   7 +-
 pym/portage/repository/config.py                   |  12 ++
 pym/portage/sync/modules/rsync/rsync.py            |  13 +-
 pym/portage/sync/modules/squashdelta/README        | 124 -----------
 pym/portage/sync/modules/squashdelta/__init__.py   |  37 ----
 .../sync/modules/squashdelta/squashdelta.py        | 237 ---------------------
 setup.py                                           |   2 +-
 21 files changed, 81 insertions(+), 440 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2015-10-04 11:38 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2015-10-04 11:38 UTC (permalink / raw
  To: gentoo-commits

commit:     b0547d42cce2be3442cef58316e95684d64b471e
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sun Oct  4 11:35:51 2015 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun Oct  4 11:35:51 2015 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=b0547d42

Merge tag 'v2.2.20.1' into multilib

New version

 bin/egencache            |  2 --
 bin/repoman              |  9 +++++++--
 cnf/sets/portage.conf    |  2 +-
 man/egencache.1          |  2 +-
 man/emaint.1             |  4 ++--
 man/make.conf.5          | 44 ++++++++++++++++++++++++++++++++++++--------
 man/repoman.1            |  4 ++--
 pym/portage/const.py     |  1 +
 pym/repoman/checks.py    |  7 +++----
 pym/repoman/errors.py    |  2 +-
 pym/repoman/utilities.py |  7 +++++--
 setup.py                 |  2 +-
 12 files changed, 60 insertions(+), 26 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2015-10-04 11:38 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2015-10-04 11:38 UTC (permalink / raw
  To: gentoo-commits

commit:     60c36c144d304311433dcd19662cc2cc2181c2a7
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sun Oct  4 11:35:08 2015 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun Oct  4 11:35:08 2015 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=60c36c14

Merge v2.2.19

 NEWS                                               |   9 +
 RELEASE-NOTES                                      |  50 +-
 bin/dispatch-conf                                  |   9 +-
 bin/ebuild-helpers/bsd/sed                         |   4 +-
 bin/ebuild-helpers/emake                           |  28 +-
 bin/ebuild-helpers/portageq                        |   4 +-
 bin/ebuild-helpers/unprivileged/chown              |   4 +-
 bin/ebuild-helpers/xattr/install                   |  14 +-
 bin/ebuild.sh                                      |  10 +-
 bin/emerge-webrsync                                |   4 +-
 bin/install-qa-check.d/10executable-issues         |  12 +-
 bin/install-qa-check.d/90gcc-warnings              |   2 +-
 bin/misc-functions.sh                              |  15 +-
 bin/phase-functions.sh                             |  12 +-
 bin/phase-helpers.sh                               |   2 +-
 bin/portageq                                       |  18 +-
 bin/quickpkg                                       |   1 -
 bin/repoman                                        |  58 +-
 cnf/dispatch-conf.conf                             |   2 +-
 cnf/make.globals                                   |   6 +-
 cnf/repos.conf                                     |   4 +
 man/ebuild.5                                       |  22 +-
 man/make.conf.5                                    |  31 +
 man/portage.5                                      |   8 +-
 pym/_emerge/Binpkg.py                              |  33 +-
 pym/_emerge/BinpkgExtractorAsync.py                |   5 +-
 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/EbuildMerge.py                         |   3 +-
 pym/_emerge/JobStatusDisplay.py                    |   4 +-
 pym/_emerge/Package.py                             |  67 +-
 pym/_emerge/PackageMerge.py                        |   9 +-
 pym/_emerge/Scheduler.py                           |  26 +-
 pym/_emerge/actions.py                             |   5 +-
 pym/_emerge/clear_caches.py                        |   1 -
 pym/_emerge/depgraph.py                            |  16 +-
 pym/_emerge/is_valid_package_atom.py               |   5 +-
 pym/_emerge/resolver/output.py                     |  21 +-
 pym/_emerge/search.py                              |  24 +-
 pym/portage/_emirrordist/Config.py                 |   6 +-
 pym/portage/_emirrordist/MirrorDistTask.py         |   4 +-
 pym/portage/_sets/ProfilePackageSet.py             |   3 +-
 pym/portage/_sets/files.py                         |   5 +-
 pym/portage/_sets/profiles.py                      |   3 +-
 pym/portage/cache/index/pkg_desc_index.py          |   1 +
 pym/portage/checksum.py                            |   2 +-
 pym/portage/const.py                               |   5 +
 pym/portage/dbapi/_MergeProcess.py                 |   9 +-
 pym/portage/dbapi/_VdbMetadataDelta.py             |  25 +-
 pym/portage/dbapi/__init__.py                      |  10 +-
 pym/portage/dbapi/bintree.py                       | 851 +++++++++++----------
 pym/portage/dbapi/vartree.py                       |  63 +-
 pym/portage/dbapi/virtual.py                       | 113 ++-
 pym/portage/dep/__init__.py                        |  38 +-
 pym/portage/dispatch_conf.py                       | 101 ++-
 pym/portage/emaint/modules/binhost/binhost.py      |  47 +-
 pym/portage/output.py                              |   4 +-
 .../package/ebuild/_config/KeywordsManager.py      |   3 +-
 .../package/ebuild/_config/LocationsManager.py     |   8 +-
 pym/portage/package/ebuild/_config/MaskManager.py  |  21 +-
 pym/portage/package/ebuild/_config/UseManager.py   |  22 +-
 pym/portage/package/ebuild/config.py               |  15 +-
 pym/portage/package/ebuild/doebuild.py             |  81 +-
 pym/portage/package/ebuild/fetch.py                |   7 +-
 pym/portage/repository/config.py                   |   4 +-
 pym/portage/sync/controller.py                     |   9 +-
 pym/portage/sync/modules/squashdelta/README        | 124 +++
 pym/portage/sync/modules/squashdelta/__init__.py   |  37 +
 .../sync/modules/squashdelta/squashdelta.py        | 237 ++++++
 pym/portage/sync/modules/webrsync/__init__.py      |   4 +-
 pym/portage/sync/modules/webrsync/webrsync.py      |   4 +
 pym/portage/tests/dep/test_isvalidatom.py          |   8 +-
 pym/portage/tests/resolver/ResolverPlayground.py   |  25 +-
 .../resolver/binpkg_multi_instance}/__init__.py    |   0
 .../{soname => binpkg_multi_instance}/__test__.py  |   0
 .../test_build_id_profile_format.py                | 134 ++++
 .../binpkg_multi_instance/test_rebuilt_binaries.py | 101 +++
 pym/portage/util/__init__.py                       |  35 +-
 pym/portage/util/_dyn_libs/LinkageMapELF.py        |   3 +-
 pym/portage/util/formatter.py                      |  69 ++
 pym/portage/util/writeable_check.py                |  24 +-
 pym/portage/versions.py                            |  28 +-
 pym/repoman/utilities.py                           |   8 +-
 setup.py                                           |   2 +-
 87 files changed, 2192 insertions(+), 725 deletions(-)

diff --cc bin/phase-functions.sh
index 7537ddc,7bf4d63..6f98569
--- a/bin/phase-functions.sh
+++ b/bin/phase-functions.sh
@@@ -549,21 -489,6 +549,13 @@@ __dyn_test() 
  	elif [[ ${EBUILD_FORCE_TEST} != 1 ]] && ! has test ${FEATURES} ; then
  		__vecho ">>> Test phase [not enabled]: ${CATEGORY}/${PF}"
  	else
- 		# If ${EBUILD_FORCE_TEST} == 1 and USE came from ${T}/environment
- 		# then it might not have USE=test like it's supposed to here.
- 		if [[ ${EBUILD_FORCE_TEST} == 1 && test =~ ${PORTAGE_IUSE} ]] && \
- 			! has test ${USE} ; then
- 			export USE="${USE} test"
- 		fi
- 
 +		if [[ " ${FEATURES} " == *" force-multilib "* ]]; then
 +			if [ ${PORTAGE_BUILDDIR}/.tested.${LOOP_ABI} -nt "${WORKDIR}" ]; then
 +				echo ">>> It appears that ${PN} is already tested for ABI=${LOOP_ABI}; skipping."
 +				echo ">>> Remove '$PORTAGE_BUILDDIR/.tested.${LOOP_ABI}' to force testing."
 +				continue
 +			fi
 +		fi
- 
  		local save_sp=${SANDBOX_PREDICT}
  		addpredict /
  		__ebuild_phase pre_src_test


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2015-10-04 11:38 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2015-10-04 11:38 UTC (permalink / raw
  To: gentoo-commits

commit:     d41a3639f9e8adb6684d3800adf1b1b2ae40f843
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sun Oct  4 11:37:13 2015 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun Oct  4 11:37:13 2015 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=d41a3639

Merge v2.2.21

 .travis.yml                                   |   2 -
 DEVELOPING                                    |  10 +-
 README                                        |   2 +-
 RELEASE-NOTES                                 |  39 ++++
 bin/ebuild-helpers/die                        |   2 +-
 bin/ebuild-helpers/dobin                      |   2 +-
 bin/ebuild-helpers/doconfd                    |   2 +-
 bin/ebuild-helpers/dodir                      |   2 +-
 bin/ebuild-helpers/dodoc                      |   2 +-
 bin/ebuild-helpers/doenvd                     |   2 +-
 bin/ebuild-helpers/doexe                      |   2 +-
 bin/ebuild-helpers/dohard                     |   2 +-
 bin/ebuild-helpers/doheader                   |   2 +-
 bin/ebuild-helpers/dohtml                     |   6 +-
 bin/ebuild-helpers/doinfo                     |   2 +-
 bin/ebuild-helpers/doinitd                    |   2 +-
 bin/ebuild-helpers/doins                      |   2 +-
 bin/ebuild-helpers/dolib                      |   2 +-
 bin/ebuild-helpers/doman                      |   2 +-
 bin/ebuild-helpers/domo                       |   2 +-
 bin/ebuild-helpers/dosbin                     |   2 +-
 bin/ebuild-helpers/dosed                      |   2 +-
 bin/ebuild-helpers/dosym                      |   2 +-
 bin/ebuild-helpers/ecompress                  |   2 +-
 bin/ebuild-helpers/ecompressdir               |   2 +-
 bin/ebuild-helpers/elog                       |   2 +-
 bin/ebuild-helpers/emake                      |   2 +-
 bin/ebuild-helpers/fowners                    |   2 +-
 bin/ebuild-helpers/fperms                     |   2 +-
 bin/ebuild-helpers/keepdir                    |   2 +-
 bin/ebuild-helpers/newins                     |   2 +-
 bin/ebuild-helpers/portageq                   |   4 +-
 bin/ebuild-helpers/prepall                    |   2 +-
 bin/ebuild-helpers/prepalldocs                |   2 +-
 bin/ebuild-helpers/prepallinfo                |   2 +-
 bin/ebuild-helpers/prepallman                 |   2 +-
 bin/ebuild-helpers/prepallstrip               |   2 +-
 bin/ebuild-helpers/prepinfo                   |   2 +-
 bin/ebuild-helpers/prepman                    |   2 +-
 bin/ebuild-helpers/prepstrip                  |   3 +-
 bin/ebuild-helpers/unprivileged/chown         |   4 +-
 bin/ebuild-helpers/xattr/install              |   2 -
 bin/ebuild-ipc                                |   4 +-
 bin/ebuild.sh                                 |   3 -
 bin/egencache                                 |  20 +++
 bin/helper-functions.sh                       |   2 +-
 bin/install-qa-check.d/10executable-issues    | 248 +++++++++++++-------------
 bin/install-qa-check.d/80libraries            | 130 +++++++-------
 bin/isolated-functions.sh                     |   3 +-
 bin/misc-functions.sh                         |  18 +-
 bin/phase-helpers.sh                          |   4 +-
 bin/quickpkg                                  |  18 +-
 bin/xattr-helper.py                           |  11 +-
 doc/qa.docbook                                |   3 +-
 man/portage.5                                 |  11 ++
 man/repoman.1                                 |   5 +-
 pym/_emerge/AbstractEbuildProcess.py          |  21 ++-
 pym/_emerge/BlockerDB.py                      |   5 +-
 pym/_emerge/PackageVirtualDbapi.py            |   4 +-
 pym/_emerge/Scheduler.py                      |  10 +-
 pym/_emerge/actions.py                        |   7 +-
 pym/_emerge/depgraph.py                       |  55 ++++--
 pym/_emerge/main.py                           |  19 +-
 pym/_emerge/resolver/circular_dependency.py   |  21 ++-
 pym/_emerge/resolver/slot_collision.py        |  11 +-
 pym/_emerge/search.py                         |   3 +-
 pym/portage/dbapi/IndexedPortdb.py            |   4 +-
 pym/portage/dbapi/IndexedVardb.py             |   6 +-
 pym/portage/dbapi/__init__.py                 |   4 +-
 pym/portage/dbapi/bintree.py                  |   4 +-
 pym/portage/dbapi/porttree.py                 |   6 +-
 pym/portage/dbapi/vartree.py                  |  22 ++-
 pym/portage/dbapi/virtual.py                  |   4 +-
 pym/portage/dep/__init__.py                   |   7 +-
 pym/portage/dep/soname/multilib_category.py   |   2 +-
 pym/portage/emaint/modules/sync/sync.py       | 148 +++++++++++++--
 pym/portage/manifest.py                       |  35 ++++
 pym/portage/package/ebuild/config.py          |   3 +-
 pym/portage/proxy/lazyimport.py               |  17 +-
 pym/portage/repository/config.py              |  44 +++--
 pym/portage/sync/__init__.py                  |  20 ++-
 pym/portage/sync/controller.py                |  31 +++-
 pym/portage/sync/modules/cvs/__init__.py      |   3 +-
 pym/portage/sync/modules/cvs/cvs.py           |   2 +-
 pym/portage/sync/modules/git/__init__.py      |   1 +
 pym/portage/sync/modules/git/git.py           |  20 ++-
 pym/portage/sync/modules/rsync/__init__.py    |   4 +
 pym/portage/sync/modules/rsync/rsync.py       |  17 +-
 pym/portage/sync/modules/svn/__init__.py      |   1 +
 pym/portage/sync/modules/webrsync/__init__.py |   1 +
 pym/portage/sync/syncbase.py                  |   2 +-
 pym/portage/tests/dep/test_match_from_list.py |  21 ++-
 pym/portage/tests/sync/test_sync_local.py     |  79 +++++++-
 pym/portage/tests/util/test_xattr.py          | 178 ++++++++++++++++++
 pym/portage/util/_async/AsyncFunction.py      |  67 +++++++
 pym/portage/util/_dyn_libs/LinkageMapELF.py   |   2 +-
 pym/portage/util/_xattr.py                    | 228 +++++++++++++++++++++++
 pym/portage/util/movefile.py                  | 102 +++--------
 runtests                                      | 156 ++++++++++++++++
 runtests.sh                                   | 109 -----------
 setup.py                                      |   2 +-
 101 files changed, 1538 insertions(+), 588 deletions(-)

diff --cc bin/misc-functions.sh
index 5038ff1,c2ff70a..84f01c1
--- a/bin/misc-functions.sh
+++ b/bin/misc-functions.sh
@@@ -14,10 -14,9 +14,10 @@@
  MISC_FUNCTIONS_ARGS="$@"
  shift $#
  
- source "${PORTAGE_BIN_PATH:-/usr/lib/portage/bin}/ebuild.sh"
+ source "${PORTAGE_BIN_PATH}/ebuild.sh" || exit 1
  
  install_symlink_html_docs() {
 +	[[ " ${FEATURES} " == *" force-prefix "* ]] || \
  	if ! ___eapi_has_prefix_variables; then
  		local ED=${D}
  	fi


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2015-10-04 11:38 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2015-10-04 11:38 UTC (permalink / raw
  To: gentoo-commits

commit:     0c879b950b70c54cd672ddc0541744d7785ee04b
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sun Oct  4 11:37:24 2015 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun Oct  4 11:37:24 2015 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=0c879b95

Merge tag 'v2.2.22' into multilib

New Release

 NEWS                                               |    6 +
 RELEASE-NOTES                                      |   11 +
 bin/egencache                                      |    4 +-
 bin/repoman                                        | 3164 +-------------------
 man/ebuild.5                                       |    9 +-
 pym/portage/dbapi/virtual.py                       |    8 +-
 pym/portage/repository/config.py                   |    2 +-
 pym/portage/sync/controller.py                     |    8 +-
 pym/portage/tests/repoman/test_simple.py           |    6 +-
 pym/repoman/_portage.py                            |   25 +
 pym/repoman/_subprocess.py                         |   82 +
 pym/repoman/_xml.py                                |  101 +
 pym/repoman/actions.py                             |  835 ++++++
 pym/repoman/argparser.py                           |  221 ++
 pym/repoman/check_missingslot.py                   |    6 +-
 pym/repoman/{ => checks}/__init__.py               |    0
 pym/repoman/{ => checks/directories}/__init__.py   |    0
 pym/repoman/checks/directories/files.py            |   80 +
 pym/repoman/{ => checks/ebuilds}/__init__.py       |    0
 pym/repoman/{ => checks/ebuilds}/checks.py         |  188 +-
 .../{ => checks/ebuilds/eclasses}/__init__.py      |    0
 pym/repoman/checks/ebuilds/eclasses/live.py        |   39 +
 pym/repoman/checks/ebuilds/eclasses/ruby.py        |   32 +
 pym/repoman/checks/ebuilds/errors.py               |   48 +
 pym/repoman/checks/ebuilds/fetches.py              |  134 +
 pym/repoman/checks/ebuilds/isebuild.py             |   70 +
 pym/repoman/checks/ebuilds/keywords.py             |  121 +
 pym/repoman/checks/ebuilds/manifests.py            |  101 +
 pym/repoman/checks/ebuilds/misc.py                 |   54 +
 pym/repoman/checks/ebuilds/pkgmetadata.py          |  174 ++
 pym/repoman/checks/ebuilds/thirdpartymirrors.py    |   38 +
 pym/repoman/checks/ebuilds/use_flags.py            |   89 +
 .../{ => checks/ebuilds/variables}/__init__.py     |    0
 .../checks/ebuilds/variables/description.py        |   32 +
 pym/repoman/checks/ebuilds/variables/eapi.py       |   44 +
 pym/repoman/checks/ebuilds/variables/license.py    |   47 +
 pym/repoman/checks/ebuilds/variables/restrict.py   |   41 +
 pym/repoman/{ => checks/herds}/__init__.py         |    0
 pym/repoman/{ => checks/herds}/herdbase.py         |   26 +-
 pym/repoman/checks/herds/metadata.py               |   25 +
 pym/repoman/copyrights.py                          |  119 +
 pym/repoman/ebuild.py                              |   28 +
 pym/repoman/errors.py                              |   42 +-
 pym/repoman/gpg.py                                 |   81 +
 pym/repoman/main.py                                |  168 ++
 pym/repoman/metadata.py                            |  150 +
 pym/repoman/{ => modules}/__init__.py              |    0
 pym/repoman/{ => modules/commit}/__init__.py       |    0
 pym/repoman/modules/commit/repochecks.py           |   34 +
 pym/repoman/{ => modules/fix}/__init__.py          |    0
 pym/repoman/{ => modules/full}/__init__.py         |    0
 pym/repoman/{ => modules/manifest}/__init__.py     |    0
 pym/repoman/{ => modules/scan}/__init__.py         |    0
 pym/repoman/profile.py                             |   86 +
 pym/repoman/qa_data.py                             |  438 +++
 pym/repoman/qa_tracker.py                          |   45 +
 pym/repoman/repos.py                               |  306 ++
 pym/repoman/scan.py                                |  170 ++
 pym/repoman/scanner.py                             |  717 +++++
 pym/repoman/utilities.py                           |  568 +---
 pym/repoman/{ => vcs}/__init__.py                  |    0
 pym/repoman/vcs/vcs.py                             |  276 ++
 pym/repoman/vcs/vcsstatus.py                       |  113 +
 setup.py                                           |    2 +-
 64 files changed, 5492 insertions(+), 3722 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2016-02-28 12:37 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2016-02-28 12:37 UTC (permalink / raw
  To: gentoo-commits

commit:     4b760f60a70b9af4dce6c894226ebe72485f5495
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sun Feb 28 12:27:00 2016 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun Feb 28 12:27:00 2016 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=4b760f60

merge v2.2.25

 NEWS                                     |   5 ++
 RELEASE-NOTES                            |  13 +++
 bin/eapi.sh                              |   8 ++
 bin/ebuild.sh                            |  43 ++++++++++
 bin/egencache                            | 125 ++++++++++++++++-----------
 bin/install-qa-check.d/60openrc          |   2 +-
 bin/phase-helpers.sh                     |  78 ++++++++++++-----
 bin/save-ebuild-env.sh                   |   9 +-
 man/portage.5                            |   7 +-
 misc/emerge-delta-webrsync               |   2 +-
 pym/_emerge/actions.py                   |   3 +
 pym/_emerge/main.py                      |  15 +++-
 pym/portage/const.py                     |   2 +-
 pym/portage/eapi.py                      |  11 ++-
 pym/portage/emaint/modules/sync/sync.py  |  57 +++++++++++--
 pym/portage/package/ebuild/config.py     |  16 ++++
 pym/portage/repository/config.py         |   6 +-
 pym/portage/sync/controller.py           |  18 ++--
 pym/portage/sync/modules/git/git.py      |  11 ++-
 pym/portage/sync/modules/rsync/rsync.py  |  17 ++--
 pym/portage/util/_async/AsyncFunction.py |   5 +-
 pym/portage/util/locale.py               | 141 +++++++++++++++++++++++++++++++
 pym/repoman/checks/ebuilds/checks.py     |   7 +-
 pym/repoman/vcs/vcs.py                   |  20 +++--
 setup.py                                 |   2 +-
 25 files changed, 513 insertions(+), 110 deletions(-)

diff --cc bin/ebuild.sh
index 9d83477,4319a17..0dd971b
--- a/bin/ebuild.sh
+++ b/bin/ebuild.sh
@@@ -6,12 -6,50 +6,54 @@@
  # Make sure it's before everything so we don't mess aliases that follow.
  unalias -a
  
+ # Make sure this isn't exported to scripts we execute.
+ unset BASH_COMPAT
+ 
  source "${PORTAGE_BIN_PATH}/isolated-functions.sh" || exit 1
  
 +if [[ " ${FEATURES} " == *" force-multilib "* ]]; then
 +	source "${PORTAGE_BIN_PATH}/auto-multilib.sh" || exit 1
 +fi
 +
+ # Set up the bash version compatibility level.  This does not disable
+ # features when running with a newer version, but makes it so that when
+ # bash changes behavior in an incompatible way, the older behavior is
+ # used instead.
+ __check_bash_version() {
+ 	# Figure out which min version of bash we require.
+ 	local maj min
+ 	if ___eapi_bash_3_2 ; then
+ 		maj=3 min=2
+ 	elif ___eapi_bash_4_2 ; then
+ 		maj=4 min=2
+ 	else
+ 		return
+ 	fi
+ 
+ 	# Make sure the active bash is sane.
+ 	if [[ ${BASH_VERSINFO[0]} -lt ${maj} ]] ||
+ 	   [[ ${BASH_VERSINFO[0]} -eq ${maj} && ${BASH_VERSINFO[1]} -lt ${min} ]] ; then
+ 		die ">=bash-${maj}.${min} is required"
+ 	fi
+ 
+ 	# Set the compat level in case things change with newer ones.  We must not
+ 	# export this into the env otherwise we might break  other shell scripts we
+ 	# execute (e.g. ones in /usr/bin).
+ 	BASH_COMPAT="${maj}.${min}"
+ 
+ 	# The variable above is new to bash-4.3.  For older versions, we have to use
+ 	# a compat knob.  Further, the compat knob only exists with older versions
+ 	# (e.g. bash-4.3 has compat42 but not compat43).  This means we only need to
+ 	# turn the knob with older EAPIs, and only when running newer bash versions:
+ 	# there is no bash-3.3 (it went 3.2 to 4.0), and when requiring bash-4.2, the
+ 	# var works with bash-4.3+, and you don't need to set compat to 4.2 when you
+ 	# are already running 4.2.
+ 	if ___eapi_bash_3_2 && [[ ${BASH_VERSINFO[0]} -gt 3 ]] ; then
+ 		shopt -s compat32
+ 	fi
+ }
+ __check_bash_version
+ 
  if [[ $EBUILD_PHASE != depend ]] ; then
  	source "${PORTAGE_BIN_PATH}/phase-functions.sh" || die
  	source "${PORTAGE_BIN_PATH}/save-ebuild-env.sh" || die


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2016-02-28 12:37 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2016-02-28 12:37 UTC (permalink / raw
  To: gentoo-commits

commit:     fa253ca6f939b075c380e6c208a3283bcbaab0c5
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sun Feb 28 12:25:01 2016 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun Feb 28 12:25:01 2016 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=fa253ca6

Merge tag 'v2.2.24' into multilib

Version 2.2.24

 RELEASE-NOTES                                      | 19 ++++++
 bin/binhost-snapshot                               |  4 +-
 bin/cgroup-release-agent                           |  2 +-
 bin/chpathtool.py                                  | 45 ++++---------
 bin/ebuild                                         |  4 +-
 bin/egencache                                      | 33 +++++++---
 bin/fixpackages                                    |  4 +-
 bin/glsa-check                                     |  4 +-
 bin/install.py                                     |  4 +-
 bin/portageq                                       |  6 +-
 bin/quickpkg                                       |  4 +-
 bin/xattr-helper.py                                |  4 +-
 bin/xpak-helper.py                                 |  4 +-
 man/egencache.1                                    | 10 +++
 man/emerge.1                                       |  7 ++
 pym/_emerge/AbstractEbuildProcess.py               | 18 ++++++
 pym/_emerge/Binpkg.py                              | 24 +++----
 pym/_emerge/BinpkgFetcher.py                       |  2 +-
 pym/_emerge/EbuildBuild.py                         | 21 +++---
 pym/_emerge/SpawnProcess.py                        |  4 +-
 pym/_emerge/actions.py                             | 74 ++++++++++++++++------
 pym/_emerge/main.py                                |  4 +-
 pym/portage/_emirrordist/main.py                   |  4 +-
 pym/portage/dbapi/vartree.py                       |  8 ++-
 pym/portage/emaint/main.py                         |  6 +-
 .../package/ebuild/_config/KeywordsManager.py      | 35 ++++------
 pym/portage/repository/config.py                   |  7 +-
 pym/portage/sync/controller.py                     |  1 -
 pym/portage/tests/__init__.py                      |  4 +-
 pym/portage/tests/resolver/test_depclean.py        | 10 ++-
 pym/portage/util/_argparse.py                      | 42 ------------
 pym/repoman/argparser.py                           |  4 +-
 pym/repoman/checks/ebuilds/checks.py               |  5 +-
 pym/repoman/qa_data.py                             |  3 +-
 pym/repoman/scanner.py                             | 10 +++
 runtests                                           | 48 +++++++++-----
 setup.py                                           | 21 +++---
 37 files changed, 291 insertions(+), 218 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2016-02-28 12:37 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2016-02-28 12:37 UTC (permalink / raw
  To: gentoo-commits

commit:     3a63f58d0993f66975cd324eb85f4a2340d4f7c3
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sun Feb 28 12:24:26 2016 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun Feb 28 12:24:26 2016 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=3a63f58d

Merge tag 'v2.2.23' into multilib

New release

 .travis.yml                                     |  1 +
 README                                          | 10 +--
 RELEASE-NOTES                                   | 14 ++++
 bin/cgroup-release-agent                        |  2 +
 bin/{ebuild-ipc => chmod-lite}                  |  6 +-
 bin/chmod-lite.py                               | 30 ++++++++
 bin/dohtml.py                                   | 47 +++++++++---
 bin/phase-helpers.sh                            |  4 +-
 man/make.conf.5                                 |  3 +
 pym/_emerge/AbstractEbuildProcess.py            | 14 ++--
 pym/_emerge/Scheduler.py                        | 30 ++++----
 pym/portage/checksum.py                         |  4 +-
 pym/portage/const.py                            |  1 +
 pym/portage/data.py                             |  2 +-
 pym/portage/dbapi/__init__.py                   | 23 +++---
 pym/portage/dbapi/porttree.py                   | 18 +++--
 pym/portage/package/ebuild/doebuild.py          | 14 ++--
 pym/portage/sync/controller.py                  | 39 +++++++++-
 pym/portage/util/__init__.py                    | 97 ++++++++++++++-----------
 pym/repoman/_subprocess.py                      |  1 +
 pym/repoman/_xml.py                             |  1 +
 pym/repoman/actions.py                          |  3 +-
 pym/repoman/argparser.py                        |  4 +
 pym/repoman/check_missingslot.py                |  1 +
 pym/repoman/checks/directories/files.py         |  1 +
 pym/repoman/checks/ebuilds/checks.py            |  1 +
 pym/repoman/checks/ebuilds/errors.py            |  1 +
 pym/repoman/checks/ebuilds/fetches.py           |  1 +
 pym/repoman/checks/ebuilds/isebuild.py          |  1 +
 pym/repoman/checks/ebuilds/keywords.py          |  1 +
 pym/repoman/checks/ebuilds/manifests.py         |  1 +
 pym/repoman/checks/ebuilds/misc.py              |  1 +
 pym/repoman/checks/ebuilds/pkgmetadata.py       |  1 +
 pym/repoman/checks/ebuilds/thirdpartymirrors.py |  1 +
 pym/repoman/checks/ebuilds/use_flags.py         |  1 +
 pym/repoman/checks/herds/metadata.py            |  1 +
 pym/repoman/copyrights.py                       |  1 +
 pym/repoman/ebuild.py                           |  1 +
 pym/repoman/errors.py                           |  1 +
 pym/repoman/gpg.py                              |  1 +
 pym/repoman/main.py                             |  1 +
 pym/repoman/metadata.py                         |  1 +
 pym/repoman/modules/commit/repochecks.py        |  1 +
 pym/repoman/profile.py                          |  1 +
 pym/repoman/qa_data.py                          |  1 +
 pym/repoman/repos.py                            |  3 +-
 pym/repoman/scan.py                             |  4 +-
 pym/repoman/scanner.py                          | 29 ++++++--
 pym/repoman/utilities.py                        |  1 +
 pym/repoman/vcs/vcs.py                          |  1 +
 pym/repoman/vcs/vcsstatus.py                    |  1 +
 setup.py                                        |  2 +-
 52 files changed, 304 insertions(+), 127 deletions(-)

diff --cc pym/portage/const.py
index 6b03017,6c4f613..20cf40e
--- a/pym/portage/const.py
+++ b/pym/portage/const.py
@@@ -147,9 -146,9 +147,10 @@@ SUPPORTED_FEATURES       = frozenset(
  	"fakeroot",
  	"fixlafiles",
  	"force-mirror",
 +	"force-multilib",
  	"force-prefix",
  	"getbinpkg",
+ 	"icecream",
  	"installsources",
  	"ipc-sandbox",
  	"keeptemp",


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2016-02-28 12:37 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2016-02-28 12:37 UTC (permalink / raw
  To: gentoo-commits

commit:     0cf294d33a466f4a3c537aa82d385ec7f87c7bf3
Author:     Brian Dolbec <dolsen <AT> gentoo <DOT> org>
AuthorDate: Thu Nov 12 19:26:42 2015 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Thu Nov 12 19:26:42 2015 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=0cf294d3

Merge branch 'master' of git+ssh://git.gentoo.org/proj/portage

 bin/egencache                            | 70 +++++++++++++++++++-------------
 bin/install-qa-check.d/60openrc          |  2 +-
 bin/save-ebuild-env.sh                   |  2 +-
 man/portage.5                            |  7 +++-
 misc/emerge-delta-webrsync               |  2 +-
 pym/portage/emaint/modules/sync/sync.py  | 57 ++++++++++++++++++++++----
 pym/portage/repository/config.py         |  6 ++-
 pym/portage/sync/controller.py           | 18 +++++---
 pym/portage/sync/modules/git/git.py      | 11 ++++-
 pym/portage/sync/modules/rsync/rsync.py  | 17 ++++----
 pym/portage/util/_async/AsyncFunction.py |  5 ++-
 11 files changed, 139 insertions(+), 58 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2016-02-28 12:37 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2016-02-28 12:37 UTC (permalink / raw
  To: gentoo-commits

commit:     58fb9ace0cb1bf49df2ce68b13999d303fa25756
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sun Feb 28 12:35:46 2016 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun Feb 28 12:35:46 2016 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=58fb9ace

merge v2.2.27

 NEWS                                               |  6 +++
 RELEASE-NOTES                                      | 25 +++++++++
 bin/ebuild                                         | 20 ++++---
 bin/ebuild.sh                                      | 25 ---------
 bin/egencache                                      | 20 +------
 bin/misc-functions.sh                              |  3 +-
 bin/phase-functions.sh                             | 36 +++++++++++++
 bin/portageq                                       | 16 ++++--
 bin/socks5-server.py                               |  9 +++-
 cnf/make.globals                                   |  2 +-
 man/ebuild.5                                       |  4 +-
 man/egencache.1                                    | 10 +---
 man/emerge.1                                       |  6 +++
 man/emirrordist.1                                  | 10 +---
 pym/_emerge/actions.py                             | 61 ++++++++++++----------
 pym/_emerge/depgraph.py                            | 18 +++++--
 pym/_emerge/main.py                                | 11 ++++
 pym/portage/_emirrordist/Config.py                 | 10 +++-
 pym/portage/_emirrordist/main.py                   | 23 +-------
 pym/portage/_sets/__init__.py                      |  4 ++
 pym/portage/cache/anydbm.py                        |  3 ++
 pym/portage/cache/flat_hash.py                     |  5 ++
 pym/portage/cache/sqlite.py                        |  9 +++-
 pym/portage/cache/template.py                      | 61 +++++++++++++++++-----
 pym/portage/dbapi/porttree.py                      | 20 +++----
 pym/portage/dep/dep_check.py                       |  6 ++-
 pym/portage/elog/mod_save.py                       |  3 +-
 pym/portage/emaint/modules/merges/__init__.py      |  2 +-
 pym/portage/exception.py                           |  5 +-
 pym/portage/manifest.py                            | 52 +++++++++++++-----
 .../package/ebuild/_config/LicenseManager.py       |  4 +-
 .../package/ebuild/_config/special_env_vars.py     |  2 +-
 pym/portage/package/ebuild/config.py               | 41 ++++++++++-----
 pym/portage/package/ebuild/doebuild.py             | 27 ++++++----
 pym/portage/package/ebuild/fetch.py                |  9 ++--
 pym/portage/repository/config.py                   | 21 +++-----
 pym/portage/sync/controller.py                     |  6 +--
 pym/portage/tests/dbapi/test_portdb_cache.py       |  3 +-
 pym/portage/tests/ebuild/test_config.py            |  4 +-
 pym/portage/tests/ebuild/test_doebuild_fd_pipes.py | 37 ++++++-------
 pym/portage/tests/ebuild/test_doebuild_spawn.py    |  3 +-
 pym/portage/tests/ebuild/test_ipc_daemon.py        |  3 +-
 pym/portage/tests/emerge/test_config_protect.py    |  3 +-
 pym/portage/tests/emerge/test_emerge_slot_abi.py   |  3 +-
 pym/portage/tests/emerge/test_simple.py            |  3 +-
 pym/portage/tests/repoman/test_simple.py           |  3 +-
 pym/portage/tests/sync/test_sync_local.py          |  3 +-
 pym/portage/xml/metadata.py                        |  3 ++
 pym/repoman/_xml.py                                | 10 ++--
 pym/repoman/checks/ebuilds/checks.py               | 10 ++++
 pym/repoman/checks/ebuilds/pkgmetadata.py          |  6 ++-
 pym/repoman/qa_data.py                             |  1 +
 pym/repoman/scanner.py                             | 20 +++++--
 pym/repoman/vcs/vcsstatus.py                       |  2 +-
 setup.py                                           |  2 +-
 55 files changed, 445 insertions(+), 269 deletions(-)

diff --cc pym/_emerge/actions.py
index 9f2ef29,59626ad..e0c8afd
--- a/pym/_emerge/actions.py
+++ b/pym/_emerge/actions.py
@@@ -2809,15 -2814,7 +2814,15 @@@ def run_action(emerge_config)
  	adjust_configs(emerge_config.opts, emerge_config.trees)
  	apply_priorities(emerge_config.target_config.settings)
  
 +	if 'force-multilib' in emerge_config.target_config.settings.features:
 +		if emerge_config.target_config.settings.get("NO_AUTO_FLAG", "") is "":
 +			writemsg_level(bad("!!! Failed to find vars from extra profile") + "\n",level=logging.ERROR, noiselevel=-1)
 +			writemsg_level(bad("!!! Please make sure that you did follow the instructions and included the extra profile\n"),level=logging.ERROR, noiselevel=-1)
 +			writemsg_level(bad("!!! http://git.overlays.gentoo.org/gitweb/?p=proj/multilib-portage.git;a=blob;f=doc/portage-multilib-instructions\n"),level=logging.ERROR, noiselevel=-1)
 +			writemsg_level(bad("!!! has some basic instructions for the setup\n"),level=logging.ERROR, noiselevel=-1)
 +			return 1
 +
- 	for fmt in emerge_config.target_config.settings["PORTAGE_BINPKG_FORMAT"].split():
+ 	for fmt in emerge_config.target_config.settings.get("PORTAGE_BINPKG_FORMAT", "").split():
  		if not fmt in portage.const.SUPPORTED_BINPKG_FORMATS:
  			if "--pkg-format" in emerge_config.opts:
  				problematic="--pkg-format"


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2016-02-28 12:37 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2016-02-28 12:37 UTC (permalink / raw
  To: gentoo-commits

commit:     2988e14465a24de9db00f5899239cb739e5de083
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sun Feb 28 12:32:23 2016 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun Feb 28 12:32:23 2016 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=2988e144

merge v2.2.26

 RELEASE-NOTES                                      | 12 ++++++
 bin/egencache                                      |  6 +--
 bin/phase-functions.sh                             | 13 ++++++-
 bin/phase-helpers.sh                               | 17 +++++----
 pym/_emerge/SpawnProcess.py                        | 37 +++++++++++++++++--
 pym/_emerge/depgraph.py                            | 35 +++++++++++++++++-
 pym/portage/repository/config.py                   | 14 ++-----
 pym/portage/sync/controller.py                     |  7 ++++
 pym/portage/sync/modules/cvs/__init__.py           |  4 +-
 .../tests/resolver/test_autounmask_parent.py       | 43 ++++++++++++++++++++++
 pym/portage/util/locale.py                         |  7 ++--
 setup.py                                           |  2 +-
 12 files changed, 164 insertions(+), 33 deletions(-)

diff --cc bin/phase-functions.sh
index 6f98569,042e242..96ed339
--- a/bin/phase-functions.sh
+++ b/bin/phase-functions.sh
@@@ -222,32 -219,13 +222,38 @@@ __dyn_pretend() 
  }
  
  __dyn_setup() {
+ 	if [[ -e $PORTAGE_BUILDDIR/.setuped ]] ; then
+ 		__vecho ">>> It appears that '$PF' is already setup; skipping."
+ 		__vecho ">>> Remove '$PORTAGE_BUILDDIR/.setuped' to force setup."
 -		return 0
++		return
++	fi
++
 +	if [[ " ${FEATURES} " == *" force-multilib "* ]]; then
 +		if ! is_auto-multilib && ! use multilib_abi_"${DEFAULT_ABI}" ; then
 +			ewarn
 +			ewarn "You disabled all ABIs"
 +			ewarn "You should enable at least one ABI"
 +			ewarn "Enabling the default ABI now"
 +			ewarn
 +		fi
  	fi
 +	for LOOP_ABI in $(get_abi_list); do
 +		if [[ " ${FEATURES} " == *" force-multilib "* ]]; then
 +			set_abi ${LOOP_ABI}
 +			rm -f "${T}"/environment
 +			if [[ -e $PORTAGE_BUILDDIR/.setuped.${ABI} ]] ; then
 +				__vecho ">>> It appears that '$PF' is already setup; skipping."
 +				__vecho ">>> Remove '$PORTAGE_BUILDDIR/.setuped.${ABI}' to force setup."
 +				return 0
 +			fi
 +		fi
  	__ebuild_phase pre_pkg_setup
  	__ebuild_phase pkg_setup
 +	>> "$PORTAGE_BUILDDIR/.setuped.${ABI}" || \
 +		die "Failed to create $PORTAGE_BUILDDIR/.setuped"
 +
 +	done
 +
  	>> "$PORTAGE_BUILDDIR/.setuped" || \
  		die "Failed to create $PORTAGE_BUILDDIR/.setuped"
  	__ebuild_phase post_pkg_setup
@@@ -270,7 -246,7 +276,7 @@@ __dyn_unpack() 
  	>> "$PORTAGE_BUILDDIR/.unpacked" || \
  		die "Failed to create $PORTAGE_BUILDDIR/.unpacked"
  	__vecho ">>> Source unpacked in ${WORKDIR}"
--	__ebuild_phase post_src_unpack
++__ebuild_phase post_src_unpack
  }
  
  __dyn_clean() {
@@@ -406,11 -372,14 +412,16 @@@ __dyn_prepare() 
  	trap __abort_prepare SIGINT SIGQUIT
  
  	__ebuild_phase pre_src_prepare
 -	__vecho ">>> Preparing source in $PWD ..."
 +	__vecho ">>> Preparing source in $PWD$(_get_abi_string) ..."
  	__ebuild_phase src_prepare
  
 +	done
 +
+ 	# keep path in eapply_user in sync!
+ 	if ___eapi_has_eapply_user && [[ ! -f ${T}/.portage_user_patches_applied ]]; then
+ 		die "eapply_user (or default) must be called in src_prepare()!"
+ 	fi
+ 
  	>> "$PORTAGE_BUILDDIR/.prepared" || \
  		die "Failed to create $PORTAGE_BUILDDIR/.prepared"
  	__vecho ">>> Source prepared."


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2018-01-07  9:39 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2018-01-07  9:39 UTC (permalink / raw
  To: gentoo-commits

commit:     f89c3c5cd8d1da1e40d9a94a016b3002df237237
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sun Jan  7 09:32:44 2018 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun Jan  7 09:32:44 2018 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=f89c3c5c

Merge tag 'v2.2.28' into multilib

New Release

 .travis.yml                              |  3 +++
 RELEASE-NOTES                            | 20 +++++++++++++++++++
 bin/isolated-functions.sh                | 11 ++++++-----
 bin/misc-functions.sh                    |  2 +-
 bin/phase-functions.sh                   |  7 +------
 bin/phase-helpers.sh                     |  7 ++++++-
 bin/portageq                             | 33 ++++++++++++++------------------
 man/emerge.1                             |  3 ++-
 man/make.conf.5                          |  6 +++---
 man/portage.5                            |  6 ++++++
 pym/_emerge/BinpkgFetcher.py             |  7 +++----
 pym/_emerge/UserQuery.py                 | 15 +++++++++++----
 pym/_emerge/chk_updated_cfg_files.py     |  8 ++++----
 pym/_emerge/depgraph.py                  |  7 +++++--
 pym/portage/_legacy_globals.py           |  2 +-
 pym/portage/dbapi/bintree.py             |  2 +-
 pym/portage/dbapi/porttree.py            |  3 ++-
 pym/portage/news.py                      |  2 +-
 pym/portage/package/ebuild/config.py     |  4 ++--
 pym/portage/package/ebuild/doebuild.py   |  2 +-
 pym/portage/sync/modules/git/__init__.py |  5 ++++-
 pym/portage/sync/modules/git/git.py      |  4 ++++
 pym/portage/tests/repoman/test_simple.py |  9 +++------
 pym/repoman/_xml.py                      |  2 ++
 pym/repoman/actions.py                   | 29 +++++++++++++++++++---------
 pym/repoman/checks/ebuilds/checks.py     |  3 ++-
 pym/repoman/checks/ebuilds/misc.py       |  2 ++
 pym/repoman/checks/herds/herdbase.py     |  2 +-
 pym/repoman/errors.py                    |  2 ++
 pym/repoman/metadata.py                  |  2 ++
 pym/repoman/scanner.py                   |  7 +++++--
 runtests                                 |  4 ++--
 setup.py                                 |  2 +-
 33 files changed, 143 insertions(+), 80 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2018-01-07  9:50 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2018-01-07  9:50 UTC (permalink / raw
  To: gentoo-commits

commit:     e69902fbc9c41f0470461561258f596535d9f5c7
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sun Jan  7 09:48:55 2018 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun Jan  7 09:48:55 2018 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=e69902fb

Merge tag 'portage-2.3.0' into multilib

Final release

 .gitignore                                         |   2 +
 .travis.yml                                        |  13 +-
 MANIFEST.in                                        |   1 -
 NEWS                                               |  10 +
 RELEASE-NOTES                                      |  32 +
 bin/dispatch-conf                                  |  15 +-
 bin/eapi.sh                                        |   4 -
 bin/ebuild.sh                                      |  30 +-
 bin/egencache                                      |  17 +-
 bin/install-qa-check.d/10executable-issues         |  20 +-
 bin/install-qa-check.d/60openrc                    |   8 +-
 bin/install-qa-check.d/90gcc-warnings              |  10 +-
 bin/phase-helpers.sh                               |   9 +-
 bin/portageq                                       |   6 +-
 cnf/make.globals                                   |   4 +-
 cnf/metadata.dtd                                   | 102 ---
 pym/_emerge/EbuildBuild.py                         |  22 +-
 pym/_emerge/MiscFunctionsProcess.py                |   3 +-
 pym/_emerge/Scheduler.py                           |   9 +-
 pym/_emerge/actions.py                             |   2 +-
 pym/_emerge/depgraph.py                            |  20 +-
 pym/_emerge/resolver/output.py                     |   5 +-
 pym/_emerge/resolver/output_helpers.py             |  11 +
 pym/portage/__init__.py                            |   9 -
 pym/portage/_sets/__init__.py                      |  37 +-
 pym/portage/const.py                               |   2 +-
 pym/portage/dbapi/bintree.py                       |   7 +-
 pym/portage/dbapi/porttree.py                      |   4 +-
 pym/portage/dbapi/vartree.py                       | 117 +++-
 pym/portage/emaint/modules/binhost/__init__.py     |   1 +
 pym/portage/emaint/modules/config/__init__.py      |   1 +
 pym/portage/emaint/modules/logs/__init__.py        |   1 +
 pym/portage/emaint/modules/merges/__init__.py      |   1 +
 pym/portage/emaint/modules/move/__init__.py        |   2 +
 pym/portage/emaint/modules/resume/__init__.py      |   1 +
 pym/portage/emaint/modules/sync/__init__.py        |   1 +
 pym/portage/emaint/modules/world/__init__.py       |   1 +
 pym/portage/localization.py                        |   6 +-
 pym/portage/manifest.py                            |  17 +-
 pym/portage/module.py                              |  15 +-
 pym/portage/news.py                                |   7 +-
 pym/portage/output.py                              |   2 +-
 pym/portage/package/ebuild/doebuild.py             |   6 +-
 pym/portage/package/ebuild/prepare_build_dirs.py   |   5 +-
 pym/portage/repository/config.py                   |  47 +-
 pym/portage/sync/modules/cvs/__init__.py           |   1 +
 pym/portage/sync/modules/cvs/cvs.py                |   4 +-
 pym/portage/sync/modules/git/__init__.py           |   1 +
 pym/portage/sync/modules/git/git.py                |   4 +-
 pym/portage/sync/modules/rsync/__init__.py         |   1 +
 pym/portage/sync/modules/rsync/rsync.py            |   4 +-
 pym/portage/sync/modules/svn/__init__.py           |   1 +
 pym/portage/sync/modules/svn/svn.py                |   6 +-
 pym/portage/sync/modules/webrsync/__init__.py      |   1 +
 pym/portage/sync/modules/webrsync/webrsync.py      |   2 +-
 ...bi.py => test_emerge_blocker_file_collision.py} | 101 ++-
 pym/portage/tests/emerge/test_simple.py            |   2 -
 pym/portage/tests/resolver/ResolverPlayground.py   |  24 +-
 pym/portage/tests/util/test_getconfig.py           |   4 +-
 pym/portage/util/__init__.py                       |   6 +-
 pym/portage/util/_desktop_entry.py                 |  25 +-
 pym/portage/util/_dyn_libs/LinkageMapELF.py        |   5 +-
 pym/portage/util/configparser.py                   |  76 +++
 pym/{repoman => portage/util/futures}/__init__.py  |   0
 pym/portage/util/futures/extendedfutures.py        |  73 ++
 pym/portage/util/futures/futures.py                | 118 ++++
 pym/portage/xml/metadata.py                        |  59 +-
 pym/repoman/_xml.py                                | 106 ---
 pym/repoman/checks/ebuilds/eclasses/live.py        |  39 --
 pym/repoman/checks/ebuilds/isebuild.py             |  71 --
 pym/repoman/checks/ebuilds/manifests.py            | 102 ---
 pym/repoman/checks/ebuilds/misc.py                 |  57 --
 pym/repoman/checks/ebuilds/pkgmetadata.py          | 177 -----
 pym/repoman/checks/ebuilds/thirdpartymirrors.py    |  39 --
 pym/repoman/checks/ebuilds/variables/eapi.py       |  44 --
 pym/repoman/checks/ebuilds/variables/license.py    |  47 --
 pym/repoman/checks/herds/__init__.py               |   0
 pym/repoman/ebuild.py                              |  29 -
 pym/repoman/metadata.py                            | 153 -----
 pym/repoman/modules/__init__.py                    |   0
 pym/repoman/modules/commit/__init__.py             |   0
 pym/repoman/modules/fix/__init__.py                |   0
 pym/repoman/modules/full/__init__.py               |   0
 pym/repoman/modules/manifest/__init__.py           |   0
 pym/repoman/modules/scan/__init__.py               |   0
 pym/repoman/scan.py                                | 172 -----
 pym/repoman/scanner.py                             | 755 ---------------------
 pym/repoman/vcs/__init__.py                        |   0
 pym/repoman/vcs/vcs.py                             | 287 --------
 pym/repoman/vcs/vcsstatus.py                       | 114 ----
 .../__test__.py => repoman/.repoman_not_installed  |   0
 repoman/MANIFEST.in                                |   3 +
 repoman/NEWS                                       |   9 +
 README => repoman/README                           |   0
 repoman/RELEASE-NOTES                              |  23 +
 TEST-NOTES => repoman/TEST-NOTES                   |   0
 {bin => repoman/bin}/repoman                       |  11 +-
 repoman/cnf/metadata.xsd                           | 547 +++++++++++++++
 {man => repoman/man}/repoman.1                     |   0
 repoman/pym/repoman/__init__.py                    |   6 +
 {pym => repoman/pym}/repoman/_portage.py           |   0
 {pym => repoman/pym}/repoman/_subprocess.py        |   0
 {pym => repoman/pym}/repoman/actions.py            | 448 ++----------
 {pym => repoman/pym}/repoman/argparser.py          |   0
 {pym => repoman/pym}/repoman/check_missingslot.py  |   0
 {pym => repoman/pym}/repoman/checks/__init__.py    |   0
 .../pym/repoman/checks/herds}/__init__.py          |   0
 .../pym}/repoman/checks/herds/herdbase.py          |   0
 .../pym}/repoman/checks/herds/metadata.py          |   0
 {pym => repoman/pym}/repoman/copyrights.py         |   0
 {pym => repoman/pym}/repoman/errors.py             |   0
 {pym => repoman/pym}/repoman/gpg.py                |   0
 {pym => repoman/pym}/repoman/main.py               |  36 +-
 repoman/pym/repoman/metadata.py                    | 126 ++++
 .../pym/repoman/modules}/__init__.py               |   0
 .../pym/repoman/modules/commit}/__init__.py        |   0
 repoman/pym/repoman/modules/commit/manifest.py     | 115 ++++
 .../pym}/repoman/modules/commit/repochecks.py      |   4 +-
 .../pym/repoman/modules/scan}/__init__.py          |   0
 .../pym/repoman/modules/scan/depend/__init__.py    |  32 +
 .../repoman/modules/scan/depend/_depend_checks.py  | 195 ++++++
 .../pym/repoman/modules/scan/depend/_gen_arches.py |  57 ++
 repoman/pym/repoman/modules/scan/depend/profile.py | 256 +++++++
 .../repoman/modules/scan/directories/__init__.py   |  48 ++
 .../pym/repoman/modules/scan}/directories/files.py |  43 +-
 .../pym/repoman/modules/scan/directories/mtime.py  |  30 +
 repoman/pym/repoman/modules/scan/eapi/__init__.py  |  29 +
 repoman/pym/repoman/modules/scan/eapi/eapi.py      |  49 ++
 .../pym/repoman/modules/scan/ebuild/__init__.py    |  58 ++
 .../pym/repoman/modules/scan/ebuild}/checks.py     |   8 +-
 repoman/pym/repoman/modules/scan/ebuild/ebuild.py  | 238 +++++++
 .../pym/repoman/modules/scan/ebuild}/errors.py     |   0
 .../pym/repoman/modules/scan/ebuild/multicheck.py  |  56 ++
 .../pym/repoman/modules/scan/eclasses/__init__.py  |  47 ++
 repoman/pym/repoman/modules/scan/eclasses/live.py  |  76 +++
 .../pym/repoman/modules/scan}/eclasses/ruby.py     |  26 +-
 repoman/pym/repoman/modules/scan/fetch/__init__.py |  33 +
 .../pym/repoman/modules/scan/fetch}/fetches.py     |  97 ++-
 .../pym/repoman/modules/scan/keywords/__init__.py  |  33 +
 .../pym/repoman/modules/scan/keywords}/keywords.py |  95 +--
 .../pym/repoman/modules/scan/manifest/__init__.py  |  30 +
 .../pym/repoman/modules/scan/manifest/manifests.py |  56 ++
 .../pym/repoman/modules/scan/metadata/__init__.py  |  85 +++
 .../repoman/modules/scan/metadata}/description.py  |  23 +-
 .../modules/scan/metadata/ebuild_metadata.py       |  71 ++
 .../repoman/modules/scan/metadata/pkgmetadata.py   | 198 ++++++
 .../pym/repoman/modules/scan/metadata}/restrict.py |  32 +-
 .../repoman/modules/scan/metadata}/use_flags.py    |  28 +-
 .../pym/repoman/modules/scan/options/__init__.py   |  28 +
 .../pym/repoman/modules/scan/options/options.py    |  29 +
 repoman/pym/repoman/modules/scan/scan.py           |  66 ++
 repoman/pym/repoman/modules/scan/scanbase.py       |  79 +++
 repoman/pym/repoman/modules/vcs/None/__init__.py   |  34 +
 repoman/pym/repoman/modules/vcs/None/changes.py    |  50 ++
 repoman/pym/repoman/modules/vcs/None/status.py     |  53 ++
 repoman/pym/repoman/modules/vcs/__init__.py        |  14 +
 repoman/pym/repoman/modules/vcs/bzr/__init__.py    |  34 +
 repoman/pym/repoman/modules/vcs/bzr/changes.py     |  68 ++
 repoman/pym/repoman/modules/vcs/bzr/status.py      |  70 ++
 repoman/pym/repoman/modules/vcs/changes.py         | 169 +++++
 repoman/pym/repoman/modules/vcs/cvs/__init__.py    |  34 +
 repoman/pym/repoman/modules/vcs/cvs/changes.py     | 118 ++++
 repoman/pym/repoman/modules/vcs/cvs/status.py      | 131 ++++
 repoman/pym/repoman/modules/vcs/git/__init__.py    |  34 +
 repoman/pym/repoman/modules/vcs/git/changes.py     | 120 ++++
 repoman/pym/repoman/modules/vcs/git/status.py      |  79 +++
 repoman/pym/repoman/modules/vcs/hg/__init__.py     |  34 +
 repoman/pym/repoman/modules/vcs/hg/changes.py      | 105 +++
 repoman/pym/repoman/modules/vcs/hg/status.py       |  65 ++
 repoman/pym/repoman/modules/vcs/settings.py        | 108 +++
 repoman/pym/repoman/modules/vcs/svn/__init__.py    |  34 +
 repoman/pym/repoman/modules/vcs/svn/changes.py     | 142 ++++
 repoman/pym/repoman/modules/vcs/svn/status.py      | 150 ++++
 repoman/pym/repoman/modules/vcs/vcs.py             | 161 +++++
 {pym => repoman/pym}/repoman/profile.py            |   0
 {pym => repoman/pym}/repoman/qa_data.py            |   2 +
 {pym => repoman/pym}/repoman/qa_tracker.py         |   0
 {pym => repoman/pym}/repoman/repos.py              |  13 +-
 repoman/pym/repoman/scanner.py                     | 434 ++++++++++++
 .../pym/repoman}/tests/__init__.py                 |  17 +-
 .../bin => repoman/pym/repoman/tests}/__test__.py  |   0
 .../pym/repoman/tests/changelog}/__init__.py       |   0
 .../repoman/tests/changelog}/test_echangelog.py    |   0
 .../pym/repoman}/tests/runTests.py                 |  12 +-
 .../pym/repoman/tests/simple}/__init__.py          |   0
 repoman/pym/repoman/tests/simple/__test__.py       |   1 +
 .../pym/repoman/tests/simple}/test_simple.py       |  17 +-
 {pym => repoman/pym}/repoman/utilities.py          |   7 -
 runtests => repoman/runtests                       |  22 +-
 setup.py => repoman/setup.py                       | 241 +------
 runtests                                           |  16 +-
 setup.py                                           |   6 +-
 192 files changed, 6092 insertions(+), 3417 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2018-01-07 10:09 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2018-01-07 10:09 UTC (permalink / raw
  To: gentoo-commits

commit:     0e3b0c33b73dd0a2b5331106baeb54b8628dae7c
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sun Jan  7 10:08:35 2018 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun Jan  7 10:08:35 2018 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=0e3b0c33

Merge tag 'portage-2.3.1' into multilib

New Release

 NEWS                                               |   6 ++
 RELEASE-NOTES                                      |  28 ++++-
 bin/chpathtool.py                                  |   2 +-
 bin/install-qa-check.d/10executable-issues         |   4 +-
 bin/install-qa-check.d/80libraries                 |   2 +-
 bin/install-qa-check.d/90gcc-warnings              |   4 +-
 cnf/make.conf.example                              |   2 +-
 cnf/make.conf.example.arm.diff                     |   2 +-
 cnf/make.conf.example.sh.diff                      |   2 +-
 cnf/make.conf.example.sparc.diff                   |   6 +-
 doc/config/sets.docbook                            |   4 +-
 doc/custom.xsl                                     |   2 +-
 doc/package/ebuild/eapi/4-python.docbook           |   2 +-
 doc/package/ebuild/eapi/5-progress.docbook         |   2 +-
 doc/portage.docbook                                |   2 +-
 doc/qa.docbook                                     |  12 +--
 man/color.map.5                                    |   2 +-
 man/dispatch-conf.1                                |   2 +-
 man/ebuild.1                                       |   2 +-
 man/ebuild.5                                       |  10 +-
 man/egencache.1                                    |   2 +-
 man/emaint.1                                       |   2 +-
 man/emerge.1                                       |  32 +++++-
 man/emirrordist.1                                  |   2 +-
 man/env-update.1                                   |   2 +-
 man/etc-update.1                                   |   2 +-
 man/fixpackages.1                                  |   2 +-
 man/make.conf.5                                    |  20 ++--
 man/portage.5                                      |  12 +--
 man/quickpkg.1                                     |   2 +-
 man/ru/color.map.5                                 |   2 +-
 man/ru/dispatch-conf.1                             |   2 +-
 man/ru/ebuild.1                                    |   2 +-
 man/ru/env-update.1                                |   2 +-
 man/ru/etc-update.1                                |   2 +-
 man/ru/fixpackages.1                               |   2 +-
 pym/_emerge/EbuildPhase.py                         |   2 +-
 pym/_emerge/Scheduler.py                           |  15 ++-
 pym/_emerge/actions.py                             |  43 ++++++--
 pym/_emerge/depgraph.py                            | 111 +++++++++++++++-----
 pym/_emerge/main.py                                |  41 +++++++-
 pym/_emerge/search.py                              |  26 ++++-
 pym/portage/__init__.py                            |  10 +-
 pym/portage/_emirrordist/FetchTask.py              |   2 +-
 pym/portage/_selinux.py                            |  24 +++--
 pym/portage/cache/anydbm.py                        |   4 +-
 pym/portage/cache/ebuild_xattr.py                  |   2 +-
 pym/portage/cache/flat_hash.py                     |  53 +++++-----
 pym/portage/cache/mappings.py                      |   4 +-
 pym/portage/cache/sqlite.py                        |   4 +-
 pym/portage/cache/template.py                      |  36 ++++++-
 pym/portage/data.py                                |   2 +-
 pym/portage/dbapi/_SyncfsProcess.py                |   2 +-
 pym/portage/dbapi/vartree.py                       |   4 +-
 pym/portage/dispatch_conf.py                       |   2 +-
 pym/portage/metadata.py                            |   2 +-
 pym/portage/news.py                                |  76 +++++++++-----
 pym/portage/package/ebuild/config.py               |  20 +++-
 pym/portage/package/ebuild/doebuild.py             |   4 +-
 pym/portage/sync/modules/git/git.py                |  27 ++++-
 .../tests/ebuild/test_array_fromfile_eof.py        |   2 +-
 pym/portage/tests/ebuild/test_ipc_daemon.py        |  23 +++--
 pym/portage/tests/emerge/test_simple.py            |  15 +++
 pym/portage/tests/news/test_NewsItem.py            |   1 +
 pym/portage/tests/process/test_poll.py             |   2 +-
 .../soname/test_slot_conflict_reinstall.py         |   1 +
 .../resolver/test_runtime_cycle_merge_order.py     |  72 +++++++++++++
 .../tests/resolver/test_slot_conflict_rebuild.py   |   2 +-
 .../resolver/test_slot_operator_reverse_deps.py    | 113 +++++++++++++++++++++
 pym/portage/util/__init__.py                       |   2 +-
 pym/portage/util/_desktop_entry.py                 |   2 +-
 pym/portage/util/_eventloop/EventLoop.py           |  17 +++-
 pym/portage/util/locale.py                         |  20 ++--
 pym/portage/util/writeable_check.py                |  28 ++++-
 pym/portage/xml/metadata.py                        |   2 +-
 pym/portage/xpak.py                                |   2 +-
 repoman/man/repoman.1                              |   8 +-
 repoman/pym/repoman/_subprocess.py                 |   4 +-
 repoman/pym/repoman/actions.py                     |  13 ++-
 repoman/pym/repoman/checks/herds/herdbase.py       |   2 +-
 repoman/pym/repoman/gpg.py                         |   2 +-
 repoman/pym/repoman/main.py                        |  10 +-
 repoman/pym/repoman/metadata.py                    |   4 +-
 .../repoman/modules/scan/depend/_depend_checks.py  |  25 +++--
 .../repoman/modules/scan/metadata/pkgmetadata.py   |   2 +-
 repoman/pym/repoman/modules/vcs/git/status.py      |   4 +-
 repoman/pym/repoman/qa_data.py                     |   2 -
 repoman/pym/repoman/scanner.py                     |   2 +
 repoman/pym/repoman/tests/simple/test_simple.py    |   8 +-
 setup.py                                           |  17 +++-
 src/portage_util_libc.c                            |  68 +++++++++++++
 testpath                                           |   9 +-
 92 files changed, 922 insertions(+), 266 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2018-01-07 10:30 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2018-01-07 10:30 UTC (permalink / raw
  To: gentoo-commits

commit:     c4fc96e0cc3f6f0cc6443373d9374df32a54d856
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sun Jan  7 10:29:49 2018 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun Jan  7 10:29:49 2018 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=c4fc96e0

Merge tag 'portage-2.3.2' into multilib

 .travis.yml                                       |  1 +
 README                                            | 19 ++++++++
 RELEASE-NOTES                                     | 13 ++++-
 bin/ebuild.sh                                     | 11 +++--
 bin/phase-functions.sh                            | 12 +++--
 bin/phase-helpers.sh                              |  2 +-
 doc/custom.xsl                                    |  2 +-
 doc/portage.docbook                               |  2 +-
 pym/portage/cache/fs_template.py                  |  2 +-
 pym/portage/locks.py                              | 59 ++++++++++++++++++++---
 pym/portage/package/ebuild/doebuild.py            |  9 ++--
 pym/portage/package/ebuild/prepare_build_dirs.py  |  6 ---
 pym/portage/sync/modules/git/git.py               | 14 ++++--
 repoman/pym/repoman/main.py                       |  2 +-
 repoman/pym/repoman/modules/scan/fetch/fetches.py |  6 +++
 setup.py                                          | 23 ++++++++-
 16 files changed, 147 insertions(+), 36 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2018-01-07 10:33 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2018-01-07 10:33 UTC (permalink / raw
  To: gentoo-commits

commit:     676927062dc65324ca68d72690114cff36265d1d
Author:     Brian Dolbec <dolsen <AT> gentoo <DOT> org>
AuthorDate: Fri Jan  6 17:14:54 2017 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Fri Jan  6 17:14:54 2017 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=67692706

Merge Coacher:extend-rdepend-suspect repoman updates

 commit '021199792ce55bdc0f99bc7791a2b31ba1533d2e'

 repoman/pym/repoman/qa_data.py | 3 +++
 1 file changed, 3 insertions(+)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2018-01-07 10:33 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2018-01-07 10:33 UTC (permalink / raw
  To: gentoo-commits

commit:     d6db617338b7764db3ad8eeb62907ec048a91ff4
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sun Jan  7 10:30:28 2018 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun Jan  7 10:30:28 2018 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=d6db6173

Merge tag 'portage-2.3.4' into multilib

version bump

 .gitignore                                         |   2 +
 .travis.yml                                        |   1 +
 RELEASE-NOTES                                      |  35 +++++
 bin/check-implicit-pointer-usage.py                |  22 +--
 bin/dispatch-conf                                  |   4 +-
 bin/etc-update                                     |  19 ++-
 bin/glsa-check                                     |  19 ++-
 bin/helper-functions.sh                            |   9 +-
 bin/portageq                                       |   7 +
 bin/save-ebuild-env.sh                             |   2 +-
 bin/socks5-server.py                               |   5 +
 cnf/make.conf.example                              |  18 +--
 cnf/make.conf.example.alpha.diff                   |   2 +-
 cnf/make.conf.example.amd64-fbsd.diff              |   2 +-
 cnf/make.conf.example.amd64.diff                   |   2 +-
 cnf/make.conf.example.arm.diff                     |   2 +-
 cnf/make.conf.example.hppa.diff                    |   2 +-
 cnf/make.conf.example.ia64.diff                    |   2 +-
 cnf/make.conf.example.m68k.diff                    |   2 +-
 cnf/make.conf.example.mips.diff                    |   2 +-
 cnf/make.conf.example.ppc.diff                     |   2 +-
 cnf/make.conf.example.ppc64.diff                   |   2 +-
 cnf/make.conf.example.s390.diff                    |   2 +-
 cnf/make.conf.example.sh.diff                      |   2 +-
 cnf/make.conf.example.sparc-fbsd.diff              |   2 +-
 cnf/make.conf.example.sparc.diff                   |   2 +-
 cnf/make.conf.example.x86-fbsd.diff                |   2 +-
 cnf/make.conf.example.x86.diff                     |   2 +-
 man/emaint.1                                       |   8 +-
 man/emerge.1                                       |   8 +-
 man/portage.5                                      |  11 +-
 pym/_emerge/actions.py                             |  17 ++-
 pym/_emerge/depgraph.py                            |  24 ++--
 pym/_emerge/main.py                                |   4 +-
 pym/_emerge/post_emerge.py                         |   6 +-
 pym/_emerge/resolver/slot_collision.py             |  37 ++++-
 pym/portage/__init__.py                            |   4 +-
 pym/portage/checksum.py                            |  78 ++++++++---
 pym/portage/const.py                               |   6 +-
 pym/portage/cvstree.py                             |   6 +-
 pym/portage/dbapi/bintree.py                       |  33 ++++-
 pym/portage/dbapi/vartree.py                       |  15 +-
 pym/portage/emaint/main.py                         |  12 +-
 pym/portage/emaint/modules/binhost/binhost.py      |   8 +-
 pym/portage/emaint/modules/config/config.py        |  14 +-
 pym/portage/emaint/modules/logs/logs.py            |  55 ++++----
 pym/portage/emaint/modules/merges/merges.py        |  18 ++-
 pym/portage/emaint/modules/move/move.py            |  15 +-
 pym/portage/emaint/modules/resume/resume.py        |   5 +-
 pym/portage/emaint/modules/sync/sync.py            | 156 +++++++++++----------
 pym/portage/emaint/modules/world/world.py          |  10 +-
 pym/portage/glsa.py                                |  12 +-
 pym/portage/news.py                                |   4 +-
 pym/portage/package/ebuild/fetch.py                |   4 +-
 pym/portage/process.py                             |   4 +
 pym/portage/repository/config.py                   |  16 ++-
 pym/portage/sync/controller.py                     |  13 +-
 pym/portage/sync/modules/git/__init__.py           |  16 +--
 pym/portage/sync/modules/git/git.py                |  11 +-
 pym/portage/tests/emerge/test_simple.py            |   1 +
 .../resolver/test_imagemagick_graphicsmagick.py    | 104 ++++++++++++++
 pym/portage/tests/{bin => sets}/__test__.py        |   0
 pym/portage/tests/{bin => sync}/__test__.py        |   0
 pym/portage/tests/sync/test_sync_local.py          |  23 ++-
 pym/portage/tests/util/test_getconfig.py           |   4 +-
 pym/portage/tests/util/test_varExpand.py           |   4 +-
 pym/portage/util/__init__.py                       |  13 +-
 pym/portage/util/_async/PopenProcess.py            |   9 +-
 pym/portage/util/_dyn_libs/LinkageMapELF.py        |  33 ++++-
 pym/portage/util/compression_probe.py              |   5 +-
 pym/portage/util/env_update.py                     |  10 +-
 pym/portage/util/lafilefixer.py                    |   8 +-
 pym/portage/versions.py                            |   8 +-
 pym/portage/xml/metadata.py                        |   4 +-
 repoman/MANIFEST.in                                |   1 +
 repoman/RELEASE-NOTES                              |  34 +++++
 repoman/cnf/metadata.xsd                           |   1 +
 repoman/man/repoman.1                              |   8 +-
 repoman/pym/repoman/__init__.py                    |  73 ++++++++++
 repoman/pym/repoman/actions.py                     |  12 +-
 repoman/pym/repoman/copyrights.py                  |  10 +-
 repoman/pym/repoman/main.py                        |   3 +-
 repoman/pym/repoman/modules/scan/ebuild/checks.py  |  51 +++----
 repoman/pym/repoman/modules/scan/ebuild/errors.py  |   6 +-
 repoman/pym/repoman/modules/scan/fetch/fetches.py  |   3 +
 .../modules/scan/metadata/ebuild_metadata.py       |  17 ++-
 .../repoman/modules/scan/metadata/pkgmetadata.py   |   2 +-
 repoman/pym/repoman/modules/vcs/cvs/changes.py     |   2 +-
 repoman/pym/repoman/modules/vcs/cvs/status.py      |   6 +-
 repoman/pym/repoman/modules/vcs/git/status.py      |  15 +-
 repoman/pym/repoman/modules/vcs/svn/changes.py     |   2 +-
 repoman/pym/repoman/qa_data.py                     |   8 ++
 .../pym/repoman/tests/changelog}/__test__.py       |   0
 repoman/runtests                                   |   1 +
 repoman/setup.py                                   |  42 +++++-
 runtests                                           |   1 +
 setup.py                                           |   2 +-
 97 files changed, 964 insertions(+), 367 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2018-01-07 10:33 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2018-01-07 10:33 UTC (permalink / raw
  To: gentoo-commits

commit:     6154d2d5738bf2b554edcf507a419d931244ad5f
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sun Jan  7 10:30:21 2018 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun Jan  7 10:30:21 2018 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=6154d2d5

Merge tag 'portage-2.3.3' into multilib

new release

 NEWS                                      | 10 ++++
 RELEASE-NOTES                             | 28 +++++++++++-
 bin/ebuild                                | 25 +++++++---
 bin/egencache                             | 76 ++-----------------------------
 bin/phase-helpers.sh                      |  7 ++-
 man/portage.5                             |  9 +++-
 pym/_emerge/depgraph.py                   | 23 ++++++++--
 pym/portage/dbapi/vartree.py              | 14 ++++++
 pym/portage/dep/__init__.py               | 16 +++++--
 pym/portage/dep/dep_check.py              | 41 +++++++++++++----
 pym/portage/manifest.py                   |  6 ++-
 pym/portage/package/ebuild/config.py      |  5 --
 pym/portage/package/ebuild/digestcheck.py |  2 +-
 pym/portage/package/ebuild/doebuild.py    |  9 ++--
 pym/portage/repository/config.py          | 18 ++++++--
 pym/portage/sync/modules/git/git.py       | 33 +-------------
 pym/portage/util/changelog.py             | 69 ++++++++++++++++++++++++++++
 pym/portage/versions.py                   | 23 +++++-----
 pym/portage/xml/metadata.py               | 28 +++++++++++-
 setup.py                                  |  2 +-
 20 files changed, 287 insertions(+), 157 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2018-01-07 10:33 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2018-01-07 10:33 UTC (permalink / raw
  To: gentoo-commits

commit:     c7938eca955a49b2fc7c7ce714bf0ab6d1a53c7b
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sun Jan  7 10:32:31 2018 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun Jan  7 10:32:31 2018 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=c7938eca

Merge tag 'portage-2.3.6' into multilib

 RELEASE-NOTES                                      |  29 +++
 bin/ebuild-helpers/dosym                           |  17 +-
 bin/emirrordist                                    |   8 +
 bin/phase-functions.sh                             |   5 +-
 bin/phase-helpers.sh                               |   8 +-
 man/ebuild.5                                       |   6 +-
 man/emerge.1                                       |  19 +-
 pym/_emerge/AsynchronousLock.py                    |  89 +++++++-
 pym/_emerge/EbuildBuild.py                         |  23 +-
 pym/_emerge/EbuildPhase.py                         |  14 +-
 pym/_emerge/PollScheduler.py                       |  57 +++--
 pym/_emerge/Scheduler.py                           |  10 +-
 pym/_emerge/SpawnProcess.py                        |   3 +-
 pym/_emerge/SubProcess.py                          |  23 +-
 pym/_emerge/UseFlagDisplay.py                      |  19 +-
 pym/_emerge/actions.py                             |  17 +-
 pym/_emerge/depgraph.py                            | 202 ++++++++++++++---
 pym/_emerge/main.py                                |  12 ++
 pym/portage/_emirrordist/FetchIterator.py          |  21 ++
 pym/portage/_emirrordist/MirrorDistTask.py         |  47 ++--
 pym/portage/dbapi/bintree.py                       |  19 +-
 pym/portage/dbapi/vartree.py                       |  22 +-
 pym/portage/package/ebuild/_spawn_nofetch.py       | 106 +++++----
 pym/portage/package/ebuild/config.py               |   3 -
 pym/portage/package/ebuild/doebuild.py             |   2 +-
 pym/portage/package/ebuild/prepare_build_dirs.py   |  13 ++
 pym/portage/tests/ebuild/test_ipc_daemon.py        |   3 +-
 pym/portage/tests/locks/test_asynchronous_lock.py  |  15 +-
 pym/portage/tests/resolver/test_autounmask.py      |  57 ++++-
 .../tests/resolver/test_autounmask_use_breakage.py |  40 ++++
 .../resolver/test_binary_pkg_ebuild_visibility.py  | 144 +++++++++++++
 .../tests/resolver/test_onlydeps_minimal.py        |  47 ++++
 .../test_slot_conflict_unsatisfied_deep_deps.py    |  61 ++++++
 ...ask.py => test_slot_operator_complete_graph.py} |  23 +-
 .../resolver/test_slot_operator_exclusive_slots.py |  39 ++++
 .../modules => tests/util/eventloop}/__init__.py   |   0
 .../tests/{bin => util/eventloop}/__test__.py      |   0
 .../tests/util/eventloop/test_call_soon_fifo.py    |  30 +++
 .../modules => tests/util/futures}/__init__.py     |   0
 .../tests/{bin => util/futures}/__test__.py        |   0
 .../tests/util/futures/test_done_callback.py       |  35 +++
 pym/portage/tests/util/test_digraph.py             |   6 +-
 pym/portage/util/_async/AsyncScheduler.py          |  16 +-
 pym/portage/util/_async/SchedulerInterface.py      |   6 +-
 pym/portage/util/_eventloop/EventLoop.py           |  99 ++++++++-
 pym/portage/util/digraph.py                        |  35 ++-
 pym/portage/util/futures/futures.py                | 238 ++++++++++++++-------
 repoman/man/repoman.1                              |   4 +
 repoman/pym/repoman/modules/scan/ebuild/checks.py  |  13 ++
 repoman/pym/repoman/qa_data.py                     |   4 +
 setup.py                                           |   7 +-
 src/portage_util_file_copy_reflink_linux.c         |  19 +-
 52 files changed, 1433 insertions(+), 302 deletions(-)

diff --cc bin/phase-functions.sh
index 5633d6313,dfd8733c8..b98023702
--- a/bin/phase-functions.sh
+++ b/bin/phase-functions.sh
@@@ -306,8 -281,9 +306,9 @@@ __dyn_clean() 
  			"$PORTAGE_BUILDDIR"/.ipc_{in,out,lock} \
  			"$PORTAGE_BUILDDIR"/.exit_status
  
- 		rm -rf "${PORTAGE_BUILDDIR}"/{build-info,abi-code}
- 		rm -rf "${WORKDIR}"*
 -		rm -rf "${PORTAGE_BUILDDIR}/build-info"
++		rm -rf "${PORTAGE_BUILDDIR}/{build-info,abi-code}"
+ 		rm -rf "${WORKDIR}"
+ 		rm -f "${PORTAGE_BUILDDIR}/files"
  	fi
  
  	if [ -f "${PORTAGE_BUILDDIR}/.unpacked" ]; then


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2018-01-07 10:33 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2018-01-07 10:33 UTC (permalink / raw
  To: gentoo-commits

commit:     284eeaaa4b2ded1a16313b1951489aadcbb68bc9
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sun Jan  7 10:30:33 2018 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun Jan  7 10:30:33 2018 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=284eeaaa

Merge tag 'portage-2.3.5' into multilib

new release

 .travis.yml                                        |   9 +-
 NEWS                                               |   7 +
 RELEASE-NOTES                                      |  18 +
 man/emerge.1                                       |  37 +-
 pym/_emerge/create_depgraph_params.py              |   5 +
 pym/_emerge/depgraph.py                            | 119 +++++--
 pym/_emerge/main.py                                |   5 +
 pym/portage/_emirrordist/FetchTask.py              |   2 +-
 pym/portage/checksum.py                            | 340 +++++++++++-------
 pym/portage/const.py                               |   3 +-
 pym/portage/dbapi/bintree.py                       |   4 +-
 pym/portage/dep/__init__.py                        |   4 +-
 pym/portage/eclass_cache.py                        |   2 +-
 pym/portage/manifest.py                            |   4 +-
 pym/portage/package/ebuild/config.py               |   7 +-
 pym/portage/package/ebuild/fetch.py                |  11 +-
 pym/portage/tests/resolver/ResolverPlayground.py   |   5 +
 .../soname/test_slot_conflict_reinstall.py         |  16 +-
 pym/portage/tests/resolver/test_bdeps.py           | 215 ++++++++++++
 pym/portage/tests/resolver/test_slot_abi.py        |  12 +-
 .../tests/resolver/test_slot_conflict_rebuild.py   |   8 +-
 .../resolver/test_slot_operator_exclusive_slots.py | 109 ++++++
 .../test_slot_operator_runtime_pkg_mask.py         | 136 ++++++++
 .../modules => tests/util/file_copy}/__init__.py   |   0
 .../tests/{bin => util/file_copy}/__test__.py      |   0
 pym/portage/tests/util/file_copy/test_copyfile.py  |  71 ++++
 pym/portage/tests/util/test_checksum.py            | 106 ++++++
 pym/portage/util/file_copy/__init__.py             |  36 ++
 pym/portage/util/movefile.py                       |   5 +-
 repoman/pym/repoman/actions.py                     |  21 +-
 repoman/pym/repoman/modules/scan/ebuild/checks.py  |  26 ++
 repoman/pym/repoman/modules/scan/ebuild/errors.py  |   2 +
 repoman/pym/repoman/qa_data.py                     |   4 +-
 repoman/pym/repoman/utilities.py                   |  39 ++-
 setup.py                                           |  11 +-
 src/portage_util_file_copy_reflink_linux.c         | 385 +++++++++++++++++++++
 36 files changed, 1573 insertions(+), 211 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2018-01-07 10:38 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2018-01-07 10:38 UTC (permalink / raw
  To: gentoo-commits

commit:     16fcf4998f4b55f1697e4358c7b232e3cab56a11
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sun Jan  7 10:38:27 2018 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun Jan  7 10:38:27 2018 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=16fcf499

Merge tag 'portage-2.3.7' into multilib

 .editorconfig                                      |  14 +++
 .travis.yml                                        |   4 +-
 NEWS                                               |  15 +++
 RELEASE-NOTES                                      |  16 ++-
 bin/ebuild-helpers/doman                           |   1 +
 bin/install-qa-check.d/80multilib-strict           |   7 +-
 bin/misc-functions.sh                              |   6 +-
 bin/phase-helpers.sh                               |  45 +++++---
 bin/quickpkg                                       |  62 ++++++++---
 cnf/make.globals                                   |   3 +-
 man/emerge.1                                       |   7 ++
 man/make.conf.5                                    |  25 +++++
 man/portage.5                                      |  27 ++++-
 pym/_emerge/BinpkgExtractorAsync.py                |  43 +++++++-
 pym/_emerge/actions.py                             |  15 +++
 pym/_emerge/depgraph.py                            | 117 +++++++++++++++++----
 pym/_emerge/main.py                                |   9 ++
 pym/_emerge/search.py                              |  24 ++++-
 pym/portage/const.py                               |   3 +-
 pym/portage/dbapi/bintree.py                       |  18 ++--
 pym/portage/dep/dep_check.py                       |   6 +-
 pym/portage/localization.py                        |   2 +-
 .../package/ebuild/_config/KeywordsManager.py      |   4 +-
 pym/portage/package/ebuild/_config/UseManager.py   |   5 +-
 .../package/ebuild/_config/special_env_vars.py     |   3 +-
 pym/portage/package/ebuild/config.py               |  27 +++++
 pym/portage/package/ebuild/doebuild.py             |  34 +++++-
 pym/portage/sync/modules/git/__init__.py           |   8 +-
 pym/portage/sync/modules/git/git.py                |  37 ++++++-
 pym/portage/sync/modules/rsync/__init__.py         |   3 +-
 pym/portage/sync/modules/rsync/rsync.py            |  12 +++
 pym/portage/sync/syncbase.py                       |   5 +-
 pym/portage/tests/emerge/test_simple.py            |   5 +-
 .../tests/resolver/test_autounmask_binpkg_use.py   |  64 +++++++++++
 .../resolver/test_autounmask_keep_keywords.py      |  72 +++++++++++++
 pym/portage/util/_urlopen.py                       |  12 +++
 pym/portage/util/compression_probe.py              |  45 ++++++--
 repoman/RELEASE-NOTES                              |  12 +++
 repoman/bin/repoman                                |   4 +-
 repoman/man/repoman.1                              |  20 +++-
 repoman/pym/repoman/actions.py                     |  55 ++++++++--
 repoman/pym/repoman/argparser.py                   |  16 ++-
 repoman/pym/repoman/main.py                        |   4 +-
 repoman/pym/repoman/modules/scan/ebuild/checks.py  |   5 +
 .../pym/repoman/modules/scan/keywords/keywords.py  |  26 ++++-
 .../repoman/modules/scan/metadata/pkgmetadata.py   |  10 ++
 repoman/pym/repoman/qa_data.py                     |   1 +
 repoman/pym/repoman/scanner.py                     |   2 +-
 repoman/pym/repoman/tests/runTests.py              |   4 +-
 repoman/runtests                                   |   4 +-
 repoman/setup.py                                   |   2 +-
 setup.py                                           |   8 +-
 52 files changed, 844 insertions(+), 134 deletions(-)

diff --cc pym/_emerge/actions.py
index 6f6646b34,3c6c265f7..d9647dd9a
--- a/pym/_emerge/actions.py
+++ b/pym/_emerge/actions.py
@@@ -2862,13 -2872,11 +2872,18 @@@ def run_action(emerge_config)
  	adjust_configs(emerge_config.opts, emerge_config.trees)
  	apply_priorities(emerge_config.target_config.settings)
  
 +	if 'force-multilib' in emerge_config.target_config.settings.features:
 +		if emerge_config.target_config.settings.get("NO_AUTO_FLAG", "") is "":
 +			writemsg_level(bad("!!! Failed to find vars from extra profile") + "\n",level=logging.ERROR, noiselevel=-1)
 +			writemsg_level(bad("!!! Please make sure that you did follow the instructions and included the extra profile\n"),level=logging.ERROR, noiselevel=-1)
 +			writemsg_level(bad("!!! http://git.overlays.gentoo.org/gitweb/?p=proj/multilib-portage.git;a=blob;f=doc/portage-multilib-instructions\n"),level=logging.ERROR, noiselevel=-1)
 +			writemsg_level(bad("!!! has some basic instructions for the setup\n"),level=logging.ERROR, noiselevel=-1)
 +			return 1
+ 	if ("--autounmask-continue" in emerge_config.opts and
+ 		emerge_config.opts.get("--autounmask") == "n"):
+ 		writemsg_level(
+ 			" %s --autounmask-continue has been disabled by --autounmask=n\n" %
+ 			warn("*"), level=logging.WARNING, noiselevel=-1)
  
  	for fmt in emerge_config.target_config.settings.get("PORTAGE_BINPKG_FORMAT", "").split():
  		if not fmt in portage.const.SUPPORTED_BINPKG_FORMATS:


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2018-01-07 10:43 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2018-01-07 10:43 UTC (permalink / raw
  To: gentoo-commits

commit:     6326008f9b4faac9e5e984b67a6d0a1a176cbf0a
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sun Jan  7 10:39:38 2018 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun Jan  7 10:39:38 2018 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=6326008f

Merge tag 'portage-2.3.11' into multilib

portage-2.3.11

 RELEASE-NOTES                                      | 14 ++++
 bin/postinst-qa-check.d/50gnome2-utils             |  8 +-
 bin/postinst-qa-check.d/50xdg-utils                | 12 +--
 pym/_emerge/depgraph.py                            | 38 ++++++++--
 pym/_emerge/search.py                              |  8 +-
 .../resolver/test_autounmask_use_backtrack.py      | 86 ++++++++++++++++++++++
 .../tests/resolver/test_slot_conflict_update.py    |  2 +-
 setup.py                                           |  2 +-
 8 files changed, 152 insertions(+), 18 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2018-01-07 10:43 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2018-01-07 10:43 UTC (permalink / raw
  To: gentoo-commits

commit:     dfc32ac920fa86c8f0b25321a73ec99022ee7591
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sun Jan  7 10:40:01 2018 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun Jan  7 10:40:01 2018 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=dfc32ac9

Merge tag 'portage-2.3.13' into multilib

portage-2.3.13

 .travis.yml                                |  2 +
 RELEASE-NOTES                              |  9 +++
 bin/misc-functions.sh                      | 18 +++---
 bin/postinst-qa-check.d/50gnome2-utils     |  6 ++
 bin/postinst-qa-check.d/50xdg-utils        | 12 ++++
 bin/preinst-qa-check.d/50gnome2-utils      |  1 +
 bin/preinst-qa-check.d/50xdg-utils         |  1 +
 doc/config/bashrc.docbook                  | 15 +++++
 man/ebuild.5                               | 76 +----------------------
 pym/portage/checksum.py                    | 17 ++++-
 pym/portage/package/ebuild/doebuild.py     |  1 +
 pym/portage/sync/modules/rsync/rsync.py    |  6 +-
 repoman/RELEASE-NOTES                      |  5 ++
 repoman/setup.py                           |  2 +-
 setup.py                                   |  2 +-
 src/portage_util_file_copy_reflink_linux.c | 99 ++++++++++++++++++------------
 16 files changed, 144 insertions(+), 128 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2018-01-07 10:43 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2018-01-07 10:43 UTC (permalink / raw
  To: gentoo-commits

commit:     4d099159120c927f18a23c8775636370da1d8793
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sun Jan  7 10:40:06 2018 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun Jan  7 10:40:06 2018 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=4d099159

Merge tag 'portage-2.3.14' into multilib

portage-2.3.14

 NEWS                                               |   5 +
 RELEASE-NOTES                                      |   8 ++
 man/portage.5                                      |  13 +-
 pym/portage/_emirrordist/FetchTask.py              |   2 +-
 pym/portage/const.py                               |  29 +---
 pym/portage/dbapi/vartree.py                       |  42 +++++-
 pym/portage/dep/_dnf.py                            |  90 +++++++++++++
 pym/portage/dep/dep_check.py                       | 147 +++++++++++++++++++--
 pym/portage/manifest.py                            |  35 ++---
 pym/portage/package/ebuild/digestgen.py            |   7 +-
 pym/portage/package/ebuild/doebuild.py             |  17 ++-
 pym/portage/repository/config.py                   |  45 +++++--
 pym/portage/tests/dep/test_dnf_convert.py          |  48 +++++++
 pym/portage/tests/dep/test_overlap_dnf.py          |  28 ++++
 pym/portage/tests/ebuild/test_config.py            |   1 +
 .../tests/resolver/test_or_downgrade_installed.py  |  97 ++++++++++++++
 .../resolver/test_virtual_minimize_children.py     | 145 ++++++++++++++++++++
 repoman/pym/repoman/repos.py                       |  17 ++-
 setup.py                                           |   2 +-
 19 files changed, 701 insertions(+), 77 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2018-01-07 10:43 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2018-01-07 10:43 UTC (permalink / raw
  To: gentoo-commits

commit:     252b6373d6716a503f990856f0e3619f2afc3fd7
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sun Jan  7 10:39:14 2018 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun Jan  7 10:39:14 2018 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=252b6373

Merge tag 'portage-2.3.9' into multilib

 NEWS                                               |  2 +
 RELEASE-NOTES                                      | 19 +++++
 bin/clean_locks                                    |  2 +-
 bin/dispatch-conf                                  |  2 +-
 bin/ebuild                                         |  2 +-
 bin/ebuild.sh                                      |  9 +++
 bin/emaint                                         |  2 +-
 bin/env-update                                     |  2 +-
 bin/isolated-functions.sh                          |  4 ++
 bin/misc-functions.sh                              | 59 ++++++++++++++-
 bin/phase-functions.sh                             | 53 ++++++++++++--
 bin/portageq                                       |  2 +-
 bin/postinst-qa-check.d/50gnome2-utils             | 52 ++++++++++++++
 bin/postinst-qa-check.d/50xdg-utils                | 83 ++++++++++++++++++++++
 bin/quickpkg                                       | 25 ++++---
 pym/_emerge/AsynchronousLock.py                    |  6 +-
 pym/portage/dbapi/vartree.py                       |  5 +-
 pym/portage/elog/mod_echo.py                       | 13 +++-
 .../package/ebuild/_config/special_env_vars.py     |  4 +-
 pym/portage/package/ebuild/doebuild.py             |  5 +-
 pym/portage/repository/config.py                   |  4 +-
 pym/portage/sync/syncbase.py                       |  8 +--
 pym/portage/tests/locks/test_asynchronous_lock.py  |  8 ++-
 pym/portage/util/digraph.py                        | 12 ++--
 repoman/man/repoman.1                              | 18 +++--
 repoman/pym/repoman/actions.py                     | 17 ++---
 setup.py                                           |  2 +-
 tabcheck.py                                        |  2 +-
 28 files changed, 362 insertions(+), 60 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2018-01-07 10:43 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2018-01-07 10:43 UTC (permalink / raw
  To: gentoo-commits

commit:     86232affabdb17a0526dc1d03e4a693800d69008
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sun Jan  7 10:39:33 2018 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun Jan  7 10:39:33 2018 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=86232aff

Merge tag 'portage-2.3.10' into multilib

 RELEASE-NOTES                          |  7 +++++++
 bin/postinst-qa-check.d/50gnome2-utils | 13 ++++++++-----
 bin/postinst-qa-check.d/50xdg-utils    | 26 ++++++++++++++++----------
 setup.py                               |  2 +-
 4 files changed, 32 insertions(+), 16 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2018-01-07 10:43 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2018-01-07 10:43 UTC (permalink / raw
  To: gentoo-commits

commit:     a3ffba07f7d4b8a583bd58ff3c42b0a580317b1a
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sun Jan  7 10:40:11 2018 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun Jan  7 10:40:11 2018 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=a3ffba07

Merge tag 'portage-2.3.15' into multilib

portage-2.3.15

 RELEASE-NOTES                                    |  9 +++
 bin/quickpkg                                     | 15 +++--
 pym/portage/dbapi/bintree.py                     | 80 ++++++++++++++----------
 pym/portage/manifest.py                          |  2 +-
 pym/portage/package/ebuild/_config/UseManager.py |  5 +-
 pym/portage/util/__init__.py                     |  6 +-
 repoman/RELEASE-NOTES                            | 12 ++++
 repoman/pym/repoman/tests/simple/test_simple.py  | 15 -----
 repoman/setup.py                                 | 24 ++++++-
 setup.py                                         | 10 ++-
 10 files changed, 115 insertions(+), 63 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2018-01-07 10:43 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2018-01-07 10:43 UTC (permalink / raw
  To: gentoo-commits

commit:     d8c91b341ffad9d2e2199ad90633ae9762825477
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sun Jan  7 10:40:15 2018 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun Jan  7 10:40:15 2018 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=d8c91b34

Merge tag 'portage-2.3.16' into multilib

portage-2.3.16

 RELEASE-NOTES                                 |  7 +++++++
 pym/portage/dbapi/bintree.py                  |  9 +++++++--
 pym/portage/emaint/modules/binhost/binhost.py | 10 +++++-----
 pym/portage/sync/modules/git/git.py           |  2 +-
 pym/portage/sync/modules/rsync/rsync.py       |  2 +-
 pym/portage/tests/sync/test_sync_local.py     |  2 +-
 setup.py                                      |  2 +-
 7 files changed, 23 insertions(+), 11 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2018-01-07 10:43 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2018-01-07 10:43 UTC (permalink / raw
  To: gentoo-commits

commit:     2acb493dac53adbd860a992f4bbf4f10b46bba9a
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sun Jan  7 10:39:53 2018 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun Jan  7 10:39:53 2018 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=2acb493d

Merge tag 'portage-2.3.12' into multilib

portage-2.3.12

 NEWS                                    |   7 ++
 RELEASE-NOTES                           |  12 ++++
 bin/ebuild-helpers/prepstrip            |  20 ++++--
 bin/install-qa-check.d/10ignored-flags  |   5 +-
 man/ebuild.5                            |   2 +-
 man/emerge.1                            |   2 +-
 man/make.conf.5                         |   4 +-
 man/portage.5                           |  14 ++--
 pym/_emerge/BinpkgExtractorAsync.py     |  26 ++++---
 pym/_emerge/depgraph.py                 |  45 +++++++++++-
 pym/_emerge/resolver/package_tracker.py |  87 +++++++++++++++++-----
 pym/portage/dbapi/porttree.py           | 123 ++++++++++++++++++++++++++++----
 pym/portage/elog/mod_echo.py            |   4 +-
 setup.py                                |   2 +-
 14 files changed, 292 insertions(+), 61 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2018-01-07 10:43 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2018-01-07 10:43 UTC (permalink / raw
  To: gentoo-commits

commit:     9aff2af7bd5b5d2a851e7619b9bf8f5ee35a7b93
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sun Jan  7 10:42:54 2018 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun Jan  7 10:42:54 2018 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=9aff2af7

Merge tag 'portage-2.3.18' into multilib

portage-2.3.18

 RELEASE-NOTES                             |  9 +++++++++
 bin/doins.py                              |  6 +++++-
 bin/phase-functions.sh                    |  2 +-
 cnf/make.globals                          |  5 ++++-
 pym/_emerge/BinpkgExtractorAsync.py       |  4 ++--
 pym/_emerge/Package.py                    | 32 +++++++++++++++++++++++++++++++
 pym/portage/dbapi/__init__.py             |  5 +++++
 pym/portage/package/ebuild/config.py      |  6 ++++++
 pym/portage/tests/dbapi/test_fakedbapi.py | 20 +++++++++++++++++++
 setup.py                                  |  2 +-
 10 files changed, 85 insertions(+), 6 deletions(-)

diff --cc pym/_emerge/Package.py
index 23abb4fe8,cebfd8281..5f3de3175
--- a/pym/_emerge/Package.py
+++ b/pym/_emerge/Package.py
@@@ -82,17 -83,14 +83,21 @@@ class Package(Task)
  
  		if eapi_attrs.iuse_effective:
  			implicit_match = self.root_config.settings._iuse_effective_match
+ 			if self.built:
+ 				implicit_match = functools.partial(
+ 					self._built_iuse_effective_match,
+ 					implicit_match, frozenset(self._metadata['USE'].split()))
  		else:
  			implicit_match = self.root_config.settings._iuse_implicit_match
 +		iuse = self._metadata["IUSE"]
 +		if 'force-multilib' in self.root_config.settings.features:
 +			if self.built is False:
 +				for multilib_abis in self.root_config.settings.get("MULTILIB_ABIS", '').split():
 +					iuse += " multilib_abi_" + multilib_abis
 +				iuse += " abiwrapper"
 +				self._metadata["IUSE"] = iuse
  		usealiases = self.root_config.settings._use_manager.getUseAliases(self)
 -		self.iuse = self._iuse(self, self._metadata["IUSE"].split(), implicit_match,
 +		self.iuse = self._iuse(self, iuse.split(), implicit_match,
  			usealiases, self.eapi)
  
  		if (self.iuse.enabled or self.iuse.disabled) and \


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2018-01-07 10:43 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2018-01-07 10:43 UTC (permalink / raw
  To: gentoo-commits

commit:     e54d9bf70ed9310a7ccda6aba93234abee3c1e75
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sun Jan  7 10:42:58 2018 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun Jan  7 10:42:58 2018 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=e54d9bf7

Merge tag 'portage-2.3.19' into multilib

portage-2.3.19

 RELEASE-NOTES                              | 7 +++++++
 bin/ebuild-helpers/doins                   | 2 +-
 setup.py                                   | 2 +-
 src/portage_util_file_copy_reflink_linux.c | 4 ++--
 4 files changed, 11 insertions(+), 4 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2018-01-07 10:43 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2018-01-07 10:43 UTC (permalink / raw
  To: gentoo-commits

commit:     4d42c6dde9572c3b9dac7dadf1366420b05f37e3
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sun Jan  7 10:42:45 2018 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun Jan  7 10:42:45 2018 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=4d42c6dd

Merge tag 'portage-2.3.17' into multilib

 COPYING                                            |  35 ++
 NEWS                                               |   5 +
 RELEASE-NOTES                                      |   9 +
 bin/doins.py                                       | 579 +++++++++++++++++++++
 bin/ebuild-helpers/doins                           | 156 ++----
 bin/phase-helpers.sh                               |   3 +-
 pym/_emerge/Scheduler.py                           |  36 --
 pym/_emerge/depgraph.py                            |  12 +-
 pym/_emerge/main.py                                |   3 +-
 pym/portage/checksum.py                            |   9 +-
 pym/portage/output.py                              |   2 +-
 pym/portage/package/ebuild/config.py               |   4 +-
 pym/portage/tests/bin/test_doins.py                | 352 +++++++++++++
 .../resolver/test_disjunctive_depend_order.py      |  87 ++++
 .../tests/resolver/test_onlydeps_minimal.py        |   5 +-
 pym/portage/tests/versions/test_vercmp.py          |   3 -
 pym/portage/versions.py                            |  38 +-
 setup.py                                           |   2 +-
 18 files changed, 1153 insertions(+), 187 deletions(-)

diff --cc bin/phase-helpers.sh
index 8e3721dba,9b1f6adbe..0a3bcdf1f
--- a/bin/phase-helpers.sh
+++ b/bin/phase-helpers.sh
@@@ -193,9 -193,9 +193,10 @@@ use() 
  	# a full profile with IUSE_IMPLICIT and stuff (see bug #456830).
  	elif [[ -n $PORTAGE_IUSE && -n $EBUILD_PHASE &&
  		-n $PORTAGE_INTERNAL_CALLER ]] ; then
 -		if [[ ! $u =~ $PORTAGE_IUSE ]] ; then
 +		if ( [[ ! " ${FEATURES} " == *" force-multilib "* && $u == multilib ]] && \
 +			[[ ! $u =~ $PORTAGE_IUSE ]] ) ; then
- 			if [[ ! ${EAPI} =~ ^(0|1|2|3|4|4-python|4-slot-abi)$ ]] ; then
+ 			if [[ ${EMERGE_FROM} != binary &&
+ 				! ${EAPI} =~ ^(0|1|2|3|4|4-python|4-slot-abi)$ ]] ; then
  				# This is only strict starting with EAPI 5, since implicit IUSE
  				# is not well defined for earlier EAPIs (see bug #449708).
  				die "USE Flag '${u}' not in IUSE for ${CATEGORY}/${PF}"


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2018-03-03 15:18 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2018-03-03 15:18 UTC (permalink / raw
  To: gentoo-commits

commit:     3228956aed7ba7caaaad7a07e48ed6013f73e523
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sat Mar  3 15:17:29 2018 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sat Mar  3 15:17:29 2018 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=3228956a

Merge tag 'portage-2.3.24' into multilib

portage-2.3.24

 NEWS                                               |   4 +
 RELEASE-NOTES                                      |  46 ++++++
 bin/doins.py                                       |  38 ++++-
 bin/emerge-webrsync                                |  11 +-
 bin/install-qa-check.d/90cmake-warnings            |  28 ++++
 bin/install-qa-check.d/95empty-dirs                |  42 ++++++
 cnf/repos.conf                                     |   2 +
 man/ebuild.5                                       |  12 +-
 man/egencache.1                                    |   6 +-
 man/emaint.1                                       |  22 +--
 man/emerge.1                                       | 102 ++++++-------
 man/make.conf.5                                    |   4 +
 man/portage.5                                      |  14 ++
 misc/emerge-delta-webrsync                         |  11 +-
 pym/_emerge/EbuildExecuter.py                      |   6 +-
 pym/_emerge/EbuildPhase.py                         |   6 +-
 pym/_emerge/FakeVartree.py                         |   2 +-
 pym/_emerge/Scheduler.py                           |   3 +-
 pym/_emerge/actions.py                             |   7 +-
 pym/_emerge/create_depgraph_params.py              |  11 +-
 pym/_emerge/depgraph.py                            | 104 +++++++++++++-
 pym/_emerge/main.py                                |  13 ++
 pym/portage/const.py                               |   5 +-
 pym/portage/dep/dep_check.py                       |  75 +++++++---
 pym/portage/dep/soname/multilib_category.py        |   4 +-
 pym/portage/package/ebuild/config.py               |  11 +-
 pym/portage/package/ebuild/doebuild.py             |  42 +-----
 pym/portage/package/ebuild/prepare_build_dirs.py   |  31 +++-
 pym/portage/repository/config.py                   |   9 +-
 pym/portage/sync/modules/rsync/__init__.py         |   4 +-
 pym/portage/sync/modules/rsync/rsync.py            |  41 +++++-
 pym/portage/tests/bin/test_doins.py                |   7 +-
 pym/portage/tests/dep/test_overlap_dnf.py          |   2 +-
 pym/portage/tests/resolver/test_changed_deps.py    |   1 +
 pym/portage/tests/resolver/test_multirepo.py       |   4 +-
 .../tests/resolver/test_or_upgrade_installed.py    | 160 +++++++++++++++++++++
 .../resolver/test_virtual_minimize_children.py     | 144 ++++++++++++++++++-
 pym/portage/tests/resolver/test_virtual_slot.py    |   2 +-
 .../util/_dyn_libs/PreservedLibsRegistry.py        |   3 +-
 pym/portage/util/elf/constants.py                  |   1 +
 repoman/man/repoman.1                              |   8 ++
 repoman/pym/repoman/modules/scan/depend/profile.py |   2 +
 repoman/pym/repoman/qa_data.py                     |   8 ++
 setup.py                                           |   2 +-
 44 files changed, 890 insertions(+), 170 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2018-04-14 12:16 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2018-04-14 12:16 UTC (permalink / raw
  To: gentoo-commits

commit:     ee29b930b880050eb9a04c06d0f1a0edd0e1fc27
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sat Apr 14 12:11:15 2018 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sat Apr 14 12:11:15 2018 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=ee29b930

Merge portage-2.3.28

 .travis.yml                                        |    2 +
 NEWS                                               |    4 +
 RELEASE-NOTES                                      |   50 +
 bin/eapi.sh                                        |   42 +-
 bin/eapi7-ver-funcs.sh                             |  191 ++++
 bin/ebuild                                         |    2 +
 bin/ebuild-helpers/dobin                           |   16 +-
 bin/ebuild-helpers/doconfd                         |   11 +-
 bin/ebuild-helpers/dodir                           |    4 +-
 bin/ebuild-helpers/dodoc                           |    2 +-
 bin/ebuild-helpers/doenvd                          |   11 +-
 bin/ebuild-helpers/doexe                           |    8 +-
 bin/ebuild-helpers/dohard                          |    6 +-
 bin/ebuild-helpers/doheader                        |    8 +-
 bin/ebuild-helpers/dohtml                          |    7 +-
 bin/ebuild-helpers/doinfo                          |    8 +-
 bin/ebuild-helpers/doins                           |   18 +-
 bin/ebuild-helpers/dolib                           |   17 +-
 bin/ebuild-helpers/dolib.a                         |    4 +-
 bin/ebuild-helpers/dolib.so                        |    4 +-
 bin/ebuild-helpers/doman                           |    8 +-
 bin/ebuild-helpers/domo                            |   21 +-
 bin/ebuild-helpers/dosbin                          |   16 +-
 bin/ebuild-helpers/dosed                           |    4 +-
 bin/ebuild-helpers/dosym                           |    8 +-
 bin/ebuild-helpers/ecompressdir                    |   25 +-
 bin/ebuild-helpers/fowners                         |    4 +-
 bin/ebuild-helpers/fperms                          |    4 +-
 bin/ebuild-helpers/keepdir                         |    6 +-
 bin/ebuild-helpers/newins                          |    2 +-
 bin/ebuild-helpers/nonfatal                        |   14 +
 bin/ebuild-helpers/prepall                         |    2 +-
 bin/ebuild-helpers/prepalldocs                     |    4 +-
 bin/ebuild-helpers/prepallinfo                     |    4 +-
 bin/ebuild-helpers/prepallstrip                    |    4 +
 bin/ebuild-helpers/prepinfo                        |   12 +-
 bin/ebuild-helpers/prepman                         |   10 +-
 bin/ebuild-helpers/prepstrip                       |  401 +-------
 bin/ebuild.sh                                      |   47 +-
 bin/emerge                                         |    1 +
 bin/{ebuild-helpers/prepstrip => estrip}           |   93 +-
 bin/etc-update                                     |   30 +-
 bin/filter-bash-environment.py                     |   47 +-
 bin/install-qa-check.d/60udev                      |    6 +-
 bin/install-qa-check.d/80libraries                 |   22 +-
 bin/isolated-functions.sh                          |   40 +-
 bin/misc-functions.sh                              |  131 +--
 bin/phase-functions.sh                             |   50 +-
 bin/phase-helpers.sh                               |  114 ++-
 bin/portageq                                       |   18 +-
 bin/postinst-qa-check.d/50gnome2-utils             |    3 +
 bin/save-ebuild-env.sh                             |    8 +-
 bin/xattr-helper.py                                |   19 +-
 cnf/repos.conf                                     |    6 +
 man/ebuild.5                                       |   10 -
 man/emerge.1                                       |   26 +-
 man/portage.5                                      |   29 +-
 pym/_emerge/BlockerDB.py                           |    4 +-
 pym/_emerge/EbuildPhase.py                         |    7 +
 pym/_emerge/Package.py                             |   32 +-
 pym/_emerge/PackagePhase.py                        |   93 ++
 pym/_emerge/actions.py                             |   16 +-
 pym/_emerge/create_depgraph_params.py              |   12 +-
 pym/_emerge/depgraph.py                            |   77 +-
 pym/_emerge/main.py                                |   24 +-
 pym/_emerge/resolver/output.py                     |    4 +-
 pym/_emerge/search.py                              |    4 +
 pym/_emerge/show_invalid_depstring_notice.py       |    4 +-
 pym/portage/__init__.py                            |   58 +-
 pym/portage/_sets/base.py                          |   17 +-
 pym/portage/cache/metadata.py                      |    4 +-
 pym/portage/const.py                               |    3 +-
 pym/portage/dbapi/__init__.py                      |    4 +-
 pym/portage/dbapi/bintree.py                       |   16 +-
 pym/portage/dbapi/dep_expand.py                    |    2 +-
 pym/portage/dbapi/porttree.py                      |  105 +-
 pym/portage/dbapi/vartree.py                       |   66 +-
 pym/portage/dep/__init__.py                        |   27 +-
 pym/portage/dep/_slot_operator.py                  |    7 +-
 pym/portage/eapi.py                                |   43 +-
 pym/portage/emaint/modules/move/move.py            |    4 +-
 pym/portage/module.py                              |   49 +-
 pym/portage/package/ebuild/_config/MaskManager.py  |   10 +-
 .../package/ebuild/_config/special_env_vars.py     |    7 +-
 pym/portage/package/ebuild/config.py               |  137 +--
 pym/portage/package/ebuild/doebuild.py             |   26 +-
 pym/portage/process.py                             |   30 +-
 pym/portage/repository/config.py                   |   27 +-
 pym/portage/sync/modules/git/__init__.py           |    3 +-
 pym/portage/sync/modules/git/git.py                |   95 +-
 pym/portage/sync/modules/rsync/__init__.py         |    1 +
 pym/portage/sync/modules/rsync/rsync.py            |  479 +++++----
 pym/portage/sync/syncbase.py                       |   87 +-
 pym/portage/tests/bin/test_eapi7_ver_funcs.py      |  240 +++++
 pym/portage/tests/bin/test_filter_bash_env.py      |  115 +++
 pym/portage/tests/dep/testCheckRequiredUse.py      |    5 +-
 pym/portage/tests/ebuild/test_ipc_daemon.py        |   12 +-
 pym/portage/tests/resolver/ResolverPlayground.py   |    2 +-
 pym/portage/tests/resolver/test_autounmask.py      |   25 +-
 pym/portage/tests/resolver/test_complete_graph.py  |   20 +-
 pym/portage/tests/resolver/test_eapi.py            |    9 +-
 pym/portage/tests/resolver/test_required_use.py    |   22 +-
 .../resolver/test_slot_change_without_revbump.py   |   19 +
 .../tests/resolver/test_virtual_transition.py      |   51 -
 .../tests/util/futures/test_iter_completed.py      |   50 +
 pym/portage/tests/util/futures/test_retry.py       |  147 +++
 pym/portage/util/_async/AsyncTaskFuture.py         |   31 +
 pym/portage/util/_eventloop/EventLoop.py           |   92 +-
 pym/portage/util/backoff.py                        |   53 +
 .../modules => util/futures/executor}/__init__.py  |    0
 pym/portage/util/futures/executor/fork.py          |  134 +++
 pym/portage/util/futures/futures.py                |    6 +
 pym/portage/util/futures/iter_completed.py         |   63 ++
 pym/portage/util/futures/retry.py                  |  183 ++++
 pym/portage/util/futures/wait.py                   |   92 ++
 pym/portage/util/install_mask.py                   |  125 +++
 pym/portage/util/monotonic.py                      |   34 +
 pym/portage/util/movefile.py                       |    4 +-
 repoman/NEWS                                       |    5 +
 repoman/RELEASE-NOTES                              |   13 +
 repoman/cnf/linechecks/linechecks.yaml             |   35 +
 repoman/cnf/qa_data/qa_data.yaml                   |  136 +++
 repoman/cnf/repository/linechecks.yaml             |  252 +++++
 repoman/cnf/repository/qa_data.yaml                |  160 +++
 repoman/cnf/repository/repository.yaml             |   76 ++
 repoman/man/repoman.1                              |   19 +-
 repoman/pym/repoman/actions.py                     |  100 +-
 repoman/pym/repoman/argparser.py                   |    8 +-
 repoman/pym/repoman/config.py                      |  159 +++
 repoman/pym/repoman/main.py                        |   30 +-
 repoman/pym/repoman/metadata.py                    |    2 +-
 .../__test__.py => modules/linechecks/__init__.py} |    0
 .../modules/linechecks/assignment/__init__.py      |   28 +
 .../modules/linechecks/assignment/assignment.py    |   31 +
 repoman/pym/repoman/modules/linechecks/base.py     |  101 ++
 repoman/pym/repoman/modules/linechecks/config.py   |  118 +++
 .../pym/repoman/modules/linechecks/controller.py   |  145 +++
 .../repoman/modules/linechecks/depend/__init__.py  |   22 +
 .../repoman/modules/linechecks/depend/implicit.py  |   39 +
 .../modules/linechecks/deprecated/__init__.py      |   47 +
 .../modules/linechecks/deprecated/deprecated.py    |   32 +
 .../modules/linechecks/deprecated/inherit.py       |   66 ++
 .../pym/repoman/modules/linechecks/do/__init__.py  |   22 +
 repoman/pym/repoman/modules/linechecks/do/dosym.py |   16 +
 .../repoman/modules/linechecks/eapi/__init__.py    |   52 +
 .../pym/repoman/modules/linechecks/eapi/checks.py  |   83 ++
 .../repoman/modules/linechecks/eapi/definition.py  |   36 +
 .../repoman/modules/linechecks/emake/__init__.py   |   28 +
 .../pym/repoman/modules/linechecks/emake/emake.py  |   23 +
 .../modules/linechecks/gentoo_header/__init__.py   |   22 +
 .../modules/linechecks/gentoo_header/header.py     |   49 +
 .../repoman/modules/linechecks/helpers/__init__.py |   22 +
 .../repoman/modules/linechecks/helpers/offset.py   |   22 +
 .../repoman/modules/linechecks/nested/__init__.py  |   22 +
 .../repoman/modules/linechecks/nested/nested.py    |   15 +
 .../repoman/modules/linechecks/nested/nesteddie.py |   11 +
 .../repoman/modules/linechecks/patches/__init__.py |   22 +
 .../repoman/modules/linechecks/patches/patches.py  |   16 +
 .../repoman/modules/linechecks/phases/__init__.py  |   35 +
 .../pym/repoman/modules/linechecks/phases/phase.py |   71 ++
 .../repoman/modules/linechecks/portage/__init__.py |   28 +
 .../repoman/modules/linechecks/portage/internal.py |   37 +
 .../repoman/modules/linechecks/quotes/__init__.py  |   28 +
 .../repoman/modules/linechecks/quotes/quoteda.py   |   16 +
 .../repoman/modules/linechecks/quotes/quotes.py    |   86 ++
 .../pym/repoman/modules/linechecks/uri/__init__.py |   22 +
 repoman/pym/repoman/modules/linechecks/uri/uri.py  |   30 +
 .../pym/repoman/modules/linechecks/use/__init__.py |   22 +
 .../repoman/modules/linechecks/use/builtwith.py    |   10 +
 .../repoman/modules/linechecks/useless/__init__.py |   28 +
 .../pym/repoman/modules/linechecks/useless/cd.py   |   24 +
 .../repoman/modules/linechecks/useless/dodoc.py    |   16 +
 .../modules/linechecks/whitespace/__init__.py      |   28 +
 .../repoman/modules/linechecks/whitespace/blank.py |   25 +
 .../modules/linechecks/whitespace/whitespace.py    |   21 +
 .../modules/linechecks/workaround/__init__.py      |   28 +
 .../modules/linechecks/workaround/workarounds.py   |   18 +
 .../pym/repoman/modules/scan/depend/__init__.py    |    4 +-
 .../repoman/modules/scan/depend/_depend_checks.py  |   11 +-
 repoman/pym/repoman/modules/scan/depend/profile.py |    3 +-
 .../repoman/modules/scan/directories/__init__.py   |    5 +-
 repoman/pym/repoman/modules/scan/eapi/__init__.py  |    4 +-
 repoman/pym/repoman/modules/scan/eapi/eapi.py      |    4 +-
 .../pym/repoman/modules/scan/ebuild/__init__.py    |    7 +-
 repoman/pym/repoman/modules/scan/ebuild/checks.py  | 1044 --------------------
 repoman/pym/repoman/modules/scan/ebuild/ebuild.py  |    5 +-
 repoman/pym/repoman/modules/scan/ebuild/errors.py  |   53 -
 .../pym/repoman/modules/scan/ebuild/multicheck.py  |   10 +-
 .../pym/repoman/modules/scan/eclasses/__init__.py  |    7 +-
 repoman/pym/repoman/modules/scan/eclasses/ruby.py  |    5 +-
 repoman/pym/repoman/modules/scan/fetch/__init__.py |    4 +-
 .../pym/repoman/modules/scan/keywords/__init__.py  |    4 +-
 .../pym/repoman/modules/scan/manifest/__init__.py  |    4 +-
 .../pym/repoman/modules/scan/metadata/__init__.py  |   13 +-
 .../repoman/modules/scan/metadata/description.py   |    6 +-
 .../modules/scan/metadata/ebuild_metadata.py       |   14 +-
 .../repoman/modules/scan/metadata/pkgmetadata.py   |    2 +-
 .../pym/repoman/modules/scan/metadata/restrict.py  |    4 +-
 repoman/pym/repoman/modules/scan/module.py         |  102 ++
 .../pym/repoman/modules/scan/options/__init__.py   |    4 +-
 repoman/pym/repoman/qa_data.py                     |  462 ++-------
 repoman/pym/repoman/qa_tracker.py                  |   10 +-
 repoman/pym/repoman/repos.py                       |   21 +-
 repoman/pym/repoman/scanner.py                     |   84 +-
 .../pym/repoman/tests/commit}/__init__.py          |    2 +-
 .../repoman/tests/{simple => commit}/__test__.py   |    0
 repoman/pym/repoman/tests/commit/test_commitmsg.py |  109 ++
 repoman/pym/repoman/tests/runTests.py              |    8 +-
 repoman/pym/repoman/tests/simple/test_simple.py    |    8 +-
 repoman/pym/repoman/utilities.py                   |   22 +-
 repoman/setup.py                                   |    8 +-
 setup.py                                           |    2 +-
 212 files changed, 6465 insertions(+), 3030 deletions(-)

diff --cc bin/phase-functions.sh
index 58e0cdc0b,3de8d01b5..6c8da017d
--- a/bin/phase-functions.sh
+++ b/bin/phase-functions.sh
@@@ -746,28 -673,10 +760,20 @@@ __dyn_install() 
  		x=$(echo -n ${!f})
  		[[ -n $x ]] && echo "$x" > $f
  	done
- 	if [[ $CATEGORY != virtual ]] ; then
- 		for f in ASFLAGS CBUILD CC CFLAGS CHOST CTARGET CXX \
- 			CXXFLAGS EXTRA_ECONF EXTRA_EINSTALL EXTRA_MAKE \
- 			LDFLAGS LIBCFLAGS LIBCXXFLAGS QA_CONFIGURE_OPTIONS \
- 			QA_DESKTOP_FILE QA_PREBUILT PROVIDES_EXCLUDE REQUIRES_EXCLUDE ; do
- 			x=$(echo -n ${!f})
- 			[[ -n $x ]] && echo "$x" > $f
- 		done
- 		# whitespace preserved
- 		for f in QA_AM_MAINTAINER_MODE ; do
- 			[[ -n ${!f} ]] && echo "${!f}" > $f
- 		done
+ 	# whitespace preserved
+ 	for f in QA_AM_MAINTAINER_MODE ; do
+ 		[[ -n ${!f} ]] && echo "${!f}" > $f
+ 	done
 +	fi
 +	if [[ " ${FEATURES} " == *" force-multilib "* ]]; then
 +		#IUSE is changed in _post_src_install_chost_fix
 +		#in pym/portage/package/ebuild/doebuild.py
 +		#which is run after dyn_install, so useless to
 +		#add internal USE flags here 
 +		if is_auto-multilib; then
 +			echo "$(get_abi_order)" > MULTILIB_ABIS
 +		fi
 +	fi
  	echo "${USE}"       > USE
  	echo "${EAPI:-0}"   > EAPI
  


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2018-05-23 12:23 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2018-05-23 12:23 UTC (permalink / raw
  To: gentoo-commits

commit:     b74e878839a2b1e8d6148776d5a44019d8fffbc1
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Wed May 23 12:22:27 2018 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Wed May 23 12:22:27 2018 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=b74e8788

Merge portage-2.3.38

 .travis.yml                                        |   2 +
 NEWS                                               |   9 +
 RELEASE-NOTES                                      |  92 +++
 bin/eapi.sh                                        |  18 +-
 bin/ebuild                                         |   8 +-
 bin/ebuild-helpers/ecompressdir                    |   4 +-
 bin/ebuild-ipc.py                                  |  55 +-
 bin/ebuild.sh                                      |   3 +
 bin/egencache                                      |   5 +-
 bin/emaint                                         |   3 +
 bin/emerge                                         |   5 +
 bin/emirrordist                                    |   6 +-
 bin/estrip                                         |   3 +-
 bin/etc-update                                     |  31 +-
 bin/install-qa-check.d/10ignored-flags             |   2 +-
 bin/misc-functions.sh                              |   2 +-
 bin/phase-functions.sh                             |   9 +
 bin/phase-helpers.sh                               | 159 ++---
 bin/portageq                                       |   6 +-
 bin/quickpkg                                       |  14 +-
 cnf/repos.conf                                     |   3 +-
 man/ebuild.5                                       |   6 +
 man/emerge.1                                       |  38 +-
 man/portage.5                                      |  10 +-
 pym/_emerge/AbstractEbuildProcess.py               |  97 ++-
 pym/_emerge/AbstractPollTask.py                    |  87 +--
 pym/_emerge/AsynchronousLock.py                    |  76 +--
 pym/_emerge/AsynchronousTask.py                    |  60 +-
 pym/_emerge/Binpkg.py                              |  78 ++-
 pym/_emerge/BinpkgExtractorAsync.py                |  16 +-
 pym/_emerge/BinpkgFetcher.py                       | 104 ++-
 pym/_emerge/CompositeTask.py                       |  46 +-
 pym/_emerge/EbuildBuild.py                         |  99 ++-
 pym/_emerge/EbuildBuildDir.py                      | 172 +++--
 pym/_emerge/EbuildFetcher.py                       | 135 +++-
 pym/_emerge/EbuildIpcDaemon.py                     |  28 +-
 pym/_emerge/EbuildMerge.py                         |  26 +-
 pym/_emerge/EbuildMetadataPhase.py                 |  55 +-
 pym/_emerge/EbuildPhase.py                         |  22 +-
 pym/_emerge/FifoIpcDaemon.py                       |  32 +-
 pym/_emerge/MetadataRegen.py                       |  14 +-
 pym/_emerge/Package.py                             |  54 +-
 pym/_emerge/PackageUninstall.py                    |  37 +-
 pym/_emerge/PipeReader.py                          |  42 +-
 pym/_emerge/Scheduler.py                           | 106 ++--
 pym/_emerge/SpawnProcess.py                        |  23 +-
 pym/_emerge/SubProcess.py                          | 123 +---
 pym/_emerge/actions.py                             |  53 +-
 pym/_emerge/create_world_atom.py                   |   6 +-
 pym/_emerge/depgraph.py                            |  33 +-
 pym/_emerge/main.py                                |  13 +-
 pym/_emerge/resolver/DbapiProvidesIndex.py         |   3 +-
 pym/portage/__init__.py                            |   8 +-
 pym/portage/_emirrordist/FetchIterator.py          | 323 ++++++----
 pym/portage/_emirrordist/FetchTask.py              |   2 +-
 pym/portage/_emirrordist/MirrorDistTask.py         |  27 +-
 pym/portage/_legacy_globals.py                     |   3 +-
 pym/portage/const.py                               |   2 +-
 pym/portage/dbapi/IndexedVardb.py                  |   2 +-
 pym/portage/dbapi/_MergeProcess.py                 |  47 +-
 pym/portage/dbapi/__init__.py                      |  44 +-
 pym/portage/dbapi/bintree.py                       |  89 ++-
 pym/portage/dbapi/porttree.py                      | 153 ++++-
 pym/portage/dbapi/vartree.py                       |  10 +-
 pym/portage/dbapi/virtual.py                       |   4 +-
 pym/portage/eapi.py                                |  16 +-
 pym/portage/emaint/modules/binhost/binhost.py      |   1 +
 pym/portage/exception.py                           |   3 +
 .../package/ebuild/_config/LocationsManager.py     |  25 +-
 .../package/ebuild/_config/special_env_vars.py     |   8 +-
 pym/portage/package/ebuild/_ipc/QueryCommand.py    |   4 +-
 .../ebuild/_parallel_manifest/ManifestScheduler.py |  25 +-
 .../ebuild/_parallel_manifest/ManifestTask.py      |  24 +-
 pym/portage/package/ebuild/config.py               |  44 +-
 pym/portage/package/ebuild/doebuild.py             |  30 +-
 pym/portage/package/ebuild/profile_iuse.py         |  32 +
 pym/portage/process.py                             |  10 +
 pym/portage/sync/modules/rsync/rsync.py            |  42 +-
 pym/portage/tests/__init__.py                      |  20 +-
 pym/portage/tests/dbapi/test_portdb_cache.py       |   3 +-
 pym/portage/tests/ebuild/test_ipc_daemon.py        |   6 +-
 pym/portage/tests/emerge/test_simple.py            |  51 +-
 pym/portage/tests/locks/test_asynchronous_lock.py  |  22 +-
 pym/portage/tests/resolver/ResolverPlayground.py   |  10 +
 pym/portage/tests/resolver/test_autounmask.py      |  48 +-
 pym/portage/tests/resolver/test_eapi.py            |   2 +-
 pym/portage/tests/resolver/test_required_use.py    |   6 +-
 pym/portage/tests/resolver/test_slot_collisions.py |  20 +-
 .../tests/resolver/test_slot_operator_rebuild.py   |  45 +-
 pym/portage/tests/runTests.py                      |   6 +-
 .../util/futures/asyncio}/__init__.py              |   0
 .../{bin => util/futures/asyncio}/__test__.py      |   0
 .../util/futures/asyncio/test_child_watcher.py     |  50 ++
 .../futures/asyncio/test_event_loop_in_fork.py     |  65 ++
 .../tests/util/futures/asyncio/test_pipe_closed.py | 151 +++++
 .../asyncio/test_policy_wrapper_recursion.py       |  29 +
 .../futures/asyncio/test_run_until_complete.py     |  34 +
 .../util/futures/asyncio/test_subprocess_exec.py   | 236 +++++++
 .../tests/util/futures/test_iter_completed.py      |  40 +-
 pym/portage/tests/util/futures/test_retry.py       | 177 ++++--
 pym/portage/util/SlotObject.py                     |   9 +-
 pym/portage/util/_async/AsyncFunction.py           |   7 +-
 pym/portage/util/_async/AsyncScheduler.py          |  49 +-
 pym/portage/util/_async/AsyncTaskFuture.py         |   4 +-
 pym/portage/util/_async/FileDigester.py            |   7 +-
 pym/portage/util/_async/ForkProcess.py             |  10 +
 pym/portage/util/_async/PipeLogger.py              |  32 +-
 pym/portage/util/_async/PipeReaderBlockingIO.py    |  16 +-
 pym/portage/util/_async/PopenProcess.py            |  17 +-
 pym/portage/util/_async/SchedulerInterface.py      |  34 +-
 pym/portage/util/_eventloop/EventLoop.py           | 374 +++++++++--
 pym/portage/util/_eventloop/GlibEventLoop.py       |  23 -
 pym/portage/util/_eventloop/asyncio_event_loop.py  |  85 +++
 pym/portage/util/_eventloop/global_event_loop.py   |  11 +-
 pym/portage/util/elf/constants.py                  |   4 +-
 pym/portage/util/futures/__init__.py               |   8 +
 pym/portage/util/futures/_asyncio/__init__.py      | 185 ++++++
 .../util/futures/{wait.py => _asyncio/tasks.py}    |  19 +-
 pym/portage/util/futures/events.py                 | 191 ++++++
 pym/portage/util/futures/executor/fork.py          |   6 +-
 pym/portage/util/futures/futures.py                |   9 +-
 pym/portage/util/futures/iter_completed.py         | 138 +++-
 pym/portage/util/futures/retry.py                  |  13 +-
 pym/portage/util/futures/transports.py             |  90 +++
 pym/portage/util/futures/unix_events.py            | 705 +++++++++++++++++++++
 pym/portage/versions.py                            |   6 +-
 repoman/bin/repoman                                |   3 +
 repoman/cnf/qa_data/qa_data.yaml                   |   2 +-
 repoman/man/repoman.1                              |   2 +-
 .../modules/linechecks/assignment/assignment.py    |   9 +-
 .../modules/linechecks/deprecated/inherit.py       |   3 +
 .../repoman/modules/linechecks/quotes/quotes.py    |   3 +-
 repoman/pym/repoman/modules/scan/fetch/fetches.py  |   2 +-
 repoman/pym/repoman/modules/scan/module.py         |   2 +-
 repoman/pym/repoman/tests/__init__.py              |   3 +
 repoman/pym/repoman/tests/runTests.py              |   6 +-
 repoman/setup.py                                   |   3 +-
 setup.py                                           |   5 +-
 138 files changed, 4789 insertions(+), 1438 deletions(-)

diff --cc pym/_emerge/Package.py
index 5d86c9635,a7ce00bc9..2be526471
--- a/pym/_emerge/Package.py
+++ b/pym/_emerge/Package.py
@@@ -82,24 -93,10 +93,16 @@@ class Package(Task)
  		# sync metadata with validated repo (may be UNKNOWN_REPO)
  		self._metadata['repository'] = self.cpv.repo
  
- 		if eapi_attrs.iuse_effective:
- 			implicit_match = self.root_config.settings._iuse_effective_match
- 			if self.built:
- 				implicit_match = functools.partial(
- 					self._built_iuse_effective_match,
- 					implicit_match, frozenset(self._metadata['USE'].split()))
- 		else:
- 			implicit_match = self.root_config.settings._iuse_implicit_match
- 		iuse = self._metadata["IUSE"]
+ 		implicit_match = db._iuse_implicit_cnstr(self.cpv, self._metadata)
 +		if 'force-multilib' in self.root_config.settings.features:
 +			if self.built is False:
 +				for multilib_abis in self.root_config.settings.get("MULTILIB_ABIS", '').split():
 +					iuse += " multilib_abi_" + multilib_abis
 +				iuse += " abiwrapper"
 +				self._metadata["IUSE"] = iuse
  		usealiases = self.root_config.settings._use_manager.getUseAliases(self)
- 		self.iuse = self._iuse(self, iuse.split(), implicit_match,
- 			usealiases, self.eapi)
+ 		self.iuse = self._iuse(self, self._metadata["IUSE"].split(),
+ 			implicit_match, usealiases, self.eapi)
  
  		if (self.iuse.enabled or self.iuse.disabled) and \
  			not eapi_attrs.iuse_defaults:
diff --cc pym/_emerge/actions.py
index 966b4421b,70fb8d3b4..f53c33b46
--- a/pym/_emerge/actions.py
+++ b/pym/_emerge/actions.py
@@@ -2868,16 -2882,29 +2882,36 @@@ def run_action(emerge_config)
  			"--usepkg", "--usepkgonly"):
  			emerge_config.opts.pop(opt, None)
  
+ 	# Populate the bintree with current --getbinpkg setting.
+ 	# This needs to happen before:
+ 	# * expand_set_arguments, in case any sets use the bintree
+ 	# * adjust_configs and profile_check, in order to propagate settings
+ 	#   implicit IUSE and USE_EXPAND settings from the binhost(s)
+ 	if (emerge_config.action in ('search', None) and
+ 		'--usepkg' in emerge_config.opts):
+ 		for mytrees in emerge_config.trees.values():
+ 			try:
+ 				mytrees['bintree'].populate(
+ 					getbinpkgs='--getbinpkg' in emerge_config.opts)
+ 			except ParseError as e:
+ 				writemsg('\n\n!!!%s.\nSee make.conf(5) for more info.\n'
+ 						 % (e,), noiselevel=-1)
+ 				return 1
+ 
  	adjust_configs(emerge_config.opts, emerge_config.trees)
+ 
+ 	if profile_check(emerge_config.trees, emerge_config.action) != os.EX_OK:
+ 		return 1
+ 
  	apply_priorities(emerge_config.target_config.settings)
  
 +	if 'force-multilib' in emerge_config.target_config.settings.features:
 +		if emerge_config.target_config.settings.get("NO_AUTO_FLAG", "") is "":
 +			writemsg_level(bad("!!! Failed to find vars from extra profile") + "\n",level=logging.ERROR, noiselevel=-1)
 +			writemsg_level(bad("!!! Please make sure that you did follow the instructions and included the extra profile\n"),level=logging.ERROR, noiselevel=-1)
 +			writemsg_level(bad("!!! http://git.overlays.gentoo.org/gitweb/?p=proj/multilib-portage.git;a=blob;f=doc/portage-multilib-instructions\n"),level=logging.ERROR, noiselevel=-1)
 +			writemsg_level(bad("!!! has some basic instructions for the setup\n"),level=logging.ERROR, noiselevel=-1)
 +			return 1
  	if ("--autounmask-continue" in emerge_config.opts and
  		emerge_config.opts.get("--autounmask") == "n"):
  		writemsg_level(


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2018-09-01 11:03 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2018-09-01 11:03 UTC (permalink / raw
  To: gentoo-commits

commit:     cb6737033d90f57168ed12e4b0cec8711b311b36
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sat Sep  1 09:30:48 2018 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sat Sep  1 09:30:48 2018 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=cb673703

Merge portage-2.3.48

 .gitignore                                         |   1 +
 .travis.yml                                        |  28 +--
 NEWS                                               |  10 +
 README                                             |   4 +-
 RELEASE-NOTES                                      |  98 +++++++++
 TEST-NOTES                                         |   6 +-
 bin/archive-conf                                   |   2 +-
 bin/binhost-snapshot                               |   2 +-
 bin/clean_locks                                    |   2 +-
 bin/dispatch-conf                                  |   2 +-
 bin/ebuild                                         |  10 +-
 bin/ebuild-ipc.py                                  |   2 +-
 bin/ebuild.sh                                      |   2 +-
 bin/egencache                                      |   2 +-
 bin/emaint                                         |   2 +-
 bin/emerge                                         |   2 +-
 bin/emerge-webrsync                                |  23 +-
 bin/env-update                                     |   2 +-
 bin/etc-update                                     |  18 +-
 bin/fixpackages                                    |   2 +-
 bin/glsa-check                                     |   2 +-
 bin/install-qa-check.d/10executable-issues         |   6 +-
 bin/install-qa-check.d/10ignored-flags             |   6 +-
 bin/install-qa-check.d/60pngfix                    |  14 +-
 bin/install-qa-check.d/90bad-bin-group-write       |  55 +++++
 bin/install-qa-check.d/90bad-bin-owner             |  48 +++++
 bin/isolated-functions.sh                          |   6 +-
 bin/misc-functions.sh                              |   8 +-
 bin/phase-functions.sh                             |   7 +-
 bin/portageq                                       |   2 +-
 bin/quickpkg                                       |   2 +-
 bin/regenworld                                     |   2 +-
 cnf/make.conf.example                              |   8 +-
 cnf/make.conf.example.arm64.diff                   |  37 ++++
 cnf/make.globals                                   |   2 +-
 {pym => lib}/_emerge/AbstractDepPriority.py        |   0
 {pym => lib}/_emerge/AbstractEbuildProcess.py      |  15 +-
 {pym => lib}/_emerge/AbstractPollTask.py           |  12 +-
 {pym => lib}/_emerge/AsynchronousLock.py           |   0
 {pym => lib}/_emerge/AsynchronousTask.py           |   0
 {pym => lib}/_emerge/AtomArg.py                    |   0
 {pym => lib}/_emerge/Binpkg.py                     |  10 +-
 {pym => lib}/_emerge/BinpkgEnvExtractor.py         |   0
 {pym => lib}/_emerge/BinpkgExtractorAsync.py       |   0
 {pym => lib}/_emerge/BinpkgFetcher.py              |   8 +
 {pym => lib}/_emerge/BinpkgPrefetcher.py           |   0
 {pym => lib}/_emerge/BinpkgVerifier.py             |   0
 {pym => lib}/_emerge/Blocker.py                    |   0
 {pym => lib}/_emerge/BlockerCache.py               |   0
 {pym => lib}/_emerge/BlockerDB.py                  |   0
 {pym => lib}/_emerge/BlockerDepPriority.py         |   0
 {pym => lib}/_emerge/CompositeTask.py              |   1 +
 {pym => lib}/_emerge/DepPriority.py                |   0
 {pym => lib}/_emerge/DepPriorityNormalRange.py     |   0
 {pym => lib}/_emerge/DepPrioritySatisfiedRange.py  |   0
 {pym => lib}/_emerge/Dependency.py                 |   0
 {pym => lib}/_emerge/DependencyArg.py              |   0
 {pym => lib}/_emerge/EbuildBinpkg.py               |   0
 {pym => lib}/_emerge/EbuildBuild.py                |  34 ++-
 {pym => lib}/_emerge/EbuildBuildDir.py             |   0
 {pym => lib}/_emerge/EbuildExecuter.py             |   0
 {pym => lib}/_emerge/EbuildFetcher.py              |  12 ++
 {pym => lib}/_emerge/EbuildFetchonly.py            |   5 +-
 {pym => lib}/_emerge/EbuildIpcDaemon.py            |   0
 {pym => lib}/_emerge/EbuildMerge.py                |   0
 {pym => lib}/_emerge/EbuildMetadataPhase.py        |   0
 {pym => lib}/_emerge/EbuildPhase.py                |  34 ++-
 {pym => lib}/_emerge/EbuildProcess.py              |   0
 {pym => lib}/_emerge/EbuildSpawnProcess.py         |   0
 {pym => lib}/_emerge/FakeVartree.py                |   0
 {pym => lib}/_emerge/FifoIpcDaemon.py              |   0
 {pym => lib}/_emerge/JobStatusDisplay.py           |   0
 {pym => lib}/_emerge/MergeListItem.py              |   0
 {pym => lib}/_emerge/MetadataRegen.py              |   0
 {pym => lib}/_emerge/MiscFunctionsProcess.py       |   6 +-
 {pym => lib}/_emerge/Package.py                    |   5 +-
 {pym => lib}/_emerge/PackageArg.py                 |   0
 {pym => lib}/_emerge/PackageMerge.py               |   0
 {pym => lib}/_emerge/PackagePhase.py               |   0
 {pym => lib}/_emerge/PackageUninstall.py           |  10 +-
 {pym => lib}/_emerge/PackageVirtualDbapi.py        |   0
 {pym => lib}/_emerge/PipeReader.py                 |  19 +-
 {pym => lib}/_emerge/PollScheduler.py              |   0
 {pym => lib}/_emerge/ProgressHandler.py            |   0
 {pym => lib}/_emerge/RootConfig.py                 |   0
 {pym => lib}/_emerge/Scheduler.py                  |   3 +
 {pym => lib}/_emerge/SequentialTaskQueue.py        |   0
 {pym => lib}/_emerge/SetArg.py                     |   0
 {pym => lib}/_emerge/SpawnProcess.py               |   3 +
 {pym => lib}/_emerge/SubProcess.py                 |   0
 {pym => lib}/_emerge/Task.py                       |   0
 {pym => lib}/_emerge/TaskSequence.py               |   0
 {pym => lib}/_emerge/UninstallFailure.py           |   0
 {pym => lib}/_emerge/UnmergeDepPriority.py         |   0
 {pym => lib}/_emerge/UseFlagDisplay.py             |   0
 {pym => lib}/_emerge/UserQuery.py                  |   0
 {pym => lib}/_emerge/__init__.py                   |   0
 .../_emerge/_find_deep_system_runtime_deps.py      |   0
 {pym => lib}/_emerge/_flush_elog_mod_echo.py       |   0
 {pym => lib}/_emerge/actions.py                    |  19 +-
 {pym => lib}/_emerge/chk_updated_cfg_files.py      |   0
 {pym => lib}/_emerge/clear_caches.py               |   0
 {pym => lib}/_emerge/countdown.py                  |   0
 {pym => lib}/_emerge/create_depgraph_params.py     |   2 +-
 {pym => lib}/_emerge/create_world_atom.py          |   2 +-
 {pym => lib}/_emerge/depgraph.py                   |  16 +-
 {pym => lib}/_emerge/emergelog.py                  |   0
 {pym => lib}/_emerge/getloadavg.py                 |   0
 {pym => lib}/_emerge/help.py                       |   0
 {pym => lib}/_emerge/is_valid_package_atom.py      |   0
 {pym => lib}/_emerge/main.py                       |   0
 {pym => lib}/_emerge/post_emerge.py                |   0
 .../_emerge/resolver/DbapiProvidesIndex.py         |   0
 {pym => lib}/_emerge/resolver/__init__.py          |   0
 {pym => lib}/_emerge/resolver/backtracking.py      |   0
 .../_emerge/resolver/circular_dependency.py        |   0
 {pym => lib}/_emerge/resolver/output.py            |   0
 {pym => lib}/_emerge/resolver/output_helpers.py    |   0
 {pym => lib}/_emerge/resolver/package_tracker.py   |   0
 {pym => lib}/_emerge/resolver/slot_collision.py    |   0
 {pym => lib}/_emerge/search.py                     |   2 +-
 .../_emerge/show_invalid_depstring_notice.py       |   0
 {pym => lib}/_emerge/stdout_spinner.py             |   0
 {pym => lib}/_emerge/unmerge.py                    |   0
 {pym => lib}/portage/__init__.py                   |   2 +-
 {pym => lib}/portage/_emirrordist/Config.py        |   0
 .../portage/_emirrordist/DeletionIterator.py       |   0
 {pym => lib}/portage/_emirrordist/DeletionTask.py  |   0
 {pym => lib}/portage/_emirrordist/FetchIterator.py |  10 +
 {pym => lib}/portage/_emirrordist/FetchTask.py     |   0
 .../portage/_emirrordist/MirrorDistTask.py         |   0
 {pym => lib}/portage/_emirrordist/__init__.py      |   0
 {pym => lib}/portage/_emirrordist/main.py          |   0
 {pym => lib}/portage/_global_updates.py            |   2 +-
 {pym => lib}/portage/_legacy_globals.py            |   0
 {pym => lib}/portage/_selinux.py                   |   0
 {pym => lib}/portage/_sets/ProfilePackageSet.py    |   0
 {pym => lib}/portage/_sets/__init__.py             |   0
 {pym => lib}/portage/_sets/base.py                 |   0
 {pym => lib}/portage/_sets/dbapi.py                |   0
 {pym => lib}/portage/_sets/files.py                |   0
 {pym => lib}/portage/_sets/libs.py                 |   0
 {pym => lib}/portage/_sets/profiles.py             |   0
 {pym => lib}/portage/_sets/security.py             |   0
 {pym => lib}/portage/_sets/shell.py                |   0
 {pym => lib}/portage/cache/__init__.py             |   0
 {pym => lib}/portage/cache/anydbm.py               |   0
 {pym => lib}/portage/cache/cache_errors.py         |   0
 {pym => lib}/portage/cache/ebuild_xattr.py         |   0
 {pym => lib}/portage/cache/flat_hash.py            |   0
 {pym => lib}/portage/cache/fs_template.py          |   0
 .../portage/cache/index/IndexStreamIterator.py     |   0
 {pym => lib}/portage/cache/index/__init__.py       |   0
 {pym => lib}/portage/cache/index/pkg_desc_index.py |   0
 {pym => lib}/portage/cache/mappings.py             |   0
 {pym => lib}/portage/cache/metadata.py             |   0
 {pym => lib}/portage/cache/sql_template.py         |   0
 {pym => lib}/portage/cache/sqlite.py               |   0
 {pym => lib}/portage/cache/template.py             |   0
 {pym => lib}/portage/cache/volatile.py             |   0
 {pym => lib}/portage/checksum.py                   |   0
 {pym => lib}/portage/const.py                      |   0
 {pym => lib}/portage/cvstree.py                    |   0
 {pym => lib}/portage/data.py                       |   0
 {pym => lib}/portage/dbapi/DummyTree.py            |   0
 {pym => lib}/portage/dbapi/IndexedPortdb.py        |   0
 {pym => lib}/portage/dbapi/IndexedVardb.py         |   0
 .../dbapi/_ContentsCaseSensitivityManager.py       |   0
 {pym => lib}/portage/dbapi/_MergeProcess.py        |   0
 {pym => lib}/portage/dbapi/_SyncfsProcess.py       |   0
 {pym => lib}/portage/dbapi/_VdbMetadataDelta.py    |   0
 {pym => lib}/portage/dbapi/__init__.py             |  12 ++
 {pym => lib}/portage/dbapi/_expand_new_virt.py     |   0
 {pym => lib}/portage/dbapi/_similar_name_search.py |   0
 {pym => lib}/portage/dbapi/bintree.py              |   4 +-
 {pym => lib}/portage/dbapi/cpv_expand.py           |   0
 {pym => lib}/portage/dbapi/dep_expand.py           |   0
 {pym => lib}/portage/dbapi/porttree.py             |  83 +++++---
 {pym => lib}/portage/dbapi/vartree.py              |  27 ++-
 {pym => lib}/portage/dbapi/virtual.py              |   0
 {pym => lib}/portage/debug.py                      |   2 +-
 {pym => lib}/portage/dep/__init__.py               |   0
 {pym => lib}/portage/dep/_dnf.py                   |   0
 {pym => lib}/portage/dep/_slot_operator.py         |   0
 {pym => lib}/portage/dep/dep_check.py              |   0
 {pym => lib}/portage/dep/soname/SonameAtom.py      |   0
 {pym => lib}/portage/dep/soname/__init__.py        |   0
 .../portage/dep/soname/multilib_category.py        |   0
 {pym => lib}/portage/dep/soname/parse.py           |   0
 {pym => lib}/portage/dispatch_conf.py              |   0
 {pym => lib}/portage/eapi.py                       |   2 +-
 {pym => lib}/portage/eclass_cache.py               |   0
 {pym => lib}/portage/elog/__init__.py              |   0
 {pym => lib}/portage/elog/filtering.py             |   0
 {pym => lib}/portage/elog/messages.py              |   0
 {pym => lib}/portage/elog/mod_custom.py            |   0
 {pym => lib}/portage/elog/mod_echo.py              |   0
 {pym => lib}/portage/elog/mod_mail.py              |   0
 {pym => lib}/portage/elog/mod_mail_summary.py      |   0
 {pym => lib}/portage/elog/mod_save.py              |   0
 {pym => lib}/portage/elog/mod_save_summary.py      |   0
 {pym => lib}/portage/elog/mod_syslog.py            |   0
 {pym => lib}/portage/emaint/__init__.py            |   0
 {pym => lib}/portage/emaint/defaults.py            |   0
 {pym => lib}/portage/emaint/main.py                |   0
 {pym => lib}/portage/emaint/modules/__init__.py    |   0
 .../portage/emaint/modules/binhost/__init__.py     |   0
 .../portage/emaint/modules/binhost/binhost.py      |   0
 .../portage/emaint/modules/config/__init__.py      |   0
 .../portage/emaint/modules/config/config.py        |   0
 .../portage/emaint/modules/logs/__init__.py        |   0
 {pym => lib}/portage/emaint/modules/logs/logs.py   |   0
 .../portage/emaint/modules/merges/__init__.py      |   0
 .../portage/emaint/modules/merges/merges.py        |   2 +-
 .../portage/emaint/modules/move/__init__.py        |   0
 {pym => lib}/portage/emaint/modules/move/move.py   |   0
 .../portage/emaint/modules/resume/__init__.py      |   0
 .../portage/emaint/modules/resume/resume.py        |   0
 .../portage/emaint/modules/sync/__init__.py        |   0
 {pym => lib}/portage/emaint/modules/sync/sync.py   |   0
 .../portage/emaint/modules/world/__init__.py       |   0
 {pym => lib}/portage/emaint/modules/world/world.py |   0
 {pym => lib}/portage/env/__init__.py               |   0
 {pym => lib}/portage/env/config.py                 |   0
 {pym => lib}/portage/env/loaders.py                |   0
 {pym => lib}/portage/env/validators.py             |   0
 {pym => lib}/portage/exception.py                  |   0
 {pym => lib}/portage/getbinpkg.py                  |   0
 {pym => lib}/portage/glsa.py                       |   0
 {pym => lib}/portage/localization.py               |   0
 {pym => lib}/portage/locks.py                      |   0
 {pym => lib}/portage/mail.py                       |   0
 {pym => lib}/portage/manifest.py                   |   0
 {pym => lib}/portage/metadata.py                   |   6 +-
 {pym => lib}/portage/module.py                     |   0
 {pym => lib}/portage/news.py                       |   2 +-
 {pym => lib}/portage/output.py                     |   0
 {pym => lib}/portage/package/__init__.py           |   0
 {pym => lib}/portage/package/ebuild/__init__.py    |   0
 .../package/ebuild/_config/KeywordsManager.py      |   0
 .../package/ebuild/_config/LicenseManager.py       |   0
 .../package/ebuild/_config/LocationsManager.py     |   5 +-
 .../portage/package/ebuild/_config/MaskManager.py  |   0
 .../portage/package/ebuild/_config/UseManager.py   |   0
 .../package/ebuild/_config/VirtualsManager.py      |   0
 .../portage/package/ebuild/_config/__init__.py     |   0
 .../package/ebuild/_config/env_var_validation.py   |   0
 .../portage/package/ebuild/_config/features_set.py |   0
 .../portage/package/ebuild/_config/helper.py       |   0
 .../package/ebuild/_config/special_env_vars.py     |   0
 .../package/ebuild/_config/unpack_dependencies.py  |   0
 .../portage/package/ebuild/_ipc/ExitCommand.py     |   0
 .../portage/package/ebuild/_ipc/IpcCommand.py      |   0
 .../portage/package/ebuild/_ipc/QueryCommand.py    |   0
 .../portage/package/ebuild/_ipc/__init__.py        |   0
 .../portage/package/ebuild/_metadata_invalid.py    |   0
 .../ebuild/_parallel_manifest/ManifestProcess.py   |   0
 .../ebuild/_parallel_manifest/ManifestScheduler.py |   0
 .../ebuild/_parallel_manifest/ManifestTask.py      |   0
 .../package/ebuild/_parallel_manifest/__init__.py  |   0
 .../portage/package/ebuild/_spawn_nofetch.py       |   0
 {pym => lib}/portage/package/ebuild/config.py      | 145 ++++++++-----
 .../package/ebuild/deprecated_profile_check.py     |   0
 {pym => lib}/portage/package/ebuild/digestcheck.py |   0
 {pym => lib}/portage/package/ebuild/digestgen.py   |   0
 {pym => lib}/portage/package/ebuild/doebuild.py    |  73 ++++---
 {pym => lib}/portage/package/ebuild/fetch.py       |   0
 .../portage/package/ebuild/getmaskingreason.py     |   0
 .../portage/package/ebuild/getmaskingstatus.py     |   0
 .../portage/package/ebuild/prepare_build_dirs.py   |   5 +-
 .../portage/package/ebuild/profile_iuse.py         |   0
 {pym => lib}/portage/process.py                    |   0
 {pym => lib}/portage/progress.py                   |   0
 {pym => lib}/portage/proxy/__init__.py             |   0
 {pym => lib}/portage/proxy/lazyimport.py           |   0
 {pym => lib}/portage/proxy/objectproxy.py          |   0
 {pym => lib}/portage/repository/__init__.py        |   0
 {pym => lib}/portage/repository/config.py          |  16 +-
 {pym => lib}/portage/sync/__init__.py              |   0
 {pym => lib}/portage/sync/config_checks.py         |   0
 {pym => lib}/portage/sync/controller.py            |   0
 {pym => lib}/portage/sync/getaddrinfo_validate.py  |   0
 {pym => lib}/portage/sync/modules/__init__.py      |   0
 {pym => lib}/portage/sync/modules/cvs/__init__.py  |   0
 {pym => lib}/portage/sync/modules/cvs/cvs.py       |   0
 {pym => lib}/portage/sync/modules/git/__init__.py  |   0
 {pym => lib}/portage/sync/modules/git/git.py       |  72 ++++++-
 .../portage/sync/modules/rsync/__init__.py         |   0
 {pym => lib}/portage/sync/modules/rsync/rsync.py   | 122 +++++++----
 {pym => lib}/portage/sync/modules/svn/__init__.py  |   0
 {pym => lib}/portage/sync/modules/svn/svn.py       |   0
 .../portage/sync/modules/webrsync/__init__.py      |   6 +-
 lib/portage/sync/modules/webrsync/webrsync.py      | 136 ++++++++++++
 {pym => lib}/portage/sync/old_tree_timestamp.py    |   0
 {pym => lib}/portage/sync/syncbase.py              |  41 ++++
 {pym => lib}/portage/tests/__init__.py             |   0
 {pym => lib}/portage/tests/bin/__init__.py         |   0
 {pym => lib}/portage/tests/bin/__test__.py         |   0
 {pym => lib}/portage/tests/bin/setup_env.py        |   0
 {pym => lib}/portage/tests/bin/test_dobin.py       |   0
 {pym => lib}/portage/tests/bin/test_dodir.py       |   0
 {pym => lib}/portage/tests/bin/test_doins.py       |   0
 .../portage/tests/bin/test_eapi7_ver_funcs.py      |   0
 .../portage/tests/bin/test_filter_bash_env.py      |   0
 {pym => lib}/portage/tests/dbapi/__init__.py       |   0
 {pym => lib}/portage/tests/dbapi/__test__.py       |   0
 {pym => lib}/portage/tests/dbapi/test_fakedbapi.py |   0
 .../portage/tests/dbapi/test_portdb_cache.py       |   0
 {pym => lib}/portage/tests/dep/__init__.py         |   0
 {pym => lib}/portage/tests/dep/__test__.py         |   0
 {pym => lib}/portage/tests/dep/testAtom.py         |   0
 .../portage/tests/dep/testCheckRequiredUse.py      |   0
 .../portage/tests/dep/testExtendedAtomDict.py      |   0
 .../portage/tests/dep/testExtractAffectingUSE.py   |   0
 {pym => lib}/portage/tests/dep/testStandalone.py   |   0
 .../portage/tests/dep/test_best_match_to_list.py   |   0
 {pym => lib}/portage/tests/dep/test_dep_getcpv.py  |   0
 {pym => lib}/portage/tests/dep/test_dep_getrepo.py |   0
 {pym => lib}/portage/tests/dep/test_dep_getslot.py |   0
 .../portage/tests/dep/test_dep_getusedeps.py       |   0
 {pym => lib}/portage/tests/dep/test_dnf_convert.py |   0
 .../portage/tests/dep/test_get_operator.py         |   0
 .../tests/dep/test_get_required_use_flags.py       |   0
 {pym => lib}/portage/tests/dep/test_isjustname.py  |   0
 {pym => lib}/portage/tests/dep/test_isvalidatom.py |   0
 .../portage/tests/dep/test_match_from_list.py      |   0
 {pym => lib}/portage/tests/dep/test_overlap_dnf.py |   0
 .../portage/tests/dep/test_paren_reduce.py         |   0
 {pym => lib}/portage/tests/dep/test_use_reduce.py  |   0
 {pym => lib}/portage/tests/ebuild/__init__.py      |   0
 {pym => lib}/portage/tests/ebuild/__test__.py      |   0
 .../tests/ebuild/test_array_fromfile_eof.py        |   0
 {pym => lib}/portage/tests/ebuild/test_config.py   |   0
 .../portage/tests/ebuild/test_doebuild_fd_pipes.py |   0
 .../portage/tests/ebuild/test_doebuild_spawn.py    |   0
 .../portage/tests/ebuild/test_ipc_daemon.py        |   0
 {pym => lib}/portage/tests/ebuild/test_spawn.py    |   0
 .../tests/ebuild/test_use_expand_incremental.py    |   0
 {pym => lib}/portage/tests/emerge/__init__.py      |   0
 {pym => lib}/portage/tests/emerge/__test__.py      |   0
 .../portage/tests/emerge/test_config_protect.py    |   0
 .../emerge/test_emerge_blocker_file_collision.py   |   0
 .../portage/tests/emerge/test_emerge_slot_abi.py   |   0
 .../portage/tests/emerge/test_global_updates.py    |   0
 {pym => lib}/portage/tests/emerge/test_simple.py   |   0
 {pym => lib}/portage/tests/env/__init__.py         |   0
 {pym => lib}/portage/tests/env/__test__.py         |   0
 {pym => lib}/portage/tests/env/config/__init__.py  |   0
 {pym => lib}/portage/tests/env/config/__test__.py  |   0
 .../tests/env/config/test_PackageKeywordsFile.py   |   0
 .../tests/env/config/test_PackageMaskFile.py       |   0
 .../tests/env/config/test_PackageUseFile.py        |   0
 .../tests/env/config/test_PortageModulesFile.py    |   0
 {pym => lib}/portage/tests/glsa/__init__.py        |   0
 {pym => lib}/portage/tests/glsa/__test__.py        |   0
 .../portage/tests/glsa/test_security_set.py        |   0
 {pym => lib}/portage/tests/lafilefixer/__init__.py |   0
 {pym => lib}/portage/tests/lafilefixer/__test__.py |   0
 .../portage/tests/lafilefixer/test_lafilefixer.py  |   0
 {pym => lib}/portage/tests/lazyimport/__init__.py  |   0
 {pym => lib}/portage/tests/lazyimport/__test__.py  |   0
 .../test_lazy_import_portage_baseline.py           |   0
 .../lazyimport/test_preload_portage_submodules.py  |   0
 {pym => lib}/portage/tests/lint/__init__.py        |   0
 {pym => lib}/portage/tests/lint/__test__.py        |   0
 {pym => lib}/portage/tests/lint/metadata.py        |   0
 .../portage/tests/lint/test_bash_syntax.py         |   0
 .../portage/tests/lint/test_compile_modules.py     |   0
 .../portage/tests/lint/test_import_modules.py      |   0
 {pym => lib}/portage/tests/locks/__init__.py       |   0
 {pym => lib}/portage/tests/locks/__test__.py       |   0
 .../portage/tests/locks/test_asynchronous_lock.py  |   0
 .../portage/tests/locks/test_lock_nonblock.py      |   0
 {pym => lib}/portage/tests/news/__init__.py        |   0
 {pym => lib}/portage/tests/news/__test__.py        |   0
 {pym => lib}/portage/tests/news/test_NewsItem.py   |   0
 {pym => lib}/portage/tests/process/__init__.py     |   0
 {pym => lib}/portage/tests/process/__test__.py     |   0
 .../portage/tests/process/test_PopenProcess.py     |   0
 .../tests/process/test_PopenProcessBlockingIO.py   |   0
 {pym => lib}/portage/tests/process/test_poll.py    |  75 ++++---
 .../portage/tests/resolver/ResolverPlayground.py   |   0
 {pym => lib}/portage/tests/resolver/__init__.py    |   0
 {pym => lib}/portage/tests/resolver/__test__.py    |   0
 .../resolver/binpkg_multi_instance/__init__.py     |   0
 .../resolver/binpkg_multi_instance/__test__.py     |   0
 .../test_build_id_profile_format.py                |   0
 .../binpkg_multi_instance/test_rebuilt_binaries.py |   0
 .../portage/tests/resolver/soname/__init__.py      |   0
 .../portage/tests/resolver/soname/__test__.py      |   0
 .../tests/resolver/soname/test_autounmask.py       |   0
 .../portage/tests/resolver/soname/test_depclean.py |   0
 .../tests/resolver/soname/test_downgrade.py        |   0
 .../tests/resolver/soname/test_or_choices.py       |   0
 .../tests/resolver/soname/test_reinstall.py        |   0
 .../tests/resolver/soname/test_skip_update.py      |   0
 .../soname/test_slot_conflict_reinstall.py         |   0
 .../resolver/soname/test_slot_conflict_update.py   |   0
 .../tests/resolver/soname/test_soname_provided.py  |   0
 .../tests/resolver/soname/test_unsatisfiable.py    |   0
 .../tests/resolver/soname/test_unsatisfied.py      |   0
 .../portage/tests/resolver/test_autounmask.py      |   0
 .../tests/resolver/test_autounmask_binpkg_use.py   |   0
 .../resolver/test_autounmask_keep_keywords.py      |   0
 .../tests/resolver/test_autounmask_multilib_use.py |   0
 .../tests/resolver/test_autounmask_parent.py       |   0
 .../resolver/test_autounmask_use_backtrack.py      |   0
 .../tests/resolver/test_autounmask_use_breakage.py |   0
 .../portage/tests/resolver/test_backtracking.py    |   0
 {pym => lib}/portage/tests/resolver/test_bdeps.py  |   0
 .../resolver/test_binary_pkg_ebuild_visibility.py  |   0
 .../portage/tests/resolver/test_blocker.py         |   0
 .../portage/tests/resolver/test_changed_deps.py    |   0
 .../tests/resolver/test_circular_choices.py        |   0
 .../tests/resolver/test_circular_dependencies.py   |   0
 .../portage/tests/resolver/test_complete_graph.py  |   0
 ...test_complete_if_new_subslot_without_revbump.py |   0
 .../portage/tests/resolver/test_depclean.py        |   0
 .../portage/tests/resolver/test_depclean_order.py  |   0
 .../resolver/test_depclean_slot_unavailable.py     |   0
 {pym => lib}/portage/tests/resolver/test_depth.py  |   0
 .../resolver/test_disjunctive_depend_order.py      |   0
 {pym => lib}/portage/tests/resolver/test_eapi.py   |   0
 .../tests/resolver/test_features_test_use.py       |  88 ++++++++
 .../resolver/test_imagemagick_graphicsmagick.py    |   0
 .../portage/tests/resolver/test_keywords.py        |   0
 .../portage/tests/resolver/test_merge_order.py     |   0
 .../test_missing_iuse_and_evaluated_atoms.py       |   0
 .../portage/tests/resolver/test_multirepo.py       |   0
 .../portage/tests/resolver/test_multislot.py       |   0
 .../tests/resolver/test_old_dep_chain_display.py   |   0
 .../portage/tests/resolver/test_onlydeps.py        |   0
 .../tests/resolver/test_onlydeps_circular.py       |   0
 .../tests/resolver/test_onlydeps_minimal.py        |   0
 .../portage/tests/resolver/test_or_choices.py      |   0
 .../tests/resolver/test_or_downgrade_installed.py  |   0
 .../tests/resolver/test_or_upgrade_installed.py    |   0
 {pym => lib}/portage/tests/resolver/test_output.py |   0
 .../portage/tests/resolver/test_package_tracker.py |   0
 .../tests/resolver/test_profile_default_eapi.py    |   0
 .../tests/resolver/test_profile_package_set.py     |   0
 .../portage/tests/resolver/test_rebuild.py         |   0
 .../test_regular_slot_change_without_revbump.py    |   0
 .../portage/tests/resolver/test_required_use.py    |   0
 .../resolver/test_runtime_cycle_merge_order.py     |   0
 {pym => lib}/portage/tests/resolver/test_simple.py |   0
 .../portage/tests/resolver/test_slot_abi.py        |   0
 .../tests/resolver/test_slot_abi_downgrade.py      |   0
 .../resolver/test_slot_change_without_revbump.py   |   0
 .../portage/tests/resolver/test_slot_collisions.py |   0
 .../resolver/test_slot_conflict_force_rebuild.py   |   0
 .../resolver/test_slot_conflict_mask_update.py     |   0
 .../tests/resolver/test_slot_conflict_rebuild.py   |   0
 .../test_slot_conflict_unsatisfied_deep_deps.py    |   0
 .../tests/resolver/test_slot_conflict_update.py    |   0
 .../resolver/test_slot_operator_autounmask.py      |   0
 .../resolver/test_slot_operator_complete_graph.py  |   0
 .../resolver/test_slot_operator_exclusive_slots.py |   0
 .../tests/resolver/test_slot_operator_rebuild.py   |   0
 .../resolver/test_slot_operator_required_use.py    |   0
 .../resolver/test_slot_operator_reverse_deps.py    |   0
 .../test_slot_operator_runtime_pkg_mask.py         |   0
 .../resolver/test_slot_operator_unsatisfied.py     |   0
 .../tests/resolver/test_slot_operator_unsolved.py  |   0
 ..._slot_operator_update_probe_parent_downgrade.py |   0
 .../test_solve_non_slot_operator_slot_conflicts.py |   0
 .../portage/tests/resolver/test_targetroot.py      |   0
 .../tests/resolver/test_unpack_dependencies.py     |   0
 .../portage/tests/resolver/test_use_aliases.py     |   0
 .../tests/resolver/test_use_dep_defaults.py        |   0
 .../portage/tests/resolver/test_useflags.py        |   0
 .../resolver/test_virtual_minimize_children.py     |   0
 .../portage/tests/resolver/test_virtual_slot.py    |   0
 .../portage/tests/resolver/test_with_test_deps.py  |   0
 {pym => lib}/portage/tests/runTests.py             |   0
 {pym => lib}/portage/tests/sets/__init__.py        |   0
 {pym => lib}/portage/tests/sets/__test__.py        |   0
 {pym => lib}/portage/tests/sets/base/__init__.py   |   0
 {pym => lib}/portage/tests/sets/base/__test__.py   |   0
 .../tests/sets/base/testInternalPackageSet.py      |   0
 {pym => lib}/portage/tests/sets/files/__init__.py  |   0
 {pym => lib}/portage/tests/sets/files/__test__.py  |   0
 .../portage/tests/sets/files/testConfigFileSet.py  |   0
 .../portage/tests/sets/files/testStaticFileSet.py  |   0
 {pym => lib}/portage/tests/sets/shell/__init__.py  |   0
 {pym => lib}/portage/tests/sets/shell/__test__.py  |   0
 {pym => lib}/portage/tests/sets/shell/testShell.py |   0
 {pym => lib}/portage/tests/sync/__init__.py        |   0
 {pym => lib}/portage/tests/sync/__test__.py        |   0
 {pym => lib}/portage/tests/sync/test_sync_local.py |  15 +-
 {pym => lib}/portage/tests/unicode/__init__.py     |   0
 {pym => lib}/portage/tests/unicode/__test__.py     |   0
 .../portage/tests/unicode/test_string_format.py    |   0
 {pym => lib}/portage/tests/update/__init__.py      |   0
 {pym => lib}/portage/tests/update/__test__.py      |   0
 {pym => lib}/portage/tests/update/test_move_ent.py |   0
 .../portage/tests/update/test_move_slot_ent.py     |   0
 .../portage/tests/update/test_update_dbentry.py    |   0
 {pym => lib}/portage/tests/util/__init__.py        |   0
 {pym => lib}/portage/tests/util/__test__.py        |   0
 .../portage/tests/util/dyn_libs}/__init__.py       |   0
 .../portage/tests/util/dyn_libs}/__test__.py       |   0
 .../tests/util/dyn_libs/test_soname_deps.py        |  34 +++
 .../portage/tests/util/eventloop}/__init__.py      |   0
 .../portage/tests/util/eventloop}/__test__.py      |   0
 .../tests/util/eventloop/test_call_soon_fifo.py    |   0
 .../portage/tests/util/file_copy}/__init__.py      |   0
 .../portage/tests/util/file_copy}/__test__.py      |   0
 .../portage/tests/util/file_copy/test_copyfile.py  |   0
 .../portage/tests/util/futures}/__init__.py        |   0
 .../portage/tests/util/futures}/__test__.py        |   0
 .../tests/util/futures/asyncio}/__init__.py        |   0
 .../tests/util/futures/asyncio}/__test__.py        |   0
 .../util/futures/asyncio/test_child_watcher.py     |   0
 .../futures/asyncio/test_event_loop_in_fork.py     |   0
 .../tests/util/futures/asyncio/test_pipe_closed.py |   0
 .../asyncio/test_policy_wrapper_recursion.py       |   0
 .../futures/asyncio/test_run_until_complete.py     |   0
 .../util/futures/asyncio/test_subprocess_exec.py   | 160 ++++++++++++++
 .../util/futures/asyncio/test_wakeup_fd_sigchld.py |  76 +++++++
 .../tests/util/futures/test_compat_coroutine.py    | 159 ++++++++++++++
 .../tests/util/futures/test_done_callback.py       |   0
 .../tests/util/futures/test_iter_completed.py      |   0
 .../portage/tests/util/futures/test_retry.py       |   0
 {pym => lib}/portage/tests/util/test_checksum.py   |   0
 {pym => lib}/portage/tests/util/test_digraph.py    |   0
 {pym => lib}/portage/tests/util/test_getconfig.py  |   0
 {pym => lib}/portage/tests/util/test_grabdict.py   |   0
 lib/portage/tests/util/test_install_mask.py        | 129 +++++++++++
 .../portage/tests/util/test_normalizedPath.py      |   0
 .../portage/tests/util/test_stackDictList.py       |   0
 {pym => lib}/portage/tests/util/test_stackDicts.py |   0
 {pym => lib}/portage/tests/util/test_stackLists.py |   0
 .../portage/tests/util/test_uniqueArray.py         |   0
 {pym => lib}/portage/tests/util/test_varExpand.py  |   0
 {pym => lib}/portage/tests/util/test_whirlpool.py  |   0
 {pym => lib}/portage/tests/util/test_xattr.py      |   0
 {pym => lib}/portage/tests/versions/__init__.py    |   0
 .../portage/tests/versions}/__test__.py            |   0
 .../portage/tests/versions/test_cpv_sort_key.py    |   0
 {pym => lib}/portage/tests/versions/test_vercmp.py |   0
 {pym => lib}/portage/tests/xpak/__init__.py        |   0
 .../tests => lib/portage/tests/xpak}/__test__.py   |   0
 {pym => lib}/portage/tests/xpak/test_decodeint.py  |   0
 {pym => lib}/portage/update.py                     |   0
 {pym => lib}/portage/util/ExtractKernelVersion.py  |   0
 {pym => lib}/portage/util/SlotObject.py            |   0
 {pym => lib}/portage/util/_ShelveUnicodeWrapper.py |   0
 {pym => lib}/portage/util/__init__.py              |   0
 {pym => lib}/portage/util/_async/AsyncFunction.py  |   0
 {pym => lib}/portage/util/_async/AsyncScheduler.py |   0
 .../portage/util/_async/AsyncTaskFuture.py         |   0
 {pym => lib}/portage/util/_async/FileCopier.py     |   0
 {pym => lib}/portage/util/_async/FileDigester.py   |   0
 {pym => lib}/portage/util/_async/ForkProcess.py    |   0
 {pym => lib}/portage/util/_async/PipeLogger.py     |   0
 .../portage/util/_async/PipeReaderBlockingIO.py    |   0
 {pym => lib}/portage/util/_async/PopenProcess.py   |   0
 .../portage/util/_async/SchedulerInterface.py      |   0
 {pym => lib}/portage/util/_async/TaskScheduler.py  |   0
 {pym => lib}/portage/util/_async/__init__.py       |   0
 .../portage/util/_async/run_main_scheduler.py      |   0
 {pym => lib}/portage/util/_ctypes.py               |   0
 {pym => lib}/portage/util/_desktop_entry.py        |   0
 .../portage/util/_dyn_libs/LinkageMapELF.py        |   0
 {pym => lib}/portage/util/_dyn_libs/NeededEntry.py |   0
 .../util/_dyn_libs/PreservedLibsRegistry.py        |   0
 {pym => lib}/portage/util/_dyn_libs/__init__.py    |   0
 .../util/_dyn_libs/display_preserved_libs.py       |   0
 {pym => lib}/portage/util/_dyn_libs/soname_deps.py |  42 +++-
 {pym => lib}/portage/util/_eventloop/EventLoop.py  |  52 ++++-
 .../portage/util/_eventloop/PollConstants.py       |   0
 .../portage/util/_eventloop/PollSelectAdapter.py   |   0
 {pym => lib}/portage/util/_eventloop/__init__.py   |   0
 .../portage/util/_eventloop/asyncio_event_loop.py  |  66 +++++-
 .../portage/util/_eventloop/global_event_loop.py   |   0
 {pym => lib}/portage/util/_get_vm_info.py          |   0
 {pym => lib}/portage/util/_info_files.py           |   0
 {pym => lib}/portage/util/_path.py                 |   0
 {pym => lib}/portage/util/_pty.py                  |   0
 {pym => lib}/portage/util/_urlopen.py              |   0
 {pym => lib}/portage/util/_xattr.py                |   0
 {pym => lib}/portage/util/backoff.py               |   0
 {pym => lib}/portage/util/changelog.py             |   0
 {pym => lib}/portage/util/compression_probe.py     |   2 +-
 {pym => lib}/portage/util/configparser.py          |   0
 {pym => lib}/portage/util/cpuinfo.py               |   0
 {pym => lib}/portage/util/digraph.py               |   0
 {pym => lib}/portage/util/elf/__init__.py          |   0
 {pym => lib}/portage/util/elf/constants.py         |   0
 {pym => lib}/portage/util/elf/header.py            |   0
 {pym => lib}/portage/util/endian/__init__.py       |   0
 {pym => lib}/portage/util/endian/decode.py         |   0
 {pym => lib}/portage/util/env_update.py            |   0
 {pym => lib}/portage/util/file_copy/__init__.py    |   0
 {pym => lib}/portage/util/formatter.py             |   0
 {pym => lib}/portage/util/futures/__init__.py      |   0
 .../portage/util/futures/_asyncio/__init__.py      |  53 +++++
 lib/portage/util/futures/_asyncio/process.py       | 107 ++++++++++
 lib/portage/util/futures/_asyncio/streams.py       |  96 +++++++++
 .../portage/util/futures/_asyncio/tasks.py         |   0
 lib/portage/util/futures/compat_coroutine.py       | 116 ++++++++++
 {pym => lib}/portage/util/futures/events.py        |   0
 .../portage/util/futures/executor}/__init__.py     |   0
 {pym => lib}/portage/util/futures/executor/fork.py |   0
 .../portage/util/futures/extendedfutures.py        |   0
 {pym => lib}/portage/util/futures/futures.py       |   0
 .../portage/util/futures/iter_completed.py         |   0
 {pym => lib}/portage/util/futures/retry.py         |   0
 {pym => lib}/portage/util/futures/transports.py    |   0
 {pym => lib}/portage/util/futures/unix_events.py   |   0
 {pym => lib}/portage/util/install_mask.py          |   7 +-
 .../portage/util/iterators/MultiIterGroupBy.py     |   0
 {pym => lib}/portage/util/iterators/__init__.py    |   0
 {pym => lib}/portage/util/lafilefixer.py           |   0
 {pym => lib}/portage/util/listdir.py               |   0
 {pym => lib}/portage/util/locale.py                |   0
 {pym => lib}/portage/util/monotonic.py             |   0
 {pym => lib}/portage/util/movefile.py              |   0
 {pym => lib}/portage/util/mtimedb.py               |   0
 {pym => lib}/portage/util/path.py                  |   0
 {pym => lib}/portage/util/socks5.py                |   0
 {pym => lib}/portage/util/whirlpool.py             |   0
 {pym => lib}/portage/util/writeable_check.py       |   0
 {pym => lib}/portage/versions.py                   |   0
 {pym => lib}/portage/xml/__init__.py               |   0
 {pym => lib}/portage/xml/metadata.py               |   0
 {pym => lib}/portage/xpak.py                       |   0
 man/color.map.5                                    |   2 +-
 man/emerge.1                                       |  10 +-
 man/make.conf.5                                    |   8 +-
 man/portage.5                                      |  29 ++-
 man/ru/color.map.5                                 |   2 +-
 misc/emerge-delta-webrsync                         |  26 ++-
 pym/portage/sync/modules/webrsync/webrsync.py      |  70 ------
 .../tests/resolver/test_features_test_use.py       |  68 ------
 .../util/futures/asyncio/test_subprocess_exec.py   | 236 ---------------------
 repoman/README                                     |   2 +-
 repoman/RELEASE-NOTES                              |   7 +
 repoman/TEST-NOTES                                 |   6 +-
 repoman/bin/repoman                                |   4 +-
 repoman/cnf/qa_data/qa_data.yaml                   |   2 +
 repoman/cnf/repository/qa_data.yaml                |   2 +
 repoman/{pym => lib}/repoman/__init__.py           |   2 +-
 repoman/{pym => lib}/repoman/_portage.py           |   0
 repoman/{pym => lib}/repoman/_subprocess.py        |   0
 repoman/{pym => lib}/repoman/actions.py            |   0
 repoman/{pym => lib}/repoman/argparser.py          |   0
 repoman/{pym => lib}/repoman/check_missingslot.py  |   0
 .../herds => lib/repoman/checks}/__init__.py       |   0
 repoman/{pym => lib}/repoman/config.py             |   8 +-
 repoman/{pym => lib}/repoman/copyrights.py         |   0
 repoman/{pym => lib}/repoman/errors.py             |   0
 repoman/{pym => lib}/repoman/gpg.py                |   0
 repoman/{pym => lib}/repoman/main.py               |   0
 repoman/{pym => lib}/repoman/metadata.py           |   0
 repoman/{pym => lib}/repoman/modules/__init__.py   |   0
 .../repoman/modules/commit/__init__.py             |   0
 .../repoman/modules/commit/manifest.py             |   0
 .../repoman/modules/commit/repochecks.py           |   0
 .../repoman/modules/linechecks/__init__.py         |   0
 .../modules/linechecks/assignment/__init__.py      |   0
 .../modules/linechecks/assignment/assignment.py    |   0
 .../repoman/modules/linechecks/base.py             |   0
 .../repoman/modules/linechecks/config.py           |   0
 .../repoman/modules/linechecks/controller.py       |   0
 .../repoman/modules/linechecks/depend/__init__.py  |   0
 .../repoman/modules/linechecks/depend/implicit.py  |   0
 .../modules/linechecks/deprecated/__init__.py      |   0
 .../modules/linechecks/deprecated/deprecated.py    |   0
 .../modules/linechecks/deprecated/inherit.py       |   0
 .../repoman/modules/linechecks/do/__init__.py      |   0
 .../repoman/modules/linechecks/do/dosym.py         |   0
 .../repoman/modules/linechecks/eapi/__init__.py    |   0
 .../repoman/modules/linechecks/eapi/checks.py      |   0
 .../repoman/modules/linechecks/eapi/definition.py  |   0
 .../repoman/modules/linechecks/emake/__init__.py   |   0
 .../repoman/modules/linechecks/emake/emake.py      |   0
 .../modules/linechecks/gentoo_header/__init__.py   |   0
 .../modules/linechecks/gentoo_header/header.py     |   0
 .../repoman/modules/linechecks/helpers/__init__.py |   0
 .../repoman/modules/linechecks/helpers/offset.py   |   0
 .../repoman/modules/linechecks/nested/__init__.py  |   0
 .../repoman/modules/linechecks/nested/nested.py    |   0
 .../repoman/modules/linechecks/nested/nesteddie.py |   0
 .../repoman/modules/linechecks/patches/__init__.py |   0
 .../repoman/modules/linechecks/patches/patches.py  |   0
 .../repoman/modules/linechecks/phases/__init__.py  |   0
 .../repoman/modules/linechecks/phases/phase.py     |   0
 .../repoman/modules/linechecks/portage/__init__.py |   0
 .../repoman/modules/linechecks/portage/internal.py |   0
 .../repoman/modules/linechecks/quotes/__init__.py  |   0
 .../repoman/modules/linechecks/quotes/quoteda.py   |   0
 .../repoman/modules/linechecks/quotes/quotes.py    |   0
 .../repoman/modules/linechecks/uri/__init__.py     |   0
 .../repoman/modules/linechecks/uri/uri.py          |   0
 .../repoman/modules/linechecks/use/__init__.py     |   0
 .../repoman/modules/linechecks/use/builtwith.py    |   0
 .../repoman/modules/linechecks/useless/__init__.py |   0
 .../repoman/modules/linechecks/useless/cd.py       |   0
 .../repoman/modules/linechecks/useless/dodoc.py    |   0
 .../modules/linechecks/whitespace/__init__.py      |   0
 .../repoman/modules/linechecks/whitespace/blank.py |   0
 .../modules/linechecks/whitespace/whitespace.py    |   0
 .../modules/linechecks/workaround/__init__.py      |   0
 .../modules/linechecks/workaround/workarounds.py   |   0
 .../{pym => lib}/repoman/modules/scan/__init__.py  |   0
 .../repoman/modules/scan/depend/__init__.py        |   0
 .../repoman/modules/scan/depend/_depend_checks.py  |   9 +
 .../repoman/modules/scan/depend/_gen_arches.py     |   0
 .../repoman/modules/scan/depend/profile.py         |  36 ++++
 .../repoman/modules/scan/directories/__init__.py   |   0
 .../repoman/modules/scan/directories/files.py      |   0
 .../repoman/modules/scan/directories/mtime.py      |   0
 .../repoman/modules/scan/eapi/__init__.py          |   0
 .../{pym => lib}/repoman/modules/scan/eapi/eapi.py |   0
 .../repoman/modules/scan/ebuild/__init__.py        |   0
 .../repoman/modules/scan/ebuild/ebuild.py          |   0
 .../repoman/modules/scan/ebuild/multicheck.py      |   0
 .../repoman/modules/scan/eclasses/__init__.py      |   0
 .../repoman/modules/scan/eclasses/live.py          |   0
 .../repoman/modules/scan/eclasses/ruby.py          |   0
 .../repoman/modules/scan/fetch/__init__.py         |   0
 .../repoman/modules/scan/fetch/fetches.py          |   0
 .../repoman/modules/scan/keywords/__init__.py      |   0
 .../repoman/modules/scan/keywords/keywords.py      |  21 ++
 .../repoman/modules/scan/manifest/__init__.py      |   0
 .../repoman/modules/scan/manifest/manifests.py     |   0
 .../repoman/modules/scan/metadata/__init__.py      |   0
 .../repoman/modules/scan/metadata/description.py   |   0
 .../modules/scan/metadata/ebuild_metadata.py       |   0
 .../repoman/modules/scan/metadata/pkgmetadata.py   |   0
 .../repoman/modules/scan/metadata/restrict.py      |   0
 .../repoman/modules/scan/metadata/use_flags.py     |   0
 .../{pym => lib}/repoman/modules/scan/module.py    |   0
 .../repoman/modules/scan/options/__init__.py       |   0
 .../repoman/modules/scan/options/options.py        |   0
 repoman/{pym => lib}/repoman/modules/scan/scan.py  |   0
 .../{pym => lib}/repoman/modules/scan/scanbase.py  |   0
 .../repoman/modules/vcs/None/__init__.py           |   0
 .../repoman/modules/vcs/None/changes.py            |   0
 .../repoman/modules/vcs/None/status.py             |   0
 .../{pym => lib}/repoman/modules/vcs/__init__.py   |   0
 .../repoman/modules/vcs/bzr/__init__.py            |   0
 .../repoman/modules/vcs/bzr/changes.py             |   0
 .../{pym => lib}/repoman/modules/vcs/bzr/status.py |   0
 .../{pym => lib}/repoman/modules/vcs/changes.py    |   0
 .../repoman/modules/vcs/cvs/__init__.py            |   0
 .../repoman/modules/vcs/cvs/changes.py             |   0
 .../{pym => lib}/repoman/modules/vcs/cvs/status.py |   0
 .../repoman/modules/vcs/git/__init__.py            |   0
 .../repoman/modules/vcs/git/changes.py             |   0
 .../{pym => lib}/repoman/modules/vcs/git/status.py |   0
 .../repoman/modules/vcs/hg/__init__.py             |   0
 .../{pym => lib}/repoman/modules/vcs/hg/changes.py |   0
 .../{pym => lib}/repoman/modules/vcs/hg/status.py  |   0
 .../{pym => lib}/repoman/modules/vcs/settings.py   |   0
 .../repoman/modules/vcs/svn/__init__.py            |   0
 .../repoman/modules/vcs/svn/changes.py             |   0
 .../{pym => lib}/repoman/modules/vcs/svn/status.py |   0
 repoman/{pym => lib}/repoman/modules/vcs/vcs.py    |   0
 repoman/{pym => lib}/repoman/profile.py            |   0
 repoman/{pym => lib}/repoman/qa_data.py            |   0
 repoman/{pym => lib}/repoman/qa_tracker.py         |   0
 repoman/{pym => lib}/repoman/repos.py              |   0
 repoman/{pym => lib}/repoman/scanner.py            |   0
 repoman/{pym => lib}/repoman/tests/__init__.py     |   0
 .../changelog => lib/repoman/tests}/__test__.py    |   0
 .../repoman/tests/changelog/__init__.py            |   0
 .../lib/repoman/tests/changelog}/__test__.py       |   0
 .../repoman/tests/changelog/test_echangelog.py     |   0
 .../{pym => lib}/repoman/tests/commit/__init__.py  |   0
 .../{pym => lib}/repoman/tests/commit/__test__.py  |   0
 .../repoman/tests/commit/test_commitmsg.py         |   0
 repoman/{pym => lib}/repoman/tests/runTests.py     |   2 +-
 .../{pym => lib}/repoman/tests/simple/__init__.py  |   0
 .../{pym => lib}/repoman/tests/simple/__test__.py  |   0
 .../repoman/tests/simple/test_simple.py            |   0
 repoman/{pym => lib}/repoman/utilities.py          |   2 +-
 repoman/man/repoman.1                              |   5 +-
 repoman/pym/repoman/checks/herds/herdbase.py       | 135 ------------
 repoman/pym/repoman/checks/herds/metadata.py       |  26 ---
 repoman/runtests                                   |   4 +-
 repoman/setup.py                                   |  24 +--
 runtests                                           |   4 +-
 setup.py                                           |   8 +-
 testpath                                           |   4 +-
 tox.ini                                            |  16 ++
 788 files changed, 2521 insertions(+), 954 deletions(-)

diff --cc lib/_emerge/Package.py
index e73c9d9d1,5f34f3d27..ed4bd2277
--- a/lib/_emerge/Package.py
+++ b/lib/_emerge/Package.py
@@@ -93,13 -93,10 +93,16 @@@ class Package(Task)
  		# sync metadata with validated repo (may be UNKNOWN_REPO)
  		self._metadata['repository'] = self.cpv.repo
  
- 		implicit_match = db._iuse_implicit_cnstr(self.cpv, self._metadata)
+ 		if self.root_config.settings.local_config:
+ 			implicit_match = db._iuse_implicit_cnstr(self.cpv, self._metadata)
+ 		else:
+ 			implicit_match = db._repoman_iuse_implicit_cnstr(self.cpv, self._metadata)
 +		if 'force-multilib' in self.root_config.settings.features:
 +			iuse = self._metadata["IUSE"]
 +			for multilib_abis in self.root_config.settings.get("MULTILIB_ABIS", '').split():
 +				iuse += " multilib_abi_" + multilib_abis
 +			iuse += " abiwrapper"
 +			self._metadata["IUSE"] = iuse
  		usealiases = self.root_config.settings._use_manager.getUseAliases(self)
  		self.iuse = self._iuse(self, self._metadata["IUSE"].split(),
  			implicit_match, usealiases, self.eapi)
diff --cc lib/portage/package/ebuild/config.py
index 1f1158d33,a68df5807..14a2193ef
--- a/lib/portage/package/ebuild/config.py
+++ b/lib/portage/package/ebuild/config.py
@@@ -952,14 -962,15 +962,22 @@@ class config(object)
  
  			# initialize self.features
  			self.regenerate()
+ 			feature_use = []
+ 			if "test" in self.features:
+ 				feature_use.append("test")
+ 			self.configdict["features"]["USE"] = self._default_features_use = " ".join(feature_use)
+ 			if feature_use:
+ 				# Regenerate USE so that the initial "test" flag state is
+ 				# correct for evaluation of !test? conditionals in RESTRICT.
+ 				self.regenerate()
  
 +			if 'force-multilib' in self.features:
 +				#add multilib_abi internally to list of USE_EXPANDed vars
 +				self["USE_EXPAND"] = "MULTILIB_ABI" + " " + self.get("USE_EXPAND", "")
 +				self.backup_changes("USE_EXPAND")
 +				default_abi = self.configdict["defaults"].get('DEFAULT_ABI', '').strip()
 +				if default_abi:
 +					self.configdict["defaults"]["USE"] = self.configdict["defaults"].get("USE", "") + " multilib_abi_" + default_abi
  			if unprivileged:
  				self.features.add('unprivileged')
  
@@@ -1906,16 -1938,6 +1947,10 @@@
  		iuse_implicit.add("build")
  		iuse_implicit.add("bootstrap")
  
- 		# Controlled by FEATURES=test. Make this implicit, so handling
- 		# of FEATURES=test is consistent regardless of explicit IUSE.
- 		# Users may use use.mask/package.use.mask to control
- 		# FEATURES=test for all ebuilds, regardless of explicit IUSE.
- 		iuse_implicit.add("test")
- 
 +		if 'force-multilib' in self.features:
 +			for multilib_abis in self.get('MULTILIB_ABIS', '').split():
 +				iuse_implicit.add("multilib_abi_" + multilib_abis)
 +
  		return iuse_implicit
  
  	def _getUseMask(self, pkg, stable=None):


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2019-03-09  9:56 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2019-03-09  9:56 UTC (permalink / raw
  To: gentoo-commits

commit:     533044621a8608b0186ae79eeaa994a0a40a7204
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Wed Dec 26 09:50:27 2018 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Wed Dec 26 10:16:35 2018 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=53304462

merge portage-2.3.52

Signed-off-by: Thomas Sachau <tommy <AT> gentoo.org>

 RELEASE-NOTES                                      |  32 +++
 bin/ebuild-helpers/dodoc                           |   3 +-
 bin/ebuild-helpers/ecompress                       | 161 -------------
 bin/ebuild-helpers/ecompressdir                    | 226 -------------------
 bin/ebuild-helpers/fowners                         |  15 ++
 bin/ebuild-helpers/fperms                          |  15 ++
 bin/ebuild-helpers/prepall                         |  25 +-
 bin/ebuild-helpers/prepalldocs                     |  19 +-
 bin/ebuild-helpers/prepallinfo                     |   9 +-
 bin/ebuild-helpers/prepallman                      |  20 +-
 bin/ebuild-helpers/prepinfo                        |   3 +-
 bin/ebuild-helpers/prepman                         |  35 +--
 bin/ebuild.sh                                      |   8 +-
 bin/ecompress                                      | 198 ++++++++++++++++
 bin/ecompress-file                                 |  61 +++++
 bin/estrip                                         |  10 +-
 bin/etc-update                                     |  12 +-
 bin/helper-functions.sh                            |   9 +-
 bin/install-qa-check.d/60pngfix                    |  13 +-
 bin/isolated-functions.sh                          |  24 +-
 bin/misc-functions.sh                              | 211 +++++++----------
 bin/phase-functions.sh                             |   2 +-
 bin/phase-helpers.sh                               |   7 +-
 bin/pid-ns-init                                    |  30 +++
 bin/portageq                                       |   4 +
 bin/postinst-qa-check.d/50gnome2-utils             |   2 +-
 bin/postinst-qa-check.d/50xdg-utils                |   2 +-
 cnf/make.globals                                   |   4 +-
 lib/_emerge/actions.py                             |   7 -
 lib/portage/const.py                               |   6 +-
 lib/portage/dbapi/porttree.py                      |  72 ++++--
 lib/portage/dbapi/vartree.py                       |  12 +
 lib/portage/package/ebuild/doebuild.py             |  27 ++-
 lib/portage/process.py                             |  73 +++++-
 lib/portage/repository/config.py                   | 148 +++++++++---
 .../repository/storage}/__init__.py                |   2 +-
 .../repository/storage/hardlink_quarantine.py      |  97 ++++++++
 lib/portage/repository/storage/hardlink_rcu.py     | 251 +++++++++++++++++++++
 lib/portage/repository/storage/inplace.py          |  49 ++++
 lib/portage/repository/storage/interface.py        |  87 +++++++
 lib/portage/sync/controller.py                     |   1 +
 lib/portage/sync/modules/rsync/rsync.py            |  85 ++-----
 lib/portage/sync/syncbase.py                       |  55 ++++-
 lib/portage/tests/__init__.py                      |  36 +--
 lib/portage/tests/bin/setup_env.py                 |   2 +-
 lib/portage/tests/sync/test_sync_local.py          |  40 +++-
 .../tests/util/futures/test_compat_coroutine.py    |  22 +-
 lib/portage/util/futures/_asyncio/__init__.py      |  14 ++
 lib/portage/util/futures/_sync_decorator.py        |  54 +++++
 lib/portage/util/futures/compat_coroutine.py       |  14 ++
 man/ebuild.1                                       |   5 +
 man/ebuild.5                                       |   6 +-
 man/emerge.1                                       |   2 +-
 man/make.conf.5                                    |  33 ++-
 man/portage.5                                      |  35 +++
 repoman/RELEASE-NOTES                              |  18 ++
 repoman/bin/repoman                                |   2 +-
 repoman/cnf/linechecks/linechecks.yaml             |   3 +-
 repoman/lib/repoman/actions.py                     |  55 ++++-
 repoman/lib/repoman/copyrights.py                  |  18 +-
 repoman/lib/repoman/main.py                        |   9 +-
 repoman/lib/repoman/modules/commit/manifest.py     |  11 +-
 .../modules/linechecks/gentoo_header/header.py     |  47 ++--
 repoman/lib/repoman/scanner.py                     |   3 +-
 repoman/lib/repoman/tests/__init__.py              |  34 +--
 .../lib/repoman/tests/changelog/test_echangelog.py |   2 +-
 repoman/lib/repoman/tests/simple/test_simple.py    |  14 +-
 repoman/setup.py                                   |   2 +-
 setup.py                                           |   4 +-
 69 files changed, 1696 insertions(+), 921 deletions(-)

diff --cc bin/phase-functions.sh
index a1aaea020,d8ebf3d3e..fd17e6377
--- a/bin/phase-functions.sh
+++ b/bin/phase-functions.sh
@@@ -311,9 -287,8 +311,9 @@@ __dyn_clean() 
  	fi
  
  	if [[ $EMERGE_FROM = binary ]] || ! has keepwork $FEATURES; then
 -		rm -f "$PORTAGE_BUILDDIR"/.{ebuild_changed,logid,pretended,setuped,unpacked,prepared} \
 -			"$PORTAGE_BUILDDIR"/.{configured,compiled,tested,packaged,instprepped} \
 +		rm -f "$PORTAGE_BUILDDIR"/.{ebuild_changed,logid,pretended*,setuped*,unpacked*,prepared*} \
- 			"$PORTAGE_BUILDDIR"/.{configured*,compiled*,tested*,packaged*} \
++			"$PORTAGE_BUILDDIR"/.{configured*,compiled*,tested*,packaged*,instprepped} \
 +			"$PORTAGE_BUILDDIR"/.abi \
  			"$PORTAGE_BUILDDIR"/.die_hooks \
  			"$PORTAGE_BUILDDIR"/.ipc_{in,out,lock} \
  			"$PORTAGE_BUILDDIR"/.exit_status


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2019-03-17 11:35 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2019-03-17 11:35 UTC (permalink / raw
  To: gentoo-commits

commit:     88a712b0cf17c1bc47de174f8f1219d24912eee6
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sun Mar 17 11:34:05 2019 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun Mar 17 11:34:05 2019 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=88a712b0

Merge tag 'portage-2.3.62' into multilib

portage-2.3.62

Signed-off-by: Zac Medico <zmedico <AT> gentoo.org>

 .travis.yml                                        |   7 +
 NEWS                                               |   9 +-
 RELEASE-NOTES                                      |  76 +++++++
 bin/ebuild-helpers/bsd/sed                         |   3 +-
 bin/ebuild-helpers/portageq                        |   3 +-
 bin/ebuild-helpers/unprivileged/chown              |   3 +-
 bin/ebuild-helpers/xattr/install                   |   3 +-
 bin/ebuild.sh                                      |  34 ++--
 bin/etc-update                                     |   2 +-
 bin/misc-functions.sh                              |  34 ++++
 bin/pid-ns-init                                    | 105 +++++++++-
 bin/postinst-qa-check.d/50gnome2-utils             |  64 ------
 bin/postinst-qa-check.d/50xdg-utils                |  54 +++++
 bin/preinst-qa-check.d/50gnome2-utils              |   1 -
 bin/socks5-server.py                               |   8 +-
 cnf/make.conf.example                              |  20 +-
 cnf/make.globals                                   |  14 +-
 lib/_emerge/AbstractEbuildProcess.py               |   9 +-
 lib/_emerge/SpawnProcess.py                        |   2 +-
 lib/_emerge/help.py                                |   2 +-
 lib/_emerge/post_emerge.py                         |   2 +-
 lib/_emerge/resolver/output.py                     |  13 +-
 lib/portage/const.py                               |   1 +
 lib/portage/dbapi/porttree.py                      |  20 +-
 lib/portage/dbapi/vartree.py                       |  17 +-
 lib/portage/elog/mod_echo.py                       |   2 +-
 lib/portage/elog/mod_save.py                       |   4 +-
 lib/portage/elog/mod_save_summary.py               |   4 +-
 lib/portage/emaint/modules/logs/__init__.py        |   2 +-
 lib/portage/emaint/modules/logs/logs.py            |  22 +--
 lib/portage/locks.py                               | 154 ++++++++++++---
 .../package/ebuild/_config/special_env_vars.py     |   5 +-
 lib/portage/package/ebuild/config.py               |  15 +-
 lib/portage/package/ebuild/doebuild.py             |  49 ++---
 lib/portage/package/ebuild/prepare_build_dirs.py   |  26 +--
 lib/portage/process.py                             | 220 +++++++++++++++++----
 lib/portage/sync/modules/git/git.py                |  10 +-
 lib/portage/sync/modules/rsync/rsync.py            |  11 +-
 lib/portage/tests/emerge/test_simple.py            |   2 +-
 lib/portage/tests/resolver/ResolverPlayground.py   |  49 +++++
 lib/portage/tests/sync/test_sync_local.py          |  22 ++-
 lib/portage/tests/util/test_install_mask.py        |  36 ++++
 lib/portage/tests/util/test_socks5.py              | 211 ++++++++++++++++++++
 lib/portage/util/ExtractKernelVersion.py           |  17 +-
 lib/portage/util/cpuinfo.py                        |  33 +++-
 lib/portage/util/futures/compat_coroutine.py       |   6 +-
 lib/portage/util/futures/executor/fork.py          |   4 +-
 lib/portage/util/futures/iter_completed.py         |  18 +-
 lib/portage/util/install_mask.py                   |  89 ++++++++-
 lib/portage/util/socks5.py                         |  48 ++++-
 man/ebuild.5                                       |   2 +-
 man/emaint.1                                       |   6 +-
 man/emerge.1                                       |   8 +-
 man/make.conf.5                                    |  52 ++---
 man/portage.5                                      |   2 +-
 repoman/runtests                                   |   6 +-
 runtests                                           |   6 +-
 setup.py                                           |   2 +-
 tox.ini                                            |   2 +-
 59 files changed, 1304 insertions(+), 347 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2019-12-26 11:56 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2019-12-26 11:56 UTC (permalink / raw
  To: gentoo-commits

commit:     a757c986855dee5574a1b773f45d3d976d55edd0
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Thu Dec 26 11:49:34 2019 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Thu Dec 26 11:55:34 2019 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=a757c986

Merge portage-2.3.83

Signed-off-by: Thomas Sachau <tommy <AT> gentoo.org>

 .travis.yml                                        |  15 +-
 NEWS                                               |  40 ++
 RELEASE-NOTES                                      | 200 ++++++++
 bin/dispatch-conf                                  |  11 +-
 bin/eapi.sh                                        |   4 +
 bin/ebuild                                         |  10 +-
 bin/ebuild-helpers/doins                           |   3 +-
 bin/ebuild.sh                                      |  13 +-
 bin/emerge-webrsync                                |  47 +-
 bin/estrip                                         |  41 +-
 bin/glsa-check                                     | 112 +++--
 bin/helper-functions.sh                            |   7 +-
 bin/install-qa-check.d/10ignored-flags             |   2 +-
 bin/install-qa-check.d/80libraries                 |  21 +-
 bin/install-qa-check.d/95empty-dirs                |   4 +-
 bin/install.py                                     |  24 +-
 bin/isolated-functions.sh                          |  28 +-
 bin/phase-functions.sh                             |  41 +-
 bin/phase-helpers.sh                               | 119 ++---
 bin/pid-ns-init                                    |   2 +-
 bin/quickpkg                                       |  34 +-
 bin/socks5-server.py                               |   2 +-
 cnf/make.conf.example                              |  21 +-
 cnf/make.globals                                   |  10 +-
 cnf/repos.conf                                     |   8 +-
 cnf/sets/portage.conf                              |  12 +-
 lib/_emerge/Binpkg.py                              |  96 ++--
 lib/_emerge/BinpkgVerifier.py                      |   4 +-
 lib/_emerge/EbuildExecuter.py                      |   6 +-
 lib/_emerge/EbuildPhase.py                         |   2 +-
 lib/_emerge/PollScheduler.py                       |   6 +-
 lib/_emerge/Scheduler.py                           |  17 +-
 lib/_emerge/actions.py                             |  46 +-
 lib/_emerge/create_depgraph_params.py              |  39 ++
 lib/_emerge/depgraph.py                            | 528 +++++++++++++--------
 lib/_emerge/emergelog.py                           |   2 +-
 lib/_emerge/main.py                                |  32 +-
 lib/_emerge/resolver/backtracking.py               |  20 +-
 lib/_emerge/resolver/slot_collision.py             |  17 +-
 lib/portage/__init__.py                            |  31 +-
 .../{sync/modules => _compat_upgrade}/__init__.py  |   0
 lib/portage/_compat_upgrade/default_locations.py   |  93 ++++
 lib/portage/_emirrordist/Config.py                 |  10 +-
 lib/portage/_emirrordist/DeletionIterator.py       |  38 +-
 lib/portage/_emirrordist/DeletionTask.py           |  47 +-
 lib/portage/_emirrordist/FetchTask.py              | 120 +++--
 lib/portage/_emirrordist/main.py                   |  12 +
 lib/portage/_sets/__init__.py                      |  14 +-
 lib/portage/_sets/dbapi.py                         |  18 +-
 lib/portage/cache/flat_hash.py                     |   4 +-
 lib/portage/cache/mappings.py                      |  30 +-
 lib/portage/const.py                               |   6 +-
 lib/portage/dbapi/__init__.py                      |   9 +-
 lib/portage/dbapi/bintree.py                       | 148 +++++-
 lib/portage/dbapi/porttree.py                      |  27 +-
 lib/portage/dbapi/vartree.py                       | 250 +++++++++-
 lib/portage/dep/__init__.py                        | 244 ++++++----
 lib/portage/dep/dep_check.py                       |  10 +
 lib/portage/dep/soname/multilib_category.py        |  51 +-
 lib/portage/emaint/modules/binhost/binhost.py      |  21 +-
 lib/portage/emaint/modules/sync/sync.py            |   6 +-
 lib/portage/exception.py                           |   6 +-
 lib/portage/glsa.py                                |  15 +-
 lib/portage/locks.py                               |   6 +-
 lib/portage/news.py                                |   5 +-
 lib/portage/package/ebuild/_config/helper.py       |   4 +-
 .../package/ebuild/_config/special_env_vars.py     |   9 +-
 lib/portage/package/ebuild/_spawn_nofetch.py       |   6 +-
 lib/portage/package/ebuild/config.py               |  41 +-
 lib/portage/package/ebuild/doebuild.py             |  54 +--
 lib/portage/package/ebuild/fetch.py                | 381 +++++++++++++--
 lib/portage/process.py                             | 102 +++-
 lib/portage/repository/config.py                   |  29 +-
 lib/portage/sync/__init__.py                       |   5 +-
 lib/portage/sync/controller.py                     |   5 +-
 lib/portage/sync/modules/rsync/rsync.py            |   7 +
 lib/portage/sync/modules/webrsync/webrsync.py      |   1 +
 lib/portage/sync/syncbase.py                       |  13 +-
 lib/portage/tests/dep/testAtom.py                  |  16 +-
 lib/portage/tests/dep/test_use_reduce.py           |  72 ++-
 lib/portage/tests/ebuild/test_fetch.py             | 476 +++++++++++++++++++
 lib/portage/tests/emerge/test_emerge_slot_abi.py   |  14 +-
 lib/portage/tests/emerge/test_simple.py            |   3 +-
 lib/portage/tests/glsa/test_security_set.py        |   2 +-
 lib/portage/tests/news/test_NewsItem.py            |   4 +-
 lib/portage/tests/process/test_poll.py             |  20 +-
 lib/portage/tests/process/test_unshare_net.py      |  38 ++
 lib/portage/tests/resolver/ResolverPlayground.py   |  17 +-
 .../test_aggressive_backtrack_downgrade.py         |  91 ++++
 lib/portage/tests/resolver/test_autounmask.py      |  39 +-
 lib/portage/tests/resolver/test_blocker.py         |  87 +++-
 .../tests/resolver/test_circular_choices.py        | 109 ++++-
 lib/portage/tests/resolver/test_keywords.py        |  15 +-
 lib/portage/tests/resolver/test_slot_abi.py        |  42 +-
 .../tests/resolver/test_slot_abi_downgrade.py      |  32 +-
 lib/portage/tests/resolver/test_slot_collisions.py |   6 +-
 .../resolver/test_slot_conflict_mask_update.py     |   5 +-
 .../resolver/test_slot_conflict_update_virt.py     |  79 +++
 .../resolver/test_slot_operator_autounmask.py      |  22 +-
 .../resolver/test_slot_operator_complete_graph.py  |   2 +-
 .../test_slot_operator_runtime_pkg_mask.py         |   4 +-
 lib/portage/tests/resolver/test_targetroot.py      |  24 +-
 .../resolver/test_virtual_minimize_children.py     |  39 ++
 lib/portage/tests/resolver/test_with_test_deps.py  |  39 +-
 lib/portage/tests/update/test_move_slot_ent.py     |  18 +-
 .../util/futures/asyncio/test_child_watcher.py     |  19 +-
 .../util/futures/asyncio/test_subprocess_exec.py   |  36 +-
 .../util/futures/asyncio/test_wakeup_fd_sigchld.py |  10 +-
 lib/portage/tests/util/test_file_copier.py         |  48 ++
 lib/portage/tests/util/test_getconfig.py           |   4 +-
 lib/portage/update.py                              |   6 +-
 lib/portage/util/_async/FileCopier.py              |  26 +-
 lib/portage/util/_compare_files.py                 | 103 ++++
 lib/portage/util/_dyn_libs/LinkageMapELF.py        |   5 +-
 lib/portage/util/_eventloop/asyncio_event_loop.py  |   5 +
 lib/portage/util/_get_vm_info.py                   |   9 +-
 lib/portage/util/_urlopen.py                       |   6 +-
 lib/portage/util/_xattr.py                         |   6 +-
 lib/portage/util/elf/constants.py                  |  10 +-
 lib/portage/util/futures/_asyncio/__init__.py      |  23 +-
 lib/portage/util/install_mask.py                   |   8 +-
 lib/portage/util/netlink.py                        |  98 ++++
 lib/portage/util/socks5.py                         |  10 +-
 lib/portage/xml/metadata.py                        |  16 +-
 man/ebuild.5                                       | 299 +++++++-----
 man/emerge.1                                       |  60 ++-
 man/emirrordist.1                                  |  10 +
 man/glsa-check.1                                   |  53 +++
 man/make.conf.5                                    |  65 ++-
 man/portage.5                                      |  37 +-
 man/quickpkg.1                                     |   4 +-
 misc/emerge-delta-webrsync                         |  32 +-
 repoman/RELEASE-NOTES                              |  51 ++
 repoman/cnf/linechecks/linechecks.yaml             |  47 +-
 repoman/cnf/qa_data/qa_data.yaml                   |   1 +
 repoman/cnf/repository/qa_data.yaml                |   1 +
 repoman/lib/repoman/__init__.py                    |   4 +-
 repoman/lib/repoman/actions.py                     |  15 +-
 repoman/lib/repoman/argparser.py                   |  40 +-
 repoman/lib/repoman/modules/linechecks/base.py     |   5 +-
 .../lib/repoman/modules/linechecks/controller.py   |  12 +-
 .../modules/linechecks/deprecated/inherit.py       |  19 +-
 repoman/lib/repoman/modules/linechecks/do/dosym.py |   6 +-
 .../lib/repoman/modules/linechecks/eapi/checks.py  |  10 +-
 .../lib/repoman/modules/linechecks/emake/emake.py  |   2 +-
 .../modules/linechecks/gentoo_header/header.py     |  51 +-
 .../lib/repoman/modules/linechecks/phases/phase.py |   4 +-
 .../repoman/modules/linechecks/portage/internal.py |   7 +-
 .../repoman/modules/linechecks/quotes/quoteda.py   |   2 +-
 .../repoman/modules/linechecks/useless/dodoc.py    |   2 +-
 .../repoman/modules/linechecks/whitespace/blank.py |   2 +-
 .../lib/repoman/modules/scan/depend/__init__.py    |   3 +-
 .../repoman/modules/scan/depend/_depend_checks.py  |  14 +
 repoman/lib/repoman/modules/scan/depend/profile.py |   9 +-
 repoman/lib/repoman/modules/scan/ebuild/ebuild.py  |   3 +-
 .../modules/scan/metadata/ebuild_metadata.py       |   4 +-
 .../lib/repoman/modules/scan/metadata/restrict.py  |   6 +-
 repoman/lib/repoman/scanner.py                     |   9 +
 repoman/lib/repoman/tests/commit/test_commitmsg.py |   2 +-
 repoman/lib/repoman/tests/simple/test_simple.py    |   1 +
 repoman/man/repoman.1                              |   9 +-
 repoman/runtests                                   |   6 +-
 repoman/setup.py                                   |   2 +-
 runtests                                           |   6 +-
 setup.py                                           |   6 +-
 tox.ini                                            |   8 +-
 166 files changed, 4728 insertions(+), 1488 deletions(-)

diff --cc bin/phase-functions.sh
index fd17e6377,73f8cee9b..f98d78f8a
--- a/bin/phase-functions.sh
+++ b/bin/phase-functions.sh
@@@ -678,25 -594,9 +664,25 @@@ __dyn_install() 
  	export _E_DOCDESTTREE_=""
  
  	__ebuild_phase src_install
 +
 +		if ( [[ " ${FEATURES} " == *" force-multilib "* ]] && is_auto-multilib ) ; then
 +			_finalize_abi_install
 +			cp "${T}"/environment "${PORTAGE_BUILDDIR}"/build-info/environment.${LOOP_ABI} || die
 +		fi
 +	done
 +	if [[ -d "${D}" ]]; then
 +		if [[ " ${FEATURES} " == *" force-multilib "* ]]; then
 +			if [[ ${CATEGORY}/${PN} == sys-devel/libtool ]] ; then
 +				ewarn "Preserving libltdl.la because of extensive usage"
 +				ewarn "even in m4 macros of libtool"
 +			else
 +				find "${D}" -name '*.la' ! -exec grep -q shouldnotlink=yes {} \; -exec rm {} \;
 +			fi
 +		fi
 +
  	>> "$PORTAGE_BUILDDIR/.installed" || \
  		die "Failed to create $PORTAGE_BUILDDIR/.installed"
- 	__vecho ">>> Completed installing ${PF} into ${D}"
+ 	__vecho ">>> Completed installing ${CATEGORY}/${PF} into ${D}"
  	__vecho
  	__ebuild_phase post_src_install
  
diff --cc bin/phase-helpers.sh
index 07f4c68ce,b5691bd70..0a326b7d9
--- a/bin/phase-helpers.sh
+++ b/bin/phase-helpers.sh
@@@ -237,10 -237,9 +237,10 @@@ use() 
  	# Make sure we have this USE flag in IUSE, but exempt binary
  	# packages for API consumers like Entropy which do not require
  	# a full profile with IUSE_IMPLICIT and stuff (see bug #456830).
- 	elif [[ -n $PORTAGE_IUSE && -n $EBUILD_PHASE &&
- 		-n $PORTAGE_INTERNAL_CALLER ]] ; then
+ 	elif declare -f ___in_portage_iuse >/dev/null &&
+ 		[[ -n ${EBUILD_PHASE} && -n ${PORTAGE_INTERNAL_CALLER} ]] ; then
 +		if ( [[ ! " ${FEATURES} " == *" force-multilib "* && $u == multilib ]] && \
- 			[[ ! $u =~ $PORTAGE_IUSE ]] ) ; then
+ 		if ! ___in_portage_iuse "${u}"; then
  			if [[ ${EMERGE_FROM} != binary &&
  				! ${EAPI} =~ ^(0|1|2|3|4|4-python|4-slot-abi)$ ]] ; then
  				# This is only strict starting with EAPI 5, since implicit IUSE


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2020-07-05 17:57 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2020-07-05 17:57 UTC (permalink / raw
  To: gentoo-commits

commit:     661e707be59a3e3c2973b81ac1cbe376248ed0d9
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sun Jul  5 08:51:15 2020 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun Jul  5 17:56:29 2020 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=661e707b

Merge tag 'portage-2.3.103' into multilib

portage-2.3.103

Signed-off-by: Zac Medico <zmedico <AT> gentoo.org>
Signed-off-by: Thomas Sachau <tommy <AT> gentoo.org>

 .travis.yml                                        |  10 +-
 MANIFEST.in                                        |   5 +
 NEWS                                               |  24 +
 RELEASE-NOTES                                      | 153 ++++++
 bin/eapi.sh                                        |  46 +-
 bin/ebuild-helpers/dosym                           |  13 +-
 bin/ebuild.sh                                      |  23 +-
 bin/ecompress                                      |  27 +-
 bin/emerge-webrsync                                |   1 +
 bin/isolated-functions.sh                          |   4 +-
 bin/misc-functions.sh                              |  12 +-
 bin/phase-functions.sh                             |   8 +-
 bin/phase-helpers.sh                               |  12 +-
 bin/socks5-server.py                               |  36 +-
 cnf/make.globals                                   |   9 +-
 doc/api/.gitignore                                 |   1 +
 doc/api/Makefile                                   |  32 ++
 doc/api/conf.py                                    |  66 +++
 doc/api/index.rst                                  |  18 +
 doc/package/ebuild.docbook                         |   1 -
 doc/package/ebuild/eapi/5-hdepend.docbook          |  32 --
 doc/portage.docbook                                |   1 -
 doc/qa.docbook                                     |  98 ++++
 lib/_emerge/AbstractEbuildProcess.py               |   5 +-
 lib/_emerge/AbstractPollTask.py                    |   3 -
 lib/_emerge/AsynchronousTask.py                    |  75 +--
 lib/_emerge/BinpkgFetcher.py                       |   3 +-
 lib/_emerge/CompositeTask.py                       |   7 +-
 lib/_emerge/EbuildFetcher.py                       |  15 +-
 lib/_emerge/EbuildMetadataPhase.py                 |   3 +-
 lib/_emerge/EbuildPhase.py                         | 115 ++++-
 lib/_emerge/FifoIpcDaemon.py                       |   3 -
 lib/_emerge/Package.py                             |   6 +-
 lib/_emerge/Scheduler.py                           |  43 +-
 lib/_emerge/SequentialTaskQueue.py                 |  19 +-
 lib/_emerge/SpawnProcess.py                        |  69 ++-
 lib/_emerge/SubProcess.py                          |  15 +-
 lib/_emerge/actions.py                             |  41 +-
 lib/_emerge/create_world_atom.py                   |  11 +-
 lib/_emerge/depgraph.py                            | 185 ++++---
 lib/portage/__init__.py                            |   3 +-
 lib/portage/_compat_upgrade/binpkg_compression.py  |  40 ++
 lib/portage/_emirrordist/FetchTask.py              |   9 -
 lib/portage/_selinux.py                            |   9 +-
 lib/portage/cache/ebuild_xattr.py                  |   5 +-
 lib/portage/cache/metadata.py                      |   2 +-
 lib/portage/cache/template.py                      |   2 +-
 lib/portage/const.py                               |   1 +
 lib/portage/data.py                                |  10 -
 lib/portage/dbapi/_MergeProcess.py                 |   3 +-
 lib/portage/dbapi/bintree.py                       |   7 +-
 lib/portage/dbapi/cpv_expand.py                    |   4 +-
 lib/portage/dbapi/porttree.py                      |  20 +-
 lib/portage/dbapi/vartree.py                       |  11 +-
 lib/portage/dep/_slot_operator.py                  |   3 -
 lib/portage/dep/dep_check.py                       |  93 ++--
 lib/portage/dep/soname/SonameAtom.py               |   9 +-
 lib/portage/dispatch_conf.py                       |   9 -
 lib/portage/eapi.py                                |  18 +-
 lib/portage/emaint/modules/sync/sync.py            |   2 +-
 lib/portage/locks.py                               |  67 ++-
 lib/portage/output.py                              |   2 +-
 .../package/ebuild/_config/KeywordsManager.py      |  16 +-
 .../package/ebuild/_config/special_env_vars.py     |  16 +-
 lib/portage/package/ebuild/config.py               |  13 +-
 .../package/ebuild/deprecated_profile_check.py     |   2 +-
 lib/portage/package/ebuild/doebuild.py             |  41 +-
 lib/portage/package/ebuild/fetch.py                | 148 ++++--
 lib/portage/package/ebuild/prepare_build_dirs.py   |  21 +-
 lib/portage/process.py                             |  29 +-
 lib/portage/repository/config.py                   |  10 +-
 lib/portage/sync/syncbase.py                       |   9 +-
 lib/portage/tests/dbapi/test_auxdb.py              |  77 +++
 lib/portage/tests/dep/test_soname_atom_pickle.py   |  26 +
 lib/portage/tests/ebuild/test_doebuild_spawn.py    |   4 +-
 lib/portage/tests/emerge/test_simple.py            |  69 ++-
 lib/portage/tests/locks/test_lock_nonblock.py      |  16 +-
 lib/portage/tests/process/test_PipeLogger.py       |  58 +++
 lib/portage/tests/resolver/ResolverPlayground.py   |  99 ++--
 .../tests/resolver/test_circular_choices.py        |  44 +-
 lib/portage/tests/resolver/test_depth.py           |  18 +-
 lib/portage/tests/resolver/test_merge_order.py     |  28 +-
 lib/portage/tests/resolver/test_multirepo.py       |   8 +-
 lib/portage/tests/resolver/test_or_choices.py      | 572 +++++++++++++++++++--
 .../tests/resolver/test_or_upgrade_installed.py    |  70 +++
 .../resolver/test_slot_operator_reverse_deps.py    |  93 +++-
 .../tests/util/futures/test_compat_coroutine.py    |  29 +-
 .../util/futures/test_done_callback_after_exit.py  |  44 ++
 lib/portage/util/__init__.py                       |   8 -
 lib/portage/util/_async/AsyncFunction.py           |   5 +-
 lib/portage/util/_async/BuildLogger.py             | 109 ++++
 lib/portage/util/_async/FileDigester.py            |   5 +-
 lib/portage/util/_async/PipeLogger.py              |  82 ++-
 lib/portage/util/_async/SchedulerInterface.py      |  32 +-
 lib/portage/util/_desktop_entry.py                 |   8 -
 lib/portage/util/_dyn_libs/LinkageMapELF.py        |  84 ++-
 lib/portage/util/_dyn_libs/NeededEntry.py          |   5 +
 lib/portage/util/_dyn_libs/soname_deps_qa.py       |  98 ++++
 lib/portage/util/_eventloop/asyncio_event_loop.py  |  31 +-
 lib/portage/util/compression_probe.py              |  10 +-
 lib/portage/util/futures/_asyncio/__init__.py      |   8 +-
 lib/portage/util/futures/_asyncio/process.py       |  11 +-
 lib/portage/util/futures/_asyncio/streams.py       |  50 +-
 lib/portage/util/futures/compat_coroutine.py       |  19 +-
 lib/portage/xml/metadata.py                        |  22 +-
 lib/portage/xpak.py                                |   5 +-
 man/emerge.1                                       |  16 +-
 man/make.conf.5                                    |  13 +-
 man/portage.5                                      |   9 +-
 misc/emerge-delta-webrsync                         |   1 +
 repoman/RELEASE-NOTES                              |  16 +
 repoman/cnf/linechecks/linechecks.yaml             |   1 -
 repoman/cnf/repository/linechecks.yaml             |   1 -
 repoman/cnf/repository/repository.yaml             |   1 -
 repoman/lib/repoman/_subprocess.py                 |  18 -
 repoman/lib/repoman/gpg.py                         |   9 -
 repoman/lib/repoman/metadata.py                    |  51 +-
 .../modules/linechecks/deprecated/inherit.py       |   7 +
 .../repoman/modules/linechecks/patches/patches.py  |   2 +-
 .../modules/linechecks/workaround/__init__.py      |   6 -
 .../modules/linechecks/workaround/workarounds.py   |   7 -
 repoman/lib/repoman/modules/vcs/git/changes.py     |  22 +-
 repoman/runtests                                   |   8 +-
 repoman/setup.py                                   |   2 +-
 runtests                                           |   8 +-
 setup.py                                           |  37 +-
 tox.ini                                            |   8 +-
 127 files changed, 3032 insertions(+), 942 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2020-08-23 12:22 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2020-08-23 12:22 UTC (permalink / raw
  To: gentoo-commits

commit:     9ab4d534816dd92345df6c0cc2a1c1343415a6bd
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sun Aug 23 12:20:01 2020 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun Aug 23 12:22:18 2020 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=9ab4d534

Merge portage-3.0.4

Signed-off-by: Thomas Sachau <tommy <AT> gentoo.org>

 .editorconfig                                      |   5 +-
 .travis.yml                                        |   1 -
 DEVELOPING                                         |  18 +-
 NEWS                                               |   4 +
 README                                             |   2 +-
 RELEASE-NOTES                                      |  45 ++
 bin/archive-conf                                   |   4 +-
 bin/binhost-snapshot                               |   5 +-
 bin/check-implicit-pointer-usage.py                |  27 +-
 bin/chmod-lite.py                                  |  11 +-
 bin/chpathtool.py                                  |  10 +-
 bin/clean_locks                                    |   4 +-
 bin/dispatch-conf                                  |   4 +-
 bin/dohtml.py                                      |  15 +-
 bin/doins.py                                       |  37 +-
 bin/ebuild                                         |  19 +-
 bin/ebuild-ipc.py                                  |   2 +-
 bin/ecompress                                      |  27 +-
 bin/egencache                                      |  19 +-
 bin/emaint                                         |   4 +-
 bin/emerge                                         |   4 +-
 bin/env-update                                     |   4 +-
 bin/filter-bash-environment.py                     |  11 +-
 bin/fixpackages                                    |   4 +-
 bin/glsa-check                                     |   4 +-
 bin/install.py                                     |  19 +-
 bin/pid-ns-init                                    |  10 +-
 bin/portageq                                       |   6 +-
 bin/quickpkg                                       |   6 +-
 bin/regenworld                                     |   4 +-
 bin/socks5-server.py                               |   2 +-
 bin/xattr-helper.py                                |  32 +-
 cnf/repo.postsync.d/example                        |  15 +-
 doc/api/conf.py                                    |   2 +-
 lib/_emerge/AbstractEbuildProcess.py               |   3 +-
 lib/_emerge/AbstractPollTask.py                    |   4 +-
 lib/_emerge/AsynchronousLock.py                    |  12 +-
 lib/_emerge/Binpkg.py                              |   8 +-
 lib/_emerge/BinpkgEnvExtractor.py                  |  11 +-
 lib/_emerge/BinpkgFetcher.py                       |  11 +-
 lib/_emerge/BinpkgPrefetcher.py                    |   1 -
 lib/_emerge/BlockerCache.py                        |  29 +-
 lib/_emerge/BlockerDB.py                           |   7 +-
 lib/_emerge/DepPriority.py                         |   1 -
 lib/_emerge/DepPriorityNormalRange.py              |   2 +-
 lib/_emerge/DepPrioritySatisfiedRange.py           |   2 +-
 lib/_emerge/Dependency.py                          |   1 -
 lib/_emerge/DependencyArg.py                       |  20 +-
 lib/_emerge/EbuildBuild.py                         |  30 +-
 lib/_emerge/EbuildBuildDir.py                      |   1 -
 lib/_emerge/EbuildFetcher.py                       |  12 +-
 lib/_emerge/EbuildMetadataPhase.py                 |  12 +-
 lib/_emerge/EbuildPhase.py                         |  19 +-
 lib/_emerge/FakeVartree.py                         |  23 +-
 lib/_emerge/FifoIpcDaemon.py                       |  33 +-
 lib/_emerge/JobStatusDisplay.py                    |  15 +-
 lib/_emerge/MergeListItem.py                       |   2 +-
 lib/_emerge/MetadataRegen.py                       |   7 +-
 lib/_emerge/Package.py                             |  47 +-
 lib/_emerge/PackageVirtualDbapi.py                 |   7 +-
 lib/_emerge/PipeReader.py                          |  14 +-
 lib/_emerge/PollScheduler.py                       |   6 +-
 lib/_emerge/ProgressHandler.py                     |   3 +-
 lib/_emerge/RootConfig.py                          |   2 +-
 lib/_emerge/Scheduler.py                           |  15 +-
 lib/_emerge/SequentialTaskQueue.py                 |   8 +-
 lib/_emerge/SetArg.py                              |   1 -
 lib/_emerge/SpawnProcess.py                        |  43 +-
 lib/_emerge/SubProcess.py                          |   9 +-
 lib/_emerge/TaskSequence.py                        |   6 +-
 lib/_emerge/UnmergeDepPriority.py                  |   1 -
 lib/_emerge/UseFlagDisplay.py                      |  16 +-
 lib/_emerge/UserQuery.py                           |  23 +-
 lib/_emerge/_find_deep_system_runtime_deps.py      |   1 -
 lib/_emerge/actions.py                             |  79 ++--
 lib/_emerge/chk_updated_cfg_files.py               |   2 -
 lib/_emerge/countdown.py                           |   4 +-
 lib/_emerge/create_depgraph_params.py              |   1 -
 lib/_emerge/create_world_atom.py                   |  10 +-
 lib/_emerge/depgraph.py                            | 171 ++++----
 lib/_emerge/emergelog.py                           |   3 -
 lib/_emerge/help.py                                |   6 +-
 lib/_emerge/main.py                                |  21 +-
 lib/_emerge/post_emerge.py                         |   4 +-
 lib/_emerge/resolver/DbapiProvidesIndex.py         |   8 +-
 lib/_emerge/resolver/backtracking.py               |   9 +-
 lib/_emerge/resolver/circular_dependency.py        |  16 +-
 lib/_emerge/resolver/output.py                     | 104 ++---
 lib/_emerge/resolver/output_helpers.py             | 148 +------
 lib/_emerge/resolver/package_tracker.py            |   8 +-
 lib/_emerge/resolver/slot_collision.py             | 226 +++++-----
 lib/_emerge/search.py                              |  17 +-
 lib/_emerge/show_invalid_depstring_notice.py       |   1 -
 lib/_emerge/stdout_spinner.py                      |   4 +-
 lib/_emerge/unmerge.py                             |  39 +-
 lib/portage/__init__.py                            |  84 ++--
 lib/portage/_emirrordist/Config.py                 |  12 +-
 lib/portage/_emirrordist/DeletionIterator.py       |   2 +-
 lib/portage/_emirrordist/FetchIterator.py          |   2 +-
 lib/portage/_emirrordist/FetchTask.py              |  55 +--
 lib/portage/_emirrordist/MirrorDistTask.py         |   8 +-
 lib/portage/_emirrordist/main.py                   |  11 +-
 lib/portage/_global_updates.py                     |   7 +-
 lib/portage/_legacy_globals.py                     |   2 +-
 lib/portage/_selinux.py                            |  17 +-
 lib/portage/_sets/__init__.py                      |  21 +-
 lib/portage/_sets/base.py                          |  38 +-
 lib/portage/_sets/dbapi.py                         |  81 ++--
 lib/portage/_sets/files.py                         |  14 +-
 lib/portage/_sets/libs.py                          |   4 +-
 lib/portage/_sets/security.py                      |  16 +-
 lib/portage/_sets/shell.py                         |   4 +-
 lib/portage/cache/__init__.py                      |   1 -
 lib/portage/cache/anydbm.py                        |  39 +-
 lib/portage/cache/ebuild_xattr.py                  |  36 +-
 lib/portage/cache/flat_hash.py                     |  10 +-
 lib/portage/cache/fs_template.py                   |  15 +-
 lib/portage/cache/index/IndexStreamIterator.py     |   2 +-
 lib/portage/cache/index/pkg_desc_index.py          |  13 +-
 lib/portage/cache/mappings.py                      |  58 +--
 lib/portage/cache/metadata.py                      |   9 +-
 lib/portage/cache/sql_template.py                  |  30 +-
 lib/portage/cache/sqlite.py                        |  50 ++-
 lib/portage/cache/template.py                      |  40 +-
 lib/portage/checksum.py                            |  30 +-
 lib/portage/const.py                               |   2 -
 lib/portage/cvstree.py                             |  27 +-
 lib/portage/data.py                                |  10 +-
 lib/portage/dbapi/DummyTree.py                     |   2 +-
 lib/portage/dbapi/IndexedPortdb.py                 |  10 +-
 lib/portage/dbapi/IndexedVardb.py                  |   5 +-
 .../dbapi/_ContentsCaseSensitivityManager.py       |   2 +-
 lib/portage/dbapi/_MergeProcess.py                 | 125 ++----
 lib/portage/dbapi/_VdbMetadataDelta.py             |   2 +-
 lib/portage/dbapi/__init__.py                      |  10 +-
 lib/portage/dbapi/_expand_new_virt.py              |   2 -
 lib/portage/dbapi/bintree.py                       |  97 ++--
 lib/portage/dbapi/cpv_expand.py                    |  12 +-
 lib/portage/dbapi/dep_expand.py                    |   2 -
 lib/portage/dbapi/porttree.py                      |  45 +-
 lib/portage/dbapi/vartree.py                       | 101 ++---
 lib/portage/dbapi/virtual.py                       |  11 +-
 lib/portage/debug.py                               |  16 +-
 lib/portage/dep/__init__.py                        | 257 ++++++-----
 lib/portage/dep/_dnf.py                            |   4 +-
 lib/portage/dep/_slot_operator.py                  |   2 -
 lib/portage/dep/dep_check.py                       |  19 +-
 lib/portage/dep/soname/SonameAtom.py               |  16 +-
 lib/portage/dep/soname/multilib_category.py        |   2 -
 lib/portage/dep/soname/parse.py                    |   2 -
 lib/portage/dispatch_conf.py                       |   7 +-
 lib/portage/eclass_cache.py                        |  17 +-
 lib/portage/elog/__init__.py                       |  10 +-
 lib/portage/elog/messages.py                       |  19 +-
 lib/portage/elog/mod_custom.py                     |   9 +-
 lib/portage/elog/mod_echo.py                       |  10 +-
 lib/portage/elog/mod_mail.py                       |  10 +-
 lib/portage/elog/mod_mail_summary.py               |   8 +-
 lib/portage/elog/mod_save_summary.py               |   5 -
 lib/portage/elog/mod_syslog.py                     |  14 +-
 lib/portage/emaint/main.py                         |   8 +-
 lib/portage/emaint/modules/binhost/binhost.py      |  12 +-
 lib/portage/emaint/modules/config/config.py        |   2 +-
 lib/portage/emaint/modules/logs/logs.py            |   2 +-
 lib/portage/emaint/modules/merges/merges.py        |  12 +-
 lib/portage/emaint/modules/move/move.py            |   7 +-
 lib/portage/emaint/modules/resume/resume.py        |   2 +-
 lib/portage/emaint/modules/sync/sync.py            |  17 +-
 lib/portage/emaint/modules/world/world.py          |   3 +-
 lib/portage/env/__init__.py                        |   1 -
 lib/portage/env/config.py                          |  22 +-
 lib/portage/env/loaders.py                         |  24 +-
 lib/portage/env/validators.py                      |   4 +-
 lib/portage/exception.py                           |  55 +--
 lib/portage/getbinpkg.py                           |  95 ++--
 lib/portage/glsa.py                                |  48 +-
 lib/portage/localization.py                        |   6 +-
 lib/portage/locks.py                               |  54 +--
 lib/portage/mail.py                                |  59 +--
 lib/portage/manifest.py                            |  69 ++-
 lib/portage/metadata.py                            |  18 +-
 lib/portage/module.py                              |   9 +-
 lib/portage/news.py                                |  15 +-
 lib/portage/output.py                              |  59 ++-
 .../package/ebuild/_config/KeywordsManager.py      |   7 +-
 .../package/ebuild/_config/LicenseManager.py       |   6 +-
 .../package/ebuild/_config/LocationsManager.py     |   4 +-
 lib/portage/package/ebuild/_config/MaskManager.py  |   2 +-
 lib/portage/package/ebuild/_config/UseManager.py   |   2 +-
 .../package/ebuild/_config/VirtualsManager.py      |   2 +-
 lib/portage/package/ebuild/_config/features_set.py |   2 +-
 .../package/ebuild/_config/special_env_vars.py     |   2 -
 lib/portage/package/ebuild/_ipc/IpcCommand.py      |   2 +-
 lib/portage/package/ebuild/_ipc/QueryCommand.py    |  17 +-
 .../ebuild/_parallel_manifest/ManifestProcess.py   |   3 +-
 .../ebuild/_parallel_manifest/ManifestScheduler.py |   2 -
 lib/portage/package/ebuild/_spawn_nofetch.py       |   6 +-
 lib/portage/package/ebuild/config.py               |  57 +--
 .../package/ebuild/deprecated_profile_check.py     |   4 +-
 lib/portage/package/ebuild/doebuild.py             |  20 +-
 lib/portage/package/ebuild/fetch.py                |  30 +-
 lib/portage/package/ebuild/getmaskingreason.py     |  13 +-
 lib/portage/package/ebuild/getmaskingstatus.py     |  20 +-
 lib/portage/package/ebuild/prepare_build_dirs.py   |   3 -
 lib/portage/process.py                             |  45 +-
 lib/portage/progress.py                            |   3 +-
 lib/portage/proxy/lazyimport.py                    |   7 +-
 lib/portage/proxy/objectproxy.py                   |  11 +-
 lib/portage/repository/config.py                   |  35 +-
 .../repository/storage/hardlink_quarantine.py      |  26 +-
 lib/portage/repository/storage/hardlink_rcu.py     |  47 +-
 lib/portage/repository/storage/inplace.py          |  10 +-
 lib/portage/repository/storage/interface.py        |  12 +-
 lib/portage/sync/config_checks.py                  |   2 +-
 lib/portage/sync/controller.py                     |  20 +-
 lib/portage/sync/getaddrinfo_validate.py           |   7 +-
 lib/portage/sync/modules/git/__init__.py           |  13 +-
 lib/portage/sync/modules/git/git.py                |  37 +-
 lib/portage/sync/modules/rsync/rsync.py            |  52 +--
 lib/portage/sync/modules/webrsync/webrsync.py      |   1 -
 lib/portage/sync/old_tree_timestamp.py             |   4 +-
 lib/portage/sync/syncbase.py                       |   5 +-
 lib/portage/tests/__init__.py                      |   4 +-
 lib/portage/tests/bin/setup_env.py                 |  20 +-
 lib/portage/tests/dbapi/test_auxdb.py              |  45 +-
 lib/portage/tests/dep/testAtom.py                  |   8 +-
 lib/portage/tests/dep/testExtractAffectingUSE.py   |   6 +-
 lib/portage/tests/dep/test_dep_getcpv.py           |   4 +-
 lib/portage/tests/dep/test_isvalidatom.py          |   2 +-
 lib/portage/tests/dep/test_match_from_list.py      |  14 +-
 lib/portage/tests/dep/test_soname_atom_pickle.py   |   3 -
 lib/portage/tests/dep/test_use_reduce.py           |   2 +-
 lib/portage/tests/ebuild/test_config.py            |   6 +-
 lib/portage/tests/ebuild/test_fetch.py             |   6 +-
 lib/portage/tests/ebuild/test_spawn.py             |   1 -
 .../tests/ebuild/test_use_expand_incremental.py    |   2 -
 lib/portage/tests/emerge/test_config_protect.py    |   2 -
 lib/portage/tests/emerge/test_simple.py            |  11 +-
 lib/portage/tests/env/__init__.py                  |   1 -
 lib/portage/tests/env/config/__init__.py           |   1 -
 .../tests/env/config/test_PackageMaskFile.py       |   8 +-
 lib/portage/tests/glsa/test_security_set.py        |   2 -
 lib/portage/tests/lafilefixer/test_lafilefixer.py  |   4 +-
 lib/portage/tests/lint/test_bash_syntax.py         |   1 -
 lib/portage/tests/process/test_AsyncFunction.py    |  62 +++
 lib/portage/tests/process/test_PipeLogger.py       |   2 +-
 lib/portage/tests/process/test_poll.py             |  10 +-
 lib/portage/tests/resolver/ResolverPlayground.py   |  27 +-
 .../resolver/test_binary_pkg_ebuild_visibility.py  |   1 -
 .../tests/resolver/test_circular_dependencies.py   |  10 +-
 lib/portage/tests/resolver/test_eapi.py            |  80 ++--
 lib/portage/tests/resolver/test_merge_order.py     |   3 +-
 .../test_missing_iuse_and_evaluated_atoms.py       |   8 +-
 .../tests/resolver/test_old_dep_chain_display.py   |   6 +-
 .../tests/resolver/test_profile_default_eapi.py    |   2 -
 .../tests/resolver/test_profile_package_set.py     |   2 -
 lib/portage/tests/resolver/test_required_use.py    |   4 +-
 lib/portage/tests/resolver/test_simple.py          |   4 +-
 lib/portage/tests/resolver/test_slot_collisions.py |   8 +-
 .../test_slot_conflict_unsatisfied_deep_deps.py    |  10 +-
 lib/portage/tests/runTests.py                      |   7 +-
 lib/portage/tests/sets/files/testConfigFileSet.py  |   1 -
 lib/portage/tests/sets/files/testStaticFileSet.py  |   1 -
 lib/portage/tests/sets/shell/testShell.py          |  12 +-
 lib/portage/tests/sync/test_sync_local.py          |  11 +-
 lib/portage/tests/unicode/test_string_format.py    |  54 +--
 lib/portage/tests/util/__init__.py                 |   1 -
 .../tests/util/eventloop/test_call_soon_fifo.py    |   4 +-
 .../util/futures/asyncio/test_child_watcher.py     |   4 +-
 .../futures/asyncio/test_event_loop_in_fork.py     |  23 +-
 .../tests/util/futures/asyncio/test_pipe_closed.py |  10 +-
 .../asyncio/test_policy_wrapper_recursion.py       |   8 +-
 .../util/futures/asyncio/test_subprocess_exec.py   |   5 -
 .../tests/util/futures/test_compat_coroutine.py    |  47 +-
 lib/portage/tests/util/futures/test_retry.py       |  34 +-
 lib/portage/tests/util/test_getconfig.py           |   3 +-
 lib/portage/tests/util/test_grabdict.py            |   4 +-
 lib/portage/tests/util/test_normalizedPath.py      |   6 +-
 lib/portage/tests/util/test_socks5.py              |  31 +-
 lib/portage/tests/util/test_xattr.py               |  18 +-
 lib/portage/tests/xpak/test_decodeint.py           |   4 +-
 lib/portage/update.py                              |  20 +-
 lib/portage/util/SlotObject.py                     |   2 +-
 lib/portage/util/_ShelveUnicodeWrapper.py          |  45 --
 lib/portage/util/__init__.py                       | 113 ++---
 lib/portage/util/_async/AsyncFunction.py           |   4 +-
 lib/portage/util/_async/BuildLogger.py             |  31 +-
 lib/portage/util/_async/ForkProcess.py             | 146 +++++--
 lib/portage/util/_async/PipeLogger.py              | 106 ++---
 lib/portage/util/_async/SchedulerInterface.py      |   4 +-
 lib/portage/util/_compare_files.py                 |  23 +-
 lib/portage/util/_desktop_entry.py                 |  17 +-
 lib/portage/util/_dyn_libs/LinkageMapELF.py        |  52 +--
 lib/portage/util/_dyn_libs/NeededEntry.py          |  19 +-
 .../util/_dyn_libs/PreservedLibsRegistry.py        |  31 +-
 .../util/_dyn_libs/display_preserved_libs.py       |   6 +-
 lib/portage/util/_dyn_libs/soname_deps.py          |   4 +-
 lib/portage/util/_eventloop/EventLoop.py           |  53 +--
 lib/portage/util/_eventloop/PollConstants.py       |   3 +-
 lib/portage/util/_eventloop/PollSelectAdapter.py   |   8 +-
 lib/portage/util/_eventloop/asyncio_event_loop.py  |   9 +-
 lib/portage/util/_eventloop/global_event_loop.py   |  16 +-
 lib/portage/util/_urlopen.py                       |  67 ++-
 lib/portage/util/_xattr.py                         |   6 +-
 lib/portage/util/backoff.py                        |   2 +-
 lib/portage/util/changelog.py                      |  29 +-
 lib/portage/util/compression_probe.py              |   5 +-
 lib/portage/util/configparser.py                   |  23 +-
 lib/portage/util/digraph.py                        |   8 +-
 lib/portage/util/elf/header.py                     |   2 +-
 lib/portage/util/env_update.py                     |  12 +-
 lib/portage/util/formatter.py                      |   5 +-
 lib/portage/util/futures/_asyncio/__init__.py      |  48 +-
 lib/portage/util/futures/_asyncio/process.py       |  18 +-
 lib/portage/util/futures/_asyncio/streams.py       |   2 +-
 lib/portage/util/futures/_asyncio/tasks.py         |  15 +-
 lib/portage/util/futures/_sync_decorator.py        |   3 +-
 lib/portage/util/futures/compat_coroutine.py       |  10 +-
 lib/portage/util/futures/events.py                 |  37 +-
 lib/portage/util/futures/executor/fork.py          |   4 +-
 lib/portage/util/futures/extendedfutures.py        |   2 -
 lib/portage/util/futures/futures.py                |  42 +-
 lib/portage/util/futures/iter_completed.py         |   5 +-
 lib/portage/util/futures/retry.py                  |   2 +-
 lib/portage/util/futures/transports.py             |   5 +-
 lib/portage/util/futures/unix_events.py            |  34 +-
 lib/portage/util/install_mask.py                   |  13 +-
 lib/portage/util/iterators/MultiIterGroupBy.py     |   4 +-
 lib/portage/util/lafilefixer.py                    |  11 +-
 lib/portage/util/listdir.py                        |   3 -
 lib/portage/util/locale.py                         |   4 +-
 lib/portage/util/monotonic.py                      |  34 --
 lib/portage/util/movefile.py                       |  65 +--
 lib/portage/util/mtimedb.py                        |   6 +-
 lib/portage/util/netlink.py                        |   3 +-
 lib/portage/util/socks5.py                         |  13 +-
 lib/portage/util/whirlpool.py                      |  28 +-
 lib/portage/util/writeable_check.py                |   2 -
 lib/portage/versions.py                            |  40 +-
 lib/portage/xml/metadata.py                        |  48 +-
 lib/portage/xpak.py                                |  21 +-
 man/ebuild.5                                       |   4 +-
 man/egencache.1                                    |   4 +-
 man/emerge.1                                       |  16 +-
 man/portage.5                                      |  47 +-
 pylintrc                                           | 486 +++++++++++++++++++++
 repoman/RELEASE-NOTES                              |   6 +
 repoman/bin/repoman                                |   5 +-
 repoman/lib/repoman/__init__.py                    |   7 +-
 repoman/lib/repoman/actions.py                     |   6 +-
 repoman/lib/repoman/argparser.py                   |   9 +
 repoman/lib/repoman/copyrights.py                  |   2 +-
 repoman/lib/repoman/errors.py                      |   2 -
 repoman/lib/repoman/gpg.py                         |   2 -
 repoman/lib/repoman/main.py                        |   7 +-
 repoman/lib/repoman/metadata.py                    |   7 -
 repoman/lib/repoman/modules/commit/manifest.py     |   2 +-
 repoman/lib/repoman/modules/commit/repochecks.py   |   2 -
 repoman/lib/repoman/modules/linechecks/base.py     |   2 +-
 repoman/lib/repoman/modules/linechecks/config.py   |   4 +-
 .../lib/repoman/modules/linechecks/controller.py   |   2 +-
 .../modules/linechecks/deprecated/inherit.py       |   1 -
 repoman/lib/repoman/modules/scan/depend/profile.py | 117 ++++-
 repoman/lib/repoman/modules/scan/ebuild/ebuild.py  |   3 +-
 .../modules/scan/metadata/ebuild_metadata.py       |   5 +-
 .../lib/repoman/modules/scan/metadata/use_flags.py |   2 +-
 repoman/lib/repoman/modules/scan/module.py         |   2 +-
 repoman/lib/repoman/modules/scan/scanbase.py       |   2 +-
 repoman/lib/repoman/modules/vcs/None/status.py     |   2 +-
 repoman/lib/repoman/modules/vcs/bzr/status.py      |   2 +-
 repoman/lib/repoman/modules/vcs/changes.py         |   2 +-
 repoman/lib/repoman/modules/vcs/cvs/status.py      |   2 +-
 repoman/lib/repoman/modules/vcs/git/status.py      |   2 +-
 repoman/lib/repoman/modules/vcs/hg/status.py       |   2 +-
 repoman/lib/repoman/modules/vcs/settings.py        |   5 +-
 repoman/lib/repoman/modules/vcs/svn/status.py      |   2 +-
 repoman/lib/repoman/modules/vcs/vcs.py             |   3 +-
 repoman/lib/repoman/profile.py                     |   4 +-
 repoman/lib/repoman/qa_data.py                     |   2 +-
 repoman/lib/repoman/qa_tracker.py                  |   2 +-
 repoman/lib/repoman/repos.py                       |   2 +-
 repoman/lib/repoman/scanner.py                     |  20 +-
 repoman/lib/repoman/tests/__init__.py              |   4 +-
 repoman/lib/repoman/utilities.py                   |   7 +-
 repoman/man/repoman.1                              |   9 +-
 repoman/runtests                                   |   4 +-
 repoman/setup.py                                   |   8 +-
 runtests                                           |   7 +-
 setup.py                                           |   6 +-
 tabcheck.py                                        |   3 +-
 tox.ini                                            |   8 +-
 391 files changed, 3232 insertions(+), 4185 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2020-10-30 10:29 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2020-10-30 10:29 UTC (permalink / raw
  To: gentoo-commits

commit:     06bf06b15d07953e4a18865c1ff6264d908eb652
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Fri Oct 30 10:28:12 2020 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Fri Oct 30 10:28:58 2020 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=06bf06b1

Merge tag 'portage-3.0.8' into multilib

portage-3.0.8

Signed-off-by: Zac Medico <zmedico <AT> gentoo.org>
Signed-off-by: Thomas Sachau <tommy <AT> gentoo.org>

 NEWS                                               |  15 ++
 RELEASE-NOTES                                      |  39 +++++
 bin/egencache                                      | 122 ++++++++++++---
 bin/quickpkg                                       |   2 +-
 cnf/repo.postsync.d/example                        |  19 ++-
 lib/_emerge/BinpkgFetcher.py                       |  29 ++--
 lib/_emerge/EbuildBinpkg.py                        |   4 +-
 lib/_emerge/Scheduler.py                           | 142 ++++++++++++-----
 lib/_emerge/actions.py                             |  16 +-
 lib/_emerge/depgraph.py                            |  38 +++--
 lib/_emerge/main.py                                |   6 +
 lib/_emerge/resolver/backtracking.py               |   7 +-
 lib/_emerge/search.py                              |  12 +-
 lib/portage/_emirrordist/FetchTask.py              |   4 +-
 lib/portage/_selinux.py                            |  16 +-
 lib/portage/_sets/dbapi.py                         |  51 ++----
 .../{_compat_upgrade => binrepo}/__init__.py       |   0
 lib/portage/binrepo/config.py                      | 133 ++++++++++++++++
 lib/portage/cache/metadata.py                      |   4 +-
 lib/portage/const.py                               |   2 +
 lib/portage/dbapi/bintree.py                       |  59 +++++--
 lib/portage/dep/soname/multilib_category.py        |  11 +-
 lib/portage/elog/mod_mail_summary.py               |   5 +-
 lib/portage/elog/mod_save_summary.py               |   2 +-
 lib/portage/locks.py                               |   2 +-
 lib/portage/package/ebuild/config.py               |   6 +
 lib/portage/package/ebuild/doebuild.py             |   2 +-
 lib/portage/package/ebuild/fetch.py                |   8 +-
 lib/portage/process.py                             |  16 +-
 lib/portage/sync/modules/git/git.py                |  14 +-
 lib/portage/sync/modules/mercurial/__init__.py     |  39 +++++
 lib/portage/sync/modules/mercurial/mercurial.py    | 174 +++++++++++++++++++++
 lib/portage/sync/modules/rsync/rsync.py            |  26 ++-
 lib/portage/sync/modules/webrsync/webrsync.py      |   4 +-
 lib/portage/sync/syncbase.py                       |  21 +++
 lib/portage/tests/emerge/test_simple.py            |  14 +-
 lib/portage/tests/locks/test_lock_nonblock.py      |   1 +
 .../resolver/test_slot_change_without_revbump.py   |   4 +-
 .../tests/resolver/test_slot_conflict_rebuild.py   |  61 +++++++-
 .../resolver/test_slot_operator_missed_update.py   | 112 +++++++++++++
 lib/portage/tests/sync/test_sync_local.py          |  67 +++++++-
 .../util/futures/asyncio/test_wakeup_fd_sigchld.py |   2 +-
 lib/portage/util/__init__.py                       |   4 +-
 lib/portage/util/_eventloop/EventLoop.py           |   6 +-
 lib/portage/util/_eventloop/asyncio_event_loop.py  |   4 +-
 lib/portage/util/_eventloop/global_event_loop.py   |   7 +-
 lib/portage/util/_urlopen.py                       |  10 +-
 lib/portage/util/env_update.py                     |  42 ++++-
 lib/portage/util/futures/iter_completed.py         |   1 -
 lib/portage/util/locale.py                         |   1 +
 lib/portage/util/movefile.py                       |   2 +-
 lib/portage/util/socks5.py                         |   2 +-
 lib/portage/xpak.py                                |   2 +-
 man/egencache.1                                    |  12 +-
 man/emerge.1                                       |  12 +-
 man/make.conf.5                                    |  11 +-
 man/portage.5                                      | 118 +++++++++++---
 repoman/RELEASE-NOTES                              |   5 +
 repoman/setup.py                                   |   2 +-
 setup.py                                           |   2 +-
 60 files changed, 1288 insertions(+), 266 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2021-01-15 16:20 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2021-01-15 16:20 UTC (permalink / raw
  To: gentoo-commits

commit:     04f0ae199e3cb389f48a99db6b2a981ae7848aa9
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Fri Jan 15 16:20:11 2021 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Fri Jan 15 16:20:11 2021 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=04f0ae19

Merge tag 'portage-3.0.11' into multilib

portage-3.0.11

Signed-off-by: Zac Medico <zmedico <AT> gentoo.org>
Signed-off-by: Thomas Sachau <tommy <AT> gentoo.org>

 RELEASE-NOTES                                      |  6 ++
 lib/_emerge/depgraph.py                            | 68 +++++++++++++---
 lib/portage/dep/dep_check.py                       | 31 ++++---
 .../tests/resolver/test_circular_choices_rust.py   | 94 ++++++++++++++++++++++
 lib/portage/util/_compare_files.py                 |  4 +-
 setup.py                                           |  2 +-
 6 files changed, 178 insertions(+), 27 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2021-01-15 16:20 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2021-01-15 16:20 UTC (permalink / raw
  To: gentoo-commits

commit:     7909a449f65b354ea061f1e91f92e918ae2a7247
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Fri Jan 15 16:20:17 2021 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Fri Jan 15 16:20:17 2021 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=7909a449

Merge tag 'portage-3.0.12' into multilib

portage-3.0.12

Signed-off-by: Zac Medico <zmedico <AT> gentoo.org>
Signed-off-by: Thomas Sachau <tommy <AT> gentoo.org>

 RELEASE-NOTES                                     |  6 +++
 lib/_emerge/DepPrioritySatisfiedRange.py          |  1 +
 lib/_emerge/depgraph.py                           | 10 ++--
 lib/portage/__init__.py                           |  4 ++
 lib/portage/dbapi/vartree.py                      |  1 -
 lib/portage/package/ebuild/doebuild.py            |  1 -
 lib/portage/tests/resolver/test_merge_order.py    | 27 ++++++++++-
 lib/portage/util/_eventloop/asyncio_event_loop.py |  6 ++-
 lib/portage/util/_eventloop/global_event_loop.py  |  7 ---
 lib/portage/util/futures/_asyncio/__init__.py     | 59 ++++++++++++++++++++---
 setup.py                                          |  2 +-
 11 files changed, 98 insertions(+), 26 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2021-01-15 16:20 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2021-01-15 16:20 UTC (permalink / raw
  To: gentoo-commits

commit:     0905e720dfeb192d27951b8f53d1577b3c45539e
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Fri Jan 15 16:19:56 2021 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Fri Jan 15 16:19:56 2021 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=0905e720

Merge tag 'portage-3.0.10' into multilib

portage-3.0.10

Signed-off-by: Zac Medico <zmedico <AT> gentoo.org>
Signed-off-by: Thomas Sachau <tommy <AT> gentoo.org>

 RELEASE-NOTES                                      |   7 +
 doc/package/ebuild/eapi/4.docbook                  |   2 +-
 lib/_emerge/DepPriorityNormalRange.py              |   2 +
 lib/_emerge/DepPrioritySatisfiedRange.py           |  53 +++---
 lib/_emerge/depgraph.py                            |  45 +++--
 lib/portage/cache/template.py                      |   2 +-
 .../package/ebuild/_config/KeywordsManager.py      |   2 +-
 .../package/ebuild/_config/LocationsManager.py     |  30 ++-
 lib/portage/package/ebuild/_config/UseManager.py   |   4 +-
 lib/portage/package/ebuild/config.py               |   2 +-
 .../package/ebuild/deprecated_profile_check.py     |   9 +-
 lib/portage/tests/resolver/test_merge_order.py     |  10 +
 .../tests/resolver/test_slot_operator_bdeps.py     | 209 +++++++++++++++++++++
 lib/portage/util/_compare_files.py                 |   3 +-
 lib/portage/util/netlink.py                        |   2 +-
 man/make.conf.5                                    |   2 +-
 setup.py                                           |   2 +-
 17 files changed, 325 insertions(+), 61 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2021-01-15 16:20 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2021-01-15 16:20 UTC (permalink / raw
  To: gentoo-commits

commit:     82a7f2ce3f7d5084e92a3cb3d87c3b7212a55fc6
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Fri Jan 15 16:19:50 2021 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Fri Jan 15 16:19:50 2021 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=82a7f2ce

Merge tag 'portage-3.0.9' into multilib

Signed-off-by: Thomas Sachau <tommy <AT> gentoo.org>

 RELEASE-NOTES                                     |  9 +++++++++
 bin/isolated-functions.sh                         |  3 +--
 bin/phase-helpers.sh                              |  3 +--
 bin/pid-ns-init                                   | 24 ++++++++++++++++++++++-
 cnf/repo.postsync.d/example                       |  3 ++-
 cnf/sets/portage.conf                             |  6 ++++++
 lib/_emerge/actions.py                            | 19 +++++++++++++++---
 lib/_emerge/depgraph.py                           | 11 +++++++++--
 lib/_emerge/main.py                               |  5 +++++
 lib/portage/package/ebuild/config.py              |  7 ++++++-
 lib/portage/tests/emerge/test_simple.py           |  8 +++-----
 lib/portage/util/movefile.py                      | 10 ++++++++--
 man/emerge.1                                      | 10 ++++++++--
 repoman/RELEASE-NOTES                             |  5 +++++
 repoman/cnf/qa_data/qa_data.yaml                  |  1 -
 repoman/cnf/repository/qa_data.yaml               |  1 -
 repoman/lib/repoman/modules/scan/fetch/fetches.py |  7 +------
 repoman/man/repoman.1                             |  2 +-
 repoman/setup.py                                  |  2 +-
 setup.py                                          |  2 +-
 20 files changed, 106 insertions(+), 32 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2021-01-15 16:20 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2021-01-15 16:20 UTC (permalink / raw
  To: gentoo-commits

commit:     688a2012b8e4d5d66406e7d3ee2eb140569a4b20
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Fri Jan 15 16:20:22 2021 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Fri Jan 15 16:20:22 2021 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=688a2012

Merge tag 'portage-3.0.13' into multilib

portage-3.0.13

Signed-off-by: Zac Medico <zmedico <AT> gentoo.org>
Signed-off-by: Thomas Sachau <tommy <AT> gentoo.org>

 .github/workflows/ci.yml                           |  43 +++++
 .travis.yml                                        |  26 ---
 NEWS                                               |   6 +
 RELEASE-NOTES                                      |   7 +
 bin/misc-functions.sh                              |   2 +-
 lib/_emerge/depgraph.py                            |  22 +++
 lib/portage/__init__.py                            |   3 +-
 lib/portage/package/ebuild/fetch.py                |  11 +-
 .../resolver/test_slot_operator_reverse_deps.py    |  98 ++++++++++-
 lib/portage/tests/util/futures/test_retry.py       | 181 ++++++++++++---------
 lib/portage/util/__init__.py                       |   9 +-
 lib/portage/util/_eventloop/asyncio_event_loop.py  |  30 +++-
 lib/portage/util/_eventloop/global_event_loop.py   |  28 +---
 lib/portage/util/env_update.py                     |  30 ++--
 lib/portage/util/futures/_asyncio/__init__.py      |  30 +++-
 lib/portage/util/futures/retry.py                  |   4 +-
 man/make.conf.5                                    |  14 +-
 repoman/runtests                                   |   5 +-
 runtests                                           |   5 +-
 setup.py                                           |   2 +-
 src/portage_util_file_copy_reflink_linux.c         |  10 +-
 src/portage_util_libc.c                            |  10 +-
 tox.ini                                            |  15 +-
 23 files changed, 402 insertions(+), 189 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2021-01-23  9:52 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2021-01-23  9:52 UTC (permalink / raw
  To: gentoo-commits

commit:     2663f1d5badc58440f289f67c53d7f661b90ee4e
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sat Jan 23 09:50:49 2021 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sat Jan 23 09:52:02 2021 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=2663f1d5

Merge tag 'portage-3.0.14' into multilib

portage-3.0.14

Signed-off-by: Zac Medico <zmedico <AT> gentoo.org>
Signed-off-by: Thomas Sachau <tommy <AT> gentoo.org>

 RELEASE-NOTES                                      | 13 +++++
 bin/clean_locks                                    |  5 +-
 bin/dispatch-conf                                  | 17 ++++---
 bin/ebuild                                         |  4 +-
 bin/egencache                                      |  6 +--
 bin/emerge                                         | 13 ++---
 bin/glsa-check                                     |  5 +-
 bin/portageq                                       | 18 +++----
 bin/quickpkg                                       | 10 ++--
 bin/regenworld                                     |  6 +--
 cnf/sets/portage.conf                              |  5 ++
 doc/config/sets.docbook                            |  8 +++
 lib/portage/__init__.py                            |  3 +-
 lib/portage/_sets/dbapi.py                         | 39 ++++++++++++++-
 lib/portage/dbapi/bintree.py                       | 58 ++++++++++++++--------
 lib/portage/dbapi/vartree.py                       |  8 +--
 lib/portage/emaint/modules/move/move.py            | 13 ++++-
 lib/portage/package/ebuild/doebuild.py             | 13 +++--
 .../repository/storage/hardlink_quarantine.py      | 45 +++++++----------
 lib/portage/repository/storage/hardlink_rcu.py     | 57 ++++++++-------------
 lib/portage/repository/storage/inplace.py          | 27 +++-------
 lib/portage/repository/storage/interface.py        | 17 +++----
 lib/portage/tests/dbapi/test_auxdb.py              | 12 ++---
 lib/portage/tests/emerge/test_simple.py            | 16 +++---
 lib/portage/tests/process/test_AsyncFunction.py    | 10 ++--
 lib/portage/tests/process/test_PipeLogger.py       | 22 ++++----
 lib/portage/tests/update/test_move_ent.py          |  7 +--
 .../util/futures/asyncio/test_child_watcher.py     | 10 ++--
 .../util/futures/asyncio/test_subprocess_exec.py   | 32 ++++++------
 lib/portage/tests/util/futures/test_retry.py       | 28 ++++-------
 lib/portage/tests/util/test_socks5.py              |  4 +-
 lib/portage/util/futures/_sync_decorator.py        |  6 +--
 lib/portage/util/futures/compat_coroutine.py       |  6 +--
 lib/portage/util/socks5.py                         |  9 ++--
 man/make.conf.5                                    |  2 +-
 repoman/lib/repoman/_subprocess.py                 |  4 --
 repoman/lib/repoman/actions.py                     |  3 +-
 repoman/lib/repoman/config.py                      |  5 --
 repoman/lib/repoman/gpg.py                         |  2 -
 repoman/lib/repoman/main.py                        |  3 +-
 repoman/lib/repoman/metadata.py                    |  1 -
 repoman/lib/repoman/modules/commit/manifest.py     |  1 -
 repoman/lib/repoman/modules/commit/repochecks.py   |  1 -
 repoman/lib/repoman/modules/linechecks/__init__.py |  1 -
 .../modules/linechecks/assignment/__init__.py      |  3 +-
 .../repoman/modules/linechecks/depend/__init__.py  |  3 +-
 .../modules/linechecks/deprecated/__init__.py      |  3 +-
 .../modules/linechecks/deprecated/deprecated.py    |  2 +-
 .../lib/repoman/modules/linechecks/do/__init__.py  |  3 +-
 .../repoman/modules/linechecks/eapi/__init__.py    |  3 +-
 .../repoman/modules/linechecks/emake/__init__.py   |  3 +-
 .../modules/linechecks/gentoo_header/__init__.py   |  3 +-
 .../repoman/modules/linechecks/helpers/__init__.py |  3 +-
 .../repoman/modules/linechecks/helpers/offset.py   |  2 +-
 .../repoman/modules/linechecks/nested/__init__.py  |  3 +-
 .../repoman/modules/linechecks/patches/__init__.py |  3 +-
 .../repoman/modules/linechecks/patches/patches.py  |  3 +-
 .../repoman/modules/linechecks/phases/__init__.py  |  3 +-
 .../repoman/modules/linechecks/portage/__init__.py |  3 +-
 .../repoman/modules/linechecks/quotes/__init__.py  |  3 +-
 .../lib/repoman/modules/linechecks/uri/__init__.py |  3 +-
 repoman/lib/repoman/modules/linechecks/uri/uri.py  | 28 +++++------
 .../lib/repoman/modules/linechecks/use/__init__.py |  3 +-
 .../repoman/modules/linechecks/use/builtwith.py    |  2 +-
 .../repoman/modules/linechecks/useless/__init__.py |  3 +-
 .../modules/linechecks/whitespace/__init__.py      |  3 +-
 .../modules/linechecks/workaround/__init__.py      |  3 +-
 .../modules/linechecks/workaround/workarounds.py   |  2 +-
 .../lib/repoman/modules/scan/depend/__init__.py    |  3 +-
 .../repoman/modules/scan/depend/_depend_checks.py  |  4 +-
 repoman/lib/repoman/modules/scan/depend/profile.py | 22 ++++----
 .../repoman/modules/scan/directories/__init__.py   |  3 +-
 repoman/lib/repoman/modules/scan/eapi/__init__.py  |  3 +-
 .../lib/repoman/modules/scan/ebuild/__init__.py    |  3 +-
 .../lib/repoman/modules/scan/eclasses/__init__.py  |  3 +-
 repoman/lib/repoman/modules/scan/fetch/__init__.py |  3 +-
 .../lib/repoman/modules/scan/keywords/__init__.py  |  3 +-
 .../lib/repoman/modules/scan/manifest/__init__.py  |  3 +-
 .../lib/repoman/modules/scan/metadata/__init__.py  |  3 +-
 .../modules/scan/metadata/ebuild_metadata.py       |  1 -
 .../repoman/modules/scan/metadata/pkgmetadata.py   |  5 +-
 .../lib/repoman/modules/scan/metadata/restrict.py  |  1 -
 .../lib/repoman/modules/scan/options/__init__.py   |  3 +-
 repoman/lib/repoman/modules/vcs/None/status.py     |  1 -
 repoman/lib/repoman/modules/vcs/__init__.py        |  1 -
 repoman/lib/repoman/modules/vcs/bzr/changes.py     |  2 +-
 repoman/lib/repoman/modules/vcs/bzr/status.py      |  2 +
 repoman/lib/repoman/modules/vcs/cvs/status.py      |  2 +-
 repoman/lib/repoman/modules/vcs/git/changes.py     |  3 +-
 repoman/lib/repoman/modules/vcs/git/status.py      |  3 +-
 repoman/lib/repoman/modules/vcs/hg/changes.py      |  3 +-
 repoman/lib/repoman/modules/vcs/hg/status.py       |  2 +
 repoman/lib/repoman/modules/vcs/svn/changes.py     |  2 -
 repoman/lib/repoman/modules/vcs/svn/status.py      |  1 +
 repoman/lib/repoman/modules/vcs/vcs.py             |  2 -
 repoman/lib/repoman/repos.py                       |  1 +
 repoman/lib/repoman/tests/commit/__test__.py       |  1 -
 repoman/lib/repoman/tests/runTests.py              |  8 +--
 repoman/lib/repoman/tests/simple/__test__.py       |  1 -
 repoman/lib/repoman/tests/simple/test_simple.py    |  4 +-
 repoman/lib/repoman/utilities.py                   |  6 +--
 setup.py                                           |  2 +-
 tox.ini                                            |  2 +-
 103 files changed, 376 insertions(+), 404 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2021-04-03  8:28 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2021-04-03  8:28 UTC (permalink / raw
  To: gentoo-commits

commit:     76014e501af0bd835a536f968e68df3e1a81f8fe
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sat Apr  3 08:28:00 2021 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sat Apr  3 08:28:00 2021 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=76014e50

Merge tag 'portage-3.0.17' into multilib

portage-3.0.17

Signed-off-by: Zac Medico <zmedico <AT> gentoo.org>
Signed-off-by: Thomas Sachau <tommy <AT> gentoo.org>

 MANIFEST.in                                        |    3 +
 RELEASE-NOTES                                      |    5 +
 bin/chmod-lite                                     |   11 +-
 bin/ebuild-ipc                                     |    9 +-
 bin/ebuild-pyhelper                                |   21 +
 bin/egencache                                      |    2 -
 lib/_emerge/EbuildPhase.py                         |   28 +-
 lib/_emerge/Package.py                             |    9 -
 lib/_emerge/Scheduler.py                           |    2 -
 lib/_emerge/UseFlagDisplay.py                      |    2 -
 lib/_emerge/create_depgraph_params.py              |   22 +-
 lib/_emerge/resolver/output.py                     |    2 -
 lib/portage/__init__.py                            |   14 +-
 lib/portage/cache/flat_hash.py                     |    3 -
 lib/portage/dbapi/vartree.py                       |   42 +-
 lib/portage/locks.py                               |   91 +-
 .../tests/resolver/test_unpack_dependencies.py     |   65 --
 lib/portage/tests/resolver/test_use_aliases.py     |  131 ---
 lib/portage/tests/resolver/test_useflags.py        |   28 +-
 lib/portage/tests/unicode/test_string_format.py    |    9 -
 lib/portage/util/_async/BuildLogger.py             |   12 +-
 lib/portage/util/_async/PipeLogger.py              |   12 +-
 lib/portage/util/_async/SchedulerInterface.py      |   10 +-
 lib/portage/util/_eventloop/EventLoop.py           | 1153 --------------------
 lib/portage/util/_eventloop/PollConstants.py       |   17 -
 lib/portage/util/_eventloop/PollSelectAdapter.py   |   74 --
 lib/portage/util/_eventloop/asyncio_event_loop.py  |    7 +-
 lib/portage/util/bin_entry_point.py                |   35 +
 lib/portage/util/digraph.py                        |    3 -
 lib/portage/util/futures/_asyncio/__init__.py      |   50 +-
 lib/portage/util/futures/_asyncio/process.py       |  116 --
 lib/portage/util/futures/_asyncio/streams.py       |   13 +-
 lib/portage/util/futures/_asyncio/tasks.py         |   96 --
 lib/portage/util/futures/events.py                 |  186 ----
 lib/portage/util/futures/futures.py                |  156 +--
 lib/portage/util/futures/transports.py             |   87 --
 lib/portage/util/futures/unix_events.py            |  626 +----------
 lib/portage/versions.py                            |   10 +-
 man/emerge.1                                       |    9 +-
 man/make.conf.5                                    |    8 +-
 pyproject.toml                                     |    6 +
 setup.py                                           |  102 +-
 42 files changed, 366 insertions(+), 2921 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2021-04-03  8:28 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2021-04-03  8:28 UTC (permalink / raw
  To: gentoo-commits

commit:     639064263dbd0d1a0753d8e754c53ac0ff10768b
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sat Apr  3 08:28:06 2021 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sat Apr  3 08:28:06 2021 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=63906426

Merge tag 'portage-3.0.18' into multilib

portage-3.0.18

Signed-off-by: Zac Medico <zmedico <AT> gentoo.org>
Signed-off-by: Thomas Sachau <tommy <AT> gentoo.org>

 NEWS                                               |   4 +
 RELEASE-NOTES                                      |   7 +
 bin/glsa-check                                     |   3 +-
 lib/_emerge/BlockerCache.py                        |   6 +-
 lib/_emerge/help.py                                |   2 +-
 lib/_emerge/main.py                                |   2 +
 lib/portage/_sets/ProfilePackageSet.py             |   9 +-
 lib/portage/_sets/profiles.py                      |  10 +-
 lib/portage/dbapi/_VdbMetadataDelta.py             |  11 +-
 lib/portage/dbapi/vartree.py                       |   6 +-
 lib/portage/dep/__init__.py                        |   7 +-
 lib/portage/eapi.py                                | 107 ++++++++---
 lib/portage/emaint/modules/sync/sync.py            |  40 +++-
 lib/portage/locks.py                               |   4 +
 .../package/ebuild/_config/KeywordsManager.py      |   7 +-
 .../package/ebuild/_config/LocationsManager.py     |  11 +-
 lib/portage/package/ebuild/_config/MaskManager.py  |   7 +-
 lib/portage/package/ebuild/_config/UseManager.py   |  12 +-
 lib/portage/package/ebuild/config.py               |  11 +-
 lib/portage/repository/config.py                   |  34 +++-
 lib/portage/tests/dep/test_isvalidatom.py          |  26 ++-
 lib/portage/tests/resolver/ResolverPlayground.py   |  10 +-
 .../test_build_id_profile_format.py                |  14 +-
 lib/portage/tests/sync/test_sync_local.py          |  15 +-
 man/emerge.1                                       |   2 +-
 man/portage.5                                      |   6 +-
 repoman/bin/repoman                                |   4 +-
 repoman/cnf/qa_data/qa_data.yaml                   |   1 +
 repoman/cnf/repository/qa_data.yaml                |   1 +
 repoman/cnf/repository/repository.yaml             |   1 +
 repoman/lib/repoman/actions.py                     |   1 -
 repoman/lib/repoman/main.py                        |  43 ++++-
 .../repoman/modules/linechecks/phases/__init__.py  |   6 +
 .../lib/repoman/modules/linechecks/phases/phase.py | 132 +++++++++++++-
 repoman/lib/repoman/repos.py                       |   8 +-
 repoman/lib/repoman/tests/simple/test_simple.py    | 203 +++++++++++++++++----
 repoman/man/repoman.1                              |   5 +-
 setup.py                                           |  11 +-
 38 files changed, 647 insertions(+), 142 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2021-04-03  8:28 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2021-04-03  8:28 UTC (permalink / raw
  To: gentoo-commits

commit:     0ea03067346adce3e7e825f3a47c1547a5d1856c
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sat Apr  3 08:27:48 2021 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sat Apr  3 08:27:48 2021 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=0ea03067

Merge tag 'portage-3.0.15' into multilib

portage-3.0.15

Signed-off-by: Zac Medico <zmedico <AT> gentoo.org>
Signed-off-by: Thomas Sachau <tommy <AT> gentoo.org>

 .github/workflows/ci.yml                      |   2 +-
 NEWS                                          |   5 +
 RELEASE-NOTES                                 |  12 ++
 cnf/make.globals                              |   1 +
 lib/_emerge/create_depgraph_params.py         |   8 +-
 lib/portage/__init__.py                       |   4 +-
 lib/portage/_emirrordist/FetchTask.py         |   3 +-
 lib/portage/emaint/modules/merges/__init__.py |  14 +-
 lib/portage/emaint/modules/merges/merges.py   |  11 +-
 lib/portage/package/ebuild/config.py          |  17 ++-
 lib/portage/package/ebuild/fetch.py           | 195 ++++++++++++++++++++++++--
 lib/portage/tests/ebuild/test_fetch.py        | 182 +++++++++++++++++++-----
 lib/portage/tests/emerge/test_simple.py       |   4 +-
 lib/portage/tests/resolver/test_autounmask.py |  25 +++-
 lib/portage/util/_async/PopenProcess.py       |   4 +-
 man/emaint.1                                  |   6 +-
 man/emerge.1                                  |  11 +-
 man/make.conf.5                               |   9 +-
 setup.py                                      |   4 +-
 tox.ini                                       |   2 +-
 20 files changed, 434 insertions(+), 85 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2021-04-03  8:28 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2021-04-03  8:28 UTC (permalink / raw
  To: gentoo-commits

commit:     8386b1c30385294d1f9e3f982bf3e2cd6fa204ad
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sat Apr  3 08:27:55 2021 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sat Apr  3 08:27:55 2021 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=8386b1c3

Merge tag 'portage-3.0.16' into multilib

portage-3.0.16

Signed-off-by: Zac Medico <zmedico <AT> gentoo.org>
Signed-off-by: Thomas Sachau <tommy <AT> gentoo.org>

 NEWS                                               |   3 +
 RELEASE-NOTES                                      |   9 +
 bin/shelve-utils                                   |  36 ++++
 .../_compat_upgrade/binpkg_multi_instance.py       |  33 ++++
 lib/portage/_emirrordist/Config.py                 |  39 ++--
 lib/portage/_emirrordist/ContentDB.py              | 196 +++++++++++++++++++++
 lib/portage/_emirrordist/DeletionIterator.py       |  25 ++-
 lib/portage/_emirrordist/DeletionTask.py           |   8 +
 lib/portage/_emirrordist/FetchIterator.py          |   3 +-
 lib/portage/_emirrordist/FetchTask.py              |   5 +-
 lib/portage/_emirrordist/main.py                   |  15 +-
 lib/portage/dbapi/bintree.py                       |   1 +
 lib/portage/package/ebuild/fetch.py                |  12 +-
 lib/portage/repository/config.py                   |   2 +
 lib/portage/tests/ebuild/test_fetch.py             | 160 ++++++++++++++++-
 .../resolver/test_autounmask_use_slot_conflict.py  |  51 ++++++
 lib/portage/tests/util/test_shelve.py              |  60 +++++++
 lib/portage/util/path.py                           |   4 +-
 lib/portage/util/shelve.py                         |  58 ++++++
 man/emirrordist.1                                  |   6 +-
 repoman/cnf/linechecks/linechecks.yaml             |   2 +-
 .../modules/linechecks/deprecated/deprecated.py    |   2 +-
 setup.py                                           |   2 +-
 23 files changed, 693 insertions(+), 39 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2021-07-25 11:43 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2021-07-25 11:43 UTC (permalink / raw
  To: gentoo-commits

commit:     2be6680750aee41ae5c9eaaade8d8a924e842066
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sun Jul 25 11:43:10 2021 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun Jul 25 11:43:15 2021 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=2be66807

Merge tag 'portage-3.0.20' into multilib

portage-3.0.20

Signed-off-by: Zac Medico <zmedico <AT> gentoo.org>
Signed-off-by: Thomas Sachau <tommy <AT> gentoo.org>

 NEWS                                   |  4 ++++
 RELEASE-NOTES                          |  5 ++++
 bin/ebuild-ipc.py                      |  6 +++--
 bin/ebuild.sh                          |  6 ++---
 bin/misc-functions.sh                  | 13 ++++++----
 bin/phase-functions.sh                 |  3 ++-
 bin/pid-ns-init                        | 22 ++++++++++++++++-
 bin/portageq                           |  6 +++--
 lib/_emerge/EbuildPhase.py             |  5 +++-
 lib/_emerge/actions.py                 | 36 +++++++++++++++++++++++++---
 lib/portage/dbapi/porttree.py          |  8 +++++--
 lib/portage/package/ebuild/doebuild.py | 19 +++++++++++++++
 lib/portage/package/ebuild/fetch.py    | 21 ++++++++++++-----
 man/make.conf.5                        | 10 +++++++-
 repoman/setup.py                       | 40 +++++++++++++++++++++----------
 setup.py                               | 43 +++++++++++++++++++++++-----------
 16 files changed, 194 insertions(+), 53 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2021-07-25 11:43 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2021-07-25 11:43 UTC (permalink / raw
  To: gentoo-commits

commit:     6047463bd3782fcc166b46f0dc781a378d626f68
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sun Jul 25 11:42:48 2021 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun Jul 25 11:43:02 2021 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=6047463b

Merge tag 'portage-3.0.19' into multilib

portage-3.0.19

Signed-off-by: Zac Medico <zmedico <AT> gentoo.org>
Signed-off-by: Thomas Sachau <tommy <AT> gentoo.org>

 NEWS                                               |   4 +
 RELEASE-NOTES                                      |  13 ++
 bin/eapi.sh                                        |  76 ++++++++-
 bin/ebuild-helpers/doconfd                         |   8 +-
 bin/ebuild-helpers/doenvd                          |   8 +-
 bin/ebuild-helpers/doheader                        |   8 +-
 bin/ebuild-helpers/doinitd                         |   9 +-
 bin/ebuild-helpers/dosym                           |  67 +++++++-
 bin/ebuild-ipc.py                                  |  20 ++-
 bin/ebuild.sh                                      |  65 ++++++--
 bin/isolated-functions.sh                          |   6 +-
 bin/phase-functions.sh                             |  16 +-
 bin/phase-helpers.sh                               |  60 +++++--
 bin/regenworld                                     |   7 +-
 cnf/sets/portage.conf                              |   1 +
 lib/_emerge/EbuildBuild.py                         |  25 ++-
 lib/_emerge/Package.py                             |   8 +-
 lib/_emerge/PackageUninstall.py                    |   2 +-
 lib/_emerge/Scheduler.py                           |  36 +++--
 lib/_emerge/actions.py                             |  30 +++-
 lib/_emerge/depgraph.py                            |   7 +-
 lib/_emerge/main.py                                |   4 +-
 lib/_emerge/unmerge.py                             |  19 ++-
 lib/portage/__init__.py                            |   4 +-
 lib/portage/_emirrordist/FetchIterator.py          |  68 ++++----
 lib/portage/_sets/dbapi.py                         |   6 +
 lib/portage/cache/metadata.py                      |   4 +-
 lib/portage/const.py                               |   4 +-
 lib/portage/dbapi/bintree.py                       |   7 +-
 lib/portage/dbapi/porttree.py                      |   4 +-
 lib/portage/dbapi/vartree.py                       |   2 +-
 lib/portage/dep/__init__.py                        |   8 +-
 lib/portage/dispatch_conf.py                       |   4 +-
 lib/portage/eapi.py                                |  15 +-
 .../package/ebuild/_config/special_env_vars.py     |   7 +-
 lib/portage/package/ebuild/config.py               |  24 ++-
 lib/portage/package/ebuild/doebuild.py             |  15 +-
 lib/portage/package/ebuild/fetch.py                |  66 ++++----
 lib/portage/tests/__init__.py                      | 127 ++++++++-------
 lib/portage/tests/ebuild/test_shell_quote.py       | 126 +++++++++++++++
 lib/portage/tests/emerge/test_simple.py            |  10 +-
 lib/portage/tests/resolver/ResolverPlayground.py   |  39 ++++-
 lib/portage/tests/resolver/test_unmerge_order.py   | 179 +++++++++++++++++++++
 lib/portage/update.py                              |  17 +-
 lib/portage/util/_async/PipeLogger.py              |  35 ++--
 lib/portage/util/env_update.py                     |   5 +
 man/ebuild.5                                       |  33 +++-
 man/emerge.1                                       |   2 +-
 man/make.conf.5                                    |  34 +++-
 man/portage.5                                      |  33 +++-
 repoman/RELEASE-NOTES                              |   6 +
 repoman/lib/repoman/argparser.py                   |   5 +-
 repoman/lib/repoman/main.py                        |   2 +-
 repoman/lib/repoman/modules/scan/module.py         |   4 +-
 repoman/lib/repoman/tests/__init__.py              |  18 +--
 repoman/lib/repoman/tests/simple/test_simple.py    |   6 +-
 repoman/setup.py                                   |   9 +-
 setup.py                                           |   2 +-
 58 files changed, 1147 insertions(+), 282 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2021-07-25 11:43 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2021-07-25 11:43 UTC (permalink / raw
  To: gentoo-commits

commit:     c0a00cde2d10eda4c207d488e01b48e0bfc75ce9
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sun Jul 25 11:43:19 2021 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sun Jul 25 11:43:22 2021 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=c0a00cde

Merge tag 'portage-3.0.21' into multilib

portage-3.0.21

Signed-off-by: Zac Medico <zmedico <AT> gentoo.org>
Signed-off-by: Thomas Sachau <tommy <AT> gentoo.org>

 .github/workflows/ci.yml                   |  2 +-
 NEWS                                       |  4 ++
 README                                     |  2 +-
 bin/ebuild.sh                              | 16 +++---
 bin/estrip                                 | 14 ++---
 bin/install-qa-check.d/10executable-issues |  2 +-
 bin/install-qa-check.d/10ignored-flags     |  4 +-
 bin/install-qa-check.d/80libraries         |  2 +-
 bin/misc-functions.sh                      |  2 +-
 bin/phase-functions.sh                     |  8 +--
 bin/phase-helpers.sh                       |  2 +-
 bin/pid-ns-init                            | 22 +-------
 lib/_emerge/actions.py                     | 36 ++-----------
 lib/portage/_sets/dbapi.py                 |  4 +-
 lib/portage/package/ebuild/fetch.py        |  4 +-
 man/make.conf.5                            | 10 +---
 setup.py                                   | 84 ++++++++++++++++++++++++++----
 17 files changed, 114 insertions(+), 104 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2021-10-30  9:44 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2021-10-30  9:44 UTC (permalink / raw
  To: gentoo-commits

commit:     4188cc1aa0a247a3d8a93cce13da8a281e3c83df
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sat Oct 30 09:34:13 2021 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sat Oct 30 09:37:05 2021 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=4188cc1a

Merge tag 'portage-3.0.22' into multilib

portage-3.0.22

Signed-off-by: Thomas Sachau <tommy <AT> gentoo.org>

 .github/workflows/ci.yml               |  4 ++--
 MANIFEST.in                            |  2 ++
 NEWS                                   |  9 +++++++++
 bin/estrip                             |  4 +++-
 lib/_emerge/resolver/output_helpers.py | 21 +++++++++++++++++++--
 lib/portage/package/ebuild/doebuild.py | 11 ++++++++++-
 man/emerge.1                           |  2 +-
 man/make.conf.5                        |  3 +--
 setup.py                               |  2 +-
 tox.ini                                | 18 +++++++++---------
 10 files changed, 57 insertions(+), 19 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2021-10-30  9:44 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2021-10-30  9:44 UTC (permalink / raw
  To: gentoo-commits

commit:     d3588989ed5cd2abee8dd4bacf6067491eb36096
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Sat Oct 30 09:37:49 2021 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Sat Oct 30 09:37:49 2021 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=d3588989

Merge tag 'portage-3.0.23' into multilib

portage-3.0.23

Signed-off-by: Thomas Sachau <tommy <AT> gentoo.org>

 NEWS                                               |  9 +++++
 bin/dispatch-conf                                  | 13 ++++++-
 bin/ebuild.sh                                      |  8 ++++
 bin/pid-ns-init                                    | 20 +++++++++-
 lib/_emerge/post_emerge.py                         |  2 +-
 lib/portage/dispatch_conf.py                       | 15 ++++++++
 lib/portage/package/ebuild/doebuild.py             |  2 +-
 lib/portage/sync/controller.py                     | 16 +-------
 .../util/_dyn_libs/display_preserved_libs.py       | 11 ++++--
 lib/portage/util/hooks.py                          | 43 ++++++++++++++++++++++
 man/dispatch-conf.1                                |  5 +++
 man/make.conf.5                                    |  5 ++-
 setup.py                                           |  2 +-
 13 files changed, 127 insertions(+), 24 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2022-03-21 10:01 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2022-03-21 10:01 UTC (permalink / raw
  To: gentoo-commits

commit:     53e3b05235f8e438e1426ada3bd42fd1125b7b6d
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Mon Mar 21 09:54:15 2022 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Mon Mar 21 09:58:42 2022 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=53e3b052

Merge tag 'portage-3.0.24' into multilib

Signed-off-by: Thomas Sachau <tommy <AT> gentoo.org>

 .editorconfig                                      |     2 +-
 .github/workflows/black.yml                        |    10 +
 .gitignorerevs                                     |     2 +
 NEWS                                               |     9 +
 README => README.md                                |    49 +-
 RELEASE-NOTES                                      |     7 +
 bin/check-implicit-pointer-usage.py                |    52 +-
 bin/chmod-lite.py                                  |    25 +-
 bin/chpathtool.py                                  |   323 +-
 bin/dohtml.py                                      |   424 +-
 bin/doins.py                                       |  1007 +-
 bin/ebuild-ipc.py                                  |   519 +-
 bin/ebuild.sh                                      |    36 +-
 bin/filter-bash-environment.py                     |   266 +-
 bin/install.py                                     |   379 +-
 bin/lock-helper.py                                 |    34 +-
 bin/misc-functions.sh                              |    64 +-
 bin/phase-functions.sh                             |     4 +-
 bin/pid-ns-init                                    |   262 +-
 bin/portageq                                       |     3 +-
 bin/socks5-server.py                               |   449 +-
 bin/xattr-helper.py                                |   226 +-
 bin/xpak-helper.py                                 |    81 +-
 doc/api/conf.py                                    |    24 +-
 lib/_emerge/AbstractDepPriority.py                 |    38 +-
 lib/_emerge/AbstractEbuildProcess.py               |   869 +-
 lib/_emerge/AbstractPollTask.py                    |   205 +-
 lib/_emerge/AsynchronousLock.py                    |   571 +-
 lib/_emerge/AsynchronousTask.py                    |   391 +-
 lib/_emerge/AtomArg.py                             |    11 +-
 lib/_emerge/Binpkg.py                              |   988 +-
 lib/_emerge/BinpkgEnvExtractor.py                  |   123 +-
 lib/_emerge/BinpkgExtractorAsync.py                |   190 +-
 lib/_emerge/BinpkgFetcher.py                       |   447 +-
 lib/_emerge/BinpkgPrefetcher.py                    |    74 +-
 lib/_emerge/BinpkgVerifier.py                      |   232 +-
 lib/_emerge/Blocker.py                             |    15 +-
 lib/_emerge/BlockerCache.py                        |   343 +-
 lib/_emerge/BlockerDB.py                           |   226 +-
 lib/_emerge/BlockerDepPriority.py                  |    14 +-
 lib/_emerge/CompositeTask.py                       |   234 +-
 lib/_emerge/DepPriority.py                         |   100 +-
 lib/_emerge/DepPriorityNormalRange.py              |    86 +-
 lib/_emerge/DepPrioritySatisfiedRange.py           |   183 +-
 lib/_emerge/Dependency.py                          |    38 +-
 lib/_emerge/DependencyArg.py                       |    48 +-
 lib/_emerge/EbuildBinpkg.py                        |    94 +-
 lib/_emerge/EbuildBuild.py                         |  1127 +-
 lib/_emerge/EbuildBuildDir.py                      |   295 +-
 lib/_emerge/EbuildExecuter.py                      |   178 +-
 lib/_emerge/EbuildFetcher.py                       |   741 +-
 lib/_emerge/EbuildFetchonly.py                     |    58 +-
 lib/_emerge/EbuildIpcDaemon.py                     |   164 +-
 lib/_emerge/EbuildMerge.py                         |   139 +-
 lib/_emerge/EbuildMetadataPhase.py                 |   431 +-
 lib/_emerge/EbuildPhase.py                         |  1045 +-
 lib/_emerge/EbuildProcess.py                       |    31 +-
 lib/_emerge/EbuildSpawnProcess.py                  |    23 +-
 lib/_emerge/FakeVartree.py                         |   621 +-
 lib/_emerge/FifoIpcDaemon.py                       |   105 +-
 lib/_emerge/JobStatusDisplay.py                    |   556 +-
 lib/_emerge/MergeListItem.py                       |   262 +-
 lib/_emerge/MetadataRegen.py                       |   292 +-
 lib/_emerge/MiscFunctionsProcess.py                |    91 +-
 lib/_emerge/Package.py                             |  1869 +-
 lib/_emerge/PackageArg.py                          |    18 +-
 lib/_emerge/PackageMerge.py                        |    90 +-
 lib/_emerge/PackagePhase.py                        |   176 +-
 lib/_emerge/PackageUninstall.py                    |   274 +-
 lib/_emerge/PackageVirtualDbapi.py                 |   274 +-
 lib/_emerge/PipeReader.py                          |   169 +-
 lib/_emerge/PollScheduler.py                       |   346 +-
 lib/_emerge/ProgressHandler.py                     |    30 +-
 lib/_emerge/RootConfig.py                          |    64 +-
 lib/_emerge/Scheduler.py                           |  4260 ++--
 lib/_emerge/SequentialTaskQueue.py                 |   157 +-
 lib/_emerge/SetArg.py                              |    12 +-
 lib/_emerge/SpawnProcess.py                        |   545 +-
 lib/_emerge/SubProcess.py                          |   157 +-
 lib/_emerge/Task.py                                |    91 +-
 lib/_emerge/TaskSequence.py                        |    95 +-
 lib/_emerge/UninstallFailure.py                    |    21 +-
 lib/_emerge/UnmergeDepPriority.py                  |    68 +-
 lib/_emerge/UseFlagDisplay.py                      |   188 +-
 lib/_emerge/UserQuery.py                           |   108 +-
 lib/_emerge/_find_deep_system_runtime_deps.py      |    54 +-
 lib/_emerge/_flush_elog_mod_echo.py                |    19 +-
 lib/_emerge/actions.py                             |  7052 +++---
 lib/_emerge/chk_updated_cfg_files.py               |    74 +-
 lib/_emerge/clear_caches.py                        |    21 +-
 lib/_emerge/countdown.py                           |    24 +-
 lib/_emerge/create_depgraph_params.py              |   398 +-
 lib/_emerge/create_world_atom.py                   |   213 +-
 lib/_emerge/depgraph.py                            | 21935 ++++++++++---------
 lib/_emerge/emergelog.py                           |    69 +-
 lib/_emerge/getloadavg.py                          |    43 +-
 lib/_emerge/help.py                                |   168 +-
 lib/_emerge/is_valid_package_atom.py               |    30 +-
 lib/_emerge/main.py                                |  2557 ++-
 lib/_emerge/post_emerge.py                         |   292 +-
 lib/_emerge/resolver/DbapiProvidesIndex.py         |   191 +-
 lib/_emerge/resolver/backtracking.py               |   548 +-
 lib/_emerge/resolver/circular_dependency.py        |   576 +-
 lib/_emerge/resolver/output.py                     |  1973 +-
 lib/_emerge/resolver/output_helpers.py             |  1113 +-
 lib/_emerge/resolver/package_tracker.py            |   740 +-
 lib/_emerge/resolver/slot_collision.py             |  2466 ++-
 lib/_emerge/search.py                              |  1071 +-
 lib/_emerge/show_invalid_depstring_notice.py       |    49 +-
 lib/_emerge/stdout_spinner.py                      |   148 +-
 lib/_emerge/unmerge.py                             |  1268 +-
 lib/portage/__init__.py                            |  1197 +-
 lib/portage/_compat_upgrade/binpkg_compression.py  |    67 +-
 .../_compat_upgrade/binpkg_multi_instance.py       |    44 +-
 lib/portage/_compat_upgrade/default_locations.py   |   174 +-
 lib/portage/_emirrordist/Config.py                 |   274 +-
 lib/portage/_emirrordist/ContentDB.py              |   371 +-
 lib/portage/_emirrordist/DeletionIterator.py       |   204 +-
 lib/portage/_emirrordist/DeletionTask.py           |   284 +-
 lib/portage/_emirrordist/FetchIterator.py          |   539 +-
 lib/portage/_emirrordist/FetchTask.py              |  1354 +-
 lib/portage/_emirrordist/MirrorDistTask.py         |   458 +-
 lib/portage/_emirrordist/main.py                   |   882 +-
 lib/portage/_global_updates.py                     |   504 +-
 lib/portage/_legacy_globals.py                     |   145 +-
 lib/portage/_selinux.py                            |   228 +-
 lib/portage/_sets/ProfilePackageSet.py             |    65 +-
 lib/portage/_sets/__init__.py                      |   619 +-
 lib/portage/_sets/base.py                          |   462 +-
 lib/portage/_sets/dbapi.py                         |  1073 +-
 lib/portage/_sets/files.py                         |   757 +-
 lib/portage/_sets/libs.py                          |   172 +-
 lib/portage/_sets/profiles.py                      |   110 +-
 lib/portage/_sets/security.py                      |   151 +-
 lib/portage/_sets/shell.py                         |    65 +-
 lib/portage/binrepo/config.py                      |   249 +-
 lib/portage/cache/anydbm.py                        |   159 +-
 lib/portage/cache/cache_errors.py                  |   103 +-
 lib/portage/cache/ebuild_xattr.py                  |   298 +-
 lib/portage/cache/flat_hash.py                     |   263 +-
 lib/portage/cache/fs_template.py                   |   130 +-
 lib/portage/cache/index/IndexStreamIterator.py     |    32 +-
 lib/portage/cache/index/pkg_desc_index.py          |    67 +-
 lib/portage/cache/mappings.py                      |   780 +-
 lib/portage/cache/metadata.py                      |   292 +-
 lib/portage/cache/sql_template.py                  |   618 +-
 lib/portage/cache/sqlite.py                        |   633 +-
 lib/portage/cache/template.py                      |   674 +-
 lib/portage/cache/volatile.py                      |    35 +-
 lib/portage/checksum.py                            |   948 +-
 lib/portage/const.py                               |   382 +-
 lib/portage/cvstree.py                             |   551 +-
 lib/portage/data.py                                |   538 +-
 lib/portage/dbapi/DummyTree.py                     |    24 +-
 lib/portage/dbapi/IndexedPortdb.py                 |   313 +-
 lib/portage/dbapi/IndexedVardb.py                  |   209 +-
 .../dbapi/_ContentsCaseSensitivityManager.py       |   179 +-
 lib/portage/dbapi/_MergeProcess.py                 |   465 +-
 lib/portage/dbapi/_SyncfsProcess.py                |    91 +-
 lib/portage/dbapi/_VdbMetadataDelta.py             |   333 +-
 lib/portage/dbapi/__init__.py                      |   878 +-
 lib/portage/dbapi/_expand_new_virt.py              |   129 +-
 lib/portage/dbapi/_similar_name_search.py          |    96 +-
 lib/portage/dbapi/bintree.py                       |  3827 ++--
 lib/portage/dbapi/cpv_expand.py                    |   183 +-
 lib/portage/dbapi/dep_expand.py                    |    84 +-
 lib/portage/dbapi/porttree.py                      |  3230 +--
 lib/portage/dbapi/vartree.py                       | 12165 +++++-----
 lib/portage/dbapi/virtual.py                       |   442 +-
 lib/portage/debug.py                               |   215 +-
 lib/portage/dep/__init__.py                        |  5919 ++---
 lib/portage/dep/_dnf.py                            |   159 +-
 lib/portage/dep/_slot_operator.py                  |   206 +-
 lib/portage/dep/dep_check.py                       |  2006 +-
 lib/portage/dep/soname/SonameAtom.py               |    96 +-
 lib/portage/dep/soname/multilib_category.py        |   242 +-
 lib/portage/dep/soname/parse.py                    |    68 +-
 lib/portage/dispatch_conf.py                       |   707 +-
 lib/portage/eapi.py                                |   466 +-
 lib/portage/eclass_cache.py                        |   322 +-
 lib/portage/elog/__init__.py                       |   326 +-
 lib/portage/elog/filtering.py                      |    21 +-
 lib/portage/elog/messages.py                       |   311 +-
 lib/portage/elog/mod_custom.py                     |    25 +-
 lib/portage/elog/mod_echo.py                       |   103 +-
 lib/portage/elog/mod_mail.py                       |    63 +-
 lib/portage/elog/mod_mail_summary.py               |   150 +-
 lib/portage/elog/mod_save.py                       |   128 +-
 lib/portage/elog/mod_save_summary.py               |   134 +-
 lib/portage/elog/mod_syslog.py                     |    37 +-
 lib/portage/emaint/defaults.py                     |    39 +-
 lib/portage/emaint/main.py                         |   431 +-
 lib/portage/emaint/modules/binhost/__init__.py     |    26 +-
 lib/portage/emaint/modules/binhost/binhost.py      |   351 +-
 lib/portage/emaint/modules/config/__init__.py      |    26 +-
 lib/portage/emaint/modules/config/config.py        |   129 +-
 lib/portage/emaint/modules/logs/__init__.py        |    79 +-
 lib/portage/emaint/modules/logs/logs.py            |   186 +-
 lib/portage/emaint/modules/merges/__init__.py      |    69 +-
 lib/portage/emaint/modules/merges/merges.py        |   543 +-
 lib/portage/emaint/modules/move/__init__.py        |    46 +-
 lib/portage/emaint/modules/move/move.py            |   361 +-
 lib/portage/emaint/modules/resume/__init__.py      |    26 +-
 lib/portage/emaint/modules/resume/resume.py        |    97 +-
 lib/portage/emaint/modules/sync/__init__.py        |    99 +-
 lib/portage/emaint/modules/sync/sync.py            |   936 +-
 lib/portage/emaint/modules/world/__init__.py       |    26 +-
 lib/portage/emaint/modules/world/world.py          |   158 +-
 lib/portage/env/config.py                          |   162 +-
 lib/portage/env/loaders.py                         |   588 +-
 lib/portage/env/validators.py                      |    23 +-
 lib/portage/exception.py                           |   248 +-
 lib/portage/getbinpkg.py                           |  1734 +-
 lib/portage/glsa.py                                |  1432 +-
 lib/portage/localization.py                        |    62 +-
 lib/portage/locks.py                               |  1419 +-
 lib/portage/mail.py                                |   238 +-
 lib/portage/manifest.py                            |  1446 +-
 lib/portage/metadata.py                            |   417 +-
 lib/portage/module.py                              |   449 +-
 lib/portage/news.py                                |   862 +-
 lib/portage/output.py                              |  1544 +-
 .../package/ebuild/_config/KeywordsManager.py      |   658 +-
 .../package/ebuild/_config/LicenseManager.py       |   450 +-
 .../package/ebuild/_config/LocationsManager.py     |   752 +-
 lib/portage/package/ebuild/_config/MaskManager.py  |   585 +-
 lib/portage/package/ebuild/_config/UseManager.py   |  1297 +-
 .../package/ebuild/_config/VirtualsManager.py      |   444 +-
 .../package/ebuild/_config/env_var_validation.py   |    31 +-
 lib/portage/package/ebuild/_config/features_set.py |   237 +-
 lib/portage/package/ebuild/_config/helper.py       |   103 +-
 .../package/ebuild/_config/special_env_vars.py     |   424 +-
 .../package/ebuild/_config/unpack_dependencies.py  |    67 +-
 lib/portage/package/ebuild/_ipc/ExitCommand.py     |    36 +-
 lib/portage/package/ebuild/_ipc/IpcCommand.py      |     7 +-
 lib/portage/package/ebuild/_ipc/QueryCommand.py    |   264 +-
 lib/portage/package/ebuild/_metadata_invalid.py    |    68 +-
 .../ebuild/_parallel_manifest/ManifestProcess.py   |    74 +-
 .../ebuild/_parallel_manifest/ManifestScheduler.py |   146 +-
 .../ebuild/_parallel_manifest/ManifestTask.py      |   403 +-
 lib/portage/package/ebuild/_spawn_nofetch.py       |   206 +-
 lib/portage/package/ebuild/config.py               |  6246 +++---
 .../package/ebuild/deprecated_profile_check.py     |   172 +-
 lib/portage/package/ebuild/digestcheck.py          |   296 +-
 lib/portage/package/ebuild/digestgen.py            |   401 +-
 lib/portage/package/ebuild/doebuild.py             |  5524 ++---
 lib/portage/package/ebuild/fetch.py                |  3518 +--
 lib/portage/package/ebuild/getmaskingreason.py     |   205 +-
 lib/portage/package/ebuild/getmaskingstatus.py     |   333 +-
 lib/portage/package/ebuild/prepare_build_dirs.py   |   906 +-
 lib/portage/package/ebuild/profile_iuse.py         |    49 +-
 lib/portage/process.py                             |  1872 +-
 lib/portage/progress.py                            |    87 +-
 lib/portage/proxy/lazyimport.py                    |   385 +-
 lib/portage/proxy/objectproxy.py                   |   120 +-
 lib/portage/repository/config.py                   |  2743 +--
 .../repository/storage/hardlink_quarantine.py      |   181 +-
 lib/portage/repository/storage/hardlink_rcu.py     |   491 +-
 lib/portage/repository/storage/inplace.py          |    61 +-
 lib/portage/repository/storage/interface.py        |   127 +-
 lib/portage/sync/__init__.py                       |    57 +-
 lib/portage/sync/config_checks.py                  |   131 +-
 lib/portage/sync/controller.py                     |   717 +-
 lib/portage/sync/getaddrinfo_validate.py           |    37 +-
 lib/portage/sync/modules/cvs/__init__.py           |    64 +-
 lib/portage/sync/modules/cvs/cvs.py                |   116 +-
 lib/portage/sync/modules/git/__init__.py           |   115 +-
 lib/portage/sync/modules/git/git.py                |   584 +-
 lib/portage/sync/modules/mercurial/__init__.py     |    52 +-
 lib/portage/sync/modules/mercurial/mercurial.py    |   320 +-
 lib/portage/sync/modules/rsync/__init__.py         |    52 +-
 lib/portage/sync/modules/rsync/rsync.py            |  1519 +-
 lib/portage/sync/modules/svn/__init__.py           |    38 +-
 lib/portage/sync/modules/svn/svn.py                |   152 +-
 lib/portage/sync/modules/webrsync/__init__.py      |    60 +-
 lib/portage/sync/modules/webrsync/webrsync.py      |   236 +-
 lib/portage/sync/old_tree_timestamp.py             |   167 +-
 lib/portage/sync/syncbase.py                       |   657 +-
 lib/portage/tests/__init__.py                      |   550 +-
 lib/portage/tests/bin/setup_env.py                 |   131 +-
 lib/portage/tests/bin/test_dobin.py                |    19 +-
 lib/portage/tests/bin/test_dodir.py                |    23 +-
 lib/portage/tests/bin/test_doins.py                |   636 +-
 lib/portage/tests/bin/test_eapi7_ver_funcs.py      |   460 +-
 lib/portage/tests/bin/test_filter_bash_env.py      |    70 +-
 lib/portage/tests/dbapi/test_auxdb.py              |   197 +-
 lib/portage/tests/dbapi/test_fakedbapi.py          |   163 +-
 lib/portage/tests/dbapi/test_portdb_cache.py       |   349 +-
 lib/portage/tests/dep/testAtom.py                  |   997 +-
 lib/portage/tests/dep/testCheckRequiredUse.py      |   414 +-
 lib/portage/tests/dep/testExtendedAtomDict.py      |    20 +-
 lib/portage/tests/dep/testExtractAffectingUSE.py   |   158 +-
 lib/portage/tests/dep/testStandalone.py            |    66 +-
 lib/portage/tests/dep/test_best_match_to_list.py   |   168 +-
 lib/portage/tests/dep/test_dep_getcpv.py           |    56 +-
 lib/portage/tests/dep/test_dep_getrepo.py          |    40 +-
 lib/portage/tests/dep/test_dep_getslot.py          |    35 +-
 lib/portage/tests/dep/test_dep_getusedeps.py       |    47 +-
 lib/portage/tests/dep/test_dnf_convert.py          |    94 +-
 lib/portage/tests/dep/test_get_operator.py         |    53 +-
 .../tests/dep/test_get_required_use_flags.py       |    76 +-
 lib/portage/tests/dep/test_isjustname.py           |    32 +-
 lib/portage/tests/dep/test_isvalidatom.py          |   407 +-
 lib/portage/tests/dep/test_match_from_list.py      |   410 +-
 lib/portage/tests/dep/test_overlap_dnf.py          |    57 +-
 lib/portage/tests/dep/test_paren_reduce.py         |   121 +-
 lib/portage/tests/dep/test_soname_atom_pickle.py   |    20 +-
 lib/portage/tests/dep/test_use_reduce.py           |  1391 +-
 .../tests/ebuild/test_array_fromfile_eof.py        |    73 +-
 lib/portage/tests/ebuild/test_config.py            |   724 +-
 lib/portage/tests/ebuild/test_doebuild_fd_pipes.py |   273 +-
 lib/portage/tests/ebuild/test_doebuild_spawn.py    |   175 +-
 lib/portage/tests/ebuild/test_fetch.py             |  1518 +-
 lib/portage/tests/ebuild/test_ipc_daemon.py        |   289 +-
 lib/portage/tests/ebuild/test_shell_quote.py       |   218 +-
 lib/portage/tests/ebuild/test_spawn.py             |    79 +-
 .../tests/ebuild/test_use_expand_incremental.py    |   212 +-
 lib/portage/tests/emerge/test_config_protect.py    |   451 +-
 .../emerge/test_emerge_blocker_file_collision.py   |   304 +-
 lib/portage/tests/emerge/test_emerge_slot_abi.py   |   335 +-
 lib/portage/tests/emerge/test_global_updates.py    |    33 +-
 lib/portage/tests/emerge/test_simple.py            |  1054 +-
 .../tests/env/config/test_PackageKeywordsFile.py   |    59 +-
 .../tests/env/config/test_PackageMaskFile.py       |    34 +-
 .../tests/env/config/test_PackageUseFile.py        |    44 +-
 .../tests/env/config/test_PortageModulesFile.py    |    57 +-
 lib/portage/tests/glsa/test_security_set.py        |   174 +-
 lib/portage/tests/lafilefixer/test_lafilefixer.py  |   187 +-
 .../test_lazy_import_portage_baseline.py           |   132 +-
 .../lazyimport/test_preload_portage_submodules.py  |    18 +-
 lib/portage/tests/lint/metadata.py                 |     9 +-
 lib/portage/tests/lint/test_bash_syntax.py         |    81 +-
 lib/portage/tests/lint/test_compile_modules.py     |   103 +-
 lib/portage/tests/lint/test_import_modules.py      |    59 +-
 lib/portage/tests/locks/test_asynchronous_lock.py  |   340 +-
 lib/portage/tests/locks/test_lock_nonblock.py      |   120 +-
 lib/portage/tests/news/test_NewsItem.py            |   121 +-
 lib/portage/tests/process/test_AsyncFunction.py    |    91 +-
 lib/portage/tests/process/test_PipeLogger.py       |   106 +-
 lib/portage/tests/process/test_PopenProcess.py     |   156 +-
 .../tests/process/test_PopenProcessBlockingIO.py   |   103 +-
 lib/portage/tests/process/test_poll.py             |   182 +-
 lib/portage/tests/process/test_unshare_net.py      |    38 +-
 lib/portage/tests/resolver/ResolverPlayground.py   |  1947 +-
 .../test_build_id_profile_format.py                |   271 +-
 .../binpkg_multi_instance/test_rebuilt_binaries.py |   193 +-
 .../tests/resolver/soname/test_autounmask.py       |   176 +-
 lib/portage/tests/resolver/soname/test_depclean.py |   106 +-
 .../tests/resolver/soname/test_downgrade.py        |   463 +-
 .../tests/resolver/soname/test_or_choices.py       |   166 +-
 .../tests/resolver/soname/test_reinstall.py        |   150 +-
 .../tests/resolver/soname/test_skip_update.py      |   148 +-
 .../soname/test_slot_conflict_reinstall.py         |   671 +-
 .../resolver/soname/test_slot_conflict_update.py   |   203 +-
 .../tests/resolver/soname/test_soname_provided.py  |   131 +-
 .../tests/resolver/soname/test_unsatisfiable.py    |   117 +-
 .../tests/resolver/soname/test_unsatisfied.py      |   148 +-
 .../test_aggressive_backtrack_downgrade.py         |   153 +-
 lib/portage/tests/resolver/test_autounmask.py      |  1346 +-
 .../tests/resolver/test_autounmask_binpkg_use.py   |   115 +-
 .../resolver/test_autounmask_keep_keywords.py      |   122 +-
 .../tests/resolver/test_autounmask_multilib_use.py |   147 +-
 .../tests/resolver/test_autounmask_parent.py       |    65 +-
 .../resolver/test_autounmask_use_backtrack.py      |   146 +-
 .../tests/resolver/test_autounmask_use_breakage.py |   174 +-
 .../resolver/test_autounmask_use_slot_conflict.py  |    76 +-
 lib/portage/tests/resolver/test_backtracking.py    |   360 +-
 lib/portage/tests/resolver/test_bdeps.py           |   399 +-
 .../resolver/test_binary_pkg_ebuild_visibility.py  |   262 +-
 lib/portage/tests/resolver/test_blocker.py         |   240 +-
 lib/portage/tests/resolver/test_changed_deps.py    |   213 +-
 .../tests/resolver/test_circular_choices.py        |   401 +-
 .../tests/resolver/test_circular_choices_rust.py   |   160 +-
 .../tests/resolver/test_circular_dependencies.py   |   197 +-
 lib/portage/tests/resolver/test_complete_graph.py  |   291 +-
 ...test_complete_if_new_subslot_without_revbump.py |   120 +-
 lib/portage/tests/resolver/test_depclean.py        |   552 +-
 lib/portage/tests/resolver/test_depclean_order.py  |   105 +-
 .../resolver/test_depclean_slot_unavailable.py     |   127 +-
 lib/portage/tests/resolver/test_depth.py           |   586 +-
 .../resolver/test_disjunctive_depend_order.py      |   145 +-
 lib/portage/tests/resolver/test_eapi.py            |   298 +-
 .../tests/resolver/test_features_test_use.py       |   146 +-
 .../resolver/test_imagemagick_graphicsmagick.py    |   183 +-
 lib/portage/tests/resolver/test_keywords.py        |   664 +-
 lib/portage/tests/resolver/test_merge_order.py     |  1237 +-
 .../test_missing_iuse_and_evaluated_atoms.py       |    53 +-
 lib/portage/tests/resolver/test_multirepo.py       |   779 +-
 lib/portage/tests/resolver/test_multislot.py       |    99 +-
 .../tests/resolver/test_old_dep_chain_display.py   |    67 +-
 lib/portage/tests/resolver/test_onlydeps.py        |    57 +-
 .../tests/resolver/test_onlydeps_circular.py       |    87 +-
 .../tests/resolver/test_onlydeps_minimal.py        |    83 +-
 lib/portage/tests/resolver/test_or_choices.py      |  1474 +-
 .../tests/resolver/test_or_downgrade_installed.py  |   152 +-
 .../tests/resolver/test_or_upgrade_installed.py    |   418 +-
 lib/portage/tests/resolver/test_output.py          |   183 +-
 lib/portage/tests/resolver/test_package_tracker.py |   509 +-
 .../tests/resolver/test_profile_default_eapi.py    |   214 +-
 .../tests/resolver/test_profile_package_set.py     |   217 +-
 lib/portage/tests/resolver/test_rebuild.py         |   324 +-
 .../test_regular_slot_change_without_revbump.py    |   104 +-
 lib/portage/tests/resolver/test_required_use.py    |   435 +-
 .../resolver/test_runtime_cycle_merge_order.py     |   127 +-
 lib/portage/tests/resolver/test_simple.py          |   144 +-
 lib/portage/tests/resolver/test_slot_abi.py        |   907 +-
 .../tests/resolver/test_slot_abi_downgrade.py      |   425 +-
 .../resolver/test_slot_change_without_revbump.py   |   150 +-
 lib/portage/tests/resolver/test_slot_collisions.py |   606 +-
 .../resolver/test_slot_conflict_force_rebuild.py   |   125 +-
 .../resolver/test_slot_conflict_mask_update.py     |    63 +-
 .../tests/resolver/test_slot_conflict_rebuild.py   |   937 +-
 .../test_slot_conflict_unsatisfied_deep_deps.py    |   351 +-
 .../tests/resolver/test_slot_conflict_update.py    |   156 +-
 .../resolver/test_slot_conflict_update_virt.py     |   129 +-
 .../resolver/test_slot_operator_autounmask.py      |   232 +-
 .../tests/resolver/test_slot_operator_bdeps.py     |   395 +-
 .../resolver/test_slot_operator_complete_graph.py  |   250 +-
 .../resolver/test_slot_operator_exclusive_slots.py |   266 +-
 .../resolver/test_slot_operator_missed_update.py   |   196 +-
 .../tests/resolver/test_slot_operator_rebuild.py   |   196 +-
 .../resolver/test_slot_operator_required_use.py    |   114 +-
 .../resolver/test_slot_operator_reverse_deps.py    |   540 +-
 .../test_slot_operator_runtime_pkg_mask.py         |   240 +-
 .../resolver/test_slot_operator_unsatisfied.py     |   121 +-
 .../tests/resolver/test_slot_operator_unsolved.py  |   147 +-
 ..._slot_operator_update_probe_parent_downgrade.py |   112 +-
 .../test_solve_non_slot_operator_slot_conflicts.py |   113 +-
 lib/portage/tests/resolver/test_targetroot.py      |   178 +-
 lib/portage/tests/resolver/test_unmerge_order.py   |   394 +-
 .../tests/resolver/test_use_dep_defaults.py        |    80 +-
 lib/portage/tests/resolver/test_useflags.py        |   214 +-
 .../resolver/test_virtual_minimize_children.py     |   548 +-
 lib/portage/tests/resolver/test_virtual_slot.py    |   458 +-
 lib/portage/tests/resolver/test_with_test_deps.py  |   150 +-
 lib/portage/tests/runTests.py                      |    36 +-
 .../tests/sets/base/testInternalPackageSet.py      |    67 +-
 lib/portage/tests/sets/files/testConfigFileSet.py  |    37 +-
 lib/portage/tests/sets/files/testStaticFileSet.py  |    27 +-
 lib/portage/tests/sets/shell/testShell.py          |    31 +-
 lib/portage/tests/sync/test_sync_local.py          |   836 +-
 lib/portage/tests/unicode/test_string_format.py    |    78 +-
 lib/portage/tests/update/test_move_ent.py          |   188 +-
 lib/portage/tests/update/test_move_slot_ent.py     |   259 +-
 lib/portage/tests/update/test_update_dbentry.py    |   560 +-
 .../tests/util/dyn_libs/test_soname_deps.py        |    37 +-
 .../tests/util/eventloop/test_call_soon_fifo.py    |    28 +-
 lib/portage/tests/util/file_copy/test_copyfile.py  |    98 +-
 .../util/futures/asyncio/test_child_watcher.py     |    78 +-
 .../futures/asyncio/test_event_loop_in_fork.py     |    68 +-
 .../tests/util/futures/asyncio/test_pipe_closed.py |   251 +-
 .../asyncio/test_policy_wrapper_recursion.py       |    22 +-
 .../futures/asyncio/test_run_until_complete.py     |    44 +-
 .../util/futures/asyncio/test_subprocess_exec.py   |   356 +-
 .../util/futures/asyncio/test_wakeup_fd_sigchld.py |    62 +-
 .../tests/util/futures/test_compat_coroutine.py    |   392 +-
 .../tests/util/futures/test_done_callback.py       |    41 +-
 .../util/futures/test_done_callback_after_exit.py  |    69 +-
 .../tests/util/futures/test_iter_completed.py      |   141 +-
 lib/portage/tests/util/futures/test_retry.py       |   462 +-
 lib/portage/tests/util/test_checksum.py            |   236 +-
 lib/portage/tests/util/test_digraph.py             |   495 +-
 lib/portage/tests/util/test_file_copier.py         |    63 +-
 lib/portage/tests/util/test_getconfig.py           |   111 +-
 lib/portage/tests/util/test_grabdict.py            |     9 +-
 lib/portage/tests/util/test_install_mask.py        |   315 +-
 lib/portage/tests/util/test_normalizedPath.py      |    11 +-
 lib/portage/tests/util/test_shelve.py              |    90 +-
 lib/portage/tests/util/test_socks5.py              |   314 +-
 lib/portage/tests/util/test_stackDictList.py       |    28 +-
 lib/portage/tests/util/test_stackDicts.py          |    41 +-
 lib/portage/tests/util/test_stackLists.py          |    22 +-
 lib/portage/tests/util/test_uniqueArray.py         |    33 +-
 lib/portage/tests/util/test_varExpand.py           |   182 +-
 lib/portage/tests/util/test_whirlpool.py           |    17 +-
 lib/portage/tests/util/test_xattr.py               |   278 +-
 lib/portage/tests/versions/test_cpv_sort_key.py    |    18 +-
 lib/portage/tests/versions/test_vercmp.py          |   151 +-
 lib/portage/tests/xpak/test_decodeint.py           |    12 +-
 lib/portage/update.py                              |   805 +-
 lib/portage/util/ExtractKernelVersion.py           |   135 +-
 lib/portage/util/SlotObject.py                     |   101 +-
 lib/portage/util/__init__.py                       |  3580 +--
 lib/portage/util/_async/AsyncFunction.py           |   116 +-
 lib/portage/util/_async/AsyncScheduler.py          |   194 +-
 lib/portage/util/_async/AsyncTaskFuture.py         |    48 +-
 lib/portage/util/_async/BuildLogger.py             |   201 +-
 lib/portage/util/_async/FileCopier.py              |    32 +-
 lib/portage/util/_async/FileDigester.py            |   140 +-
 lib/portage/util/_async/ForkProcess.py             |   295 +-
 lib/portage/util/_async/PipeLogger.py              |   359 +-
 lib/portage/util/_async/PipeReaderBlockingIO.py    |   130 +-
 lib/portage/util/_async/PopenProcess.py            |    56 +-
 lib/portage/util/_async/SchedulerInterface.py      |   233 +-
 lib/portage/util/_async/TaskScheduler.py           |    23 +-
 lib/portage/util/_async/run_main_scheduler.py      |    66 +-
 lib/portage/util/_compare_files.py                 |   179 +-
 lib/portage/util/_ctypes.py                        |    65 +-
 lib/portage/util/_desktop_entry.py                 |   117 +-
 lib/portage/util/_dyn_libs/LinkageMapELF.py        |  1855 +-
 lib/portage/util/_dyn_libs/NeededEntry.py          |   129 +-
 .../util/_dyn_libs/PreservedLibsRegistry.py        |   461 +-
 .../util/_dyn_libs/display_preserved_libs.py       |   167 +-
 lib/portage/util/_dyn_libs/soname_deps.py          |   310 +-
 lib/portage/util/_dyn_libs/soname_deps_qa.py       |   161 +-
 lib/portage/util/_eventloop/asyncio_event_loop.py  |   264 +-
 lib/portage/util/_eventloop/global_event_loop.py   |     2 +-
 lib/portage/util/_get_vm_info.py                   |   140 +-
 lib/portage/util/_info_files.py                    |   234 +-
 lib/portage/util/_path.py                          |    34 +-
 lib/portage/util/_pty.py                           |    98 +-
 lib/portage/util/_urlopen.py                       |   157 +-
 lib/portage/util/_xattr.py                         |   350 +-
 lib/portage/util/backoff.py                        |    80 +-
 lib/portage/util/bin_entry_point.py                |    44 +-
 lib/portage/util/changelog.py                      |   103 +-
 lib/portage/util/compression_probe.py              |   191 +-
 lib/portage/util/configparser.py                   |   106 +-
 lib/portage/util/cpuinfo.py                        |    43 +-
 lib/portage/util/digraph.py                        |   747 +-
 lib/portage/util/elf/constants.py                  |    82 +-
 lib/portage/util/elf/header.py                     |   116 +-
 lib/portage/util/endian/decode.py                  |    70 +-
 lib/portage/util/env_update.py                     |   798 +-
 lib/portage/util/file_copy/__init__.py             |    37 +-
 lib/portage/util/formatter.py                      |    95 +-
 lib/portage/util/futures/__init__.py               |     4 +-
 lib/portage/util/futures/_asyncio/__init__.py      |   486 +-
 lib/portage/util/futures/_asyncio/streams.py       |   139 +-
 lib/portage/util/futures/_sync_decorator.py        |    75 +-
 lib/portage/util/futures/compat_coroutine.py       |   220 +-
 lib/portage/util/futures/executor/fork.py          |   228 +-
 lib/portage/util/futures/extendedfutures.py        |   115 +-
 lib/portage/util/futures/futures.py                |    16 +-
 lib/portage/util/futures/iter_completed.py         |   342 +-
 lib/portage/util/futures/retry.py                  |   377 +-
 lib/portage/util/futures/unix_events.py            |    96 +-
 lib/portage/util/hooks.py                          |    51 +-
 lib/portage/util/install_mask.py                   |   340 +-
 lib/portage/util/iterators/MultiIterGroupBy.py     |   164 +-
 lib/portage/util/lafilefixer.py                    |   331 +-
 lib/portage/util/listdir.py                        |   251 +-
 lib/portage/util/locale.py                         |   240 +-
 lib/portage/util/movefile.py                       |   665 +-
 lib/portage/util/mtimedb.py                        |   221 +-
 lib/portage/util/netlink.py                        |   139 +-
 lib/portage/util/path.py                           |    82 +-
 lib/portage/util/shelve.py                         |    86 +-
 lib/portage/util/socks5.py                         |   199 +-
 lib/portage/util/whirlpool.py                      |  2736 ++-
 lib/portage/util/writeable_check.py                |   199 +-
 lib/portage/versions.py                            |  1066 +-
 lib/portage/xml/metadata.py                        |   842 +-
 lib/portage/xpak.py                                |   943 +-
 man/make.conf.5                                    |     2 +-
 repoman/bin/repoman                                |    46 +-
 repoman/lib/repoman/__init__.py                    |   153 +-
 repoman/lib/repoman/_portage.py                    |     7 +-
 repoman/lib/repoman/_subprocess.py                 |    89 +-
 repoman/lib/repoman/actions.py                     |  1467 +-
 repoman/lib/repoman/argparser.py                   |   621 +-
 repoman/lib/repoman/check_missingslot.py           |    43 +-
 repoman/lib/repoman/config.py                      |   284 +-
 repoman/lib/repoman/copyrights.py                  |   221 +-
 repoman/lib/repoman/errors.py                      |    17 +-
 repoman/lib/repoman/gpg.py                         |   106 +-
 repoman/lib/repoman/main.py                        |   369 +-
 repoman/lib/repoman/metadata.py                    |   130 +-
 repoman/lib/repoman/modules/commit/manifest.py     |   189 +-
 repoman/lib/repoman/modules/commit/repochecks.py   |    54 +-
 .../modules/linechecks/assignment/__init__.py      |    34 +-
 .../modules/linechecks/assignment/assignment.py    |    40 +-
 repoman/lib/repoman/modules/linechecks/base.py     |   177 +-
 repoman/lib/repoman/modules/linechecks/config.py   |   195 +-
 .../lib/repoman/modules/linechecks/controller.py   |   277 +-
 .../repoman/modules/linechecks/depend/__init__.py  |    22 +-
 .../repoman/modules/linechecks/depend/implicit.py  |    63 +-
 .../modules/linechecks/deprecated/__init__.py      |    70 +-
 .../modules/linechecks/deprecated/deprecated.py    |    39 +-
 .../modules/linechecks/deprecated/inherit.py       |   113 +-
 .../lib/repoman/modules/linechecks/do/__init__.py  |    22 +-
 repoman/lib/repoman/modules/linechecks/do/dosym.py |    24 +-
 .../repoman/modules/linechecks/eapi/__init__.py    |    82 +-
 .../lib/repoman/modules/linechecks/eapi/checks.py  |   100 +-
 .../repoman/modules/linechecks/eapi/definition.py  |    55 +-
 .../repoman/modules/linechecks/emake/__init__.py   |    34 +-
 .../lib/repoman/modules/linechecks/emake/emake.py  |    30 +-
 .../modules/linechecks/gentoo_header/__init__.py   |    22 +-
 .../modules/linechecks/gentoo_header/header.py     |    95 +-
 .../repoman/modules/linechecks/helpers/__init__.py |    22 +-
 .../repoman/modules/linechecks/helpers/offset.py   |    31 +-
 .../repoman/modules/linechecks/nested/__init__.py  |    22 +-
 .../repoman/modules/linechecks/nested/nested.py    |    13 +-
 .../repoman/modules/linechecks/nested/nesteddie.py |    14 +-
 .../repoman/modules/linechecks/patches/__init__.py |    22 +-
 .../repoman/modules/linechecks/patches/patches.py  |    29 +-
 .../repoman/modules/linechecks/phases/__init__.py  |    58 +-
 .../lib/repoman/modules/linechecks/phases/phase.py |   305 +-
 .../repoman/modules/linechecks/portage/__init__.py |    34 +-
 .../repoman/modules/linechecks/portage/internal.py |    44 +-
 .../repoman/modules/linechecks/quotes/__init__.py  |    34 +-
 .../repoman/modules/linechecks/quotes/quoteda.py   |    15 +-
 .../repoman/modules/linechecks/quotes/quotes.py    |   147 +-
 .../lib/repoman/modules/linechecks/uri/__init__.py |    22 +-
 repoman/lib/repoman/modules/linechecks/uri/uri.py  |    50 +-
 .../lib/repoman/modules/linechecks/use/__init__.py |    22 +-
 .../repoman/modules/linechecks/use/builtwith.py    |     9 +-
 .../repoman/modules/linechecks/useless/__init__.py |    34 +-
 .../lib/repoman/modules/linechecks/useless/cd.py   |    32 +-
 .../repoman/modules/linechecks/useless/dodoc.py    |    19 +-
 .../modules/linechecks/whitespace/__init__.py      |    34 +-
 .../repoman/modules/linechecks/whitespace/blank.py |    31 +-
 .../modules/linechecks/whitespace/whitespace.py    |    23 +-
 .../modules/linechecks/workaround/__init__.py      |    22 +-
 .../modules/linechecks/workaround/workarounds.py   |    12 +-
 .../lib/repoman/modules/scan/depend/__init__.py    |    57 +-
 .../repoman/modules/scan/depend/_depend_checks.py  |   448 +-
 .../lib/repoman/modules/scan/depend/_gen_arches.py |   112 +-
 repoman/lib/repoman/modules/scan/depend/profile.py |   748 +-
 .../repoman/modules/scan/directories/__init__.py   |    83 +-
 .../lib/repoman/modules/scan/directories/files.py  |   155 +-
 .../lib/repoman/modules/scan/directories/mtime.py  |    46 +-
 repoman/lib/repoman/modules/scan/eapi/__init__.py  |    38 +-
 repoman/lib/repoman/modules/scan/eapi/eapi.py      |    87 +-
 .../lib/repoman/modules/scan/ebuild/__init__.py    |   106 +-
 repoman/lib/repoman/modules/scan/ebuild/ebuild.py  |   464 +-
 .../lib/repoman/modules/scan/ebuild/multicheck.py  |   100 +-
 .../lib/repoman/modules/scan/eclasses/__init__.py  |    78 +-
 repoman/lib/repoman/modules/scan/eclasses/live.py  |   119 +-
 repoman/lib/repoman/modules/scan/eclasses/ruby.py  |    86 +-
 repoman/lib/repoman/modules/scan/fetch/__init__.py |    51 +-
 repoman/lib/repoman/modules/scan/fetch/fetches.py  |   369 +-
 .../lib/repoman/modules/scan/keywords/__init__.py  |    51 +-
 .../lib/repoman/modules/scan/keywords/keywords.py  |   331 +-
 .../lib/repoman/modules/scan/manifest/__init__.py  |    45 +-
 .../lib/repoman/modules/scan/manifest/manifests.py |    92 +-
 .../lib/repoman/modules/scan/metadata/__init__.py  |   158 +-
 .../repoman/modules/scan/metadata/description.py   |    73 +-
 .../modules/scan/metadata/ebuild_metadata.py       |   128 +-
 .../repoman/modules/scan/metadata/pkgmetadata.py   |   374 +-
 .../lib/repoman/modules/scan/metadata/restrict.py  |    96 +-
 .../lib/repoman/modules/scan/metadata/use_flags.py |   155 +-
 repoman/lib/repoman/modules/scan/module.py         |   173 +-
 .../lib/repoman/modules/scan/options/__init__.py   |    37 +-
 .../lib/repoman/modules/scan/options/options.py    |    48 +-
 repoman/lib/repoman/modules/scan/scan.py           |    99 +-
 repoman/lib/repoman/modules/scan/scanbase.py       |   106 +-
 repoman/lib/repoman/modules/vcs/None/__init__.py   |    46 +-
 repoman/lib/repoman/modules/vcs/None/changes.py    |    88 +-
 repoman/lib/repoman/modules/vcs/None/status.py     |    96 +-
 repoman/lib/repoman/modules/vcs/__init__.py        |     5 +-
 repoman/lib/repoman/modules/vcs/bzr/__init__.py    |    46 +-
 repoman/lib/repoman/modules/vcs/bzr/changes.py     |   115 +-
 repoman/lib/repoman/modules/vcs/bzr/status.py      |   104 +-
 repoman/lib/repoman/modules/vcs/changes.py         |   311 +-
 repoman/lib/repoman/modules/vcs/cvs/__init__.py    |    46 +-
 repoman/lib/repoman/modules/vcs/cvs/changes.py     |   218 +-
 repoman/lib/repoman/modules/vcs/cvs/status.py      |   239 +-
 repoman/lib/repoman/modules/vcs/git/__init__.py    |    46 +-
 repoman/lib/repoman/modules/vcs/git/changes.py     |   252 +-
 repoman/lib/repoman/modules/vcs/git/status.py      |   115 +-
 repoman/lib/repoman/modules/vcs/hg/__init__.py     |    46 +-
 repoman/lib/repoman/modules/vcs/hg/changes.py      |   193 +-
 repoman/lib/repoman/modules/vcs/hg/status.py       |    95 +-
 repoman/lib/repoman/modules/vcs/settings.py        |   176 +-
 repoman/lib/repoman/modules/vcs/svn/__init__.py    |    46 +-
 repoman/lib/repoman/modules/vcs/svn/changes.py     |   266 +-
 repoman/lib/repoman/modules/vcs/svn/status.py      |   268 +-
 repoman/lib/repoman/modules/vcs/vcs.py             |   259 +-
 repoman/lib/repoman/profile.py                     |   133 +-
 repoman/lib/repoman/qa_data.py                     |   374 +-
 repoman/lib/repoman/qa_tracker.py                  |    81 +-
 repoman/lib/repoman/repos.py                       |   624 +-
 repoman/lib/repoman/scanner.py                     |   852 +-
 repoman/lib/repoman/tests/__init__.py              |   539 +-
 .../lib/repoman/tests/changelog/test_echangelog.py |   251 +-
 repoman/lib/repoman/tests/commit/test_commitmsg.py |   156 +-
 repoman/lib/repoman/tests/runTests.py              |    36 +-
 repoman/lib/repoman/tests/simple/test_simple.py    |   903 +-
 repoman/lib/repoman/utilities.py                   |  1019 +-
 repoman/runtests                                   |   258 +-
 repoman/setup.py                                   |   768 +-
 runtests                                           |   252 +-
 setup.py                                           |  1423 +-
 tabcheck.py                                        |     2 +-
 685 files changed, 141206 insertions(+), 124231 deletions(-)

diff --cc bin/phase-functions.sh
index 8039e71b1,9a4c97b16..4b8adb82c
--- a/bin/phase-functions.sh
+++ b/bin/phase-functions.sh
@@@ -319,9 -294,9 +319,9 @@@ __dyn_clean() 
  			"$PORTAGE_BUILDDIR"/.ipc_{in,out,lock} \
  			"$PORTAGE_BUILDDIR"/.exit_status
  
 -		rm -rf "${PORTAGE_BUILDDIR}/build-info"
 +		rm -rf "${PORTAGE_BUILDDIR}"/{build-info,abi-code}
  		rm -rf "${WORKDIR}"
- 		rm -f "${PORTAGE_BUILDDIR}/files"
+ 		rm -rf "${PORTAGE_BUILDDIR}/files"
  	fi
  
  	if [ -f "${PORTAGE_BUILDDIR}/.unpacked" ]; then
diff --cc lib/_emerge/EbuildExecuter.py
index cfc0427ba,450e53594..5a528f432
--- a/lib/_emerge/EbuildExecuter.py
+++ b/lib/_emerge/EbuildExecuter.py
@@@ -6,105 -6,92 +6,95 @@@ from _emerge.TaskSequence import TaskSe
  from _emerge.CompositeTask import CompositeTask
  import portage
  from portage import os
- from portage.eapi import eapi_has_src_prepare_and_src_configure, \
- 	eapi_exports_replace_vars
+ from portage.eapi import (
+     eapi_has_src_prepare_and_src_configure,
+     eapi_exports_replace_vars,
+ )
  
- class EbuildExecuter(CompositeTask):
- 
- 	__slots__ = ("pkg", "settings")
- 
- 	_phases = ("prepare", "configure", "compile", "test", "install")
- 
- 	def _start(self):
- 		pkg = self.pkg
- 		scheduler = self.scheduler
- 		settings = self.settings
- 		cleanup = 0
- 		portage.prepare_build_dirs(pkg.root, settings, cleanup)
- 
- 		if eapi_exports_replace_vars(settings['EAPI']):
- 			vardb = pkg.root_config.trees['vartree'].dbapi
- 			settings["REPLACING_VERSIONS"] = " ".join(
- 				set(portage.versions.cpv_getversion(match) \
- 					for match in vardb.match(pkg.slot_atom) + \
- 					vardb.match('='+pkg.cpv)))
- 
- 		setup_phase = EbuildPhase(background=self.background,
- 			phase="setup", scheduler=scheduler,
- 			settings=settings)
- 
- 		setup_phase.addExitListener(self._setup_exit)
- 		self._task_queued(setup_phase)
- 		self.scheduler.scheduleSetup(setup_phase)
- 
- 	def _setup_exit(self, setup_phase):
- 
- 		if self._default_exit(setup_phase) != os.EX_OK:
- 			self.wait()
- 			return
- 
- 		unpack_phase = EbuildPhase(background=self.background,
- 			phase="unpack", scheduler=self.scheduler,
- 			settings=self.settings)
- 
- 		if "live" in self.settings.get("PROPERTIES", "").split():
- 			# Serialize $DISTDIR access for live ebuilds since
- 			# otherwise they can interfere with eachother.
- 
- 			unpack_phase.addExitListener(self._unpack_exit)
- 			self._task_queued(unpack_phase)
- 			self.scheduler.scheduleUnpack(unpack_phase)
  
- 		else:
- 			self._start_task(unpack_phase, self._unpack_exit)
- 
- 	def _unpack_exit(self, unpack_phase):
- 
- 		if self._default_exit(unpack_phase) != os.EX_OK:
- 			self.wait()
- 			return
- 
- 		ebuild_phases = TaskSequence(scheduler=self.scheduler)
- 
- 		pkg = self.pkg
- 		phases = self._phases
- 		eapi = pkg.eapi
- 		if not eapi_has_src_prepare_and_src_configure(eapi):
- 			# skip src_prepare and src_configure
- 			phases = phases[2:]
+ class EbuildExecuter(CompositeTask):
  
- 		for phase in phases:
- 			ebuild_phases.add(EbuildPhase(background=self.background,
- 				phase=phase, scheduler=self.scheduler,
- 				settings=self.settings))
+     __slots__ = ("pkg", "settings")
+ 
+     _phases = ("prepare", "configure", "compile", "test", "install")
+ 
+     def _start(self):
+         pkg = self.pkg
+         scheduler = self.scheduler
+         settings = self.settings
+         cleanup = 0
+         portage.prepare_build_dirs(pkg.root, settings, cleanup)
+ 
+         if eapi_exports_replace_vars(settings["EAPI"]):
+             vardb = pkg.root_config.trees["vartree"].dbapi
+             settings["REPLACING_VERSIONS"] = " ".join(
+                 set(
+                     portage.versions.cpv_getversion(match)
+                     for match in vardb.match(pkg.slot_atom) + vardb.match("=" + pkg.cpv)
+                 )
+             )
+ 
+         setup_phase = EbuildPhase(
+             background=self.background,
+             phase="setup",
+             scheduler=scheduler,
+             settings=settings,
+         )
+ 
+         setup_phase.addExitListener(self._setup_exit)
+         self._task_queued(setup_phase)
+         self.scheduler.scheduleSetup(setup_phase)
+ 
+     def _setup_exit(self, setup_phase):
+ 
+         if self._default_exit(setup_phase) != os.EX_OK:
+             self.wait()
+             return
+ 
+         unpack_phase = EbuildPhase(
+             background=self.background,
+             phase="unpack",
+             scheduler=self.scheduler,
+             settings=self.settings,
+         )
+ 
+         if "live" in self.settings.get("PROPERTIES", "").split():
+             # Serialize $DISTDIR access for live ebuilds since
+             # otherwise they can interfere with eachother.
+ 
+             unpack_phase.addExitListener(self._unpack_exit)
+             self._task_queued(unpack_phase)
+             self.scheduler.scheduleUnpack(unpack_phase)
+ 
+         else:
+             self._start_task(unpack_phase, self._unpack_exit)
+ 
+     def _unpack_exit(self, unpack_phase):
+ 
+         if self._default_exit(unpack_phase) != os.EX_OK:
+             self.wait()
+             return
+ 
+         ebuild_phases = TaskSequence(scheduler=self.scheduler)
+ 
+         pkg = self.pkg
+         phases = self._phases
+         eapi = pkg.eapi
+         if not eapi_has_src_prepare_and_src_configure(eapi):
+             # skip src_prepare and src_configure
+             phases = phases[2:]
+ 
+         for phase in phases:
+             ebuild_phases.add(
+                 EbuildPhase(
+                     background=self.background,
+                     phase=phase,
+                     scheduler=self.scheduler,
+                     settings=self.settings,
+                 )
+             )
  
 -        self._start_task(ebuild_phases, self._default_final_exit)
 +		if 'force-multilib' in self.settings.features:
 +			self._start_task(ebuild_phases, self._install_exit)
 +		else:
 +			self._start_task(ebuild_phases, self._default_final_exit)
- 
- 	def _install_exit(self, install_phase):
- 
- 		if self._default_exit(install_phase) != os.EX_OK:
- 			self.wait()
- 			return
- 		if not os.path.exists(self.settings["D"]):
- 			pkg = self.pkg
- 			scheduler = self.scheduler
- 			settings = self.settings
- 			cleanup = 1
- 
- 			# This initializes PORTAGE_LOG_FILE.
- 			portage.prepare_build_dirs(pkg.root, settings, cleanup)
- 
- 			setup_phase = EbuildPhase(background=self.background,
- 				phase="setup", scheduler=scheduler,
- 				settings=settings)
- 
- 			setup_phase.addExitListener(self._setup_exit)
- 			self._current_task = setup_phase
- 			self.scheduler.scheduleSetup(setup_phase)
- 		else:
- 			self.returncode = os.EX_OK
- 			self.wait()
- 			return
diff --cc lib/_emerge/Package.py
index 82fe22fec,90dfccdef..0ee9bfb8b
--- a/lib/_emerge/Package.py
+++ b/lib/_emerge/Package.py
@@@ -16,815 -22,884 +22,916 @@@ from portage.exception import InvalidDa
  from portage.localization import _
  from _emerge.Task import Task
  
+ 
  class Package(Task):
  
- 	__hash__ = Task.__hash__
- 	__slots__ = ("built", "cpv", "depth",
- 		"installed", "onlydeps", "operation",
- 		"root_config", "type_name",
- 		"category", "counter", "cp", "cpv_split",
- 		"inherited", "iuse", "mtime",
- 		"pf", "root", "slot", "sub_slot", "slot_atom", "version") + \
- 		("_invalid", "_masks", "_metadata", "_provided_cps",
- 		"_raw_metadata", "_provides", "_requires", "_use",
- 		"_validated_atoms", "_visible")
- 
- 	metadata_keys = [
- 		"BDEPEND",
- 		"BUILD_ID", "BUILD_TIME", "CHOST", "COUNTER", "DEFINED_PHASES",
- 		"DEPEND", "EAPI", "IDEPEND", "INHERITED", "IUSE", "KEYWORDS",
- 		"LICENSE", "MD5", "PDEPEND", "PROVIDES",
- 		"RDEPEND", "repository", "REQUIRED_USE",
- 		"PROPERTIES", "REQUIRES", "RESTRICT", "SIZE",
- 		"SLOT", "USE", "_mtime_"]
- 
- 	_dep_keys = ('BDEPEND', 'DEPEND', 'IDEPEND', 'PDEPEND', 'RDEPEND')
- 	_buildtime_keys = ('BDEPEND', 'DEPEND')
- 	_runtime_keys = ('IDEPEND', 'PDEPEND', 'RDEPEND')
- 	_use_conditional_misc_keys = ('LICENSE', 'PROPERTIES', 'RESTRICT')
- 	UNKNOWN_REPO = _unknown_repo
- 
- 	def __init__(self, **kwargs):
- 		metadata = _PackageMetadataWrapperBase(kwargs.pop('metadata'))
- 		Task.__init__(self, **kwargs)
- 		# the SlotObject constructor assigns self.root_config from keyword args
- 		# and is an instance of a '_emerge.RootConfig.RootConfig class
- 		self.root = self.root_config.root
- 		self._raw_metadata = metadata
- 		self._metadata = _PackageMetadataWrapper(self, metadata)
- 		if not self.built:
- 			self._metadata['CHOST'] = self.root_config.settings.get('CHOST', '')
- 		eapi_attrs = _get_eapi_attrs(self.eapi)
- 
- 		try:
- 			db = self.cpv._db
- 		except AttributeError:
- 			if self.built:
- 				# For independence from the source ebuild repository and
- 				# profile implicit IUSE state, require the _db attribute
- 				# for built packages.
- 				raise
- 			db = self.root_config.trees['porttree'].dbapi
- 
- 		self.cpv = _pkg_str(self.cpv, metadata=self._metadata,
- 			settings=self.root_config.settings, db=db)
- 		if hasattr(self.cpv, 'slot_invalid'):
- 			self._invalid_metadata('SLOT.invalid',
- 				"SLOT: invalid value: '%s'" % self._metadata["SLOT"])
- 		self.cpv_split = self.cpv.cpv_split
- 		self.category, self.pf = portage.catsplit(self.cpv)
- 		self.cp = self.cpv.cp
- 		self.version = self.cpv.version
- 		self.slot = self.cpv.slot
- 		self.sub_slot = self.cpv.sub_slot
- 		self.slot_atom = Atom("%s%s%s" % (self.cp, _slot_separator, self.slot))
- 		# sync metadata with validated repo (may be UNKNOWN_REPO)
- 		self._metadata['repository'] = self.cpv.repo
- 
- 		if self.root_config.settings.local_config:
- 			implicit_match = db._iuse_implicit_cnstr(self.cpv, self._metadata)
- 		else:
- 			implicit_match = db._repoman_iuse_implicit_cnstr(self.cpv, self._metadata)
++
+     __hash__ = Task.__hash__
+     __slots__ = (
+         "built",
+         "cpv",
+         "depth",
+         "installed",
+         "onlydeps",
+         "operation",
+         "root_config",
+         "type_name",
+         "category",
+         "counter",
+         "cp",
+         "cpv_split",
+         "inherited",
+         "iuse",
+         "mtime",
+         "pf",
+         "root",
+         "slot",
+         "sub_slot",
+         "slot_atom",
+         "version",
+     ) + (
+         "_invalid",
+         "_masks",
+         "_metadata",
+         "_provided_cps",
+         "_raw_metadata",
+         "_provides",
+         "_requires",
+         "_use",
+         "_validated_atoms",
+         "_visible",
+     )
+ 
+     metadata_keys = [
+         "BDEPEND",
+         "BUILD_ID",
+         "BUILD_TIME",
+         "CHOST",
+         "COUNTER",
+         "DEFINED_PHASES",
+         "DEPEND",
+         "EAPI",
+         "IDEPEND",
+         "INHERITED",
+         "IUSE",
+         "KEYWORDS",
+         "LICENSE",
+         "MD5",
+         "PDEPEND",
+         "PROVIDES",
+         "RDEPEND",
+         "repository",
+         "REQUIRED_USE",
+         "PROPERTIES",
+         "REQUIRES",
+         "RESTRICT",
+         "SIZE",
+         "SLOT",
+         "USE",
+         "_mtime_",
+     ]
+ 
+     _dep_keys = ("BDEPEND", "DEPEND", "IDEPEND", "PDEPEND", "RDEPEND")
+     _buildtime_keys = ("BDEPEND", "DEPEND")
+     _runtime_keys = ("IDEPEND", "PDEPEND", "RDEPEND")
+     _use_conditional_misc_keys = ("LICENSE", "PROPERTIES", "RESTRICT")
+     UNKNOWN_REPO = _unknown_repo
+ 
+     def __init__(self, **kwargs):
+         metadata = _PackageMetadataWrapperBase(kwargs.pop("metadata"))
+         Task.__init__(self, **kwargs)
+         # the SlotObject constructor assigns self.root_config from keyword args
+         # and is an instance of a '_emerge.RootConfig.RootConfig class
+         self.root = self.root_config.root
+         self._raw_metadata = metadata
+         self._metadata = _PackageMetadataWrapper(self, metadata)
+         if not self.built:
+             self._metadata["CHOST"] = self.root_config.settings.get("CHOST", "")
+         eapi_attrs = _get_eapi_attrs(self.eapi)
+ 
+         try:
+             db = self.cpv._db
+         except AttributeError:
+             if self.built:
+                 # For independence from the source ebuild repository and
+                 # profile implicit IUSE state, require the _db attribute
+                 # for built packages.
+                 raise
+             db = self.root_config.trees["porttree"].dbapi
+ 
+         self.cpv = _pkg_str(
+             self.cpv, metadata=self._metadata, settings=self.root_config.settings, db=db
+         )
+         if hasattr(self.cpv, "slot_invalid"):
+             self._invalid_metadata(
+                 "SLOT.invalid", "SLOT: invalid value: '%s'" % self._metadata["SLOT"]
+             )
+         self.cpv_split = self.cpv.cpv_split
+         self.category, self.pf = portage.catsplit(self.cpv)
+         self.cp = self.cpv.cp
+         self.version = self.cpv.version
+         self.slot = self.cpv.slot
+         self.sub_slot = self.cpv.sub_slot
+         self.slot_atom = Atom("%s%s%s" % (self.cp, _slot_separator, self.slot))
+         # sync metadata with validated repo (may be UNKNOWN_REPO)
+         self._metadata["repository"] = self.cpv.repo
+ 
+         if self.root_config.settings.local_config:
+             implicit_match = db._iuse_implicit_cnstr(self.cpv, self._metadata)
+         else:
+             implicit_match = db._repoman_iuse_implicit_cnstr(self.cpv, self._metadata)
 +		if 'force-multilib' in self.root_config.settings.features:
 +			iuse = self._metadata["IUSE"]
 +			for multilib_abis in self.root_config.settings.get("MULTILIB_ABIS", '').split():
 +				iuse += " multilib_abi_" + multilib_abis
 +			iuse += " abiwrapper"
 +			self._metadata["IUSE"] = iuse
- 		usealiases = self.root_config.settings._use_manager.getUseAliases(self)
- 		self.iuse = self._iuse(self, self._metadata["IUSE"].split(),
- 			implicit_match, usealiases, self.eapi)
- 
- 		if (self.iuse.enabled or self.iuse.disabled) and \
- 			not eapi_attrs.iuse_defaults:
- 			if not self.installed:
- 				self._invalid_metadata('EAPI.incompatible',
- 					"IUSE contains defaults, but EAPI doesn't allow them")
- 		if self.inherited is None:
- 			self.inherited = frozenset()
- 
- 		if self.operation is None:
- 			if self.onlydeps or self.installed:
- 				self.operation = "nomerge"
- 			else:
- 				self.operation = "merge"
- 
- 		self._hash_key = Package._gen_hash_key(cpv=self.cpv,
- 			installed=self.installed, onlydeps=self.onlydeps,
- 			operation=self.operation, repo_name=self.cpv.repo,
- 			root_config=self.root_config,
- 			type_name=self.type_name)
- 		self._hash_value = hash(self._hash_key)
- 
- 	@property
- 	def eapi(self):
- 		return self._metadata["EAPI"]
- 
- 	@property
- 	def build_id(self):
- 		return self.cpv.build_id
- 
- 	@property
- 	def build_time(self):
- 		if not self.built:
- 			raise AttributeError('build_time')
- 		return self.cpv.build_time
- 
- 	@property
- 	def defined_phases(self):
- 		return self._metadata.defined_phases
- 
- 	@property
- 	def properties(self):
- 		return self._metadata.properties
- 
- 	@property
- 	def provided_cps(self):
- 		return (self.cp,)
- 
- 	@property
- 	def restrict(self):
- 		return self._metadata.restrict
- 
- 	@property
- 	def metadata(self):
- 		warnings.warn("_emerge.Package.Package.metadata is deprecated",
- 			DeprecationWarning, stacklevel=3)
- 		return self._metadata
- 
- 	# These are calculated on-demand, so that they are calculated
- 	# after FakeVartree applies its metadata tweaks.
- 	@property
- 	def invalid(self):
- 		if self._invalid is None:
- 			self._validate_deps()
- 			if self._invalid is None:
- 				self._invalid = False
- 		return self._invalid
- 
- 	@property
- 	def masks(self):
- 		if self._masks is None:
- 			self._masks = self._eval_masks()
- 		return self._masks
- 
- 	@property
- 	def visible(self):
- 		if self._visible is None:
- 			self._visible = self._eval_visiblity(self.masks)
- 		return self._visible
- 
- 	@property
- 	def validated_atoms(self):
- 		"""
- 		Returns *all* validated atoms from the deps, regardless
- 		of USE conditionals, with USE conditionals inside
- 		atoms left unevaluated.
- 		"""
- 		if self._validated_atoms is None:
- 			self._validate_deps()
- 		return self._validated_atoms
- 
- 	@property
- 	def stable(self):
- 		return self.cpv.stable
- 
- 	@property
- 	def provides(self):
- 		self.invalid
- 		return self._provides
- 
- 	@property
- 	def requires(self):
- 		self.invalid
- 		return self._requires
- 
- 	@classmethod
- 	def _gen_hash_key(cls, cpv=None, installed=None, onlydeps=None,
- 		operation=None, repo_name=None, root_config=None,
- 		type_name=None, **kwargs):
- 
- 		if operation is None:
- 			if installed or onlydeps:
- 				operation = "nomerge"
- 			else:
- 				operation = "merge"
- 
- 		root = None
- 		if root_config is not None:
- 			root = root_config.root
- 		else:
- 			raise TypeError("root_config argument is required")
- 
- 		elements = [type_name, root, str(cpv), operation]
- 
- 		# For installed (and binary) packages we don't care for the repo
- 		# when it comes to hashing, because there can only be one cpv.
- 		# So overwrite the repo_key with type_name.
- 		if type_name is None:
- 			raise TypeError("type_name argument is required")
- 		elif type_name == "ebuild":
- 			if repo_name is None:
- 				raise AssertionError(
- 					"Package._gen_hash_key() " + \
- 					"called without 'repo_name' argument")
- 			elements.append(repo_name)
- 		elif type_name == "binary":
- 			# Including a variety of fingerprints in the hash makes
- 			# it possible to simultaneously consider multiple similar
- 			# packages. Note that digests are not included here, since
- 			# they are relatively expensive to compute, and they may
- 			# not necessarily be available.
- 			elements.extend([cpv.build_id, cpv.file_size,
- 				cpv.build_time, cpv.mtime])
- 		else:
- 			# For installed (and binary) packages we don't care for the repo
- 			# when it comes to hashing, because there can only be one cpv.
- 			# So overwrite the repo_key with type_name.
- 			elements.append(type_name)
- 
- 		return tuple(elements)
- 
- 	def _validate_deps(self):
- 		"""
- 		Validate deps. This does not trigger USE calculation since that
- 		is expensive for ebuilds and therefore we want to avoid doing
- 		it unnecessarily (like for masked packages).
- 		"""
- 		eapi = self.eapi
- 		dep_eapi = eapi
- 		dep_valid_flag = self.iuse.is_valid_flag
- 		if self.installed:
- 			# Ignore EAPI.incompatible and conditionals missing
- 			# from IUSE for installed packages since these issues
- 			# aren't relevant now (re-evaluate when new EAPIs are
- 			# deployed).
- 			dep_eapi = None
- 			dep_valid_flag = None
- 
- 		validated_atoms = []
- 		for k in self._dep_keys:
- 			v = self._metadata.get(k)
- 			if not v:
- 				continue
- 			try:
- 				atoms = use_reduce(v, eapi=dep_eapi,
- 					matchall=True, is_valid_flag=dep_valid_flag,
- 					token_class=Atom, flat=True)
- 			except InvalidDependString as e:
- 				self._metadata_exception(k, e)
- 			else:
- 				validated_atoms.extend(atoms)
- 				if not self.built:
- 					for atom in atoms:
- 						if not isinstance(atom, Atom):
- 							continue
- 						if atom.slot_operator_built:
- 							e = InvalidDependString(
- 								_("Improper context for slot-operator "
- 								"\"built\" atom syntax: %s") %
- 								(atom.unevaluated_atom,))
- 							self._metadata_exception(k, e)
- 
- 		if self.root_config.settings.local_config and \
+         usealiases = self.root_config.settings._use_manager.getUseAliases(self)
+         self.iuse = self._iuse(
+             self, self._metadata["IUSE"].split(), implicit_match, usealiases, self.eapi
+         )
+ 
+         if (self.iuse.enabled or self.iuse.disabled) and not eapi_attrs.iuse_defaults:
+             if not self.installed:
+                 self._invalid_metadata(
+                     "EAPI.incompatible",
+                     "IUSE contains defaults, but EAPI doesn't allow them",
+                 )
+         if self.inherited is None:
+             self.inherited = frozenset()
+ 
+         if self.operation is None:
+             if self.onlydeps or self.installed:
+                 self.operation = "nomerge"
+             else:
+                 self.operation = "merge"
+ 
+         self._hash_key = Package._gen_hash_key(
+             cpv=self.cpv,
+             installed=self.installed,
+             onlydeps=self.onlydeps,
+             operation=self.operation,
+             repo_name=self.cpv.repo,
+             root_config=self.root_config,
+             type_name=self.type_name,
+         )
+         self._hash_value = hash(self._hash_key)
+ 
+     @property
+     def eapi(self):
+         return self._metadata["EAPI"]
+ 
+     @property
+     def build_id(self):
+         return self.cpv.build_id
+ 
+     @property
+     def build_time(self):
+         if not self.built:
+             raise AttributeError("build_time")
+         return self.cpv.build_time
+ 
+     @property
+     def defined_phases(self):
+         return self._metadata.defined_phases
+ 
+     @property
+     def properties(self):
+         return self._metadata.properties
+ 
+     @property
+     def provided_cps(self):
+         return (self.cp,)
+ 
+     @property
+     def restrict(self):
+         return self._metadata.restrict
+ 
+     @property
+     def metadata(self):
+         warnings.warn(
+             "_emerge.Package.Package.metadata is deprecated",
+             DeprecationWarning,
+             stacklevel=3,
+         )
+         return self._metadata
+ 
+     # These are calculated on-demand, so that they are calculated
+     # after FakeVartree applies its metadata tweaks.
+     @property
+     def invalid(self):
+         if self._invalid is None:
+             self._validate_deps()
+             if self._invalid is None:
+                 self._invalid = False
+         return self._invalid
+ 
+     @property
+     def masks(self):
+         if self._masks is None:
+             self._masks = self._eval_masks()
+         return self._masks
+ 
+     @property
+     def visible(self):
+         if self._visible is None:
+             self._visible = self._eval_visiblity(self.masks)
+         return self._visible
+ 
+     @property
+     def validated_atoms(self):
+         """
+         Returns *all* validated atoms from the deps, regardless
+         of USE conditionals, with USE conditionals inside
+         atoms left unevaluated.
+         """
+         if self._validated_atoms is None:
+             self._validate_deps()
+         return self._validated_atoms
+ 
+     @property
+     def stable(self):
+         return self.cpv.stable
+ 
+     @property
+     def provides(self):
+         self.invalid
+         return self._provides
+ 
+     @property
+     def requires(self):
+         self.invalid
+         return self._requires
+ 
+     @classmethod
+     def _gen_hash_key(
+         cls,
+         cpv=None,
+         installed=None,
+         onlydeps=None,
+         operation=None,
+         repo_name=None,
+         root_config=None,
+         type_name=None,
+         **kwargs
+     ):
+ 
+         if operation is None:
+             if installed or onlydeps:
+                 operation = "nomerge"
+             else:
+                 operation = "merge"
+ 
+         root = None
+         if root_config is not None:
+             root = root_config.root
+         else:
+             raise TypeError("root_config argument is required")
+ 
+         elements = [type_name, root, str(cpv), operation]
+ 
+         # For installed (and binary) packages we don't care for the repo
+         # when it comes to hashing, because there can only be one cpv.
+         # So overwrite the repo_key with type_name.
+         if type_name is None:
+             raise TypeError("type_name argument is required")
+         elif type_name == "ebuild":
+             if repo_name is None:
+                 raise AssertionError(
+                     "Package._gen_hash_key() " + "called without 'repo_name' argument"
+                 )
+             elements.append(repo_name)
+         elif type_name == "binary":
+             # Including a variety of fingerprints in the hash makes
+             # it possible to simultaneously consider multiple similar
+             # packages. Note that digests are not included here, since
+             # they are relatively expensive to compute, and they may
+             # not necessarily be available.
+             elements.extend([cpv.build_id, cpv.file_size, cpv.build_time, cpv.mtime])
+         else:
+             # For installed (and binary) packages we don't care for the repo
+             # when it comes to hashing, because there can only be one cpv.
+             # So overwrite the repo_key with type_name.
+             elements.append(type_name)
+ 
+         return tuple(elements)
+ 
+     def _validate_deps(self):
+         """
+         Validate deps. This does not trigger USE calculation since that
+         is expensive for ebuilds and therefore we want to avoid doing
+         it unnecessarily (like for masked packages).
+         """
+         eapi = self.eapi
+         dep_eapi = eapi
+         dep_valid_flag = self.iuse.is_valid_flag
+         if self.installed:
+             # Ignore EAPI.incompatible and conditionals missing
+             # from IUSE for installed packages since these issues
+             # aren't relevant now (re-evaluate when new EAPIs are
+             # deployed).
+             dep_eapi = None
+             dep_valid_flag = None
+ 
+         validated_atoms = []
+         for k in self._dep_keys:
+             v = self._metadata.get(k)
+             if not v:
+                 continue
+             try:
+                 atoms = use_reduce(
+                     v,
+                     eapi=dep_eapi,
+                     matchall=True,
+                     is_valid_flag=dep_valid_flag,
+                     token_class=Atom,
+                     flat=True,
+                 )
+             except InvalidDependString as e:
+                 self._metadata_exception(k, e)
+             else:
+                 validated_atoms.extend(atoms)
+                 if not self.built:
+                     for atom in atoms:
+                         if not isinstance(atom, Atom):
+                             continue
+                         if atom.slot_operator_built:
+                             e = InvalidDependString(
+                                 _(
+                                     "Improper context for slot-operator "
+                                     '"built" atom syntax: %s'
+                                 )
+                                 % (atom.unevaluated_atom,)
+                             )
+                             self._metadata_exception(k, e)
+ 
 -        self._validated_atoms = tuple(
 +			'force-multilib' in self.root_config.settings.features:
 +			mysettings = self.root_config.settings
 +			no_auto_flag = frozenset(mysettings.get("NO_AUTO_FLAG", "").split())
 +			for i, x in enumerate(validated_atoms):
 +				if not isinstance(x, Atom):
 +					continue
 +				if x.cp in no_auto_flag:
 +					continue
 +				multilib_flags = []
 +				for multilib_abis in mysettings.get("MULTILIB_ABIS", '').split():
 +					multilib_flag = 'multilib_abi_' + multilib_abis
 +					if x.unevaluated_atom.use is None or \
 +						x.unevaluated_atom.use.conditional is None or \
 +						multilib_flag not in x.unevaluated_atom.use.conditional.enabled:
 +						multilib_flags.append(multilib_flag + '?')
 +				if multilib_flags:
 +					if x.unevaluated_atom.use is None:
 +						use_tokens = []
 +					else:
 +						use_tokens = list(x.unevaluated_atom.use.tokens)
 +					use_tokens.extend(multilib_flags)
 +					validated_atoms[i] = Atom(
 +						x.unevaluated_atom.without_use + \
 +						"[%s]" % (",".join(use_tokens)))
 +
- 		self._validated_atoms = tuple(set(atom for atom in
- 			validated_atoms if isinstance(atom, Atom)))
- 
- 		for k in self._use_conditional_misc_keys:
- 			v = self._metadata.get(k)
- 			if not v:
- 				continue
- 			try:
- 				use_reduce(v, eapi=dep_eapi, matchall=True,
- 					is_valid_flag=dep_valid_flag)
- 			except InvalidDependString as e:
- 				self._metadata_exception(k, e)
- 
- 		k = 'REQUIRED_USE'
- 		v = self._metadata.get(k)
- 		if v and not self.built:
- 			if not _get_eapi_attrs(eapi).required_use:
- 				self._invalid_metadata('EAPI.incompatible',
- 					"REQUIRED_USE set, but EAPI='%s' doesn't allow it" % eapi)
- 			else:
- 				try:
- 					check_required_use(v, (),
- 						self.iuse.is_valid_flag, eapi=eapi)
- 				except InvalidDependString as e:
- 					self._invalid_metadata(k + ".syntax", "%s: %s" % (k, e))
- 
- 		k = 'SRC_URI'
- 		v = self._metadata.get(k)
- 		if v:
- 			try:
- 				use_reduce(v, is_src_uri=True, eapi=eapi, matchall=True,
- 					is_valid_flag=self.iuse.is_valid_flag)
- 			except InvalidDependString as e:
- 				if not self.installed:
- 					self._metadata_exception(k, e)
- 
- 		if self.built:
- 			k = 'PROVIDES'
- 			try:
- 				self._provides = frozenset(
- 					parse_soname_deps(self._metadata[k]))
- 			except InvalidData as e:
- 				self._invalid_metadata(k + ".syntax", "%s: %s" % (k, e))
- 
- 			k = 'REQUIRES'
- 			try:
- 				self._requires = frozenset(
- 					parse_soname_deps(self._metadata[k]))
- 			except InvalidData as e:
- 				self._invalid_metadata(k + ".syntax", "%s: %s" % (k, e))
- 
- 	def copy(self):
- 		return Package(built=self.built, cpv=self.cpv, depth=self.depth,
- 			installed=self.installed, metadata=self._raw_metadata,
- 			onlydeps=self.onlydeps, operation=self.operation,
- 			root_config=self.root_config, type_name=self.type_name)
- 
- 	def _eval_masks(self):
- 		masks = {}
- 		settings = self.root_config.settings
- 
- 		if self.invalid is not False:
- 			masks['invalid'] = self.invalid
- 
- 		if not settings._accept_chost(self.cpv, self._metadata):
- 			masks['CHOST'] = self._metadata['CHOST']
- 
- 		eapi = self.eapi
- 		if not portage.eapi_is_supported(eapi):
- 			masks['EAPI.unsupported'] = eapi
- 		if portage._eapi_is_deprecated(eapi):
- 			masks['EAPI.deprecated'] = eapi
- 
- 		missing_keywords = settings._getMissingKeywords(
- 			self.cpv, self._metadata)
- 		if missing_keywords:
- 			masks['KEYWORDS'] = missing_keywords
- 
- 		try:
- 			missing_properties = settings._getMissingProperties(
- 				self.cpv, self._metadata)
- 			if missing_properties:
- 				masks['PROPERTIES'] = missing_properties
- 		except InvalidDependString:
- 			# already recorded as 'invalid'
- 			pass
- 
- 		try:
- 			missing_restricts = settings._getMissingRestrict(
- 				self.cpv, self._metadata)
- 			if missing_restricts:
- 				masks['RESTRICT'] = missing_restricts
- 		except InvalidDependString:
- 			# already recorded as 'invalid'
- 			pass
- 
- 		mask_atom = settings._getMaskAtom(self.cpv, self._metadata)
- 		if mask_atom is not None:
- 			masks['package.mask'] = mask_atom
- 
- 		try:
- 			missing_licenses = settings._getMissingLicenses(
- 				self.cpv, self._metadata)
- 			if missing_licenses:
- 				masks['LICENSE'] = missing_licenses
- 		except InvalidDependString:
- 			# already recorded as 'invalid'
- 			pass
- 
- 		if not masks:
- 			masks = False
- 
- 		return masks
- 
- 	def _eval_visiblity(self, masks):
- 
- 		if masks is not False:
- 
- 			if 'EAPI.unsupported' in masks:
- 				return False
- 
- 			if 'invalid' in masks:
- 				return False
- 
- 			if not self.installed and ( \
- 				'CHOST' in masks or \
- 				'EAPI.deprecated' in masks or \
- 				'KEYWORDS' in masks or \
- 				'PROPERTIES' in masks or \
- 				'RESTRICT' in masks):
- 				return False
- 
- 			if 'package.mask' in masks or \
- 				'LICENSE' in masks:
- 				return False
- 
- 		return True
- 
- 	def get_keyword_mask(self):
- 		"""returns None, 'missing', or 'unstable'."""
- 
- 		missing = self.root_config.settings._getRawMissingKeywords(
- 				self.cpv, self._metadata)
- 
- 		if not missing:
- 			return None
- 
- 		if '**' in missing:
- 			return 'missing'
- 
- 		global_accept_keywords = frozenset(
- 			self.root_config.settings.get("ACCEPT_KEYWORDS", "").split())
- 
- 		for keyword in missing:
- 			if keyword.lstrip("~") in global_accept_keywords:
- 				return 'unstable'
- 
- 		return 'missing'
- 
- 	def isHardMasked(self):
- 		"""returns a bool if the cpv is in the list of
- 		expanded pmaskdict[cp] available ebuilds"""
- 		pmask = self.root_config.settings._getRawMaskAtom(
- 			self.cpv, self._metadata)
- 		return pmask is not None
- 
- 	def _metadata_exception(self, k, e):
- 
- 		if k.endswith('DEPEND'):
- 			qacat = 'dependency.syntax'
- 		else:
- 			qacat = k + ".syntax"
- 
- 		if not self.installed:
- 			categorized_error = False
- 			if e.errors:
- 				for error in e.errors:
- 					if getattr(error, 'category', None) is None:
- 						continue
- 					categorized_error = True
- 					self._invalid_metadata(error.category,
- 						"%s: %s" % (k, error))
- 
- 			if not categorized_error:
- 				self._invalid_metadata(qacat,"%s: %s" % (k, e))
- 		else:
- 			# For installed packages, show the path of the file
- 			# containing the invalid metadata, since the user may
- 			# want to fix the deps by hand.
- 			vardb = self.root_config.trees['vartree'].dbapi
- 			path = vardb.getpath(self.cpv, filename=k)
- 			self._invalid_metadata(qacat, "%s: %s in '%s'" % (k, e, path))
- 
- 	def _invalid_metadata(self, msg_type, msg):
- 		if self._invalid is None:
- 			self._invalid = {}
- 		msgs = self._invalid.get(msg_type)
- 		if msgs is None:
- 			msgs = []
- 			self._invalid[msg_type] = msgs
- 		msgs.append(msg)
- 
- 	def __str__(self):
- 		if self.operation == "merge":
- 			if self.type_name == "binary":
- 				cpv_color = "PKG_BINARY_MERGE"
- 			else:
- 				cpv_color = "PKG_MERGE"
- 		elif self.operation == "uninstall":
- 			cpv_color = "PKG_UNINSTALL"
- 		else:
- 			cpv_color = "PKG_NOMERGE"
- 
- 		build_id_str = ""
- 		if isinstance(self.cpv.build_id, int) and self.cpv.build_id > 0:
- 			build_id_str = "-%s" % self.cpv.build_id
- 
- 		s = "(%s, %s" \
- 			% (portage.output.colorize(cpv_color, self.cpv +
- 			build_id_str + _slot_separator + self.slot + "/" +
- 			self.sub_slot + _repo_separator + self.repo),
- 			self.type_name)
- 
- 		if self.type_name == "installed":
- 			if self.root_config.settings['ROOT'] != "/":
- 				s += " in '%s'" % self.root_config.settings['ROOT']
- 			if self.operation == "uninstall":
- 				s += " scheduled for uninstall"
- 		else:
- 			if self.operation == "merge":
- 				s += " scheduled for merge"
- 				if self.root_config.settings['ROOT'] != "/":
- 					s += " to '%s'" % self.root_config.settings['ROOT']
- 		s += ")"
- 		return s
- 
- 	class _use_class:
- 
- 		__slots__ = ("enabled", "_expand", "_expand_hidden",
- 			"_force", "_pkg", "_mask")
- 
- 		# Share identical frozenset instances when available.
- 		_frozensets = {}
- 
- 		def __init__(self, pkg, enabled_flags):
- 			self._pkg = pkg
- 			self._expand = None
- 			self._expand_hidden = None
- 			self._force = None
- 			self._mask = None
- 			if eapi_has_use_aliases(pkg.eapi):
- 				for enabled_flag in enabled_flags:
- 					enabled_flags.extend(pkg.iuse.alias_mapping.get(enabled_flag, []))
- 			self.enabled = frozenset(enabled_flags)
- 			if pkg.built:
- 				# Use IUSE to validate USE settings for built packages,
- 				# in case the package manager that built this package
- 				# failed to do that for some reason (or in case of
- 				# data corruption).
- 				missing_iuse = pkg.iuse.get_missing_iuse(self.enabled)
- 				if missing_iuse:
- 					self.enabled = self.enabled.difference(missing_iuse)
- 
- 		def _init_force_mask(self):
- 			pkgsettings = self._pkg._get_pkgsettings()
- 			frozensets = self._frozensets
- 			s = frozenset(
- 				pkgsettings.get("USE_EXPAND", "").lower().split())
- 			self._expand = frozensets.setdefault(s, s)
- 			s = frozenset(
- 				pkgsettings.get("USE_EXPAND_HIDDEN", "").lower().split())
- 			self._expand_hidden = frozensets.setdefault(s, s)
- 			s = pkgsettings.useforce
- 			self._force = frozensets.setdefault(s, s)
- 			s = pkgsettings.usemask
- 			self._mask = frozensets.setdefault(s, s)
- 
- 		@property
- 		def expand(self):
- 			if self._expand is None:
- 				self._init_force_mask()
- 			return self._expand
- 
- 		@property
- 		def expand_hidden(self):
- 			if self._expand_hidden is None:
- 				self._init_force_mask()
- 			return self._expand_hidden
- 
- 		@property
- 		def force(self):
- 			if self._force is None:
- 				self._init_force_mask()
- 			return self._force
- 
- 		@property
- 		def mask(self):
- 			if self._mask is None:
- 				self._init_force_mask()
- 			return self._mask
- 
- 	@property
- 	def repo(self):
- 		return self._metadata['repository']
- 
- 	@property
- 	def repo_priority(self):
- 		repo_info = self.root_config.settings.repositories.prepos.get(self.repo)
- 		if repo_info is None:
- 			return None
- 		return repo_info.priority
- 
- 	@property
- 	def use(self):
- 		if self._use is None:
- 			self._init_use()
- 		return self._use
- 
- 	def _get_pkgsettings(self):
- 		pkgsettings = self.root_config.trees[
- 			'porttree'].dbapi.doebuild_settings
- 		pkgsettings.setcpv(self)
- 		return pkgsettings
- 
- 	def _init_use(self):
- 		if self.built:
- 			# Use IUSE to validate USE settings for built packages,
- 			# in case the package manager that built this package
- 			# failed to do that for some reason (or in case of
- 			# data corruption). The enabled flags must be consistent
- 			# with implicit IUSE, in order to avoid potential
- 			# inconsistencies in USE dep matching (see bug #453400).
- 			use_str = self._metadata['USE']
- 			is_valid_flag = self.iuse.is_valid_flag
- 			enabled_flags = [x for x in use_str.split() if is_valid_flag(x)]
- 			use_str = " ".join(enabled_flags)
- 			self._use = self._use_class(
- 				self, enabled_flags)
- 		else:
- 			try:
- 				use_str = _PackageMetadataWrapperBase.__getitem__(
- 					self._metadata, 'USE')
- 			except KeyError:
- 				use_str = None
- 			calculated_use = False
- 			if not use_str:
- 				use_str = self._get_pkgsettings()["PORTAGE_USE"]
- 				calculated_use = True
- 			self._use = self._use_class(
- 				self, use_str.split())
- 			# Initialize these now, since USE access has just triggered
- 			# setcpv, and we want to cache the result of the force/mask
- 			# calculations that were done.
- 			if calculated_use:
- 				self._use._init_force_mask()
- 
- 		_PackageMetadataWrapperBase.__setitem__(
- 			self._metadata, 'USE', use_str)
- 
- 		return use_str
- 
- 	class _iuse:
- 
- 		__slots__ = ("__weakref__", "_iuse_implicit_match", "_pkg", "alias_mapping",
- 			"all", "all_aliases", "enabled", "disabled", "tokens")
- 
- 		def __init__(self, pkg, tokens, iuse_implicit_match, aliases, eapi):
- 			self._pkg = pkg
- 			self.tokens = tuple(tokens)
- 			self._iuse_implicit_match = iuse_implicit_match
- 			enabled = []
- 			disabled = []
- 			other = []
- 			enabled_aliases = []
- 			disabled_aliases = []
- 			other_aliases = []
- 			aliases_supported = eapi_has_use_aliases(eapi)
- 			self.alias_mapping = {}
- 			for x in tokens:
- 				prefix = x[:1]
- 				if prefix == "+":
- 					enabled.append(x[1:])
- 					if aliases_supported:
- 						self.alias_mapping[x[1:]] = aliases.get(x[1:], [])
- 						enabled_aliases.extend(self.alias_mapping[x[1:]])
- 				elif prefix == "-":
- 					disabled.append(x[1:])
- 					if aliases_supported:
- 						self.alias_mapping[x[1:]] = aliases.get(x[1:], [])
- 						disabled_aliases.extend(self.alias_mapping[x[1:]])
- 				else:
- 					other.append(x)
- 					if aliases_supported:
- 						self.alias_mapping[x] = aliases.get(x, [])
- 						other_aliases.extend(self.alias_mapping[x])
- 			self.enabled = frozenset(chain(enabled, enabled_aliases))
- 			self.disabled = frozenset(chain(disabled, disabled_aliases))
- 			self.all = frozenset(chain(enabled, disabled, other))
- 			self.all_aliases = frozenset(chain(enabled_aliases, disabled_aliases, other_aliases))
- 
- 		def is_valid_flag(self, flags):
- 			"""
- 			@return: True if all flags are valid USE values which may
- 				be specified in USE dependencies, False otherwise.
- 			"""
- 			if isinstance(flags, str):
- 				flags = [flags]
- 
- 			for flag in flags:
- 				if not flag in self.all and not flag in self.all_aliases and \
- 					not self._iuse_implicit_match(flag):
- 					return False
- 			return True
- 
- 		def get_missing_iuse(self, flags):
- 			"""
- 			@return: A list of flags missing from IUSE.
- 			"""
- 			if isinstance(flags, str):
- 				flags = [flags]
- 			missing_iuse = []
- 			for flag in flags:
- 				if not flag in self.all and not flag in self.all_aliases and \
- 					not self._iuse_implicit_match(flag):
- 					missing_iuse.append(flag)
- 			return missing_iuse
- 
- 		def get_real_flag(self, flag):
- 			"""
- 			Returns the flag's name within the scope of this package
- 			(accounting for aliases), or None if the flag is unknown.
- 			"""
- 			if flag in self.all:
- 				return flag
- 
- 			if flag in self.all_aliases:
- 				for k, v in self.alias_mapping.items():
- 					if flag in v:
- 						return k
- 
- 			if self._iuse_implicit_match(flag):
- 				return flag
- 
- 			return None
- 
- 	def __len__(self):
- 		return 4
- 
- 	def __iter__(self):
- 		"""
- 		This is used to generate mtimedb resume mergelist entries, so we
- 		limit it to 4 items for backward compatibility.
- 		"""
- 		return iter(self._hash_key[:4])
- 
- 	def __lt__(self, other):
- 		if other.cp != self.cp:
- 			return self.cp < other.cp
- 		result = portage.vercmp(self.version, other.version)
- 		if result < 0:
- 			return True
- 		if result == 0 and self.built and other.built:
- 			return self.build_time < other.build_time
- 		return False
- 
- 	def __le__(self, other):
- 		if other.cp != self.cp:
- 			return self.cp <= other.cp
- 		result = portage.vercmp(self.version, other.version)
- 		if result <= 0:
- 			return True
- 		if result == 0 and self.built and other.built:
- 			return self.build_time <= other.build_time
- 		return False
- 
- 	def __gt__(self, other):
- 		if other.cp != self.cp:
- 			return self.cp > other.cp
- 		result = portage.vercmp(self.version, other.version)
- 		if result > 0:
- 			return True
- 		if result == 0 and self.built and other.built:
- 			return self.build_time > other.build_time
- 		return False
- 
- 	def __ge__(self, other):
- 		if other.cp != self.cp:
- 			return self.cp >= other.cp
- 		result = portage.vercmp(self.version, other.version)
- 		if result >= 0:
- 			return True
- 		if result == 0 and self.built and other.built:
- 			return self.build_time >= other.build_time
- 		return False
- 
- 	def with_use(self, use):
- 		"""
- 		Return an Package instance with the specified USE flags. The
- 		current instance may be returned if it has identical USE flags.
- 		@param use: a set of USE flags
- 		@type use: frozenset
- 		@return: A package with the specified USE flags
- 		@rtype: Package
- 		"""
- 		if use is not self.use.enabled:
- 			pkg = self.copy()
- 			pkg._metadata["USE"] = " ".join(use)
- 		else:
- 			pkg = self
- 		return pkg
- 
- _all_metadata_keys = set(x for x in portage.auxdbkeys \
- 	if not x.startswith("UNUSED_"))
++self._validated_atoms = tuple(
+             set(atom for atom in validated_atoms if isinstance(atom, Atom))
+         )
+ 
+         for k in self._use_conditional_misc_keys:
+             v = self._metadata.get(k)
+             if not v:
+                 continue
+             try:
+                 use_reduce(
+                     v, eapi=dep_eapi, matchall=True, is_valid_flag=dep_valid_flag
+                 )
+             except InvalidDependString as e:
+                 self._metadata_exception(k, e)
+ 
+         k = "REQUIRED_USE"
+         v = self._metadata.get(k)
+         if v and not self.built:
+             if not _get_eapi_attrs(eapi).required_use:
+                 self._invalid_metadata(
+                     "EAPI.incompatible",
+                     "REQUIRED_USE set, but EAPI='%s' doesn't allow it" % eapi,
+                 )
+             else:
+                 try:
+                     check_required_use(v, (), self.iuse.is_valid_flag, eapi=eapi)
+                 except InvalidDependString as e:
+                     self._invalid_metadata(k + ".syntax", "%s: %s" % (k, e))
+ 
+         k = "SRC_URI"
+         v = self._metadata.get(k)
+         if v:
+             try:
+                 use_reduce(
+                     v,
+                     is_src_uri=True,
+                     eapi=eapi,
+                     matchall=True,
+                     is_valid_flag=self.iuse.is_valid_flag,
+                 )
+             except InvalidDependString as e:
+                 if not self.installed:
+                     self._metadata_exception(k, e)
+ 
+         if self.built:
+             k = "PROVIDES"
+             try:
+                 self._provides = frozenset(parse_soname_deps(self._metadata[k]))
+             except InvalidData as e:
+                 self._invalid_metadata(k + ".syntax", "%s: %s" % (k, e))
+ 
+             k = "REQUIRES"
+             try:
+                 self._requires = frozenset(parse_soname_deps(self._metadata[k]))
+             except InvalidData as e:
+                 self._invalid_metadata(k + ".syntax", "%s: %s" % (k, e))
+ 
+     def copy(self):
+         return Package(
+             built=self.built,
+             cpv=self.cpv,
+             depth=self.depth,
+             installed=self.installed,
+             metadata=self._raw_metadata,
+             onlydeps=self.onlydeps,
+             operation=self.operation,
+             root_config=self.root_config,
+             type_name=self.type_name,
+         )
+ 
+     def _eval_masks(self):
+         masks = {}
+         settings = self.root_config.settings
+ 
+         if self.invalid is not False:
+             masks["invalid"] = self.invalid
+ 
+         if not settings._accept_chost(self.cpv, self._metadata):
+             masks["CHOST"] = self._metadata["CHOST"]
+ 
+         eapi = self.eapi
+         if not portage.eapi_is_supported(eapi):
+             masks["EAPI.unsupported"] = eapi
+         if portage._eapi_is_deprecated(eapi):
+             masks["EAPI.deprecated"] = eapi
+ 
+         missing_keywords = settings._getMissingKeywords(self.cpv, self._metadata)
+         if missing_keywords:
+             masks["KEYWORDS"] = missing_keywords
+ 
+         try:
+             missing_properties = settings._getMissingProperties(
+                 self.cpv, self._metadata
+             )
+             if missing_properties:
+                 masks["PROPERTIES"] = missing_properties
+         except InvalidDependString:
+             # already recorded as 'invalid'
+             pass
+ 
+         try:
+             missing_restricts = settings._getMissingRestrict(self.cpv, self._metadata)
+             if missing_restricts:
+                 masks["RESTRICT"] = missing_restricts
+         except InvalidDependString:
+             # already recorded as 'invalid'
+             pass
+ 
+         mask_atom = settings._getMaskAtom(self.cpv, self._metadata)
+         if mask_atom is not None:
+             masks["package.mask"] = mask_atom
+ 
+         try:
+             missing_licenses = settings._getMissingLicenses(self.cpv, self._metadata)
+             if missing_licenses:
+                 masks["LICENSE"] = missing_licenses
+         except InvalidDependString:
+             # already recorded as 'invalid'
+             pass
+ 
+         if not masks:
+             masks = False
+ 
+         return masks
+ 
+     def _eval_visiblity(self, masks):
+ 
+         if masks is not False:
+ 
+             if "EAPI.unsupported" in masks:
+                 return False
+ 
+             if "invalid" in masks:
+                 return False
+ 
+             if not self.installed and (
+                 "CHOST" in masks
+                 or "EAPI.deprecated" in masks
+                 or "KEYWORDS" in masks
+                 or "PROPERTIES" in masks
+                 or "RESTRICT" in masks
+             ):
+                 return False
+ 
+             if "package.mask" in masks or "LICENSE" in masks:
+                 return False
+ 
+         return True
+ 
+     def get_keyword_mask(self):
+         """returns None, 'missing', or 'unstable'."""
+ 
+         missing = self.root_config.settings._getRawMissingKeywords(
+             self.cpv, self._metadata
+         )
+ 
+         if not missing:
+             return None
+ 
+         if "**" in missing:
+             return "missing"
+ 
+         global_accept_keywords = frozenset(
+             self.root_config.settings.get("ACCEPT_KEYWORDS", "").split()
+         )
+ 
+         for keyword in missing:
+             if keyword.lstrip("~") in global_accept_keywords:
+                 return "unstable"
+ 
+         return "missing"
+ 
+     def isHardMasked(self):
+         """returns a bool if the cpv is in the list of
+         expanded pmaskdict[cp] available ebuilds"""
+         pmask = self.root_config.settings._getRawMaskAtom(self.cpv, self._metadata)
+         return pmask is not None
+ 
+     def _metadata_exception(self, k, e):
+ 
+         if k.endswith("DEPEND"):
+             qacat = "dependency.syntax"
+         else:
+             qacat = k + ".syntax"
+ 
+         if not self.installed:
+             categorized_error = False
+             if e.errors:
+                 for error in e.errors:
+                     if getattr(error, "category", None) is None:
+                         continue
+                     categorized_error = True
+                     self._invalid_metadata(error.category, "%s: %s" % (k, error))
+ 
+             if not categorized_error:
+                 self._invalid_metadata(qacat, "%s: %s" % (k, e))
+         else:
+             # For installed packages, show the path of the file
+             # containing the invalid metadata, since the user may
+             # want to fix the deps by hand.
+             vardb = self.root_config.trees["vartree"].dbapi
+             path = vardb.getpath(self.cpv, filename=k)
+             self._invalid_metadata(qacat, "%s: %s in '%s'" % (k, e, path))
+ 
+     def _invalid_metadata(self, msg_type, msg):
+         if self._invalid is None:
+             self._invalid = {}
+         msgs = self._invalid.get(msg_type)
+         if msgs is None:
+             msgs = []
+             self._invalid[msg_type] = msgs
+         msgs.append(msg)
+ 
+     def __str__(self):
+         if self.operation == "merge":
+             if self.type_name == "binary":
+                 cpv_color = "PKG_BINARY_MERGE"
+             else:
+                 cpv_color = "PKG_MERGE"
+         elif self.operation == "uninstall":
+             cpv_color = "PKG_UNINSTALL"
+         else:
+             cpv_color = "PKG_NOMERGE"
+ 
+         build_id_str = ""
+         if isinstance(self.cpv.build_id, int) and self.cpv.build_id > 0:
+             build_id_str = "-%s" % self.cpv.build_id
+ 
+         s = "(%s, %s" % (
+             portage.output.colorize(
+                 cpv_color,
+                 self.cpv
+                 + build_id_str
+                 + _slot_separator
+                 + self.slot
+                 + "/"
+                 + self.sub_slot
+                 + _repo_separator
+                 + self.repo,
+             ),
+             self.type_name,
+         )
+ 
+         if self.type_name == "installed":
+             if self.root_config.settings["ROOT"] != "/":
+                 s += " in '%s'" % self.root_config.settings["ROOT"]
+             if self.operation == "uninstall":
+                 s += " scheduled for uninstall"
+         else:
+             if self.operation == "merge":
+                 s += " scheduled for merge"
+                 if self.root_config.settings["ROOT"] != "/":
+                     s += " to '%s'" % self.root_config.settings["ROOT"]
+         s += ")"
+         return s
+ 
+     class _use_class:
+ 
+         __slots__ = ("enabled", "_expand", "_expand_hidden", "_force", "_pkg", "_mask")
+ 
+         # Share identical frozenset instances when available.
+         _frozensets = {}
+ 
+         def __init__(self, pkg, enabled_flags):
+             self._pkg = pkg
+             self._expand = None
+             self._expand_hidden = None
+             self._force = None
+             self._mask = None
+             if eapi_has_use_aliases(pkg.eapi):
+                 for enabled_flag in enabled_flags:
+                     enabled_flags.extend(pkg.iuse.alias_mapping.get(enabled_flag, []))
+             self.enabled = frozenset(enabled_flags)
+             if pkg.built:
+                 # Use IUSE to validate USE settings for built packages,
+                 # in case the package manager that built this package
+                 # failed to do that for some reason (or in case of
+                 # data corruption).
+                 missing_iuse = pkg.iuse.get_missing_iuse(self.enabled)
+                 if missing_iuse:
+                     self.enabled = self.enabled.difference(missing_iuse)
+ 
+         def _init_force_mask(self):
+             pkgsettings = self._pkg._get_pkgsettings()
+             frozensets = self._frozensets
+             s = frozenset(pkgsettings.get("USE_EXPAND", "").lower().split())
+             self._expand = frozensets.setdefault(s, s)
+             s = frozenset(pkgsettings.get("USE_EXPAND_HIDDEN", "").lower().split())
+             self._expand_hidden = frozensets.setdefault(s, s)
+             s = pkgsettings.useforce
+             self._force = frozensets.setdefault(s, s)
+             s = pkgsettings.usemask
+             self._mask = frozensets.setdefault(s, s)
+ 
+         @property
+         def expand(self):
+             if self._expand is None:
+                 self._init_force_mask()
+             return self._expand
+ 
+         @property
+         def expand_hidden(self):
+             if self._expand_hidden is None:
+                 self._init_force_mask()
+             return self._expand_hidden
+ 
+         @property
+         def force(self):
+             if self._force is None:
+                 self._init_force_mask()
+             return self._force
+ 
+         @property
+         def mask(self):
+             if self._mask is None:
+                 self._init_force_mask()
+             return self._mask
+ 
+     @property
+     def repo(self):
+         return self._metadata["repository"]
+ 
+     @property
+     def repo_priority(self):
+         repo_info = self.root_config.settings.repositories.prepos.get(self.repo)
+         if repo_info is None:
+             return None
+         return repo_info.priority
+ 
+     @property
+     def use(self):
+         if self._use is None:
+             self._init_use()
+         return self._use
+ 
+     def _get_pkgsettings(self):
+         pkgsettings = self.root_config.trees["porttree"].dbapi.doebuild_settings
+         pkgsettings.setcpv(self)
+         return pkgsettings
+ 
+     def _init_use(self):
+         if self.built:
+             # Use IUSE to validate USE settings for built packages,
+             # in case the package manager that built this package
+             # failed to do that for some reason (or in case of
+             # data corruption). The enabled flags must be consistent
+             # with implicit IUSE, in order to avoid potential
+             # inconsistencies in USE dep matching (see bug #453400).
+             use_str = self._metadata["USE"]
+             is_valid_flag = self.iuse.is_valid_flag
+             enabled_flags = [x for x in use_str.split() if is_valid_flag(x)]
+             use_str = " ".join(enabled_flags)
+             self._use = self._use_class(self, enabled_flags)
+         else:
+             try:
+                 use_str = _PackageMetadataWrapperBase.__getitem__(self._metadata, "USE")
+             except KeyError:
+                 use_str = None
+             calculated_use = False
+             if not use_str:
+                 use_str = self._get_pkgsettings()["PORTAGE_USE"]
+                 calculated_use = True
+             self._use = self._use_class(self, use_str.split())
+             # Initialize these now, since USE access has just triggered
+             # setcpv, and we want to cache the result of the force/mask
+             # calculations that were done.
+             if calculated_use:
+                 self._use._init_force_mask()
+ 
+         _PackageMetadataWrapperBase.__setitem__(self._metadata, "USE", use_str)
+ 
+         return use_str
+ 
+     class _iuse:
+ 
+         __slots__ = (
+             "__weakref__",
+             "_iuse_implicit_match",
+             "_pkg",
+             "alias_mapping",
+             "all",
+             "all_aliases",
+             "enabled",
+             "disabled",
+             "tokens",
+         )
+ 
+         def __init__(self, pkg, tokens, iuse_implicit_match, aliases, eapi):
+             self._pkg = pkg
+             self.tokens = tuple(tokens)
+             self._iuse_implicit_match = iuse_implicit_match
+             enabled = []
+             disabled = []
+             other = []
+             enabled_aliases = []
+             disabled_aliases = []
+             other_aliases = []
+             aliases_supported = eapi_has_use_aliases(eapi)
+             self.alias_mapping = {}
+             for x in tokens:
+                 prefix = x[:1]
+                 if prefix == "+":
+                     enabled.append(x[1:])
+                     if aliases_supported:
+                         self.alias_mapping[x[1:]] = aliases.get(x[1:], [])
+                         enabled_aliases.extend(self.alias_mapping[x[1:]])
+                 elif prefix == "-":
+                     disabled.append(x[1:])
+                     if aliases_supported:
+                         self.alias_mapping[x[1:]] = aliases.get(x[1:], [])
+                         disabled_aliases.extend(self.alias_mapping[x[1:]])
+                 else:
+                     other.append(x)
+                     if aliases_supported:
+                         self.alias_mapping[x] = aliases.get(x, [])
+                         other_aliases.extend(self.alias_mapping[x])
+             self.enabled = frozenset(chain(enabled, enabled_aliases))
+             self.disabled = frozenset(chain(disabled, disabled_aliases))
+             self.all = frozenset(chain(enabled, disabled, other))
+             self.all_aliases = frozenset(
+                 chain(enabled_aliases, disabled_aliases, other_aliases)
+             )
+ 
+         def is_valid_flag(self, flags):
+             """
+             @return: True if all flags are valid USE values which may
+                     be specified in USE dependencies, False otherwise.
+             """
+             if isinstance(flags, str):
+                 flags = [flags]
+ 
+             for flag in flags:
+                 if (
+                     not flag in self.all
+                     and not flag in self.all_aliases
+                     and not self._iuse_implicit_match(flag)
+                 ):
+                     return False
+             return True
+ 
+         def get_missing_iuse(self, flags):
+             """
+             @return: A list of flags missing from IUSE.
+             """
+             if isinstance(flags, str):
+                 flags = [flags]
+             missing_iuse = []
+             for flag in flags:
+                 if (
+                     not flag in self.all
+                     and not flag in self.all_aliases
+                     and not self._iuse_implicit_match(flag)
+                 ):
+                     missing_iuse.append(flag)
+             return missing_iuse
+ 
+         def get_real_flag(self, flag):
+             """
+             Returns the flag's name within the scope of this package
+             (accounting for aliases), or None if the flag is unknown.
+             """
+             if flag in self.all:
+                 return flag
+ 
+             if flag in self.all_aliases:
+                 for k, v in self.alias_mapping.items():
+                     if flag in v:
+                         return k
+ 
+             if self._iuse_implicit_match(flag):
+                 return flag
+ 
+             return None
+ 
+     def __len__(self):
+         return 4
+ 
+     def __iter__(self):
+         """
+         This is used to generate mtimedb resume mergelist entries, so we
+         limit it to 4 items for backward compatibility.
+         """
+         return iter(self._hash_key[:4])
+ 
+     def __lt__(self, other):
+         if other.cp != self.cp:
+             return self.cp < other.cp
+         result = portage.vercmp(self.version, other.version)
+         if result < 0:
+             return True
+         if result == 0 and self.built and other.built:
+             return self.build_time < other.build_time
+         return False
+ 
+     def __le__(self, other):
+         if other.cp != self.cp:
+             return self.cp <= other.cp
+         result = portage.vercmp(self.version, other.version)
+         if result <= 0:
+             return True
+         if result == 0 and self.built and other.built:
+             return self.build_time <= other.build_time
+         return False
+ 
+     def __gt__(self, other):
+         if other.cp != self.cp:
+             return self.cp > other.cp
+         result = portage.vercmp(self.version, other.version)
+         if result > 0:
+             return True
+         if result == 0 and self.built and other.built:
+             return self.build_time > other.build_time
+         return False
+ 
+     def __ge__(self, other):
+         if other.cp != self.cp:
+             return self.cp >= other.cp
+         result = portage.vercmp(self.version, other.version)
+         if result >= 0:
+             return True
+         if result == 0 and self.built and other.built:
+             return self.build_time >= other.build_time
+         return False
+ 
+     def with_use(self, use):
+         """
+         Return an Package instance with the specified USE flags. The
+         current instance may be returned if it has identical USE flags.
+         @param use: a set of USE flags
+         @type use: frozenset
+         @return: A package with the specified USE flags
+         @rtype: Package
+         """
+         if use is not self.use.enabled:
+             pkg = self.copy()
+             pkg._metadata["USE"] = " ".join(use)
+         else:
+             pkg = self
+         return pkg
+ 
+ 
+ _all_metadata_keys = set(x for x in portage.auxdbkeys)
  _all_metadata_keys.update(Package.metadata_keys)
  _all_metadata_keys = frozenset(_all_metadata_keys)
  
diff --cc lib/_emerge/actions.py
index 425336441,05a115250..35c9e4b7f
--- a/lib/_emerge/actions.py
+++ b/lib/_emerge/actions.py
@@@ -2393,87 -2747,97 +2747,97 @@@ def adjust_config(myopts, settings)
  
  def display_missing_pkg_set(root_config, set_name):
  
- 	msg = []
- 	msg.append(("emerge: There are no sets to satisfy '%s'. " + \
- 		"The following sets exist:") % \
- 		colorize("INFORM", set_name))
- 	msg.append("")
+     msg = []
+     msg.append(
+         ("emerge: There are no sets to satisfy '%s'. " + "The following sets exist:")
+         % colorize("INFORM", set_name)
+     )
+     msg.append("")
+ 
+     for s in sorted(root_config.sets):
+         msg.append("    %s" % s)
+     msg.append("")
  
- 	for s in sorted(root_config.sets):
- 		msg.append("    %s" % s)
- 	msg.append("")
+     writemsg_level("".join("%s\n" % l for l in msg), level=logging.ERROR, noiselevel=-1)
  
- 	writemsg_level("".join("%s\n" % l for l in msg),
- 		level=logging.ERROR, noiselevel=-1)
  
  def relative_profile_path(portdir, abs_profile):
- 	realpath = os.path.realpath(abs_profile)
- 	basepath   = os.path.realpath(os.path.join(portdir, "profiles"))
- 	if realpath.startswith(basepath):
- 		profilever = realpath[1 + len(basepath):]
- 	else:
- 		profilever = None
- 	return profilever
+     realpath = os.path.realpath(abs_profile)
+     basepath = os.path.realpath(os.path.join(portdir, "profiles"))
+     if realpath.startswith(basepath):
+         profilever = realpath[1 + len(basepath) :]
+     else:
+         profilever = None
+     return profilever
+ 
  
  def getportageversion(portdir, _unused, profile, chost, vardb):
- 	pythonver = 'python %d.%d.%d-%s-%d' % sys.version_info[:]
- 	profilever = None
- 	repositories = vardb.settings.repositories
- 	if profile:
- 		profilever = relative_profile_path(portdir, profile)
- 		if profilever is None:
- 			try:
- 				for parent in portage.grabfile(
- 					os.path.join(profile, 'parent')):
- 					profilever = relative_profile_path(portdir,
- 						os.path.join(profile, parent))
- 					if profilever is not None:
- 						break
- 					colon = parent.find(":")
- 					if colon != -1:
- 						p_repo_name = parent[:colon]
- 						try:
- 							p_repo_loc = \
- 								repositories.get_location_for_name(p_repo_name)
- 						except KeyError:
- 							pass
- 						else:
- 							profilever = relative_profile_path(p_repo_loc,
- 								os.path.join(p_repo_loc, 'profiles',
- 									parent[colon+1:]))
- 							if profilever is not None:
- 								break
- 			except portage.exception.PortageException:
- 				pass
- 
- 			if profilever is None:
- 				try:
- 					profilever = "!" + os.readlink(profile)
- 				except OSError:
- 					pass
- 
- 	if profilever is None:
- 		profilever = "unavailable"
- 
- 	libcver = []
- 	libclist = set()
- 	for atom in expand_new_virt(vardb, portage.const.LIBC_PACKAGE_ATOM):
- 		if not atom.blocker:
- 			libclist.update(vardb.match(atom))
- 	if libclist:
- 		for cpv in sorted(libclist):
- 			libc_split = portage.catpkgsplit(cpv)[1:]
- 			if libc_split[-1] == "r0":
- 				libc_split = libc_split[:-1]
- 			libcver.append("-".join(libc_split))
- 	else:
- 		libcver = ["unavailable"]
- 
- 	gccver = getgccversion(chost)
- 	unameout=platform.release()+" "+platform.machine()
- 
- 	return "Portage %s (%s, %s, %s, %s, %s)" % \
- 		(portage.VERSION + "-multilib", pythonver, profilever, gccver, ",".join(libcver), unameout)
+     pythonver = "python %d.%d.%d-%s-%d" % sys.version_info[:]
+     profilever = None
+     repositories = vardb.settings.repositories
+     if profile:
+         profilever = relative_profile_path(portdir, profile)
+         if profilever is None:
+             try:
+                 for parent in portage.grabfile(os.path.join(profile, "parent")):
+                     profilever = relative_profile_path(
+                         portdir, os.path.join(profile, parent)
+                     )
+                     if profilever is not None:
+                         break
+                     colon = parent.find(":")
+                     if colon != -1:
+                         p_repo_name = parent[:colon]
+                         try:
+                             p_repo_loc = repositories.get_location_for_name(p_repo_name)
+                         except KeyError:
+                             pass
+                         else:
+                             profilever = relative_profile_path(
+                                 p_repo_loc,
+                                 os.path.join(
+                                     p_repo_loc, "profiles", parent[colon + 1 :]
+                                 ),
+                             )
+                             if profilever is not None:
+                                 break
+             except portage.exception.PortageException:
+                 pass
+ 
+             if profilever is None:
+                 try:
+                     profilever = "!" + os.readlink(profile)
+                 except OSError:
+                     pass
+ 
+     if profilever is None:
+         profilever = "unavailable"
+ 
+     libcver = []
+     libclist = set()
+     for atom in expand_new_virt(vardb, portage.const.LIBC_PACKAGE_ATOM):
+         if not atom.blocker:
+             libclist.update(vardb.match(atom))
+     if libclist:
+         for cpv in sorted(libclist):
+             libc_split = portage.catpkgsplit(cpv)[1:]
+             if libc_split[-1] == "r0":
+                 libc_split = libc_split[:-1]
+             libcver.append("-".join(libc_split))
+     else:
+         libcver = ["unavailable"]
+ 
+     gccver = getgccversion(chost)
+     unameout = platform.release() + " " + platform.machine()
+ 
+     return "Portage %s (%s, %s, %s, %s, %s)" % (
 -        portage.VERSION,
++        portage.VERSION + "-multilib",
+         pythonver,
+         profilever,
+         gccver,
+         ",".join(libcver),
+         unameout,
+     )
  
  
  class _emerge_config(SlotObject):
@@@ -2897,508 -3338,628 +3338,635 @@@ def repo_name_duplicate_check(trees)
  
  def run_action(emerge_config):
  
- 	# skip global updates prior to sync, since it's called after sync
- 	if emerge_config.action not in ('help', 'info', 'sync', 'version') and \
- 		emerge_config.opts.get('--package-moves') != 'n' and \
- 		_global_updates(emerge_config.trees,
- 		emerge_config.target_config.mtimedb["updates"],
- 		quiet=("--quiet" in emerge_config.opts)):
- 		emerge_config.target_config.mtimedb.commit()
- 		# Reload the whole config from scratch.
- 		load_emerge_config(emerge_config=emerge_config)
- 
- 	xterm_titles = "notitles" not in \
- 		emerge_config.target_config.settings.features
- 	if xterm_titles:
- 		xtermTitle("emerge")
- 
- 	if "--digest" in emerge_config.opts:
- 		os.environ["FEATURES"] = os.environ.get("FEATURES","") + " digest"
- 		# Reload the whole config from scratch so that the portdbapi internal
- 		# config is updated with new FEATURES.
- 		load_emerge_config(emerge_config=emerge_config)
- 
- 	# NOTE: adjust_configs() can map options to FEATURES, so any relevant
- 	# options adjustments should be made prior to calling adjust_configs().
- 	if "--buildpkgonly" in emerge_config.opts:
- 		emerge_config.opts["--buildpkg"] = True
- 
- 	if "getbinpkg" in emerge_config.target_config.settings.features:
- 		emerge_config.opts["--getbinpkg"] = True
- 
- 	if "--getbinpkgonly" in emerge_config.opts:
- 		emerge_config.opts["--getbinpkg"] = True
- 
- 	if "--getbinpkgonly" in emerge_config.opts:
- 		emerge_config.opts["--usepkgonly"] = True
- 
- 	if "--getbinpkg" in emerge_config.opts:
- 		emerge_config.opts["--usepkg"] = True
- 
- 	if "--usepkgonly" in emerge_config.opts:
- 		emerge_config.opts["--usepkg"] = True
- 
- 	# Populate the bintree with current --getbinpkg setting.
- 	# This needs to happen before:
- 	# * expand_set_arguments, in case any sets use the bintree
- 	# * adjust_configs and profile_check, in order to propagate settings
- 	#   implicit IUSE and USE_EXPAND settings from the binhost(s)
- 	if (emerge_config.action in ('search', None) and
- 		'--usepkg' in emerge_config.opts):
- 		for mytrees in emerge_config.trees.values():
- 			kwargs = {}
- 			if (mytrees is emerge_config.target_config.trees and
- 				emerge_config.target_config is not emerge_config.running_config and
- 				emerge_config.opts.get('--quickpkg-direct', 'n') == 'y'):
- 				kwargs['add_repos'] = (emerge_config.running_config.trees['vartree'].dbapi,)
- 
- 			try:
- 				mytrees['bintree'].populate(
- 					getbinpkgs='--getbinpkg' in emerge_config.opts,
- 					**kwargs)
- 			except ParseError as e:
- 				writemsg('\n\n!!!%s.\nSee make.conf(5) for more info.\n'
- 						 % (e,), noiselevel=-1)
- 				return 1
- 
- 	adjust_configs(emerge_config.opts, emerge_config.trees)
- 
- 	if profile_check(emerge_config.trees, emerge_config.action) != os.EX_OK:
- 		return 1
- 
- 	apply_priorities(emerge_config.target_config.settings)
+     # skip global updates prior to sync, since it's called after sync
+     if (
+         emerge_config.action not in ("help", "info", "sync", "version")
+         and emerge_config.opts.get("--package-moves") != "n"
+         and _global_updates(
+             emerge_config.trees,
+             emerge_config.target_config.mtimedb["updates"],
+             quiet=("--quiet" in emerge_config.opts),
+         )
+     ):
+         emerge_config.target_config.mtimedb.commit()
+         # Reload the whole config from scratch.
+         load_emerge_config(emerge_config=emerge_config)
+ 
+     xterm_titles = "notitles" not in emerge_config.target_config.settings.features
+     if xterm_titles:
+         xtermTitle("emerge")
+ 
+     if "--digest" in emerge_config.opts:
+         os.environ["FEATURES"] = os.environ.get("FEATURES", "") + " digest"
+         # Reload the whole config from scratch so that the portdbapi internal
+         # config is updated with new FEATURES.
+         load_emerge_config(emerge_config=emerge_config)
+ 
+     # NOTE: adjust_configs() can map options to FEATURES, so any relevant
+     # options adjustments should be made prior to calling adjust_configs().
+     if "--buildpkgonly" in emerge_config.opts:
+         emerge_config.opts["--buildpkg"] = True
+ 
+     if "getbinpkg" in emerge_config.target_config.settings.features:
+         emerge_config.opts["--getbinpkg"] = True
+ 
+     if "--getbinpkgonly" in emerge_config.opts:
+         emerge_config.opts["--getbinpkg"] = True
+ 
+     if "--getbinpkgonly" in emerge_config.opts:
+         emerge_config.opts["--usepkgonly"] = True
+ 
+     if "--getbinpkg" in emerge_config.opts:
+         emerge_config.opts["--usepkg"] = True
+ 
+     if "--usepkgonly" in emerge_config.opts:
+         emerge_config.opts["--usepkg"] = True
+ 
+     # Populate the bintree with current --getbinpkg setting.
+     # This needs to happen before:
+     # * expand_set_arguments, in case any sets use the bintree
+     # * adjust_configs and profile_check, in order to propagate settings
+     #   implicit IUSE and USE_EXPAND settings from the binhost(s)
+     if emerge_config.action in ("search", None) and "--usepkg" in emerge_config.opts:
+         for mytrees in emerge_config.trees.values():
+             kwargs = {}
+             if (
+                 mytrees is emerge_config.target_config.trees
+                 and emerge_config.target_config is not emerge_config.running_config
+                 and emerge_config.opts.get("--quickpkg-direct", "n") == "y"
+             ):
+                 kwargs["add_repos"] = (
+                     emerge_config.running_config.trees["vartree"].dbapi,
+                 )
+ 
+             try:
+                 mytrees["bintree"].populate(
+                     getbinpkgs="--getbinpkg" in emerge_config.opts, **kwargs
+                 )
+             except ParseError as e:
+                 writemsg(
+                     "\n\n!!!%s.\nSee make.conf(5) for more info.\n" % (e,),
+                     noiselevel=-1,
+                 )
+                 return 1
+ 
+     adjust_configs(emerge_config.opts, emerge_config.trees)
+ 
+     if profile_check(emerge_config.trees, emerge_config.action) != os.EX_OK:
+         return 1
+ 
+     apply_priorities(emerge_config.target_config.settings)
  
 +	if 'force-multilib' in emerge_config.target_config.settings.features:
 +		if emerge_config.target_config.settings.get("NO_AUTO_FLAG", "") == "":
 +			writemsg_level(bad("!!! Failed to find vars from extra profile") + "\n",level=logging.ERROR, noiselevel=-1)
 +			writemsg_level(bad("!!! Please make sure that you did follow the instructions and included the extra profile\n"),level=logging.ERROR, noiselevel=-1)
 +			writemsg_level(bad("!!! http://git.overlays.gentoo.org/gitweb/?p=proj/multilib-portage.git;a=blob;f=doc/portage-multilib-instructions\n"),level=logging.ERROR, noiselevel=-1)
 +			writemsg_level(bad("!!! has some basic instructions for the setup\n"),level=logging.ERROR, noiselevel=-1)
 +			return 1
- 	if ("--autounmask-continue" in emerge_config.opts and
- 		emerge_config.opts.get("--autounmask") == "n"):
- 		writemsg_level(
- 			" %s --autounmask-continue has been disabled by --autounmask=n\n" %
- 			warn("*"), level=logging.WARNING, noiselevel=-1)
- 
- 	for fmt in emerge_config.target_config.settings.get("PORTAGE_BINPKG_FORMAT", "").split():
- 		if not fmt in portage.const.SUPPORTED_BINPKG_FORMATS:
- 			if "--pkg-format" in emerge_config.opts:
- 				problematic="--pkg-format"
- 			else:
- 				problematic="PORTAGE_BINPKG_FORMAT"
- 
- 			writemsg_level(("emerge: %s is not set correctly. Format " + \
- 				"'%s' is not supported.\n") % (problematic, fmt),
- 				level=logging.ERROR, noiselevel=-1)
- 			return 1
- 
- 	if emerge_config.action == 'version':
- 		writemsg_stdout(getportageversion(
- 			emerge_config.target_config.settings["PORTDIR"],
- 			None,
- 			emerge_config.target_config.settings.profile_path,
- 			emerge_config.target_config.settings.get("CHOST"),
- 			emerge_config.target_config.trees['vartree'].dbapi) + '\n',
- 			noiselevel=-1)
- 		return 0
- 	if emerge_config.action == 'help':
- 		emerge_help()
- 		return 0
- 
- 	spinner = stdout_spinner()
- 	if "candy" in emerge_config.target_config.settings.features:
- 		spinner.update = spinner.update_scroll
- 
- 	if "--quiet" not in emerge_config.opts:
- 		portage.deprecated_profile_check(
- 			settings=emerge_config.target_config.settings)
- 		repo_name_check(emerge_config.trees)
- 		repo_name_duplicate_check(emerge_config.trees)
- 		config_protect_check(emerge_config.trees)
- 	check_procfs()
- 
- 	for mytrees in emerge_config.trees.values():
- 		mydb = mytrees["porttree"].dbapi
- 		# Freeze the portdbapi for performance (memoize all xmatch results).
- 		mydb.freeze()
- 
- 	del mytrees, mydb
- 
- 	for x in emerge_config.args:
- 		if x.endswith((".ebuild", ".tbz2")) and \
- 			os.path.exists(os.path.abspath(x)):
- 			print(colorize("BAD", "\n*** emerging by path is broken "
- 				"and may not always work!!!\n"))
- 			break
- 
- 	if emerge_config.action == "list-sets":
- 		writemsg_stdout("".join("%s\n" % s for s in
- 			sorted(emerge_config.target_config.sets)))
- 		return os.EX_OK
- 	if emerge_config.action == "check-news":
- 		news_counts = count_unread_news(
- 			emerge_config.target_config.trees["porttree"].dbapi,
- 			emerge_config.target_config.trees["vartree"].dbapi)
- 		if any(news_counts.values()):
- 			display_news_notifications(news_counts)
- 		elif "--quiet" not in emerge_config.opts:
- 			print("", colorize("GOOD", "*"), "No news items were found.")
- 		return os.EX_OK
- 
- 	ensure_required_sets(emerge_config.trees)
- 
- 	if emerge_config.action is None and \
- 		"--resume" in emerge_config.opts and emerge_config.args:
- 		writemsg("emerge: unexpected argument(s) for --resume: %s\n" %
- 		   " ".join(emerge_config.args), noiselevel=-1)
- 		return 1
- 
- 	# only expand sets for actions taking package arguments
- 	oldargs = emerge_config.args[:]
- 	if emerge_config.action in ("clean", "config", "depclean",
- 		"info", "prune", "unmerge", "rage-clean", None):
- 		newargs, retval = expand_set_arguments(
- 			emerge_config.args, emerge_config.action,
- 			emerge_config.target_config)
- 		if retval != os.EX_OK:
- 			return retval
- 
- 		# Need to handle empty sets specially, otherwise emerge will react
- 		# with the help message for empty argument lists
- 		if oldargs and not newargs:
- 			print("emerge: no targets left after set expansion")
- 			return 0
- 
- 		emerge_config.args = newargs
- 
- 	if "--tree" in emerge_config.opts and \
- 		"--columns" in emerge_config.opts:
- 		print("emerge: can't specify both of \"--tree\" and \"--columns\".")
- 		return 1
- 
- 	if '--emptytree' in emerge_config.opts and \
- 		'--noreplace' in emerge_config.opts:
- 		writemsg_level("emerge: can't specify both of " + \
- 			"\"--emptytree\" and \"--noreplace\".\n",
- 			level=logging.ERROR, noiselevel=-1)
- 		return 1
- 
- 	if "--quiet" in emerge_config.opts:
- 		spinner.update = spinner.update_quiet
- 		portage.util.noiselimit = -1
- 
- 	if "--fetch-all-uri" in emerge_config.opts:
- 		emerge_config.opts["--fetchonly"] = True
- 
- 	if "--skipfirst" in emerge_config.opts and \
- 		"--resume" not in emerge_config.opts:
- 		emerge_config.opts["--resume"] = True
- 
- 	# Allow -p to remove --ask
- 	if "--pretend" in emerge_config.opts:
- 		emerge_config.opts.pop("--ask", None)
- 
- 	# forbid --ask when not in a terminal
- 	# note: this breaks `emerge --ask | tee logfile`, but that doesn't work anyway.
- 	if ("--ask" in emerge_config.opts) and (not sys.stdin.isatty()):
- 		portage.writemsg("!!! \"--ask\" should only be used in a terminal. Exiting.\n",
- 			noiselevel=-1)
- 		return 1
- 
- 	if emerge_config.target_config.settings.get("PORTAGE_DEBUG", "") == "1":
- 		spinner.update = spinner.update_quiet
- 		portage.util.noiselimit = 0
- 		if "python-trace" in emerge_config.target_config.settings.features:
- 			portage.debug.set_trace(True)
- 
- 	if not "--quiet" in emerge_config.opts:
- 		if '--nospinner' in emerge_config.opts or \
- 			emerge_config.target_config.settings.get('TERM') == 'dumb' or \
- 			not sys.stdout.isatty():
- 			spinner.update = spinner.update_basic
- 
- 	if "--debug" in emerge_config.opts:
- 		print("myaction", emerge_config.action)
- 		print("myopts", emerge_config.opts)
- 
- 	if not emerge_config.action and not emerge_config.args and \
- 		"--resume" not in emerge_config.opts:
- 		emerge_help()
- 		return 1
- 
- 	pretend = "--pretend" in emerge_config.opts
- 	fetchonly = "--fetchonly" in emerge_config.opts or \
- 		"--fetch-all-uri" in emerge_config.opts
- 	buildpkgonly = "--buildpkgonly" in emerge_config.opts
- 
- 	# check if root user is the current user for the actions where emerge needs this
- 	if portage.data.secpass < 2:
- 		# We've already allowed "--version" and "--help" above.
- 		if "--pretend" not in emerge_config.opts and \
- 			emerge_config.action not in ("search", "info"):
- 			need_superuser = emerge_config.action in ('clean', 'depclean',
- 				'deselect', 'prune', 'unmerge', "rage-clean") or not \
- 				(fetchonly or \
- 				(buildpkgonly and portage.data.secpass >= 1) or \
- 				emerge_config.action in ("metadata", "regen", "sync"))
- 			if portage.data.secpass < 1 or \
- 				need_superuser:
- 				if need_superuser:
- 					access_desc = "superuser"
- 				else:
- 					access_desc = "portage group"
- 				# Always show portage_group_warning() when only portage group
- 				# access is required but the user is not in the portage group.
- 				if "--ask" in emerge_config.opts:
- 					writemsg_stdout("This action requires %s access...\n" % \
- 						(access_desc,), noiselevel=-1)
- 					if portage.data.secpass < 1 and not need_superuser:
- 						portage.data.portage_group_warning()
- 					uq = UserQuery(emerge_config.opts)
- 					if uq.query("Would you like to add --pretend to options?",
- 						"--ask-enter-invalid" in emerge_config.opts) == "No":
- 						return 128 + signal.SIGINT
- 					emerge_config.opts["--pretend"] = True
- 					emerge_config.opts.pop("--ask")
- 				else:
- 					sys.stderr.write(("emerge: %s access is required\n") \
- 						% access_desc)
- 					if portage.data.secpass < 1 and not need_superuser:
- 						portage.data.portage_group_warning()
- 					return 1
- 
- 	# Disable emergelog for everything except build or unmerge operations.
- 	# This helps minimize parallel emerge.log entries that can confuse log
- 	# parsers like genlop.
- 	disable_emergelog = False
- 
- 	emerge_log_dir = emerge_config.target_config.settings.get("EMERGE_LOG_DIR")
- 	default_log_dir = os.path.join(
- 		os.sep, portage.const.EPREFIX.lstrip(os.sep), "var", "log"
- 	)
- 	for x in ("--pretend", "--fetchonly", "--fetch-all-uri"):
- 		if x in emerge_config.opts:
- 			if x == "--fetchonly" and "--quiet" in emerge_config.opts:
- 				# Log will be used to store fetch progress
- 				log_dir = emerge_log_dir if emerge_log_dir else default_log_dir
- 				disable_emergelog = not all(
- 					os.access(logfile, os.W_OK)
- 					for logfile in set(
- 						first_existing(os.path.join(log_dir, logfile))
- 						for logfile in ("emerge.log", "emerge-fetch.log")
- 					)
- 				)
- 				break
- 			else:
- 				disable_emergelog = True
- 				break
- 	if disable_emergelog:
- 		pass
- 	elif emerge_config.action in ("search", "info"):
- 		disable_emergelog = True
- 	elif portage.data.secpass < 1:
- 		disable_emergelog = True
- 
- 	import _emerge.emergelog
- 	_emerge.emergelog._disable = disable_emergelog
- 
- 	if not disable_emergelog:
- 		if emerge_log_dir:
- 			try:
- 				# At least the parent needs to exist for the lock file.
- 				portage.util.ensure_dirs(emerge_log_dir)
- 			except portage.exception.PortageException as e:
- 				writemsg_level("!!! Error creating directory for " + \
- 					"EMERGE_LOG_DIR='%s':\n!!! %s\n" % \
- 					(emerge_log_dir, e),
- 					noiselevel=-1, level=logging.ERROR)
- 				portage.util.ensure_dirs(_emerge.emergelog._emerge_log_dir)
- 			else:
- 				_emerge.emergelog._emerge_log_dir = emerge_log_dir
- 		else:
- 			_emerge.emergelog._emerge_log_dir = default_log_dir
- 			portage.util.ensure_dirs(_emerge.emergelog._emerge_log_dir)
- 
- 	if not "--pretend" in emerge_config.opts:
- 		time_fmt = "%b %d, %Y %H:%M:%S"
- 		time_str = time.strftime(time_fmt, time.localtime(time.time()))
- 		# Avoid potential UnicodeDecodeError in Python 2, since strftime
- 		# returns bytes in Python 2, and %b may contain non-ascii chars.
- 		time_str = _unicode_decode(time_str,
- 			encoding=_encodings['content'], errors='replace')
- 		emergelog(xterm_titles, "Started emerge on: %s" % time_str)
- 		myelogstr=""
- 		if emerge_config.opts:
- 			opt_list = []
- 			for opt, arg in emerge_config.opts.items():
- 				if arg is True:
- 					opt_list.append(opt)
- 				elif isinstance(arg, list):
- 					# arguments like --exclude that use 'append' action
- 					for x in arg:
- 						opt_list.append("%s=%s" % (opt, x))
- 				else:
- 					opt_list.append("%s=%s" % (opt, arg))
- 			myelogstr=" ".join(opt_list)
- 		if emerge_config.action:
- 			myelogstr += " --" + emerge_config.action
- 		if oldargs:
- 			myelogstr += " " + " ".join(oldargs)
- 		emergelog(xterm_titles, " *** emerge " + myelogstr)
- 
- 	oldargs = None
- 
- 	def emergeexitsig(signum, frame):
- 		signal.signal(signal.SIGTERM, signal.SIG_IGN)
- 		portage.util.writemsg(
- 			"\n\nExiting on signal %(signal)s\n" % {"signal":signum})
- 		sys.exit(128 + signum)
- 
- 	signal.signal(signal.SIGTERM, emergeexitsig)
- 
- 	def emergeexit():
- 		"""This gets out final log message in before we quit."""
- 		if "--pretend" not in emerge_config.opts:
- 			emergelog(xterm_titles, " *** terminating.")
- 		if xterm_titles:
- 			xtermTitleReset()
- 	portage.atexit_register(emergeexit)
- 
- 	if emerge_config.action in ("config", "metadata", "regen", "sync"):
- 		if "--pretend" in emerge_config.opts:
- 			sys.stderr.write(("emerge: The '%s' action does " + \
- 				"not support '--pretend'.\n") % emerge_config.action)
- 			return 1
- 
- 	if "sync" == emerge_config.action:
- 		return action_sync(emerge_config)
- 	if "metadata" == emerge_config.action:
- 		action_metadata(emerge_config.target_config.settings,
- 			emerge_config.target_config.trees['porttree'].dbapi,
- 			emerge_config.opts)
- 	elif emerge_config.action=="regen":
- 		validate_ebuild_environment(emerge_config.trees)
- 		return action_regen(emerge_config.target_config.settings,
- 			emerge_config.target_config.trees['porttree'].dbapi,
- 			emerge_config.opts.get("--jobs"),
- 			emerge_config.opts.get("--load-average"))
- 	# HELP action
- 	elif "config" == emerge_config.action:
- 		validate_ebuild_environment(emerge_config.trees)
- 		return action_config(emerge_config.target_config.settings,
- 			emerge_config.trees, emerge_config.opts, emerge_config.args)
- 
- 	# SEARCH action
- 	elif "search" == emerge_config.action:
- 		validate_ebuild_environment(emerge_config.trees)
- 		action_search(emerge_config.target_config,
- 			emerge_config.opts, emerge_config.args, spinner)
- 
- 	elif emerge_config.action in \
- 		('clean', 'depclean', 'deselect', 'prune', 'unmerge', 'rage-clean'):
- 		validate_ebuild_environment(emerge_config.trees)
- 		rval = action_uninstall(emerge_config.target_config.settings,
- 			emerge_config.trees, emerge_config.target_config.mtimedb["ldpath"],
- 			emerge_config.opts, emerge_config.action,
- 			emerge_config.args, spinner)
- 		if not (emerge_config.action == 'deselect' or
- 			buildpkgonly or fetchonly or pretend):
- 			post_emerge(emerge_config.action, emerge_config.opts,
- 				emerge_config.args, emerge_config.target_config.root,
- 				emerge_config.trees, emerge_config.target_config.mtimedb, rval)
- 		return rval
- 
- 	elif emerge_config.action == 'info':
- 
- 		# Ensure atoms are valid before calling unmerge().
- 		vardb = emerge_config.target_config.trees['vartree'].dbapi
- 		portdb = emerge_config.target_config.trees['porttree'].dbapi
- 		bindb = emerge_config.target_config.trees['bintree'].dbapi
- 		valid_atoms = []
- 		for x in emerge_config.args:
- 			if is_valid_package_atom(x, allow_repo=True):
- 				try:
- 					#look at the installed files first, if there is no match
- 					#look at the ebuilds, since EAPI 4 allows running pkg_info
- 					#on non-installed packages
- 					valid_atom = dep_expand(x, mydb=vardb)
- 					if valid_atom.cp.split("/")[0] == "null":
- 						valid_atom = dep_expand(x, mydb=portdb)
- 
- 					if valid_atom.cp.split("/")[0] == "null" and \
- 						"--usepkg" in emerge_config.opts:
- 						valid_atom = dep_expand(x, mydb=bindb)
- 
- 					valid_atoms.append(valid_atom)
- 
- 				except portage.exception.AmbiguousPackageName as e:
- 					msg = "The short ebuild name \"" + x + \
- 						"\" is ambiguous.  Please specify " + \
- 						"one of the following " + \
- 						"fully-qualified ebuild names instead:"
- 					for line in textwrap.wrap(msg, 70):
- 						writemsg_level("!!! %s\n" % (line,),
- 							level=logging.ERROR, noiselevel=-1)
- 					for i in e.args[0]:
- 						writemsg_level("    %s\n" % colorize("INFORM", i),
- 							level=logging.ERROR, noiselevel=-1)
- 					writemsg_level("\n", level=logging.ERROR, noiselevel=-1)
- 					return 1
- 				continue
- 			msg = []
- 			msg.append("'%s' is not a valid package atom." % (x,))
- 			msg.append("Please check ebuild(5) for full details.")
- 			writemsg_level("".join("!!! %s\n" % line for line in msg),
- 				level=logging.ERROR, noiselevel=-1)
- 			return 1
- 
- 		return action_info(emerge_config.target_config.settings,
- 			emerge_config.trees, emerge_config.opts, valid_atoms)
- 
- 	# "update", "system", or just process files:
- 	else:
- 		validate_ebuild_environment(emerge_config.trees)
- 
- 		for x in emerge_config.args:
- 			if x.startswith(SETPREFIX) or \
- 				is_valid_package_atom(x, allow_repo=True):
- 				continue
- 			if x[:1] == os.sep:
- 				continue
- 			try:
- 				os.lstat(x)
- 				continue
- 			except OSError:
- 				pass
- 			msg = []
- 			msg.append("'%s' is not a valid package atom." % (x,))
- 			msg.append("Please check ebuild(5) for full details.")
- 			writemsg_level("".join("!!! %s\n" % line for line in msg),
- 				level=logging.ERROR, noiselevel=-1)
- 			return 1
- 
- 		# GLEP 42 says to display news *after* an emerge --pretend
- 		if "--pretend" not in emerge_config.opts:
- 			uq = UserQuery(emerge_config.opts)
- 			if display_news_notification(emerge_config.target_config,
- 								emerge_config.opts) \
- 				and "--ask" in emerge_config.opts \
- 				and "--read-news" in emerge_config.opts \
- 				and uq.query("Would you like to read the news items while " \
- 						"calculating dependencies?",
- 						'--ask-enter-invalid' in emerge_config.opts) == "Yes":
- 				try:
- 					subprocess.call(['eselect', 'news', 'read'])
- 				# If eselect is not installed, Python <3.3 will throw an
- 				# OSError. >=3.3 will throw a FileNotFoundError, which is a
- 				# subclass of OSError.
- 				except OSError:
- 					writemsg("Please install eselect to use this feature.\n",
- 							noiselevel=-1)
- 		retval = action_build(emerge_config, spinner=spinner)
- 		post_emerge(emerge_config.action, emerge_config.opts,
- 			emerge_config.args, emerge_config.target_config.root,
- 			emerge_config.trees, emerge_config.target_config.mtimedb, retval)
- 
- 		return retval
+     if (
+         "--autounmask-continue" in emerge_config.opts
+         and emerge_config.opts.get("--autounmask") == "n"
+     ):
+         writemsg_level(
+             " %s --autounmask-continue has been disabled by --autounmask=n\n"
+             % warn("*"),
+             level=logging.WARNING,
+             noiselevel=-1,
+         )
+ 
+     for fmt in emerge_config.target_config.settings.get(
+         "PORTAGE_BINPKG_FORMAT", ""
+     ).split():
+         if not fmt in portage.const.SUPPORTED_BINPKG_FORMATS:
+             if "--pkg-format" in emerge_config.opts:
+                 problematic = "--pkg-format"
+             else:
+                 problematic = "PORTAGE_BINPKG_FORMAT"
+ 
+             writemsg_level(
+                 (
+                     "emerge: %s is not set correctly. Format "
+                     + "'%s' is not supported.\n"
+                 )
+                 % (problematic, fmt),
+                 level=logging.ERROR,
+                 noiselevel=-1,
+             )
+             return 1
+ 
+     if emerge_config.action == "version":
+         writemsg_stdout(
+             getportageversion(
+                 emerge_config.target_config.settings["PORTDIR"],
+                 None,
+                 emerge_config.target_config.settings.profile_path,
+                 emerge_config.target_config.settings.get("CHOST"),
+                 emerge_config.target_config.trees["vartree"].dbapi,
+             )
+             + "\n",
+             noiselevel=-1,
+         )
+         return 0
+     if emerge_config.action == "help":
+         emerge_help()
+         return 0
+ 
+     spinner = stdout_spinner()
+     if "candy" in emerge_config.target_config.settings.features:
+         spinner.update = spinner.update_scroll
+ 
+     if "--quiet" not in emerge_config.opts:
+         portage.deprecated_profile_check(settings=emerge_config.target_config.settings)
+         repo_name_check(emerge_config.trees)
+         repo_name_duplicate_check(emerge_config.trees)
+         config_protect_check(emerge_config.trees)
+     check_procfs()
+ 
+     for mytrees in emerge_config.trees.values():
+         mydb = mytrees["porttree"].dbapi
+         # Freeze the portdbapi for performance (memoize all xmatch results).
+         mydb.freeze()
+ 
+     del mytrees, mydb
+ 
+     for x in emerge_config.args:
+         if x.endswith((".ebuild", ".tbz2")) and os.path.exists(os.path.abspath(x)):
+             print(
+                 colorize(
+                     "BAD",
+                     "\n*** emerging by path is broken " "and may not always work!!!\n",
+                 )
+             )
+             break
+ 
+     if emerge_config.action == "list-sets":
+         writemsg_stdout(
+             "".join("%s\n" % s for s in sorted(emerge_config.target_config.sets))
+         )
+         return os.EX_OK
+     if emerge_config.action == "check-news":
+         news_counts = count_unread_news(
+             emerge_config.target_config.trees["porttree"].dbapi,
+             emerge_config.target_config.trees["vartree"].dbapi,
+         )
+         if any(news_counts.values()):
+             display_news_notifications(news_counts)
+         elif "--quiet" not in emerge_config.opts:
+             print("", colorize("GOOD", "*"), "No news items were found.")
+         return os.EX_OK
+ 
+     ensure_required_sets(emerge_config.trees)
+ 
+     if (
+         emerge_config.action is None
+         and "--resume" in emerge_config.opts
+         and emerge_config.args
+     ):
+         writemsg(
+             "emerge: unexpected argument(s) for --resume: %s\n"
+             % " ".join(emerge_config.args),
+             noiselevel=-1,
+         )
+         return 1
+ 
+     # only expand sets for actions taking package arguments
+     oldargs = emerge_config.args[:]
+     if emerge_config.action in (
+         "clean",
+         "config",
+         "depclean",
+         "info",
+         "prune",
+         "unmerge",
+         "rage-clean",
+         None,
+     ):
+         newargs, retval = expand_set_arguments(
+             emerge_config.args, emerge_config.action, emerge_config.target_config
+         )
+         if retval != os.EX_OK:
+             return retval
+ 
+         # Need to handle empty sets specially, otherwise emerge will react
+         # with the help message for empty argument lists
+         if oldargs and not newargs:
+             print("emerge: no targets left after set expansion")
+             return 0
+ 
+         emerge_config.args = newargs
+ 
+     if "--tree" in emerge_config.opts and "--columns" in emerge_config.opts:
+         print('emerge: can\'t specify both of "--tree" and "--columns".')
+         return 1
+ 
+     if "--emptytree" in emerge_config.opts and "--noreplace" in emerge_config.opts:
+         writemsg_level(
+             "emerge: can't specify both of " + '"--emptytree" and "--noreplace".\n',
+             level=logging.ERROR,
+             noiselevel=-1,
+         )
+         return 1
+ 
+     if "--quiet" in emerge_config.opts:
+         spinner.update = spinner.update_quiet
+         portage.util.noiselimit = -1
+ 
+     if "--fetch-all-uri" in emerge_config.opts:
+         emerge_config.opts["--fetchonly"] = True
+ 
+     if "--skipfirst" in emerge_config.opts and "--resume" not in emerge_config.opts:
+         emerge_config.opts["--resume"] = True
+ 
+     # Allow -p to remove --ask
+     if "--pretend" in emerge_config.opts:
+         emerge_config.opts.pop("--ask", None)
+ 
+     # forbid --ask when not in a terminal
+     # note: this breaks `emerge --ask | tee logfile`, but that doesn't work anyway.
+     if ("--ask" in emerge_config.opts) and (not sys.stdin.isatty()):
+         portage.writemsg(
+             '!!! "--ask" should only be used in a terminal. Exiting.\n', noiselevel=-1
+         )
+         return 1
+ 
+     if emerge_config.target_config.settings.get("PORTAGE_DEBUG", "") == "1":
+         spinner.update = spinner.update_quiet
+         portage.util.noiselimit = 0
+         if "python-trace" in emerge_config.target_config.settings.features:
+             portage.debug.set_trace(True)
+ 
+     if not "--quiet" in emerge_config.opts:
+         if (
+             "--nospinner" in emerge_config.opts
+             or emerge_config.target_config.settings.get("TERM") == "dumb"
+             or not sys.stdout.isatty()
+         ):
+             spinner.update = spinner.update_basic
+ 
+     if "--debug" in emerge_config.opts:
+         print("myaction", emerge_config.action)
+         print("myopts", emerge_config.opts)
+ 
+     if (
+         not emerge_config.action
+         and not emerge_config.args
+         and "--resume" not in emerge_config.opts
+     ):
+         emerge_help()
+         return 1
+ 
+     pretend = "--pretend" in emerge_config.opts
+     fetchonly = (
+         "--fetchonly" in emerge_config.opts or "--fetch-all-uri" in emerge_config.opts
+     )
+     buildpkgonly = "--buildpkgonly" in emerge_config.opts
+ 
+     # check if root user is the current user for the actions where emerge needs this
+     if portage.data.secpass < 2:
+         # We've already allowed "--version" and "--help" above.
+         if "--pretend" not in emerge_config.opts and emerge_config.action not in (
+             "search",
+             "info",
+         ):
+             need_superuser = emerge_config.action in (
+                 "clean",
+                 "depclean",
+                 "deselect",
+                 "prune",
+                 "unmerge",
+                 "rage-clean",
+             ) or not (
+                 fetchonly
+                 or (buildpkgonly and portage.data.secpass >= 1)
+                 or emerge_config.action in ("metadata", "regen", "sync")
+             )
+             if portage.data.secpass < 1 or need_superuser:
+                 if need_superuser:
+                     access_desc = "superuser"
+                 else:
+                     access_desc = "portage group"
+                 # Always show portage_group_warning() when only portage group
+                 # access is required but the user is not in the portage group.
+                 if "--ask" in emerge_config.opts:
+                     writemsg_stdout(
+                         "This action requires %s access...\n" % (access_desc,),
+                         noiselevel=-1,
+                     )
+                     if portage.data.secpass < 1 and not need_superuser:
+                         portage.data.portage_group_warning()
+                     uq = UserQuery(emerge_config.opts)
+                     if (
+                         uq.query(
+                             "Would you like to add --pretend to options?",
+                             "--ask-enter-invalid" in emerge_config.opts,
+                         )
+                         == "No"
+                     ):
+                         return 128 + signal.SIGINT
+                     emerge_config.opts["--pretend"] = True
+                     emerge_config.opts.pop("--ask")
+                 else:
+                     sys.stderr.write(("emerge: %s access is required\n") % access_desc)
+                     if portage.data.secpass < 1 and not need_superuser:
+                         portage.data.portage_group_warning()
+                     return 1
+ 
+     # Disable emergelog for everything except build or unmerge operations.
+     # This helps minimize parallel emerge.log entries that can confuse log
+     # parsers like genlop.
+     disable_emergelog = False
+ 
+     emerge_log_dir = emerge_config.target_config.settings.get("EMERGE_LOG_DIR")
+     default_log_dir = os.path.join(
+         os.sep, portage.const.EPREFIX.lstrip(os.sep), "var", "log"
+     )
+     for x in ("--pretend", "--fetchonly", "--fetch-all-uri"):
+         if x in emerge_config.opts:
+             if x == "--fetchonly" and "--quiet" in emerge_config.opts:
+                 # Log will be used to store fetch progress
+                 log_dir = emerge_log_dir if emerge_log_dir else default_log_dir
+                 disable_emergelog = not all(
+                     os.access(logfile, os.W_OK)
+                     for logfile in set(
+                         first_existing(os.path.join(log_dir, logfile))
+                         for logfile in ("emerge.log", "emerge-fetch.log")
+                     )
+                 )
+                 break
+             else:
+                 disable_emergelog = True
+                 break
+     if disable_emergelog:
+         pass
+     elif emerge_config.action in ("search", "info"):
+         disable_emergelog = True
+     elif portage.data.secpass < 1:
+         disable_emergelog = True
+ 
+     import _emerge.emergelog
+ 
+     _emerge.emergelog._disable = disable_emergelog
+ 
+     if not disable_emergelog:
+         if emerge_log_dir:
+             try:
+                 # At least the parent needs to exist for the lock file.
+                 portage.util.ensure_dirs(emerge_log_dir)
+             except portage.exception.PortageException as e:
+                 writemsg_level(
+                     "!!! Error creating directory for "
+                     + "EMERGE_LOG_DIR='%s':\n!!! %s\n" % (emerge_log_dir, e),
+                     noiselevel=-1,
+                     level=logging.ERROR,
+                 )
+                 portage.util.ensure_dirs(_emerge.emergelog._emerge_log_dir)
+             else:
+                 _emerge.emergelog._emerge_log_dir = emerge_log_dir
+         else:
+             _emerge.emergelog._emerge_log_dir = default_log_dir
+             portage.util.ensure_dirs(_emerge.emergelog._emerge_log_dir)
+ 
+     if not "--pretend" in emerge_config.opts:
+         time_fmt = "%b %d, %Y %H:%M:%S"
+         time_str = time.strftime(time_fmt, time.localtime(time.time()))
+         # Avoid potential UnicodeDecodeError in Python 2, since strftime
+         # returns bytes in Python 2, and %b may contain non-ascii chars.
+         time_str = _unicode_decode(
+             time_str, encoding=_encodings["content"], errors="replace"
+         )
+         emergelog(xterm_titles, "Started emerge on: %s" % time_str)
+         myelogstr = ""
+         if emerge_config.opts:
+             opt_list = []
+             for opt, arg in emerge_config.opts.items():
+                 if arg is True:
+                     opt_list.append(opt)
+                 elif isinstance(arg, list):
+                     # arguments like --exclude that use 'append' action
+                     for x in arg:
+                         opt_list.append("%s=%s" % (opt, x))
+                 else:
+                     opt_list.append("%s=%s" % (opt, arg))
+             myelogstr = " ".join(opt_list)
+         if emerge_config.action:
+             myelogstr += " --" + emerge_config.action
+         if oldargs:
+             myelogstr += " " + " ".join(oldargs)
+         emergelog(xterm_titles, " *** emerge " + myelogstr)
+ 
+     oldargs = None
+ 
+     def emergeexitsig(signum, frame):
+         signal.signal(signal.SIGTERM, signal.SIG_IGN)
+         portage.util.writemsg("\n\nExiting on signal %(signal)s\n" % {"signal": signum})
+         sys.exit(128 + signum)
+ 
+     signal.signal(signal.SIGTERM, emergeexitsig)
+ 
+     def emergeexit():
+         """This gets out final log message in before we quit."""
+         if "--pretend" not in emerge_config.opts:
+             emergelog(xterm_titles, " *** terminating.")
+         if xterm_titles:
+             xtermTitleReset()
+ 
+     portage.atexit_register(emergeexit)
+ 
+     if emerge_config.action in ("config", "metadata", "regen", "sync"):
+         if "--pretend" in emerge_config.opts:
+             sys.stderr.write(
+                 ("emerge: The '%s' action does " + "not support '--pretend'.\n")
+                 % emerge_config.action
+             )
+             return 1
+ 
+     if "sync" == emerge_config.action:
+         return action_sync(emerge_config)
+     if "metadata" == emerge_config.action:
+         action_metadata(
+             emerge_config.target_config.settings,
+             emerge_config.target_config.trees["porttree"].dbapi,
+             emerge_config.opts,
+         )
+     elif emerge_config.action == "regen":
+         validate_ebuild_environment(emerge_config.trees)
+         return action_regen(
+             emerge_config.target_config.settings,
+             emerge_config.target_config.trees["porttree"].dbapi,
+             emerge_config.opts.get("--jobs"),
+             emerge_config.opts.get("--load-average"),
+         )
+     # HELP action
+     elif "config" == emerge_config.action:
+         validate_ebuild_environment(emerge_config.trees)
+         return action_config(
+             emerge_config.target_config.settings,
+             emerge_config.trees,
+             emerge_config.opts,
+             emerge_config.args,
+         )
+ 
+     # SEARCH action
+     elif "search" == emerge_config.action:
+         validate_ebuild_environment(emerge_config.trees)
+         action_search(
+             emerge_config.target_config, emerge_config.opts, emerge_config.args, spinner
+         )
+ 
+     elif emerge_config.action in (
+         "clean",
+         "depclean",
+         "deselect",
+         "prune",
+         "unmerge",
+         "rage-clean",
+     ):
+         validate_ebuild_environment(emerge_config.trees)
+         rval = action_uninstall(
+             emerge_config.target_config.settings,
+             emerge_config.trees,
+             emerge_config.target_config.mtimedb["ldpath"],
+             emerge_config.opts,
+             emerge_config.action,
+             emerge_config.args,
+             spinner,
+         )
+         if not (
+             emerge_config.action == "deselect" or buildpkgonly or fetchonly or pretend
+         ):
+             post_emerge(
+                 emerge_config.action,
+                 emerge_config.opts,
+                 emerge_config.args,
+                 emerge_config.target_config.root,
+                 emerge_config.trees,
+                 emerge_config.target_config.mtimedb,
+                 rval,
+             )
+         return rval
+ 
+     elif emerge_config.action == "info":
+ 
+         # Ensure atoms are valid before calling unmerge().
+         vardb = emerge_config.target_config.trees["vartree"].dbapi
+         portdb = emerge_config.target_config.trees["porttree"].dbapi
+         bindb = emerge_config.target_config.trees["bintree"].dbapi
+         valid_atoms = []
+         for x in emerge_config.args:
+             if is_valid_package_atom(x, allow_repo=True):
+                 try:
+                     # look at the installed files first, if there is no match
+                     # look at the ebuilds, since EAPI 4 allows running pkg_info
+                     # on non-installed packages
+                     valid_atom = dep_expand(x, mydb=vardb)
+                     if valid_atom.cp.split("/")[0] == "null":
+                         valid_atom = dep_expand(x, mydb=portdb)
+ 
+                     if (
+                         valid_atom.cp.split("/")[0] == "null"
+                         and "--usepkg" in emerge_config.opts
+                     ):
+                         valid_atom = dep_expand(x, mydb=bindb)
+ 
+                     valid_atoms.append(valid_atom)
+ 
+                 except portage.exception.AmbiguousPackageName as e:
+                     msg = (
+                         'The short ebuild name "'
+                         + x
+                         + '" is ambiguous.  Please specify '
+                         + "one of the following "
+                         + "fully-qualified ebuild names instead:"
+                     )
+                     for line in textwrap.wrap(msg, 70):
+                         writemsg_level(
+                             "!!! %s\n" % (line,), level=logging.ERROR, noiselevel=-1
+                         )
+                     for i in e.args[0]:
+                         writemsg_level(
+                             "    %s\n" % colorize("INFORM", i),
+                             level=logging.ERROR,
+                             noiselevel=-1,
+                         )
+                     writemsg_level("\n", level=logging.ERROR, noiselevel=-1)
+                     return 1
+                 continue
+             msg = []
+             msg.append("'%s' is not a valid package atom." % (x,))
+             msg.append("Please check ebuild(5) for full details.")
+             writemsg_level(
+                 "".join("!!! %s\n" % line for line in msg),
+                 level=logging.ERROR,
+                 noiselevel=-1,
+             )
+             return 1
+ 
+         return action_info(
+             emerge_config.target_config.settings,
+             emerge_config.trees,
+             emerge_config.opts,
+             valid_atoms,
+         )
+ 
+     # "update", "system", or just process files:
+     else:
+         validate_ebuild_environment(emerge_config.trees)
+ 
+         for x in emerge_config.args:
+             if x.startswith(SETPREFIX) or is_valid_package_atom(x, allow_repo=True):
+                 continue
+             if x[:1] == os.sep:
+                 continue
+             try:
+                 os.lstat(x)
+                 continue
+             except OSError:
+                 pass
+             msg = []
+             msg.append("'%s' is not a valid package atom." % (x,))
+             msg.append("Please check ebuild(5) for full details.")
+             writemsg_level(
+                 "".join("!!! %s\n" % line for line in msg),
+                 level=logging.ERROR,
+                 noiselevel=-1,
+             )
+             return 1
+ 
+         # GLEP 42 says to display news *after* an emerge --pretend
+         if "--pretend" not in emerge_config.opts:
+             uq = UserQuery(emerge_config.opts)
+             if (
+                 display_news_notification(
+                     emerge_config.target_config, emerge_config.opts
+                 )
+                 and "--ask" in emerge_config.opts
+                 and "--read-news" in emerge_config.opts
+                 and uq.query(
+                     "Would you like to read the news items while "
+                     "calculating dependencies?",
+                     "--ask-enter-invalid" in emerge_config.opts,
+                 )
+                 == "Yes"
+             ):
+                 try:
+                     subprocess.call(["eselect", "news", "read"])
+                 # If eselect is not installed, Python <3.3 will throw an
+                 # OSError. >=3.3 will throw a FileNotFoundError, which is a
+                 # subclass of OSError.
+                 except OSError:
+                     writemsg(
+                         "Please install eselect to use this feature.\n", noiselevel=-1
+                     )
+         retval = action_build(emerge_config, spinner=spinner)
+         post_emerge(
+             emerge_config.action,
+             emerge_config.opts,
+             emerge_config.args,
+             emerge_config.target_config.root,
+             emerge_config.trees,
+             emerge_config.target_config.mtimedb,
+             retval,
+         )
+ 
+         return retval
diff --cc lib/portage/const.py
index 1896a6a22,abe0ef6c6..cfc0da43b
--- a/lib/portage/const.py
+++ b/lib/portage/const.py
@@@ -60,166 -60,168 +60,170 @@@ GLOBAL_CONFIG_PATH = "/usr/share/portag
  # NOTE: Use realpath(__file__) so that python module symlinks in site-packages
  # are followed back to the real location of the whole portage installation.
  # NOTE: Please keep PORTAGE_BASE_PATH in one line to help substitutions.
- PORTAGE_BASE_PATH        = os.path.join(os.sep, os.sep.join(os.path.realpath(__file__.rstrip("co")).split(os.sep)[:-3]))
- PORTAGE_BIN_PATH         = PORTAGE_BASE_PATH + "/bin"
- PORTAGE_PYM_PATH         = os.path.realpath(os.path.join(__file__, '../..'))
- LOCALE_DATA_PATH         = PORTAGE_BASE_PATH + "/locale"  # FIXME: not used
- EBUILD_SH_BINARY         = PORTAGE_BIN_PATH + "/ebuild.sh"
- MISC_SH_BINARY           = PORTAGE_BIN_PATH + "/misc-functions.sh"
- SANDBOX_BINARY           = "/usr/bin/sandbox"
- FAKEROOT_BINARY          = "/usr/bin/fakeroot"
- BASH_BINARY              = "/bin/bash"
- MOVE_BINARY              = "/bin/mv"
- PRELINK_BINARY           = "/usr/sbin/prelink"
+ # fmt:off
+ PORTAGE_BASE_PATH = os.path.join(os.sep, os.sep.join(os.path.realpath(__file__.rstrip("co")).split(os.sep)[:-3]))
+ # fmt:on
+ PORTAGE_BIN_PATH = PORTAGE_BASE_PATH + "/bin"
+ PORTAGE_PYM_PATH = os.path.realpath(os.path.join(__file__, "../.."))
+ LOCALE_DATA_PATH = PORTAGE_BASE_PATH + "/locale"  # FIXME: not used
+ EBUILD_SH_BINARY = PORTAGE_BIN_PATH + "/ebuild.sh"
+ MISC_SH_BINARY = PORTAGE_BIN_PATH + "/misc-functions.sh"
+ SANDBOX_BINARY = "/usr/bin/sandbox"
+ FAKEROOT_BINARY = "/usr/bin/fakeroot"
+ BASH_BINARY = "/bin/bash"
+ MOVE_BINARY = "/bin/mv"
+ PRELINK_BINARY = "/usr/sbin/prelink"
  
- INVALID_ENV_FILE         = "/etc/spork/is/not/valid/profile.env"
- MERGING_IDENTIFIER       = "-MERGING-"
- REPO_NAME_FILE           = "repo_name"
- REPO_NAME_LOC            = "profiles" + "/" + REPO_NAME_FILE
+ INVALID_ENV_FILE = "/etc/spork/is/not/valid/profile.env"
+ MERGING_IDENTIFIER = "-MERGING-"
+ REPO_NAME_FILE = "repo_name"
+ REPO_NAME_LOC = "profiles" + "/" + REPO_NAME_FILE
  
- PORTAGE_PACKAGE_ATOM     = "sys-apps/portage"
- LIBC_PACKAGE_ATOM        = "virtual/libc"
- OS_HEADERS_PACKAGE_ATOM  = "virtual/os-headers"
- CVS_PACKAGE_ATOM         = "dev-vcs/cvs"
- GIT_PACKAGE_ATOM         = "dev-vcs/git"
- HG_PACKAGE_ATOM          = "dev-vcs/mercurial"
- RSYNC_PACKAGE_ATOM       = "net-misc/rsync"
+ PORTAGE_PACKAGE_ATOM = "sys-apps/portage"
+ LIBC_PACKAGE_ATOM = "virtual/libc"
+ OS_HEADERS_PACKAGE_ATOM = "virtual/os-headers"
+ CVS_PACKAGE_ATOM = "dev-vcs/cvs"
+ GIT_PACKAGE_ATOM = "dev-vcs/git"
+ HG_PACKAGE_ATOM = "dev-vcs/mercurial"
+ RSYNC_PACKAGE_ATOM = "net-misc/rsync"
  
- INCREMENTALS             = (
- 	"ACCEPT_KEYWORDS",
- 	"CONFIG_PROTECT",
- 	"CONFIG_PROTECT_MASK",
- 	"ENV_UNSET",
- 	"FEATURES",
- 	"IUSE_IMPLICIT",
- 	"PRELINK_PATH",
- 	"PRELINK_PATH_MASK",
- 	"PROFILE_ONLY_VARIABLES",
- 	"USE",
- 	"USE_EXPAND",
- 	"USE_EXPAND_HIDDEN",
- 	"USE_EXPAND_IMPLICIT",
- 	"USE_EXPAND_UNPREFIXED",
+ INCREMENTALS = (
+     "ACCEPT_KEYWORDS",
+     "CONFIG_PROTECT",
+     "CONFIG_PROTECT_MASK",
+     "ENV_UNSET",
+     "FEATURES",
+     "IUSE_IMPLICIT",
+     "PRELINK_PATH",
+     "PRELINK_PATH_MASK",
+     "PROFILE_ONLY_VARIABLES",
+     "USE",
+     "USE_EXPAND",
+     "USE_EXPAND_HIDDEN",
+     "USE_EXPAND_IMPLICIT",
+     "USE_EXPAND_UNPREFIXED",
 +	"NO_AUTO_FLAG", "RESTRICT_MULTILIB_BINARIES"
  )
- EBUILD_PHASES            = (
- 	"pretend",
- 	"setup",
- 	"unpack",
- 	"prepare",
- 	"configure",
- 	"compile",
- 	"test",
- 	"install",
- 	"package",
- 	"instprep",
- 	"preinst",
- 	"postinst",
- 	"prerm",
- 	"postrm",
- 	"nofetch",
- 	"config",
- 	"info",
- 	"other",
+ EBUILD_PHASES = (
+     "pretend",
+     "setup",
+     "unpack",
+     "prepare",
+     "configure",
+     "compile",
+     "test",
+     "install",
+     "package",
+     "instprep",
+     "preinst",
+     "postinst",
+     "prerm",
+     "postrm",
+     "nofetch",
+     "config",
+     "info",
+     "other",
+ )
+ SUPPORTED_FEATURES = frozenset(
+     [
+         "assume-digests",
+         "binpkg-docompress",
+         "binpkg-dostrip",
+         "binpkg-logs",
+         "binpkg-multi-instance",
+         "buildpkg",
+         "buildsyspkg",
+         "candy",
+         "case-insensitive-fs",
+         "ccache",
+         "cgroup",
+         "chflags",
+         "clean-logs",
+         "collision-protect",
+         "compress-build-logs",
+         "compressdebug",
+         "compress-index",
+         "config-protect-if-modified",
+         "digest",
+         "distcc",
+         "distlocks",
+         "downgrade-backup",
+         "ebuild-locks",
+         "fail-clean",
+         "fakeroot",
+         "fixlafiles",
+         "force-mirror",
++        "force-multilib",
+         "force-prefix",
+         "getbinpkg",
+         "icecream",
+         "installsources",
+         "ipc-sandbox",
+         "keeptemp",
+         "keepwork",
+         "lmirror",
+         "merge-sync",
+         "metadata-transfer",
+         "mirror",
+         "mount-sandbox",
+         "multilib-strict",
+         "network-sandbox",
+         "network-sandbox-proxy",
+         "news",
+         "noauto",
+         "noclean",
+         "nodoc",
+         "noinfo",
+         "noman",
+         "nostrip",
+         "notitles",
+         "parallel-fetch",
+         "parallel-install",
+         "pid-sandbox",
+         "pkgdir-index-trusted",
+         "prelink-checksums",
+         "preserve-libs",
+         "protect-owned",
+         "python-trace",
+         "qa-unresolved-soname-deps",
+         "sandbox",
+         "selinux",
+         "sesandbox",
+         "sfperms",
+         "sign",
+         "skiprocheck",
+         "splitdebug",
+         "split-elog",
+         "split-log",
+         "strict",
+         "strict-keepdir",
+         "stricter",
+         "suidctl",
+         "test",
+         "test-fail-continue",
+         "unknown-features-filter",
+         "unknown-features-warn",
+         "unmerge-backup",
+         "unmerge-logs",
+         "unmerge-orphans",
+         "unprivileged",
+         "userfetch",
+         "userpriv",
+         "usersandbox",
+         "usersync",
+         "webrsync-gpg",
+         "xattr",
+     ]
  )
- SUPPORTED_FEATURES       = frozenset([
- 	"assume-digests",
- 	"binpkg-docompress",
- 	"binpkg-dostrip",
- 	"binpkg-logs",
- 	"binpkg-multi-instance",
- 	"buildpkg",
- 	"buildsyspkg",
- 	"candy",
- 	"case-insensitive-fs",
- 	"ccache",
- 	"cgroup",
- 	"chflags",
- 	"clean-logs",
- 	"collision-protect",
- 	"compress-build-logs",
- 	"compressdebug",
- 	"compress-index",
- 	"config-protect-if-modified",
- 	"digest",
- 	"distcc",
- 	"distlocks",
- 	"downgrade-backup",
- 	"ebuild-locks",
- 	"fail-clean",
- 	"fakeroot",
- 	"fixlafiles",
- 	"force-mirror",
- 	"force-multilib",
- 	"force-prefix",
- 	"getbinpkg",
- 	"icecream",
- 	"installsources",
- 	"ipc-sandbox",
- 	"keeptemp",
- 	"keepwork",
- 	"lmirror",
- 	"merge-sync",
- 	"metadata-transfer",
- 	"mirror",
- 	"mount-sandbox",
- 	"multilib-strict",
- 	"network-sandbox",
- 	"network-sandbox-proxy",
- 	"news",
- 	"noauto",
- 	"noclean",
- 	"nodoc",
- 	"noinfo",
- 	"noman",
- 	"nostrip",
- 	"notitles",
- 	"parallel-fetch",
- 	"parallel-install",
- 	"pid-sandbox",
- 	"pkgdir-index-trusted",
- 	"prelink-checksums",
- 	"preserve-libs",
- 	"protect-owned",
- 	"python-trace",
- 	"qa-unresolved-soname-deps",
- 	"sandbox",
- 	"selinux",
- 	"sesandbox",
- 	"sfperms",
- 	"sign",
- 	"skiprocheck",
- 	"splitdebug",
- 	"split-elog",
- 	"split-log",
- 	"strict",
- 	"strict-keepdir",
- 	"stricter",
- 	"suidctl",
- 	"test",
- 	"test-fail-continue",
- 	"unknown-features-filter",
- 	"unknown-features-warn",
- 	"unmerge-backup",
- 	"unmerge-logs",
- 	"unmerge-orphans",
- 	"unprivileged",
- 	"userfetch",
- 	"userpriv",
- 	"usersandbox",
- 	"usersync",
- 	"webrsync-gpg",
- 	"xattr",
- ])
  
- EAPI                     = 8
+ EAPI = 8
  
- HASHING_BLOCKSIZE        = 32768
+ HASHING_BLOCKSIZE = 32768
  
  MANIFEST2_HASH_DEFAULTS = frozenset(["BLAKE2B", "SHA512"])
- MANIFEST2_HASH_DEFAULT  = "BLAKE2B"
+ MANIFEST2_HASH_DEFAULT = "BLAKE2B"
  
- MANIFEST2_IDENTIFIERS    = ("AUX", "MISC", "DIST", "EBUILD")
+ MANIFEST2_IDENTIFIERS = ("AUX", "MISC", "DIST", "EBUILD")
  
  # The EPREFIX for the current install is hardcoded here, but access to this
  # constant should be minimal, in favor of access via the EPREFIX setting of
diff --cc lib/portage/dep/__init__.py
index 151f545c2,3b3577025..921483d8d
--- a/lib/portage/dep/__init__.py
+++ b/lib/portage/dep/__init__.py
@@@ -850,373 -1056,413 +1056,414 @@@ def flatten(mylist)
  
  class _use_dep:
  
- 	__slots__ = ("_eapi_attrs", "conditional", "missing_enabled", "missing_disabled",
- 		"disabled", "enabled", "tokens", "required")
- 
- 	class _conditionals_class:
- 		__slots__ = ("enabled", "disabled", "equal", "not_equal")
- 
- 		def items(self):
- 			for k in self.__slots__:
- 				v = getattr(self, k, None)
- 				if v:
- 					yield (k, v)
- 
- 		def values(self):
- 			for k in self.__slots__:
- 				v = getattr(self, k, None)
- 				if v:
- 					yield v
- 
- 	# used in InvalidAtom messages
- 	_conditional_strings = {
- 		'enabled' :     '%s?',
- 		'disabled':    '!%s?',
- 		'equal':        '%s=',
- 		'not_equal':   '!%s=',
- 	}
- 
- 	def __init__(self, use, eapi_attrs, enabled_flags=None, disabled_flags=None, missing_enabled=None,
- 		missing_disabled=None, conditional=None, required=None):
- 
- 		self._eapi_attrs = eapi_attrs
- 
- 		if enabled_flags is not None:
- 			#A shortcut for the classe's own methods.
- 			self.tokens = use
- 			if not isinstance(self.tokens, tuple):
- 				self.tokens = tuple(self.tokens)
- 
- 			self.required = frozenset(required)
- 			self.enabled = frozenset(enabled_flags)
- 			self.disabled = frozenset(disabled_flags)
- 			self.missing_enabled = frozenset(missing_enabled)
- 			self.missing_disabled = frozenset(missing_disabled)
- 			self.conditional = None
- 
- 			if conditional:
- 				self.conditional = self._conditionals_class()
- 				for k in "enabled", "disabled", "equal", "not_equal":
- 					setattr(self.conditional, k, frozenset(conditional.get(k, [])))
- 
- 			return
- 
- 		enabled_flags = set()
- 		disabled_flags = set()
- 		missing_enabled = set()
- 		missing_disabled = set()
- 		no_default = set()
- 
- 		conditional = {}
- 		usedep_re = _get_usedep_re(self._eapi_attrs)
- 
- 		for x in use:
- 			m = usedep_re.match(x)
- 			if m is None:
- 				raise InvalidAtom(_("Invalid use dep: '%s'") % (x,))
- 
- 			operator = m.group("prefix") + m.group("suffix")
- 			flag = m.group("flag")
- 			default = m.group("default")
- 
- 			if not operator:
- 				enabled_flags.add(flag)
- 			elif operator == "-":
- 				disabled_flags.add(flag)
- 			elif operator == "?":
- 				conditional.setdefault("enabled", set()).add(flag)
- 			elif operator == "=":
- 				conditional.setdefault("equal", set()).add(flag)
- 			elif operator == "!=":
- 				conditional.setdefault("not_equal", set()).add(flag)
- 			elif operator == "!?":
- 				conditional.setdefault("disabled", set()).add(flag)
- 			else:
- 				raise InvalidAtom(_("Invalid use dep: '%s'") % (x,))
- 
- 			if default:
- 				if default == "(+)":
- 					if flag in missing_disabled or flag in no_default:
- 						raise InvalidAtom(_("Invalid use dep: '%s'") % (x,))
- 					missing_enabled.add(flag)
- 				else:
- 					if flag in missing_enabled or flag in no_default:
- 						raise InvalidAtom(_("Invalid use dep: '%s'") % (x,))
- 					missing_disabled.add(flag)
- 			else:
- 				if flag in missing_enabled or flag in missing_disabled:
+     __slots__ = (
+         "_eapi_attrs",
+         "conditional",
+         "missing_enabled",
+         "missing_disabled",
+         "disabled",
+         "enabled",
+         "tokens",
+         "required",
+     )
+ 
+     class _conditionals_class:
+         __slots__ = ("enabled", "disabled", "equal", "not_equal")
+ 
+         def items(self):
+             for k in self.__slots__:
+                 v = getattr(self, k, None)
+                 if v:
+                     yield (k, v)
+ 
+         def values(self):
+             for k in self.__slots__:
+                 v = getattr(self, k, None)
+                 if v:
+                     yield v
+ 
+     # used in InvalidAtom messages
+     _conditional_strings = {
+         "enabled": "%s?",
+         "disabled": "!%s?",
+         "equal": "%s=",
+         "not_equal": "!%s=",
+     }
+ 
+     def __init__(
+         self,
+         use,
+         eapi_attrs,
+         enabled_flags=None,
+         disabled_flags=None,
+         missing_enabled=None,
+         missing_disabled=None,
+         conditional=None,
+         required=None,
+     ):
+ 
+         self._eapi_attrs = eapi_attrs
+ 
+         if enabled_flags is not None:
+             # A shortcut for the classe's own methods.
+             self.tokens = use
+             if not isinstance(self.tokens, tuple):
+                 self.tokens = tuple(self.tokens)
+ 
+             self.required = frozenset(required)
+             self.enabled = frozenset(enabled_flags)
+             self.disabled = frozenset(disabled_flags)
+             self.missing_enabled = frozenset(missing_enabled)
+             self.missing_disabled = frozenset(missing_disabled)
+             self.conditional = None
+ 
+             if conditional:
+                 self.conditional = self._conditionals_class()
+                 for k in "enabled", "disabled", "equal", "not_equal":
+                     setattr(self.conditional, k, frozenset(conditional.get(k, [])))
+ 
+             return
+ 
+         enabled_flags = set()
+         disabled_flags = set()
+         missing_enabled = set()
+         missing_disabled = set()
+         no_default = set()
+ 
+         conditional = {}
+         usedep_re = _get_usedep_re(self._eapi_attrs)
+ 
+         for x in use:
+             m = usedep_re.match(x)
+             if m is None:
+                 raise InvalidAtom(_("Invalid use dep: '%s'") % (x,))
+ 
+             operator = m.group("prefix") + m.group("suffix")
+             flag = m.group("flag")
+             default = m.group("default")
+ 
+             if not operator:
+                 enabled_flags.add(flag)
+             elif operator == "-":
+                 disabled_flags.add(flag)
+             elif operator == "?":
+                 conditional.setdefault("enabled", set()).add(flag)
+             elif operator == "=":
+                 conditional.setdefault("equal", set()).add(flag)
+             elif operator == "!=":
+                 conditional.setdefault("not_equal", set()).add(flag)
+             elif operator == "!?":
+                 conditional.setdefault("disabled", set()).add(flag)
+             else:
+                 raise InvalidAtom(_("Invalid use dep: '%s'") % (x,))
+ 
+             if default:
+                 if default == "(+)":
+                     if flag in missing_disabled or flag in no_default:
+                         raise InvalidAtom(_("Invalid use dep: '%s'") % (x,))
+                     missing_enabled.add(flag)
+                 else:
+                     if flag in missing_enabled or flag in no_default:
+                         raise InvalidAtom(_("Invalid use dep: '%s'") % (x,))
+                     missing_disabled.add(flag)
+             else:
+                 if flag in missing_enabled or flag in missing_disabled:
 +					if flag != "multilib_abi_x86" and flag != "multilib_abi_amd64":
- 						raise InvalidAtom(_("Invalid use dep: '%s'") % (x,))
- 				no_default.add(flag)
- 
- 		self.tokens = use
- 		if not isinstance(self.tokens, tuple):
- 			self.tokens = tuple(self.tokens)
- 
- 		self.required = frozenset(no_default)
- 
- 		self.enabled = frozenset(enabled_flags)
- 		self.disabled = frozenset(disabled_flags)
- 		self.missing_enabled = frozenset(missing_enabled)
- 		self.missing_disabled = frozenset(missing_disabled)
- 		self.conditional = None
- 
- 		if conditional:
- 			self.conditional = self._conditionals_class()
- 			for k in "enabled", "disabled", "equal", "not_equal":
- 				setattr(self.conditional, k, frozenset(conditional.get(k, ())))
- 
- 	def __bool__(self):
- 		return bool(self.tokens)
- 
- 	def __str__(self):
- 		if not self.tokens:
- 			return ""
- 		return "[%s]" % (",".join(self.tokens),)
- 
- 	def __repr__(self):
- 		return "portage.dep._use_dep(%s)" % repr(self.tokens)
- 
- 	def evaluate_conditionals(self, use):
- 		"""
- 		Create a new instance with conditionals evaluated.
- 
- 		Conditional evaluation behavior:
- 
- 			parent state   conditional   result
- 
- 			 x              x?            x
- 			-x              x?
- 			 x             !x?
- 			-x             !x?           -x
- 
- 			 x              x=            x
- 			-x              x=           -x
- 			 x             !x=           -x
- 			-x             !x=            x
- 
- 		Conditional syntax examples:
- 
- 			Compact Form        Equivalent Expanded Form
- 
- 			foo[bar?]           bar? ( foo[bar]  ) !bar? ( foo       )
- 			foo[!bar?]          bar? ( foo       ) !bar? ( foo[-bar] )
- 			foo[bar=]           bar? ( foo[bar]  ) !bar? ( foo[-bar] )
- 			foo[!bar=]          bar? ( foo[-bar] ) !bar? ( foo[bar]  )
- 
- 		"""
- 		enabled_flags = set(self.enabled)
- 		disabled_flags = set(self.disabled)
- 
- 		tokens = []
- 		usedep_re = _get_usedep_re(self._eapi_attrs)
- 
- 		for x in self.tokens:
- 			m = usedep_re.match(x)
- 
- 			operator = m.group("prefix") + m.group("suffix")
- 			flag = m.group("flag")
- 			default = m.group("default")
- 			if default is None:
- 				default = ""
- 
- 			if operator == "?":
- 				if flag in use:
- 					enabled_flags.add(flag)
- 					tokens.append(flag+default)
- 			elif operator == "=":
- 				if flag in use:
- 					enabled_flags.add(flag)
- 					tokens.append(flag+default)
- 				else:
- 					disabled_flags.add(flag)
- 					tokens.append("-"+flag+default)
- 			elif operator == "!=":
- 				if flag in use:
- 					disabled_flags.add(flag)
- 					tokens.append("-"+flag+default)
- 				else:
- 					enabled_flags.add(flag)
- 					tokens.append(flag+default)
- 			elif operator == "!?":
- 				if flag not in use:
- 					disabled_flags.add(flag)
- 					tokens.append("-"+flag+default)
- 			else:
- 				tokens.append(x)
- 
- 		return _use_dep(tokens, self._eapi_attrs, enabled_flags=enabled_flags, disabled_flags=disabled_flags,
- 			missing_enabled=self.missing_enabled, missing_disabled=self.missing_disabled, required=self.required)
- 
- 	def violated_conditionals(self, other_use, is_valid_flag, parent_use=None):
- 		"""
- 		Create a new instance with satisfied use deps removed.
- 		"""
- 		if parent_use is None and self.conditional:
- 			raise InvalidAtom("violated_conditionals needs 'parent_use'" + \
- 				" parameter for conditional flags.")
- 
- 		enabled_flags = set()
- 		disabled_flags = set()
- 
- 		conditional = {}
- 		tokens = []
- 
- 		all_defaults = self.missing_enabled | self.missing_disabled
- 
- 		def validate_flag(flag):
- 			return is_valid_flag(flag) or flag in all_defaults
- 
- 		usedep_re = _get_usedep_re(self._eapi_attrs)
- 
- 		for x in self.tokens:
- 			m = usedep_re.match(x)
- 
- 			operator = m.group("prefix") + m.group("suffix")
- 			flag = m.group("flag")
- 
- 			if not validate_flag(flag):
- 				tokens.append(x)
- 				if not operator:
- 					enabled_flags.add(flag)
- 				elif operator == "-":
- 					disabled_flags.add(flag)
- 				elif operator == "?":
- 					conditional.setdefault("enabled", set()).add(flag)
- 				elif operator == "=":
- 					conditional.setdefault("equal", set()).add(flag)
- 				elif operator == "!=":
- 					conditional.setdefault("not_equal", set()).add(flag)
- 				elif operator == "!?":
- 					conditional.setdefault("disabled", set()).add(flag)
- 
- 				continue
- 
- 			if not operator:
- 				if flag not in other_use:
- 					if is_valid_flag(flag) or flag in self.missing_disabled:
- 						tokens.append(x)
- 						enabled_flags.add(flag)
- 			elif operator == "-":
- 				if flag not in other_use:
- 					if not is_valid_flag(flag):
- 						if flag in self.missing_enabled:
- 							tokens.append(x)
- 							disabled_flags.add(flag)
- 				else:
- 					tokens.append(x)
- 					disabled_flags.add(flag)
- 			elif operator == "?":
- 				if flag not in parent_use or flag in other_use:
- 					continue
- 
- 				if is_valid_flag(flag) or flag in self.missing_disabled:
- 					tokens.append(x)
- 					conditional.setdefault("enabled", set()).add(flag)
- 			elif operator == "=":
- 				if flag in parent_use and flag not in other_use:
- 					if is_valid_flag(flag):
- 						tokens.append(x)
- 						conditional.setdefault("equal", set()).add(flag)
- 					else:
- 						if flag in self.missing_disabled:
- 							tokens.append(x)
- 							conditional.setdefault("equal", set()).add(flag)
- 				elif flag not in parent_use:
- 					if flag not in other_use:
- 						if not is_valid_flag(flag):
- 							if flag in self.missing_enabled:
- 								tokens.append(x)
- 								conditional.setdefault("equal", set()).add(flag)
- 					else:
- 						tokens.append(x)
- 						conditional.setdefault("equal", set()).add(flag)
- 			elif operator == "!=":
- 				if flag not in parent_use and flag not in other_use:
- 					if is_valid_flag(flag):
- 						tokens.append(x)
- 						conditional.setdefault("not_equal", set()).add(flag)
- 					else:
- 						if flag in self.missing_disabled:
- 							tokens.append(x)
- 							conditional.setdefault("not_equal", set()).add(flag)
- 				elif flag in parent_use:
- 					if flag not in other_use:
- 						if not is_valid_flag(flag):
- 							if flag in self.missing_enabled:
- 								tokens.append(x)
- 								conditional.setdefault("not_equal", set()).add(flag)
- 					else:
- 						tokens.append(x)
- 						conditional.setdefault("not_equal", set()).add(flag)
- 			elif operator == "!?":
- 				if flag not in parent_use:
- 					if flag not in other_use:
- 						if not is_valid_flag(flag) and flag in self.missing_enabled:
- 							tokens.append(x)
- 							conditional.setdefault("disabled", set()).add(flag)
- 					else:
- 						tokens.append(x)
- 						conditional.setdefault("disabled", set()).add(flag)
- 
- 		return _use_dep(tokens, self._eapi_attrs, enabled_flags=enabled_flags, disabled_flags=disabled_flags,
- 			missing_enabled=self.missing_enabled, missing_disabled=self.missing_disabled, \
- 			conditional=conditional, required=self.required)
- 
- 	def _eval_qa_conditionals(self, use_mask, use_force):
- 		"""
- 		For repoman, evaluate all possible combinations within the constraints
- 		of the given use.force and use.mask settings. The result may seem
- 		ambiguous in the sense that the same flag can be in both the enabled
- 		and disabled sets, but this is useful within the context of how its
- 		intended to be used by repoman. It is assumed that the caller has
- 		already ensured that there is no intersection between the given
- 		use_mask and use_force sets when necessary.
- 		"""
- 		enabled_flags = set(self.enabled)
- 		disabled_flags = set(self.disabled)
- 		missing_enabled = self.missing_enabled
- 		missing_disabled = self.missing_disabled
- 
- 		tokens = []
- 		usedep_re = _get_usedep_re(self._eapi_attrs)
- 
- 		for x in self.tokens:
- 			m = usedep_re.match(x)
- 
- 			operator = m.group("prefix") + m.group("suffix")
- 			flag = m.group("flag")
- 			default = m.group("default")
- 			if default is None:
- 				default = ""
- 
- 			if operator == "?":
- 				if flag not in use_mask:
- 					enabled_flags.add(flag)
- 					tokens.append(flag+default)
- 			elif operator == "=":
- 				if flag not in use_mask:
- 					enabled_flags.add(flag)
- 					tokens.append(flag+default)
- 				if flag not in use_force:
- 					disabled_flags.add(flag)
- 					tokens.append("-"+flag+default)
- 			elif operator == "!=":
- 				if flag not in use_force:
- 					enabled_flags.add(flag)
- 					tokens.append(flag+default)
- 				if flag not in use_mask:
- 					disabled_flags.add(flag)
- 					tokens.append("-"+flag+default)
- 			elif operator == "!?":
- 				if flag not in use_force:
- 					disabled_flags.add(flag)
- 					tokens.append("-"+flag+default)
- 			else:
- 				tokens.append(x)
- 
- 		return _use_dep(tokens, self._eapi_attrs, enabled_flags=enabled_flags, disabled_flags=disabled_flags,
- 			missing_enabled=missing_enabled, missing_disabled=missing_disabled, required=self.required)
+                     raise InvalidAtom(_("Invalid use dep: '%s'") % (x,))
+                 no_default.add(flag)
+ 
+         self.tokens = use
+         if not isinstance(self.tokens, tuple):
+             self.tokens = tuple(self.tokens)
+ 
+         self.required = frozenset(no_default)
+ 
+         self.enabled = frozenset(enabled_flags)
+         self.disabled = frozenset(disabled_flags)
+         self.missing_enabled = frozenset(missing_enabled)
+         self.missing_disabled = frozenset(missing_disabled)
+         self.conditional = None
+ 
+         if conditional:
+             self.conditional = self._conditionals_class()
+             for k in "enabled", "disabled", "equal", "not_equal":
+                 setattr(self.conditional, k, frozenset(conditional.get(k, ())))
+ 
+     def __bool__(self):
+         return bool(self.tokens)
+ 
+     def __str__(self):
+         if not self.tokens:
+             return ""
+         return "[%s]" % (",".join(self.tokens),)
+ 
+     def __repr__(self):
+         return "portage.dep._use_dep(%s)" % repr(self.tokens)
+ 
+     def evaluate_conditionals(self, use):
+         """
+         Create a new instance with conditionals evaluated.
+ 
+         Conditional evaluation behavior:
+ 
+                 parent state   conditional   result
+ 
+                  x              x?            x
+                 -x              x?
+                  x             !x?
+                 -x             !x?           -x
+ 
+                  x              x=            x
+                 -x              x=           -x
+                  x             !x=           -x
+                 -x             !x=            x
+ 
+         Conditional syntax examples:
+ 
+                 Compact Form        Equivalent Expanded Form
+ 
+                 foo[bar?]           bar? ( foo[bar]  ) !bar? ( foo       )
+                 foo[!bar?]          bar? ( foo       ) !bar? ( foo[-bar] )
+                 foo[bar=]           bar? ( foo[bar]  ) !bar? ( foo[-bar] )
+                 foo[!bar=]          bar? ( foo[-bar] ) !bar? ( foo[bar]  )
+ 
+         """
+         enabled_flags = set(self.enabled)
+         disabled_flags = set(self.disabled)
+ 
+         tokens = []
+         usedep_re = _get_usedep_re(self._eapi_attrs)
+ 
+         for x in self.tokens:
+             m = usedep_re.match(x)
+ 
+             operator = m.group("prefix") + m.group("suffix")
+             flag = m.group("flag")
+             default = m.group("default")
+             if default is None:
+                 default = ""
+ 
+             if operator == "?":
+                 if flag in use:
+                     enabled_flags.add(flag)
+                     tokens.append(flag + default)
+             elif operator == "=":
+                 if flag in use:
+                     enabled_flags.add(flag)
+                     tokens.append(flag + default)
+                 else:
+                     disabled_flags.add(flag)
+                     tokens.append("-" + flag + default)
+             elif operator == "!=":
+                 if flag in use:
+                     disabled_flags.add(flag)
+                     tokens.append("-" + flag + default)
+                 else:
+                     enabled_flags.add(flag)
+                     tokens.append(flag + default)
+             elif operator == "!?":
+                 if flag not in use:
+                     disabled_flags.add(flag)
+                     tokens.append("-" + flag + default)
+             else:
+                 tokens.append(x)
+ 
+         return _use_dep(
+             tokens,
+             self._eapi_attrs,
+             enabled_flags=enabled_flags,
+             disabled_flags=disabled_flags,
+             missing_enabled=self.missing_enabled,
+             missing_disabled=self.missing_disabled,
+             required=self.required,
+         )
+ 
+     def violated_conditionals(self, other_use, is_valid_flag, parent_use=None):
+         """
+         Create a new instance with satisfied use deps removed.
+         """
+         if parent_use is None and self.conditional:
+             raise InvalidAtom(
+                 "violated_conditionals needs 'parent_use'"
+                 + " parameter for conditional flags."
+             )
+ 
+         enabled_flags = set()
+         disabled_flags = set()
+ 
+         conditional = {}
+         tokens = []
+ 
+         all_defaults = self.missing_enabled | self.missing_disabled
+ 
+         def validate_flag(flag):
+             return is_valid_flag(flag) or flag in all_defaults
+ 
+         usedep_re = _get_usedep_re(self._eapi_attrs)
+ 
+         for x in self.tokens:
+             m = usedep_re.match(x)
+ 
+             operator = m.group("prefix") + m.group("suffix")
+             flag = m.group("flag")
+ 
+             if not validate_flag(flag):
+                 tokens.append(x)
+                 if not operator:
+                     enabled_flags.add(flag)
+                 elif operator == "-":
+                     disabled_flags.add(flag)
+                 elif operator == "?":
+                     conditional.setdefault("enabled", set()).add(flag)
+                 elif operator == "=":
+                     conditional.setdefault("equal", set()).add(flag)
+                 elif operator == "!=":
+                     conditional.setdefault("not_equal", set()).add(flag)
+                 elif operator == "!?":
+                     conditional.setdefault("disabled", set()).add(flag)
+ 
+                 continue
+ 
+             if not operator:
+                 if flag not in other_use:
+                     if is_valid_flag(flag) or flag in self.missing_disabled:
+                         tokens.append(x)
+                         enabled_flags.add(flag)
+             elif operator == "-":
+                 if flag not in other_use:
+                     if not is_valid_flag(flag):
+                         if flag in self.missing_enabled:
+                             tokens.append(x)
+                             disabled_flags.add(flag)
+                 else:
+                     tokens.append(x)
+                     disabled_flags.add(flag)
+             elif operator == "?":
+                 if flag not in parent_use or flag in other_use:
+                     continue
+ 
+                 if is_valid_flag(flag) or flag in self.missing_disabled:
+                     tokens.append(x)
+                     conditional.setdefault("enabled", set()).add(flag)
+             elif operator == "=":
+                 if flag in parent_use and flag not in other_use:
+                     if is_valid_flag(flag):
+                         tokens.append(x)
+                         conditional.setdefault("equal", set()).add(flag)
+                     else:
+                         if flag in self.missing_disabled:
+                             tokens.append(x)
+                             conditional.setdefault("equal", set()).add(flag)
+                 elif flag not in parent_use:
+                     if flag not in other_use:
+                         if not is_valid_flag(flag):
+                             if flag in self.missing_enabled:
+                                 tokens.append(x)
+                                 conditional.setdefault("equal", set()).add(flag)
+                     else:
+                         tokens.append(x)
+                         conditional.setdefault("equal", set()).add(flag)
+             elif operator == "!=":
+                 if flag not in parent_use and flag not in other_use:
+                     if is_valid_flag(flag):
+                         tokens.append(x)
+                         conditional.setdefault("not_equal", set()).add(flag)
+                     else:
+                         if flag in self.missing_disabled:
+                             tokens.append(x)
+                             conditional.setdefault("not_equal", set()).add(flag)
+                 elif flag in parent_use:
+                     if flag not in other_use:
+                         if not is_valid_flag(flag):
+                             if flag in self.missing_enabled:
+                                 tokens.append(x)
+                                 conditional.setdefault("not_equal", set()).add(flag)
+                     else:
+                         tokens.append(x)
+                         conditional.setdefault("not_equal", set()).add(flag)
+             elif operator == "!?":
+                 if flag not in parent_use:
+                     if flag not in other_use:
+                         if not is_valid_flag(flag) and flag in self.missing_enabled:
+                             tokens.append(x)
+                             conditional.setdefault("disabled", set()).add(flag)
+                     else:
+                         tokens.append(x)
+                         conditional.setdefault("disabled", set()).add(flag)
+ 
+         return _use_dep(
+             tokens,
+             self._eapi_attrs,
+             enabled_flags=enabled_flags,
+             disabled_flags=disabled_flags,
+             missing_enabled=self.missing_enabled,
+             missing_disabled=self.missing_disabled,
+             conditional=conditional,
+             required=self.required,
+         )
+ 
+     def _eval_qa_conditionals(self, use_mask, use_force):
+         """
+         For repoman, evaluate all possible combinations within the constraints
+         of the given use.force and use.mask settings. The result may seem
+         ambiguous in the sense that the same flag can be in both the enabled
+         and disabled sets, but this is useful within the context of how its
+         intended to be used by repoman. It is assumed that the caller has
+         already ensured that there is no intersection between the given
+         use_mask and use_force sets when necessary.
+         """
+         enabled_flags = set(self.enabled)
+         disabled_flags = set(self.disabled)
+         missing_enabled = self.missing_enabled
+         missing_disabled = self.missing_disabled
+ 
+         tokens = []
+         usedep_re = _get_usedep_re(self._eapi_attrs)
+ 
+         for x in self.tokens:
+             m = usedep_re.match(x)
+ 
+             operator = m.group("prefix") + m.group("suffix")
+             flag = m.group("flag")
+             default = m.group("default")
+             if default is None:
+                 default = ""
+ 
+             if operator == "?":
+                 if flag not in use_mask:
+                     enabled_flags.add(flag)
+                     tokens.append(flag + default)
+             elif operator == "=":
+                 if flag not in use_mask:
+                     enabled_flags.add(flag)
+                     tokens.append(flag + default)
+                 if flag not in use_force:
+                     disabled_flags.add(flag)
+                     tokens.append("-" + flag + default)
+             elif operator == "!=":
+                 if flag not in use_force:
+                     enabled_flags.add(flag)
+                     tokens.append(flag + default)
+                 if flag not in use_mask:
+                     disabled_flags.add(flag)
+                     tokens.append("-" + flag + default)
+             elif operator == "!?":
+                 if flag not in use_force:
+                     disabled_flags.add(flag)
+                     tokens.append("-" + flag + default)
+             else:
+                 tokens.append(x)
+ 
+         return _use_dep(
+             tokens,
+             self._eapi_attrs,
+             enabled_flags=enabled_flags,
+             disabled_flags=disabled_flags,
+             missing_enabled=missing_enabled,
+             missing_disabled=missing_disabled,
+             required=self.required,
+         )
+ 
  
  class Atom(str):
  
diff --cc lib/portage/dep/dep_check.py
index 90f0eefe4,9fccda08b..f75860978
--- a/lib/portage/dep/dep_check.py
+++ b/lib/portage/dep/dep_check.py
@@@ -21,894 -21,942 +21,1002 @@@ from portage.util.digraph import digrap
  from portage.util.SlotObject import SlotObject
  from portage.versions import vercmp
  
- def _expand_new_virtuals(mysplit, edebug, mydbapi, mysettings, myroot="/",
- 	trees=None, use_mask=None, use_force=None, **kwargs):
- 	"""
- 	In order to solve bug #141118, recursively expand new-style virtuals so
- 	as to collapse one or more levels of indirection, generating an expanded
- 	search space. In dep_zapdeps, new-style virtuals will be assigned
- 	zero cost regardless of whether or not they are currently installed. Virtual
- 	blockers are supported but only when the virtual expands to a single
- 	atom because it wouldn't necessarily make sense to block all the components
- 	of a compound virtual.  When more than one new-style virtual is matched,
- 	the matches are sorted from highest to lowest versions and the atom is
- 	expanded to || ( highest match ... lowest match ).
- 
- 	The result is normalized in the same way as use_reduce, having a top-level
- 	conjuction, and no redundant nested lists.
- 	"""
- 	newsplit = []
- 	mytrees = trees[myroot]
- 	portdb = mytrees["porttree"].dbapi
- 	pkg_use_enabled = mytrees.get("pkg_use_enabled")
- 	# Atoms are stored in the graph as (atom, id(atom)) tuples
- 	# since each atom is considered to be a unique entity. For
- 	# example, atoms that appear identical may behave differently
- 	# in USE matching, depending on their unevaluated form. Also,
- 	# specially generated virtual atoms may appear identical while
- 	# having different _orig_atom attributes.
- 	atom_graph = mytrees.get("atom_graph")
- 	parent = mytrees.get("parent")
- 	virt_parent = mytrees.get("virt_parent")
- 	graph_parent = None
- 	if parent is not None:
- 		if virt_parent is not None:
- 			graph_parent = virt_parent
- 			parent = virt_parent
- 		else:
- 			graph_parent = parent
- 	repoman = not mysettings.local_config
- 	if kwargs["use_binaries"]:
- 		portdb = trees[myroot]["bintree"].dbapi
- 	pprovideddict = mysettings.pprovideddict
- 	myuse = kwargs["myuse"]
- 	is_disjunction = mysplit and mysplit[0] == '||'
- 	for x in mysplit:
- 		if x == "||":
- 			newsplit.append(x)
- 			continue
- 		elif isinstance(x, list):
- 			assert x, 'Normalization error, empty conjunction found in %s' % (mysplit,)
- 			if is_disjunction:
- 				assert x[0] != '||', \
- 					'Normalization error, nested disjunction found in %s' % (mysplit,)
- 			else:
- 				assert x[0] == '||', \
- 					'Normalization error, nested conjunction found in %s' % (mysplit,)
- 			x_exp = _expand_new_virtuals(x, edebug, mydbapi,
- 				mysettings, myroot=myroot, trees=trees, use_mask=use_mask,
- 				use_force=use_force, **kwargs)
- 			if is_disjunction:
- 				if len(x_exp) == 1:
- 					x = x_exp[0]
- 					if isinstance(x, list):
- 						# Due to normalization, a conjunction must not be
- 						# nested directly in another conjunction, so this
- 						# must be a disjunction.
- 						assert x and x[0] == '||', \
- 							'Normalization error, nested conjunction found in %s' % (x_exp,)
- 						newsplit.extend(x[1:])
- 					else:
- 						newsplit.append(x)
- 				else:
- 					newsplit.append(x_exp)
- 			else:
- 				newsplit.extend(x_exp)
- 			continue
- 
- 		if not isinstance(x, Atom):
- 			raise ParseError(
- 				_("invalid token: '%s'") % x)
  
- 		if repoman:
- 			x = x._eval_qa_conditionals(use_mask, use_force)
- 
- 		if 'force-multilib' in mysettings.features:
+ def _expand_new_virtuals(
+     mysplit,
+     edebug,
+     mydbapi,
+     mysettings,
+     myroot="/",
+     trees=None,
+     use_mask=None,
+     use_force=None,
+     **kwargs
+ ):
+     """
+     In order to solve bug #141118, recursively expand new-style virtuals so
+     as to collapse one or more levels of indirection, generating an expanded
+     search space. In dep_zapdeps, new-style virtuals will be assigned
+     zero cost regardless of whether or not they are currently installed. Virtual
+     blockers are supported but only when the virtual expands to a single
+     atom because it wouldn't necessarily make sense to block all the components
+     of a compound virtual.  When more than one new-style virtual is matched,
+     the matches are sorted from highest to lowest versions and the atom is
+     expanded to || ( highest match ... lowest match ).
+ 
+     The result is normalized in the same way as use_reduce, having a top-level
+     conjuction, and no redundant nested lists.
+     """
+     newsplit = []
+     mytrees = trees[myroot]
+     portdb = mytrees["porttree"].dbapi
+     pkg_use_enabled = mytrees.get("pkg_use_enabled")
+     # Atoms are stored in the graph as (atom, id(atom)) tuples
+     # since each atom is considered to be a unique entity. For
+     # example, atoms that appear identical may behave differently
+     # in USE matching, depending on their unevaluated form. Also,
+     # specially generated virtual atoms may appear identical while
+     # having different _orig_atom attributes.
+     atom_graph = mytrees.get("atom_graph")
+     parent = mytrees.get("parent")
+     virt_parent = mytrees.get("virt_parent")
+     graph_parent = None
+     if parent is not None:
+         if virt_parent is not None:
+             graph_parent = virt_parent
+             parent = virt_parent
+         else:
+             graph_parent = parent
+     repoman = not mysettings.local_config
+     if kwargs["use_binaries"]:
+         portdb = trees[myroot]["bintree"].dbapi
+     pprovideddict = mysettings.pprovideddict
+     myuse = kwargs["myuse"]
+     is_disjunction = mysplit and mysplit[0] == "||"
+     for x in mysplit:
+         if x == "||":
+             newsplit.append(x)
+             continue
+         elif isinstance(x, list):
+             assert x, "Normalization error, empty conjunction found in %s" % (mysplit,)
+             if is_disjunction:
+                 assert (
+                     x[0] != "||"
+                 ), "Normalization error, nested disjunction found in %s" % (mysplit,)
+             else:
+                 assert (
+                     x[0] == "||"
+                 ), "Normalization error, nested conjunction found in %s" % (mysplit,)
+             x_exp = _expand_new_virtuals(
+                 x,
+                 edebug,
+                 mydbapi,
+                 mysettings,
+                 myroot=myroot,
+                 trees=trees,
+                 use_mask=use_mask,
+                 use_force=use_force,
+                 **kwargs
+             )
+             if is_disjunction:
+                 if len(x_exp) == 1:
+                     x = x_exp[0]
+                     if isinstance(x, list):
+                         # Due to normalization, a conjunction must not be
+                         # nested directly in another conjunction, so this
+                         # must be a disjunction.
+                         assert (
+                             x and x[0] == "||"
+                         ), "Normalization error, nested conjunction found in %s" % (
+                             x_exp,
+                         )
+                         newsplit.extend(x[1:])
+                     else:
+                         newsplit.append(x)
+                 else:
+                     newsplit.append(x_exp)
+             else:
+                 newsplit.extend(x_exp)
+             continue
+ 
+         if not isinstance(x, Atom):
+             raise ParseError(_("invalid token: '%s'") % x)
+ 
+         if repoman:
+             x = x._eval_qa_conditionals(use_mask, use_force)
+ 
++        if 'force-multilib' in mysettings.features:
 +			if not repoman and x.cp not in mysettings.get("NO_AUTO_FLAG", "").split():
 +				multilib_flags = []
 +				for multilib_abis in mysettings.get("MULTILIB_ABIS", '').split():
 +					multilib_flag = 'multilib_abi_' + multilib_abis
 +					if x.unevaluated_atom.use is None or \
 +						x.unevaluated_atom.use.conditional is None or \
 +						multilib_flag not in x.unevaluated_atom.use.conditional.enabled:
 +						multilib_flags.append(multilib_flag + '?')
 +				if multilib_flags:
 +					if x.unevaluated_atom.use is None:
 +						use_tokens = []
 +					else:
 +						use_tokens = list(x.unevaluated_atom.use.tokens)
 +					if 'abi_x86_64' in use_tokens:
 +						use_tokens[use_tokens.index('abi_x86_64')] = 'multilib_abi_amd64'
 +					if 'abi_x86_64(-)' in use_tokens:
 +						use_tokens[use_tokens.index('abi_x86_64(-)')] = 'multilib_abi_amd64(-)'
 +					if 'abi_x86_64(-)?' in use_tokens:
 +						use_tokens[use_tokens.index('abi_x86_64(-)?')] = 'multilib_abi_amd64(-)?'
 +					if 'abi_x86_32' in use_tokens:
 +						use_tokens[use_tokens.index('abi_x86_32')] = 'multilib_abi_x86'
 +					if 'abi_x86_32(-)' in use_tokens:
 +						use_tokens[use_tokens.index('abi_x86_32(-)')] = 'multilib_abi_x86(-)'
 +					if 'abi_x86_32(-)?' in use_tokens:
 +						use_tokens[use_tokens.index('abi_x86_32(-)?')] = 'multilib_abi_x86(-)?'
 +					use_tokens.extend(multilib_flags)
 +					x = Atom(x.unevaluated_atom.without_use +
 +						"[%s]" % (",".join(use_tokens)))
 +					x = x.evaluate_conditionals(myuse)
 +			if not repoman and x.cp in mysettings.get("NO_AUTO_FLAG", "").split():
 +				if x.unevaluated_atom.use is None:
 +					use_tokens = []
 +				else:
 +					use_tokens = list(x.unevaluated_atom.use.tokens)
 +				if 'abi_x86_64' in use_tokens:
 +					use_tokens.remove('abi_x86_64')
 +				if 'abi_x86_64(-)' in use_tokens:
 +					use_tokens.remove('abi_x86_64(-)')
 +				if 'abi_x86_64(-)?' in use_tokens:
 +					use_tokens.remove('abi_x86_64(-)?')
 +				if 'abi_x86_32' in use_tokens:
 +					use_tokens.remove('abi_x86_32')
 +				if 'abi_x86_32(-)' in use_tokens:
 +					use_tokens.remove('abi_x86_32(-)')
 +				if 'abi_x86_32(-)?' in use_tokens:
 +					use_tokens.remove('abi_x86_32(-)?')
 +				if use_tokens:
 +					x = Atom(x.unevaluated_atom.without_use +
 +						"[%s]" % (",".join(use_tokens)))
 +				else:
 +					x = x.unevaluated_atom.without_use
 +				x = x.evaluate_conditionals(myuse)
 +		mykey = x.cp
 +		if not mykey.startswith("virtual/"):
 +			newsplit.append(x)
 +			if atom_graph is not None:
 +				atom_graph.add((x, id(x)), graph_parent)
 +			continue
 +
- 		if x.blocker:
- 			# Virtual blockers are no longer expanded here since
- 			# the un-expanded virtual atom is more useful for
- 			# maintaining a cache of blocker atoms.
- 			newsplit.append(x)
- 			if atom_graph is not None:
- 				atom_graph.add((x, id(x)), graph_parent)
- 			continue
- 
- 		if repoman or not hasattr(portdb, 'match_pkgs') or \
- 			pkg_use_enabled is None:
- 			if portdb.cp_list(x.cp):
- 				newsplit.append(x)
- 			else:
- 				a = []
- 				myvartree = mytrees.get("vartree")
- 				if myvartree is not None:
- 					mysettings._populate_treeVirtuals_if_needed(myvartree)
- 				mychoices = mysettings.getvirtuals().get(mykey, [])
- 				for y in mychoices:
- 					a.append(Atom(x.replace(x.cp, y.cp, 1)))
- 				if not a:
- 					newsplit.append(x)
- 				elif is_disjunction:
- 					newsplit.extend(a)
- 				elif len(a) == 1:
- 					newsplit.append(a[0])
- 				else:
- 					newsplit.append(['||'] + a)
- 			continue
- 
- 		pkgs = []
- 		# Ignore USE deps here, since otherwise we might not
- 		# get any matches. Choices with correct USE settings
- 		# will be preferred in dep_zapdeps().
- 		matches = portdb.match_pkgs(x.without_use)
- 		# Use descending order to prefer higher versions.
- 		matches.reverse()
- 		for pkg in matches:
- 			# only use new-style matches
- 			if pkg.cp.startswith("virtual/"):
- 				pkgs.append(pkg)
- 
- 		mychoices = []
- 		if not pkgs and not portdb.cp_list(x.cp):
- 			myvartree = mytrees.get("vartree")
- 			if myvartree is not None:
- 				mysettings._populate_treeVirtuals_if_needed(myvartree)
- 			mychoices = mysettings.getvirtuals().get(mykey, [])
- 
- 		if not (pkgs or mychoices):
- 			# This one couldn't be expanded as a new-style virtual.  Old-style
- 			# virtuals have already been expanded by dep_virtual, so this one
- 			# is unavailable and dep_zapdeps will identify it as such.  The
- 			# atom is not eliminated here since it may still represent a
- 			# dependency that needs to be satisfied.
- 			newsplit.append(x)
- 			if atom_graph is not None:
- 				atom_graph.add((x, id(x)), graph_parent)
- 			continue
- 
- 		a = []
- 		for pkg in pkgs:
- 			virt_atom = '=' + pkg.cpv
- 			if x.unevaluated_atom.use:
- 				virt_atom += str(x.unevaluated_atom.use)
- 				virt_atom = Atom(virt_atom)
- 				if parent is None:
- 					if myuse is None:
- 						virt_atom = virt_atom.evaluate_conditionals(
- 							mysettings.get("PORTAGE_USE", "").split())
- 					else:
- 						virt_atom = virt_atom.evaluate_conditionals(myuse)
- 				else:
- 					virt_atom = virt_atom.evaluate_conditionals(
- 						pkg_use_enabled(parent))
- 			else:
- 				virt_atom = Atom(virt_atom)
- 
- 			# Allow the depgraph to map this atom back to the
- 			# original, in order to avoid distortion in places
- 			# like display or conflict resolution code.
- 			virt_atom.__dict__['_orig_atom'] = x
- 
- 			# According to GLEP 37, RDEPEND is the only dependency
- 			# type that is valid for new-style virtuals. Repoman
- 			# should enforce this.
- 			depstring = pkg._metadata['RDEPEND']
- 			pkg_kwargs = kwargs.copy()
- 			pkg_kwargs["myuse"] = pkg_use_enabled(pkg)
- 			if edebug:
- 				writemsg_level(_("Virtual Parent:      %s\n") \
- 					% (pkg,), noiselevel=-1, level=logging.DEBUG)
- 				writemsg_level(_("Virtual Depstring:   %s\n") \
- 					% (depstring,), noiselevel=-1, level=logging.DEBUG)
- 
- 			# Set EAPI used for validation in dep_check() recursion.
- 			mytrees["virt_parent"] = pkg
- 
- 			try:
- 				mycheck = dep_check(depstring, mydbapi, mysettings,
- 					myroot=myroot, trees=trees, **pkg_kwargs)
- 			finally:
- 				# Restore previous EAPI after recursion.
- 				if virt_parent is not None:
- 					mytrees["virt_parent"] = virt_parent
- 				else:
- 					del mytrees["virt_parent"]
- 
- 			if not mycheck[0]:
- 				raise ParseError("%s: %s '%s'" % \
- 					(pkg, mycheck[1], depstring))
- 
- 			# Replace the original atom "x" with "virt_atom" which refers
- 			# to the specific version of the virtual whose deps we're
- 			# expanding. The virt_atom._orig_atom attribute is used
- 			# by depgraph to map virt_atom back to the original atom.
- 			# We specifically exclude the original atom "x" from the
- 			# the expanded output here, since otherwise it could trigger
- 			# incorrect dep_zapdeps behavior (see bug #597752).
- 			mycheck[1].append(virt_atom)
- 			a.append(mycheck[1])
- 			if atom_graph is not None:
- 				virt_atom_node = (virt_atom, id(virt_atom))
- 				atom_graph.add(virt_atom_node, graph_parent)
- 				atom_graph.add(pkg, virt_atom_node)
- 				atom_graph.add((x, id(x)), graph_parent)
- 
- 		if not a and mychoices:
- 			# Check for a virtual package.provided match.
- 			for y in mychoices:
- 				new_atom = Atom(x.replace(x.cp, y.cp, 1))
- 				if match_from_list(new_atom,
- 					pprovideddict.get(new_atom.cp, [])):
- 					a.append(new_atom)
- 					if atom_graph is not None:
- 						atom_graph.add((new_atom, id(new_atom)), graph_parent)
- 
- 		if not a:
- 			newsplit.append(x)
- 			if atom_graph is not None:
- 				atom_graph.add((x, id(x)), graph_parent)
- 		elif is_disjunction:
- 			newsplit.extend(a)
- 		elif len(a) == 1:
- 			newsplit.extend(a[0])
- 		else:
- 			newsplit.append(['||'] + a)
- 
- 	# For consistency with related functions like use_reduce, always
- 	# normalize the result to have a top-level conjunction.
- 	if is_disjunction:
- 		newsplit = [newsplit]
+         mykey = x.cp
+         if not mykey.startswith("virtual/"):
+             newsplit.append(x)
+             if atom_graph is not None:
+                 atom_graph.add((x, id(x)), graph_parent)
+             continue
+ 
+         if x.blocker:
+             # Virtual blockers are no longer expanded here since
+             # the un-expanded virtual atom is more useful for
+             # maintaining a cache of blocker atoms.
+             newsplit.append(x)
+             if atom_graph is not None:
+                 atom_graph.add((x, id(x)), graph_parent)
+             continue
+ 
+         if repoman or not hasattr(portdb, "match_pkgs") or pkg_use_enabled is None:
+             if portdb.cp_list(x.cp):
+                 newsplit.append(x)
+             else:
+                 a = []
+                 myvartree = mytrees.get("vartree")
+                 if myvartree is not None:
+                     mysettings._populate_treeVirtuals_if_needed(myvartree)
+                 mychoices = mysettings.getvirtuals().get(mykey, [])
+                 for y in mychoices:
+                     a.append(Atom(x.replace(x.cp, y.cp, 1)))
+                 if not a:
+                     newsplit.append(x)
+                 elif is_disjunction:
+                     newsplit.extend(a)
+                 elif len(a) == 1:
+                     newsplit.append(a[0])
+                 else:
+                     newsplit.append(["||"] + a)
+             continue
+ 
+         pkgs = []
+         # Ignore USE deps here, since otherwise we might not
+         # get any matches. Choices with correct USE settings
+         # will be preferred in dep_zapdeps().
+         matches = portdb.match_pkgs(x.without_use)
+         # Use descending order to prefer higher versions.
+         matches.reverse()
+         for pkg in matches:
+             # only use new-style matches
+             if pkg.cp.startswith("virtual/"):
+                 pkgs.append(pkg)
+ 
+         mychoices = []
+         if not pkgs and not portdb.cp_list(x.cp):
+             myvartree = mytrees.get("vartree")
+             if myvartree is not None:
+                 mysettings._populate_treeVirtuals_if_needed(myvartree)
+             mychoices = mysettings.getvirtuals().get(mykey, [])
+ 
+         if not (pkgs or mychoices):
+             # This one couldn't be expanded as a new-style virtual.  Old-style
+             # virtuals have already been expanded by dep_virtual, so this one
+             # is unavailable and dep_zapdeps will identify it as such.  The
+             # atom is not eliminated here since it may still represent a
+             # dependency that needs to be satisfied.
+             newsplit.append(x)
+             if atom_graph is not None:
+                 atom_graph.add((x, id(x)), graph_parent)
+             continue
+ 
+         a = []
+         for pkg in pkgs:
+             virt_atom = "=" + pkg.cpv
+             if x.unevaluated_atom.use:
+                 virt_atom += str(x.unevaluated_atom.use)
+                 virt_atom = Atom(virt_atom)
+                 if parent is None:
+                     if myuse is None:
+                         virt_atom = virt_atom.evaluate_conditionals(
+                             mysettings.get("PORTAGE_USE", "").split()
+                         )
+                     else:
+                         virt_atom = virt_atom.evaluate_conditionals(myuse)
+                 else:
+                     virt_atom = virt_atom.evaluate_conditionals(pkg_use_enabled(parent))
+             else:
+                 virt_atom = Atom(virt_atom)
+ 
+             # Allow the depgraph to map this atom back to the
+             # original, in order to avoid distortion in places
+             # like display or conflict resolution code.
+             virt_atom.__dict__["_orig_atom"] = x
+ 
+             # According to GLEP 37, RDEPEND is the only dependency
+             # type that is valid for new-style virtuals. Repoman
+             # should enforce this.
+             depstring = pkg._metadata["RDEPEND"]
+             pkg_kwargs = kwargs.copy()
+             pkg_kwargs["myuse"] = pkg_use_enabled(pkg)
+             if edebug:
+                 writemsg_level(
+                     _("Virtual Parent:      %s\n") % (pkg,),
+                     noiselevel=-1,
+                     level=logging.DEBUG,
+                 )
+                 writemsg_level(
+                     _("Virtual Depstring:   %s\n") % (depstring,),
+                     noiselevel=-1,
+                     level=logging.DEBUG,
+                 )
+ 
+             # Set EAPI used for validation in dep_check() recursion.
+             mytrees["virt_parent"] = pkg
+ 
+             try:
+                 mycheck = dep_check(
+                     depstring,
+                     mydbapi,
+                     mysettings,
+                     myroot=myroot,
+                     trees=trees,
+                     **pkg_kwargs
+                 )
+             finally:
+                 # Restore previous EAPI after recursion.
+                 if virt_parent is not None:
+                     mytrees["virt_parent"] = virt_parent
+                 else:
+                     del mytrees["virt_parent"]
+ 
+             if not mycheck[0]:
+                 raise ParseError("%s: %s '%s'" % (pkg, mycheck[1], depstring))
+ 
+             # Replace the original atom "x" with "virt_atom" which refers
+             # to the specific version of the virtual whose deps we're
+             # expanding. The virt_atom._orig_atom attribute is used
+             # by depgraph to map virt_atom back to the original atom.
+             # We specifically exclude the original atom "x" from the
+             # the expanded output here, since otherwise it could trigger
+             # incorrect dep_zapdeps behavior (see bug #597752).
+             mycheck[1].append(virt_atom)
+             a.append(mycheck[1])
+             if atom_graph is not None:
+                 virt_atom_node = (virt_atom, id(virt_atom))
+                 atom_graph.add(virt_atom_node, graph_parent)
+                 atom_graph.add(pkg, virt_atom_node)
+                 atom_graph.add((x, id(x)), graph_parent)
+ 
+         if not a and mychoices:
+             # Check for a virtual package.provided match.
+             for y in mychoices:
+                 new_atom = Atom(x.replace(x.cp, y.cp, 1))
+                 if match_from_list(new_atom, pprovideddict.get(new_atom.cp, [])):
+                     a.append(new_atom)
+                     if atom_graph is not None:
+                         atom_graph.add((new_atom, id(new_atom)), graph_parent)
+ 
+         if not a:
+             newsplit.append(x)
+             if atom_graph is not None:
+                 atom_graph.add((x, id(x)), graph_parent)
+         elif is_disjunction:
+             newsplit.extend(a)
+         elif len(a) == 1:
+             newsplit.extend(a[0])
+         else:
+             newsplit.append(["||"] + a)
+ 
+     # For consistency with related functions like use_reduce, always
+     # normalize the result to have a top-level conjunction.
+     if is_disjunction:
+         newsplit = [newsplit]
+ 
+     return newsplit
  
- 	return newsplit
  
  def dep_eval(deplist):
- 	if not deplist:
- 		return 1
- 	if deplist[0]=="||":
- 		#or list; we just need one "1"
- 		for x in deplist[1:]:
- 			if isinstance(x, list):
- 				if dep_eval(x)==1:
- 					return 1
- 			elif x==1:
- 					return 1
- 		#XXX: unless there's no available atoms in the list
- 		#in which case we need to assume that everything is
- 		#okay as some ebuilds are relying on an old bug.
- 		if len(deplist) == 1:
- 			return 1
- 		return 0
- 	for x in deplist:
- 		if isinstance(x, list):
- 			if dep_eval(x)==0:
- 				return 0
- 		elif x==0 or x==2:
- 			return 0
- 	return 1
+     if not deplist:
+         return 1
+     if deplist[0] == "||":
+         # or list; we just need one "1"
+         for x in deplist[1:]:
+             if isinstance(x, list):
+                 if dep_eval(x) == 1:
+                     return 1
+             elif x == 1:
+                 return 1
+         # XXX: unless there's no available atoms in the list
+         # in which case we need to assume that everything is
+         # okay as some ebuilds are relying on an old bug.
+         if len(deplist) == 1:
+             return 1
+         return 0
+     for x in deplist:
+         if isinstance(x, list):
+             if dep_eval(x) == 0:
+                 return 0
+         elif x == 0 or x == 2:
+             return 0
+     return 1
  
- class _dep_choice(SlotObject):
- 	__slots__ = ('atoms', 'slot_map', 'cp_map', 'all_available',
- 		'all_installed_slots', 'new_slot_count', 'want_update', 'all_in_graph')
- 
- def dep_zapdeps(unreduced, reduced, myroot, use_binaries=0, trees=None,
- 	minimize_slots=False):
- 	"""
- 	Takes an unreduced and reduced deplist and removes satisfied dependencies.
- 	Returned deplist contains steps that must be taken to satisfy dependencies.
- 	"""
- 	if trees is None:
- 		trees = portage.db
- 	writemsg("ZapDeps -- %s\n" % (use_binaries), 2)
- 	if not reduced or unreduced == ["||"] or dep_eval(reduced):
- 		return []
- 
- 	if unreduced[0] != "||":
- 		unresolved = []
- 		for x, satisfied in zip(unreduced, reduced):
- 			if isinstance(x, list):
- 				unresolved += dep_zapdeps(x, satisfied, myroot,
- 					use_binaries=use_binaries, trees=trees,
- 					minimize_slots=minimize_slots)
- 			elif not satisfied:
- 				unresolved.append(x)
- 		return unresolved
- 
- 	# We're at a ( || atom ... ) type level and need to make a choice
- 	deps = unreduced[1:]
- 	satisfieds = reduced[1:]
- 
- 	# Our preference order is for an the first item that:
- 	# a) contains all unmasked packages with the same key as installed packages
- 	# b) contains all unmasked packages
- 	# c) contains masked installed packages
- 	# d) is the first item
- 
- 	preferred_in_graph = []
- 	preferred_installed = preferred_in_graph
- 	preferred_any_slot = preferred_in_graph
- 	preferred_non_installed = []
- 	unsat_use_in_graph = []
- 	unsat_use_installed = []
- 	unsat_use_non_installed = []
- 	other_installed = []
- 	other_installed_some = []
- 	other_installed_any_slot = []
- 	other = []
- 
- 	# unsat_use_* must come after preferred_non_installed
- 	# for correct ordering in cases like || ( foo[a] foo[b] ).
- 	choice_bins = (
- 		preferred_in_graph,
- 		preferred_non_installed,
- 		unsat_use_in_graph,
- 		unsat_use_installed,
- 		unsat_use_non_installed,
- 		other_installed,
- 		other_installed_some,
- 		other_installed_any_slot,
- 		other,
- 	)
- 
- 	# Alias the trees we'll be checking availability against
- 	parent   = trees[myroot].get("parent")
- 	virt_parent = trees[myroot].get("virt_parent")
- 	priority = trees[myroot].get("priority")
- 	graph_db = trees[myroot].get("graph_db")
- 	graph    = trees[myroot].get("graph")
- 	pkg_use_enabled = trees[myroot].get("pkg_use_enabled")
- 	graph_interface = trees[myroot].get("graph_interface")
- 	downgrade_probe = trees[myroot].get("downgrade_probe")
- 	circular_dependency = trees[myroot].get("circular_dependency")
- 	vardb = None
- 	if "vartree" in trees[myroot]:
- 		vardb = trees[myroot]["vartree"].dbapi
- 	if use_binaries:
- 		mydbapi = trees[myroot]["bintree"].dbapi
- 	else:
- 		mydbapi = trees[myroot]["porttree"].dbapi
- 
- 	try:
- 		mydbapi_match_pkgs = mydbapi.match_pkgs
- 	except AttributeError:
- 		def mydbapi_match_pkgs(atom):
- 			return [mydbapi._pkg_str(cpv, atom.repo)
- 				for cpv in mydbapi.match(atom)]
- 
- 	# Sort the deps into installed, not installed but already
- 	# in the graph and other, not installed and not in the graph
- 	# and other, with values of [[required_atom], availablility]
- 	for x, satisfied in zip(deps, satisfieds):
- 		if isinstance(x, list):
- 			atoms = dep_zapdeps(x, satisfied, myroot,
- 				use_binaries=use_binaries, trees=trees,
- 				minimize_slots=minimize_slots)
- 		else:
- 			atoms = [x]
- 		if vardb is None:
- 			# When called by repoman, we can simply return the first choice
- 			# because dep_eval() handles preference selection.
- 			return atoms
- 
- 		all_available = True
- 		all_use_satisfied = True
- 		all_use_unmasked = True
- 		conflict_downgrade = False
- 		installed_downgrade = False
- 		slot_atoms = collections.defaultdict(list)
- 		slot_map = {}
- 		cp_map = {}
- 		for atom in atoms:
- 			if atom.blocker:
- 				continue
- 
- 			# It's not a downgrade if parent is replacing child.
- 			replacing = (parent and graph_interface and
- 				graph_interface.will_replace_child(parent, myroot, atom))
- 			# Ignore USE dependencies here since we don't want USE
- 			# settings to adversely affect || preference evaluation.
- 			avail_pkg = mydbapi_match_pkgs(atom.without_use)
- 			if not avail_pkg and replacing:
- 				avail_pkg = [replacing]
- 			if avail_pkg:
- 				avail_pkg = avail_pkg[-1] # highest (ascending order)
- 				avail_slot = Atom("%s:%s" % (atom.cp, avail_pkg.slot))
- 			if not avail_pkg:
- 				all_available = False
- 				all_use_satisfied = False
- 				break
- 
- 			if not replacing and graph_db is not None and downgrade_probe is not None:
- 				slot_matches = graph_db.match_pkgs(avail_slot)
- 				if (len(slot_matches) > 1 and
- 					avail_pkg < slot_matches[-1] and
- 					not downgrade_probe(avail_pkg)):
- 					# If a downgrade is not desirable, then avoid a
- 					# choice that pulls in a lower version involved
- 					# in a slot conflict (bug #531656).
- 					conflict_downgrade = True
- 
- 			if atom.use:
- 				avail_pkg_use = mydbapi_match_pkgs(atom)
- 				if not avail_pkg_use:
- 					all_use_satisfied = False
- 
- 					if pkg_use_enabled is not None:
- 						# Check which USE flags cause the match to fail,
- 						# so we can prioritize choices that do not
- 						# require changes to use.mask or use.force
- 						# (see bug #515584).
- 						violated_atom = atom.violated_conditionals(
- 							pkg_use_enabled(avail_pkg),
- 							avail_pkg.iuse.is_valid_flag)
- 
- 						# Note that violated_atom.use can be None here,
- 						# since evaluation can collapse conditional USE
- 						# deps that cause the match to fail due to
- 						# missing IUSE (match uses atom.unevaluated_atom
- 						# to detect such missing IUSE).
- 						if violated_atom.use is not None:
- 							for flag in violated_atom.use.enabled:
- 								if flag in avail_pkg.use.mask:
- 									all_use_unmasked = False
- 									break
- 							else:
- 								for flag in violated_atom.use.disabled:
- 									if flag in avail_pkg.use.force and \
- 										flag not in avail_pkg.use.mask:
- 										all_use_unmasked = False
- 										break
- 				else:
- 					# highest (ascending order)
- 					avail_pkg_use = avail_pkg_use[-1]
- 					if avail_pkg_use != avail_pkg:
- 						avail_pkg = avail_pkg_use
- 					avail_slot = Atom("%s:%s" % (atom.cp, avail_pkg.slot))
- 
- 			if not replacing and downgrade_probe is not None and graph is not None:
- 				highest_in_slot = mydbapi_match_pkgs(avail_slot)
- 				highest_in_slot = (highest_in_slot[-1]
- 					if highest_in_slot else None)
- 				if (avail_pkg and highest_in_slot and
- 					avail_pkg < highest_in_slot and
- 					not downgrade_probe(avail_pkg) and
- 					(highest_in_slot.installed or
- 					highest_in_slot in graph)):
- 					installed_downgrade = True
- 
- 			slot_map[avail_slot] = avail_pkg
- 			slot_atoms[avail_slot].append(atom)
- 			highest_cpv = cp_map.get(avail_pkg.cp)
- 			all_match_current = None
- 			all_match_previous = None
- 			if (highest_cpv is not None and
- 				highest_cpv.slot == avail_pkg.slot):
- 				# If possible, make the package selection internally
- 				# consistent by choosing a package that satisfies all
- 				# atoms which match a package in the same slot. Later on,
- 				# the package version chosen here is used in the
- 				# has_upgrade/has_downgrade logic to prefer choices with
- 				# upgrades, and a package choice that is not internally
- 				# consistent will lead the has_upgrade/has_downgrade logic
- 				# to produce invalid results (see bug 600346).
- 				all_match_current = all(a.match(avail_pkg)
- 					for a in slot_atoms[avail_slot])
- 				all_match_previous = all(a.match(highest_cpv)
- 					for a in slot_atoms[avail_slot])
- 				if all_match_previous and not all_match_current:
- 					continue
- 
- 			current_higher = (highest_cpv is None or
- 				vercmp(avail_pkg.version, highest_cpv.version) > 0)
- 
- 			if current_higher or (all_match_current and not all_match_previous):
- 				cp_map[avail_pkg.cp] = avail_pkg
- 
- 		want_update = False
- 		if graph_interface is None or graph_interface.removal_action:
- 			new_slot_count = len(slot_map)
- 		else:
- 			new_slot_count = 0
- 			for slot_atom, avail_pkg in slot_map.items():
- 				if parent is not None and graph_interface.want_update_pkg(parent, avail_pkg):
- 					want_update = True
- 				if (not slot_atom.cp.startswith("virtual/")
- 					and not graph_db.match_pkgs(slot_atom)):
- 					new_slot_count += 1
- 
- 		this_choice = _dep_choice(atoms=atoms, slot_map=slot_map,
- 			cp_map=cp_map, all_available=all_available,
- 			all_installed_slots=False,
- 			new_slot_count=new_slot_count,
- 			all_in_graph=False,
- 			want_update=want_update)
- 		if all_available:
- 			# The "all installed" criterion is not version or slot specific.
- 			# If any version of a package is already in the graph then we
- 			# assume that it is preferred over other possible packages choices.
- 			all_installed = True
- 			for atom in set(Atom(atom.cp) for atom in atoms \
- 				if not atom.blocker):
- 				# New-style virtuals have zero cost to install.
- 				if not vardb.match(atom) and not atom.startswith("virtual/"):
- 					all_installed = False
- 					break
- 			all_installed_slots = False
- 			if all_installed:
- 				all_installed_slots = True
- 				for slot_atom in slot_map:
- 					# New-style virtuals have zero cost to install.
- 					if not vardb.match(slot_atom) and \
- 						not slot_atom.startswith("virtual/"):
- 						all_installed_slots = False
- 						break
- 			this_choice.all_installed_slots = all_installed_slots
- 			if graph_db is None:
- 				if all_use_satisfied:
- 					if all_installed:
- 						if all_installed_slots:
- 							preferred_installed.append(this_choice)
- 						else:
- 							preferred_any_slot.append(this_choice)
- 					else:
- 						preferred_non_installed.append(this_choice)
- 				else:
- 					if not all_use_unmasked:
- 						other.append(this_choice)
- 					elif all_installed_slots:
- 						unsat_use_installed.append(this_choice)
- 					else:
- 						unsat_use_non_installed.append(this_choice)
- 			elif conflict_downgrade or installed_downgrade:
- 				other.append(this_choice)
- 			else:
- 				all_in_graph = True
- 				for atom in atoms:
- 					# New-style virtuals have zero cost to install.
- 					if atom.blocker or atom.cp.startswith("virtual/"):
- 						continue
- 					# We check if the matched package has actually been
- 					# added to the digraph, in order to distinguish between
- 					# those packages and installed packages that may need
- 					# to be uninstalled in order to resolve blockers.
- 					if not any(pkg in graph for pkg in
- 						graph_db.match_pkgs(atom)):
- 						all_in_graph = False
- 						break
- 				this_choice.all_in_graph = all_in_graph
- 
- 				circular_atom = None
- 				if parent and parent.onlydeps:
- 						# Check if the atom would result in a direct circular
- 						# dependency and avoid that for --onlydeps arguments
- 						# since it can defeat the purpose of --onlydeps.
- 						# This check should only be used for --onlydeps
- 						# arguments, since it can interfere with circular
- 						# dependency backtracking choices, causing the test
- 						# case for bug 756961 to fail.
- 						cpv_slot_list = [parent]
- 						for atom in atoms:
- 							if atom.blocker:
- 								continue
- 							if vardb.match(atom):
- 								# If the atom is satisfied by an installed
- 								# version then it's not a circular dep.
- 								continue
- 							if atom.cp != parent.cp:
- 								continue
- 							if match_from_list(atom, cpv_slot_list):
- 								circular_atom = atom
- 								break
- 				if circular_atom is None and circular_dependency is not None:
- 					for circular_child in itertools.chain(
- 								circular_dependency.get(parent, []),
- 								circular_dependency.get(virt_parent, [])):
- 								for atom in atoms:
- 									if not atom.blocker and atom.match(circular_child):
- 										circular_atom = atom
- 										break
- 								if circular_atom is not None:
- 									break
- 
- 				if circular_atom is not None:
- 					other.append(this_choice)
- 				else:
- 					if all_use_satisfied:
- 						if all_in_graph:
- 							preferred_in_graph.append(this_choice)
- 						elif all_installed:
- 							if all_installed_slots:
- 								preferred_installed.append(this_choice)
- 							else:
- 								preferred_any_slot.append(this_choice)
- 						else:
- 							preferred_non_installed.append(this_choice)
- 					else:
- 						if not all_use_unmasked:
- 							other.append(this_choice)
- 						elif all_in_graph:
- 							unsat_use_in_graph.append(this_choice)
- 						elif all_installed_slots:
- 							unsat_use_installed.append(this_choice)
- 						else:
- 							unsat_use_non_installed.append(this_choice)
- 		else:
- 			all_installed = True
- 			some_installed = False
- 			for atom in atoms:
- 				if not atom.blocker:
- 					if vardb.match(atom):
- 						some_installed = True
- 					else:
- 						all_installed = False
- 
- 			if all_installed:
- 				this_choice.all_installed_slots = True
- 				other_installed.append(this_choice)
- 			elif some_installed:
- 				other_installed_some.append(this_choice)
- 
- 			# Use Atom(atom.cp) for a somewhat "fuzzy" match, since
- 			# the whole atom may be too specific. For example, see
- 			# bug #522652, where using the whole atom leads to an
- 			# unsatisfiable choice.
- 			elif any(vardb.match(Atom(atom.cp)) for atom in atoms
- 				if not atom.blocker):
- 				other_installed_any_slot.append(this_choice)
- 			else:
- 				other.append(this_choice)
- 
- 	# Prefer choices which contain upgrades to higher slots. This helps
- 	# for deps such as || ( foo:1 foo:2 ), where we want to prefer the
- 	# atom which matches the higher version rather than the atom furthest
- 	# to the left. Sorting is done separately for each of choice_bins, so
- 	# as not to interfere with the ordering of the bins. Because of the
- 	# bin separation, the main function of this code is to allow
- 	# --depclean to remove old slots (rather than to pull in new slots).
- 	for choices in choice_bins:
- 		if len(choices) < 2:
- 			continue
  
- 		if minimize_slots:
- 			# Prefer choices having fewer new slots. When used with DNF form,
- 			# this can eliminate unecessary packages that depclean would
- 			# ultimately eliminate (see bug 632026). Only use this behavior
- 			# when deemed necessary by the caller, since this will discard the
- 			# order specified in the ebuild, and the preferences specified
- 			# there can serve as a crucial sources of guidance (see bug 645002).
- 
- 			# NOTE: Under some conditions, new_slot_count value may have some
- 			# variance from one calculation to the next because it depends on
- 			# the order that packages are added to the graph. This variance can
- 			# contribute to outcomes that appear to be random. Meanwhile,
- 			# the order specified in the ebuild is without variance, so it
- 			# does not have this problem.
- 			choices.sort(key=operator.attrgetter('new_slot_count'))
- 
- 		for choice_1 in choices[1:]:
- 			cps = set(choice_1.cp_map)
- 			for choice_2 in choices:
- 				if choice_1 is choice_2:
- 					# choice_1 will not be promoted, so move on
- 					break
- 				if (
- 					# Prefer choices where all_installed_slots is True, except
- 					# in cases where we want to upgrade to a new slot as in
- 					# bug 706278. Don't compare new_slot_count here since that
- 					# would aggressively override the preference order defined
- 					# in the ebuild, breaking the test case for bug 645002.
- 					(choice_1.all_installed_slots and
- 					not choice_2.all_installed_slots and
- 					not choice_2.want_update)
- 				):
- 					# promote choice_1 in front of choice_2
- 					choices.remove(choice_1)
- 					index_2 = choices.index(choice_2)
- 					choices.insert(index_2, choice_1)
- 					break
- 
- 				intersecting_cps = cps.intersection(choice_2.cp_map)
- 				has_upgrade = False
- 				has_downgrade = False
- 				for cp in intersecting_cps:
- 					version_1 = choice_1.cp_map[cp]
- 					version_2 = choice_2.cp_map[cp]
- 					difference = vercmp(version_1.version, version_2.version)
- 					if difference != 0:
- 						if difference > 0:
- 							has_upgrade = True
- 						else:
- 							has_downgrade = True
- 
- 				if (
- 					# Prefer upgrades.
- 					(has_upgrade and not has_downgrade)
- 
- 					# Prefer choices where all packages have been pulled into
- 					# the graph, except for choices that eliminate upgrades.
- 					or (choice_1.all_in_graph and not choice_2.all_in_graph and
- 					not (has_downgrade and not has_upgrade))
- 				):
- 					# promote choice_1 in front of choice_2
- 					choices.remove(choice_1)
- 					index_2 = choices.index(choice_2)
- 					choices.insert(index_2, choice_1)
- 					break
- 
- 	for allow_masked in (False, True):
- 		for choices in choice_bins:
- 			for choice in choices:
- 				if choice.all_available or allow_masked:
- 					return choice.atoms
- 
- 	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):
- 	"""
- 	Takes a depend string, parses it, and selects atoms.
- 	The myroot parameter is unused (use mysettings['EROOT'] instead).
- 	"""
- 	myroot = mysettings['EROOT']
- 	edebug = mysettings.get("PORTAGE_DEBUG", None) == "1"
- 	#check_config_instance(mysettings)
- 	if trees is None:
- 		trees = globals()["db"]
- 	if use=="yes":
- 		if myuse is None:
- 			#default behavior
- 			myusesplit = mysettings["PORTAGE_USE"].split()
- 		else:
- 			myusesplit = myuse
- 			# We've been given useflags to use.
- 			#print "USE FLAGS PASSED IN."
- 			#print myuse
- 			#if "bindist" in myusesplit:
- 			#	print "BINDIST is set!"
- 			#else:
- 			#	print "BINDIST NOT set."
- 	else:
- 		#we are being run by autouse(), don't consult USE vars yet.
- 		# WE ALSO CANNOT USE SETTINGS
- 		myusesplit=[]
- 
- 	mymasks = set()
- 	useforce = set()
- 	if use == "all":
- 		# This is only for repoman, in order to constrain the use_reduce
- 		# matchall behavior to account for profile use.mask/force. The
- 		# ARCH/archlist code here may be redundant, since the profile
- 		# really should be handling ARCH masking/forcing itself.
- 		arch = mysettings.get("ARCH")
- 		mymasks.update(mysettings.usemask)
- 		mymasks.update(mysettings.archlist())
- 		if arch:
- 			mymasks.discard(arch)
- 			useforce.add(arch)
- 		useforce.update(mysettings.useforce)
- 		useforce.difference_update(mymasks)
- 
- 	# eapi code borrowed from _expand_new_virtuals()
- 	mytrees = trees[myroot]
- 	parent = mytrees.get("parent")
- 	virt_parent = mytrees.get("virt_parent")
- 	current_parent = None
- 	eapi = None
- 	if parent is not None:
- 		if virt_parent is not None:
- 			current_parent = virt_parent
- 		else:
- 			current_parent = parent
- 
- 	if current_parent is not None:
- 		# Don't pass the eapi argument to use_reduce() for installed packages
- 		# since previous validation will have already marked them as invalid
- 		# when necessary and now we're more interested in evaluating
- 		# dependencies so that things like --depclean work as well as possible
- 		# in spite of partial invalidity.
- 		if not current_parent.installed:
- 			eapi = current_parent.eapi
- 
- 	if isinstance(depstring, list):
- 		mysplit = depstring
- 	else:
- 		try:
- 			mysplit = use_reduce(depstring, uselist=myusesplit,
- 				masklist=mymasks, matchall=(use=="all"), excludeall=useforce,
- 				opconvert=True, token_class=Atom, eapi=eapi)
- 		except InvalidDependString as e:
- 			return [0, "%s" % (e,)]
- 
- 	if mysplit == []:
- 		#dependencies were reduced to nothing
- 		return [1,[]]
- 
- 	# Recursively expand new-style virtuals so as to
- 	# collapse one or more levels of indirection.
- 	try:
- 		mysplit = _expand_new_virtuals(mysplit, edebug, mydbapi, mysettings,
- 			use=use, mode=mode, myuse=myuse,
- 			use_force=useforce, use_mask=mymasks, use_cache=use_cache,
- 			use_binaries=use_binaries, myroot=myroot, trees=trees)
- 	except ParseError as e:
- 		return [0, "%s" % (e,)]
- 
- 	dnf = False
- 	if mysettings.local_config: # if not repoman
- 		orig_split = mysplit
- 		mysplit = _overlap_dnf(mysplit)
- 		dnf = mysplit is not orig_split
- 
- 	mysplit2 = dep_wordreduce(mysplit,
- 		mysettings, mydbapi, mode, use_cache=use_cache)
- 	if mysplit2 is None:
- 		return [0, _("Invalid token")]
- 
- 	writemsg("\n\n\n", 1)
- 	writemsg("mysplit:  %s\n" % (mysplit), 1)
- 	writemsg("mysplit2: %s\n" % (mysplit2), 1)
- 
- 	selected_atoms = dep_zapdeps(mysplit, mysplit2, myroot,
- 		use_binaries=use_binaries, trees=trees, minimize_slots=dnf)
- 
- 	return [1, selected_atoms]
+ class _dep_choice(SlotObject):
+     __slots__ = (
+         "atoms",
+         "slot_map",
+         "cp_map",
+         "all_available",
+         "all_installed_slots",
+         "new_slot_count",
+         "want_update",
+         "all_in_graph",
+     )
+ 
+ 
+ def dep_zapdeps(
+     unreduced, reduced, myroot, use_binaries=0, trees=None, minimize_slots=False
+ ):
+     """
+     Takes an unreduced and reduced deplist and removes satisfied dependencies.
+     Returned deplist contains steps that must be taken to satisfy dependencies.
+     """
+     if trees is None:
+         trees = portage.db
+     writemsg("ZapDeps -- %s\n" % (use_binaries), 2)
+     if not reduced or unreduced == ["||"] or dep_eval(reduced):
+         return []
+ 
+     if unreduced[0] != "||":
+         unresolved = []
+         for x, satisfied in zip(unreduced, reduced):
+             if isinstance(x, list):
+                 unresolved += dep_zapdeps(
+                     x,
+                     satisfied,
+                     myroot,
+                     use_binaries=use_binaries,
+                     trees=trees,
+                     minimize_slots=minimize_slots,
+                 )
+             elif not satisfied:
+                 unresolved.append(x)
+         return unresolved
+ 
+     # We're at a ( || atom ... ) type level and need to make a choice
+     deps = unreduced[1:]
+     satisfieds = reduced[1:]
+ 
+     # Our preference order is for an the first item that:
+     # a) contains all unmasked packages with the same key as installed packages
+     # b) contains all unmasked packages
+     # c) contains masked installed packages
+     # d) is the first item
+ 
+     preferred_in_graph = []
+     preferred_installed = preferred_in_graph
+     preferred_any_slot = preferred_in_graph
+     preferred_non_installed = []
+     unsat_use_in_graph = []
+     unsat_use_installed = []
+     unsat_use_non_installed = []
+     other_installed = []
+     other_installed_some = []
+     other_installed_any_slot = []
+     other = []
+ 
+     # unsat_use_* must come after preferred_non_installed
+     # for correct ordering in cases like || ( foo[a] foo[b] ).
+     choice_bins = (
+         preferred_in_graph,
+         preferred_non_installed,
+         unsat_use_in_graph,
+         unsat_use_installed,
+         unsat_use_non_installed,
+         other_installed,
+         other_installed_some,
+         other_installed_any_slot,
+         other,
+     )
+ 
+     # Alias the trees we'll be checking availability against
+     parent = trees[myroot].get("parent")
+     virt_parent = trees[myroot].get("virt_parent")
+     priority = trees[myroot].get("priority")
+     graph_db = trees[myroot].get("graph_db")
+     graph = trees[myroot].get("graph")
+     pkg_use_enabled = trees[myroot].get("pkg_use_enabled")
+     graph_interface = trees[myroot].get("graph_interface")
+     downgrade_probe = trees[myroot].get("downgrade_probe")
+     circular_dependency = trees[myroot].get("circular_dependency")
+     vardb = None
+     if "vartree" in trees[myroot]:
+         vardb = trees[myroot]["vartree"].dbapi
+     if use_binaries:
+         mydbapi = trees[myroot]["bintree"].dbapi
+     else:
+         mydbapi = trees[myroot]["porttree"].dbapi
+ 
+     try:
+         mydbapi_match_pkgs = mydbapi.match_pkgs
+     except AttributeError:
+ 
+         def mydbapi_match_pkgs(atom):
+             return [mydbapi._pkg_str(cpv, atom.repo) for cpv in mydbapi.match(atom)]
+ 
+     # Sort the deps into installed, not installed but already
+     # in the graph and other, not installed and not in the graph
+     # and other, with values of [[required_atom], availablility]
+     for x, satisfied in zip(deps, satisfieds):
+         if isinstance(x, list):
+             atoms = dep_zapdeps(
+                 x,
+                 satisfied,
+                 myroot,
+                 use_binaries=use_binaries,
+                 trees=trees,
+                 minimize_slots=minimize_slots,
+             )
+         else:
+             atoms = [x]
+         if vardb is None:
+             # When called by repoman, we can simply return the first choice
+             # because dep_eval() handles preference selection.
+             return atoms
+ 
+         all_available = True
+         all_use_satisfied = True
+         all_use_unmasked = True
+         conflict_downgrade = False
+         installed_downgrade = False
+         slot_atoms = collections.defaultdict(list)
+         slot_map = {}
+         cp_map = {}
+         for atom in atoms:
+             if atom.blocker:
+                 continue
+ 
+             # It's not a downgrade if parent is replacing child.
+             replacing = (
+                 parent
+                 and graph_interface
+                 and graph_interface.will_replace_child(parent, myroot, atom)
+             )
+             # Ignore USE dependencies here since we don't want USE
+             # settings to adversely affect || preference evaluation.
+             avail_pkg = mydbapi_match_pkgs(atom.without_use)
+             if not avail_pkg and replacing:
+                 avail_pkg = [replacing]
+             if avail_pkg:
+                 avail_pkg = avail_pkg[-1]  # highest (ascending order)
+                 avail_slot = Atom("%s:%s" % (atom.cp, avail_pkg.slot))
+             if not avail_pkg:
+                 all_available = False
+                 all_use_satisfied = False
+                 break
+ 
+             if not replacing and graph_db is not None and downgrade_probe is not None:
+                 slot_matches = graph_db.match_pkgs(avail_slot)
+                 if (
+                     len(slot_matches) > 1
+                     and avail_pkg < slot_matches[-1]
+                     and not downgrade_probe(avail_pkg)
+                 ):
+                     # If a downgrade is not desirable, then avoid a
+                     # choice that pulls in a lower version involved
+                     # in a slot conflict (bug #531656).
+                     conflict_downgrade = True
+ 
+             if atom.use:
+                 avail_pkg_use = mydbapi_match_pkgs(atom)
+                 if not avail_pkg_use:
+                     all_use_satisfied = False
+ 
+                     if pkg_use_enabled is not None:
+                         # Check which USE flags cause the match to fail,
+                         # so we can prioritize choices that do not
+                         # require changes to use.mask or use.force
+                         # (see bug #515584).
+                         violated_atom = atom.violated_conditionals(
+                             pkg_use_enabled(avail_pkg), avail_pkg.iuse.is_valid_flag
+                         )
+ 
+                         # Note that violated_atom.use can be None here,
+                         # since evaluation can collapse conditional USE
+                         # deps that cause the match to fail due to
+                         # missing IUSE (match uses atom.unevaluated_atom
+                         # to detect such missing IUSE).
+                         if violated_atom.use is not None:
+                             for flag in violated_atom.use.enabled:
+                                 if flag in avail_pkg.use.mask:
+                                     all_use_unmasked = False
+                                     break
+                             else:
+                                 for flag in violated_atom.use.disabled:
+                                     if (
+                                         flag in avail_pkg.use.force
+                                         and flag not in avail_pkg.use.mask
+                                     ):
+                                         all_use_unmasked = False
+                                         break
+                 else:
+                     # highest (ascending order)
+                     avail_pkg_use = avail_pkg_use[-1]
+                     if avail_pkg_use != avail_pkg:
+                         avail_pkg = avail_pkg_use
+                     avail_slot = Atom("%s:%s" % (atom.cp, avail_pkg.slot))
+ 
+             if not replacing and downgrade_probe is not None and graph is not None:
+                 highest_in_slot = mydbapi_match_pkgs(avail_slot)
+                 highest_in_slot = highest_in_slot[-1] if highest_in_slot else None
+                 if (
+                     avail_pkg
+                     and highest_in_slot
+                     and avail_pkg < highest_in_slot
+                     and not downgrade_probe(avail_pkg)
+                     and (highest_in_slot.installed or highest_in_slot in graph)
+                 ):
+                     installed_downgrade = True
+ 
+             slot_map[avail_slot] = avail_pkg
+             slot_atoms[avail_slot].append(atom)
+             highest_cpv = cp_map.get(avail_pkg.cp)
+             all_match_current = None
+             all_match_previous = None
+             if highest_cpv is not None and highest_cpv.slot == avail_pkg.slot:
+                 # If possible, make the package selection internally
+                 # consistent by choosing a package that satisfies all
+                 # atoms which match a package in the same slot. Later on,
+                 # the package version chosen here is used in the
+                 # has_upgrade/has_downgrade logic to prefer choices with
+                 # upgrades, and a package choice that is not internally
+                 # consistent will lead the has_upgrade/has_downgrade logic
+                 # to produce invalid results (see bug 600346).
+                 all_match_current = all(
+                     a.match(avail_pkg) for a in slot_atoms[avail_slot]
+                 )
+                 all_match_previous = all(
+                     a.match(highest_cpv) for a in slot_atoms[avail_slot]
+                 )
+                 if all_match_previous and not all_match_current:
+                     continue
+ 
+             current_higher = (
+                 highest_cpv is None
+                 or vercmp(avail_pkg.version, highest_cpv.version) > 0
+             )
+ 
+             if current_higher or (all_match_current and not all_match_previous):
+                 cp_map[avail_pkg.cp] = avail_pkg
+ 
+         want_update = False
+         if graph_interface is None or graph_interface.removal_action:
+             new_slot_count = len(slot_map)
+         else:
+             new_slot_count = 0
+             for slot_atom, avail_pkg in slot_map.items():
+                 if parent is not None and graph_interface.want_update_pkg(
+                     parent, avail_pkg
+                 ):
+                     want_update = True
+                 if not slot_atom.cp.startswith("virtual/") and not graph_db.match_pkgs(
+                     slot_atom
+                 ):
+                     new_slot_count += 1
+ 
+         this_choice = _dep_choice(
+             atoms=atoms,
+             slot_map=slot_map,
+             cp_map=cp_map,
+             all_available=all_available,
+             all_installed_slots=False,
+             new_slot_count=new_slot_count,
+             all_in_graph=False,
+             want_update=want_update,
+         )
+         if all_available:
+             # The "all installed" criterion is not version or slot specific.
+             # If any version of a package is already in the graph then we
+             # assume that it is preferred over other possible packages choices.
+             all_installed = True
+             for atom in set(Atom(atom.cp) for atom in atoms if not atom.blocker):
+                 # New-style virtuals have zero cost to install.
+                 if not vardb.match(atom) and not atom.startswith("virtual/"):
+                     all_installed = False
+                     break
+             all_installed_slots = False
+             if all_installed:
+                 all_installed_slots = True
+                 for slot_atom in slot_map:
+                     # New-style virtuals have zero cost to install.
+                     if not vardb.match(slot_atom) and not slot_atom.startswith(
+                         "virtual/"
+                     ):
+                         all_installed_slots = False
+                         break
+             this_choice.all_installed_slots = all_installed_slots
+             if graph_db is None:
+                 if all_use_satisfied:
+                     if all_installed:
+                         if all_installed_slots:
+                             preferred_installed.append(this_choice)
+                         else:
+                             preferred_any_slot.append(this_choice)
+                     else:
+                         preferred_non_installed.append(this_choice)
+                 else:
+                     if not all_use_unmasked:
+                         other.append(this_choice)
+                     elif all_installed_slots:
+                         unsat_use_installed.append(this_choice)
+                     else:
+                         unsat_use_non_installed.append(this_choice)
+             elif conflict_downgrade or installed_downgrade:
+                 other.append(this_choice)
+             else:
+                 all_in_graph = True
+                 for atom in atoms:
+                     # New-style virtuals have zero cost to install.
+                     if atom.blocker or atom.cp.startswith("virtual/"):
+                         continue
+                     # We check if the matched package has actually been
+                     # added to the digraph, in order to distinguish between
+                     # those packages and installed packages that may need
+                     # to be uninstalled in order to resolve blockers.
+                     if not any(pkg in graph for pkg in graph_db.match_pkgs(atom)):
+                         all_in_graph = False
+                         break
+                 this_choice.all_in_graph = all_in_graph
+ 
+                 circular_atom = None
+                 if parent and parent.onlydeps:
+                     # Check if the atom would result in a direct circular
+                     # dependency and avoid that for --onlydeps arguments
+                     # since it can defeat the purpose of --onlydeps.
+                     # This check should only be used for --onlydeps
+                     # arguments, since it can interfere with circular
+                     # dependency backtracking choices, causing the test
+                     # case for bug 756961 to fail.
+                     cpv_slot_list = [parent]
+                     for atom in atoms:
+                         if atom.blocker:
+                             continue
+                         if vardb.match(atom):
+                             # If the atom is satisfied by an installed
+                             # version then it's not a circular dep.
+                             continue
+                         if atom.cp != parent.cp:
+                             continue
+                         if match_from_list(atom, cpv_slot_list):
+                             circular_atom = atom
+                             break
+                 if circular_atom is None and circular_dependency is not None:
+                     for circular_child in itertools.chain(
+                         circular_dependency.get(parent, []),
+                         circular_dependency.get(virt_parent, []),
+                     ):
+                         for atom in atoms:
+                             if not atom.blocker and atom.match(circular_child):
+                                 circular_atom = atom
+                                 break
+                         if circular_atom is not None:
+                             break
+ 
+                 if circular_atom is not None:
+                     other.append(this_choice)
+                 else:
+                     if all_use_satisfied:
+                         if all_in_graph:
+                             preferred_in_graph.append(this_choice)
+                         elif all_installed:
+                             if all_installed_slots:
+                                 preferred_installed.append(this_choice)
+                             else:
+                                 preferred_any_slot.append(this_choice)
+                         else:
+                             preferred_non_installed.append(this_choice)
+                     else:
+                         if not all_use_unmasked:
+                             other.append(this_choice)
+                         elif all_in_graph:
+                             unsat_use_in_graph.append(this_choice)
+                         elif all_installed_slots:
+                             unsat_use_installed.append(this_choice)
+                         else:
+                             unsat_use_non_installed.append(this_choice)
+         else:
+             all_installed = True
+             some_installed = False
+             for atom in atoms:
+                 if not atom.blocker:
+                     if vardb.match(atom):
+                         some_installed = True
+                     else:
+                         all_installed = False
+ 
+             if all_installed:
+                 this_choice.all_installed_slots = True
+                 other_installed.append(this_choice)
+             elif some_installed:
+                 other_installed_some.append(this_choice)
+ 
+             # Use Atom(atom.cp) for a somewhat "fuzzy" match, since
+             # the whole atom may be too specific. For example, see
+             # bug #522652, where using the whole atom leads to an
+             # unsatisfiable choice.
+             elif any(vardb.match(Atom(atom.cp)) for atom in atoms if not atom.blocker):
+                 other_installed_any_slot.append(this_choice)
+             else:
+                 other.append(this_choice)
+ 
+     # Prefer choices which contain upgrades to higher slots. This helps
+     # for deps such as || ( foo:1 foo:2 ), where we want to prefer the
+     # atom which matches the higher version rather than the atom furthest
+     # to the left. Sorting is done separately for each of choice_bins, so
+     # as not to interfere with the ordering of the bins. Because of the
+     # bin separation, the main function of this code is to allow
+     # --depclean to remove old slots (rather than to pull in new slots).
+     for choices in choice_bins:
+         if len(choices) < 2:
+             continue
+ 
+         if minimize_slots:
+             # Prefer choices having fewer new slots. When used with DNF form,
+             # this can eliminate unecessary packages that depclean would
+             # ultimately eliminate (see bug 632026). Only use this behavior
+             # when deemed necessary by the caller, since this will discard the
+             # order specified in the ebuild, and the preferences specified
+             # there can serve as a crucial sources of guidance (see bug 645002).
+ 
+             # NOTE: Under some conditions, new_slot_count value may have some
+             # variance from one calculation to the next because it depends on
+             # the order that packages are added to the graph. This variance can
+             # contribute to outcomes that appear to be random. Meanwhile,
+             # the order specified in the ebuild is without variance, so it
+             # does not have this problem.
+             choices.sort(key=operator.attrgetter("new_slot_count"))
+ 
+         for choice_1 in choices[1:]:
+             cps = set(choice_1.cp_map)
+             for choice_2 in choices:
+                 if choice_1 is choice_2:
+                     # choice_1 will not be promoted, so move on
+                     break
+                 if (
+                     choice_1.all_installed_slots
+                     and not choice_2.all_installed_slots
+                     and not choice_2.want_update
+                 ):
+                     # promote choice_1 in front of choice_2
+                     choices.remove(choice_1)
+                     index_2 = choices.index(choice_2)
+                     choices.insert(index_2, choice_1)
+                     break
+ 
+                 intersecting_cps = cps.intersection(choice_2.cp_map)
+                 has_upgrade = False
+                 has_downgrade = False
+                 for cp in intersecting_cps:
+                     version_1 = choice_1.cp_map[cp]
+                     version_2 = choice_2.cp_map[cp]
+                     difference = vercmp(version_1.version, version_2.version)
+                     if difference != 0:
+                         if difference > 0:
+                             has_upgrade = True
+                         else:
+                             has_downgrade = True
+ 
+                 if (
+                     # Prefer upgrades.
+                     (has_upgrade and not has_downgrade)
+                     # Prefer choices where all packages have been pulled into
+                     # the graph, except for choices that eliminate upgrades.
+                     or (
+                         choice_1.all_in_graph
+                         and not choice_2.all_in_graph
+                         and not (has_downgrade and not has_upgrade)
+                     )
+                 ):
+                     # promote choice_1 in front of choice_2
+                     choices.remove(choice_1)
+                     index_2 = choices.index(choice_2)
+                     choices.insert(index_2, choice_1)
+                     break
+ 
+     for allow_masked in (False, True):
+         for choices in choice_bins:
+             for choice in choices:
+                 if choice.all_available or allow_masked:
+                     return choice.atoms
+ 
+     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,
+ ):
+     """
+     Takes a depend string, parses it, and selects atoms.
+     The myroot parameter is unused (use mysettings['EROOT'] instead).
+     """
+     myroot = mysettings["EROOT"]
+     edebug = mysettings.get("PORTAGE_DEBUG", None) == "1"
+     # check_config_instance(mysettings)
+     if trees is None:
+         trees = globals()["db"]
+     if use == "yes":
+         if myuse is None:
+             # default behavior
+             myusesplit = mysettings["PORTAGE_USE"].split()
+         else:
+             myusesplit = myuse
+             # We've been given useflags to use.
+             # print "USE FLAGS PASSED IN."
+             # print myuse
+             # if "bindist" in myusesplit:
+             # 	print "BINDIST is set!"
+             # else:
+             # 	print "BINDIST NOT set."
+     else:
+         # we are being run by autouse(), don't consult USE vars yet.
+         # WE ALSO CANNOT USE SETTINGS
+         myusesplit = []
+ 
+     mymasks = set()
+     useforce = set()
+     if use == "all":
+         # This is only for repoman, in order to constrain the use_reduce
+         # matchall behavior to account for profile use.mask/force. The
+         # ARCH/archlist code here may be redundant, since the profile
+         # really should be handling ARCH masking/forcing itself.
+         arch = mysettings.get("ARCH")
+         mymasks.update(mysettings.usemask)
+         mymasks.update(mysettings.archlist())
+         if arch:
+             mymasks.discard(arch)
+             useforce.add(arch)
+         useforce.update(mysettings.useforce)
+         useforce.difference_update(mymasks)
+ 
+     # eapi code borrowed from _expand_new_virtuals()
+     mytrees = trees[myroot]
+     parent = mytrees.get("parent")
+     virt_parent = mytrees.get("virt_parent")
+     current_parent = None
+     eapi = None
+     if parent is not None:
+         if virt_parent is not None:
+             current_parent = virt_parent
+         else:
+             current_parent = parent
+ 
+     if current_parent is not None:
+         # Don't pass the eapi argument to use_reduce() for installed packages
+         # since previous validation will have already marked them as invalid
+         # when necessary and now we're more interested in evaluating
+         # dependencies so that things like --depclean work as well as possible
+         # in spite of partial invalidity.
+         if not current_parent.installed:
+             eapi = current_parent.eapi
+ 
+     if isinstance(depstring, list):
+         mysplit = depstring
+     else:
+         try:
+             mysplit = use_reduce(
+                 depstring,
+                 uselist=myusesplit,
+                 masklist=mymasks,
+                 matchall=(use == "all"),
+                 excludeall=useforce,
+                 opconvert=True,
+                 token_class=Atom,
+                 eapi=eapi,
+             )
+         except InvalidDependString as e:
+             return [0, "%s" % (e,)]
+ 
+     if mysplit == []:
+         # dependencies were reduced to nothing
+         return [1, []]
+ 
+     # Recursively expand new-style virtuals so as to
+     # collapse one or more levels of indirection.
+     try:
+         mysplit = _expand_new_virtuals(
+             mysplit,
+             edebug,
+             mydbapi,
+             mysettings,
+             use=use,
+             mode=mode,
+             myuse=myuse,
+             use_force=useforce,
+             use_mask=mymasks,
+             use_cache=use_cache,
+             use_binaries=use_binaries,
+             myroot=myroot,
+             trees=trees,
+         )
+     except ParseError as e:
+         return [0, "%s" % (e,)]
+ 
+     dnf = False
+     if mysettings.local_config:  # if not repoman
+         orig_split = mysplit
+         mysplit = _overlap_dnf(mysplit)
+         dnf = mysplit is not orig_split
+ 
+     mysplit2 = dep_wordreduce(mysplit, mysettings, mydbapi, mode, use_cache=use_cache)
+     if mysplit2 is None:
+         return [0, _("Invalid token")]
+ 
+     writemsg("\n\n\n", 1)
+     writemsg("mysplit:  %s\n" % (mysplit), 1)
+     writemsg("mysplit2: %s\n" % (mysplit2), 1)
+ 
+     selected_atoms = dep_zapdeps(
+         mysplit,
+         mysplit2,
+         myroot,
+         use_binaries=use_binaries,
+         trees=trees,
+         minimize_slots=dnf,
+     )
+ 
+     return [1, selected_atoms]
  
  
  def _overlap_dnf(dep_struct):
diff --cc lib/portage/package/ebuild/config.py
index 0fe68ad38,b4d6862a3..198c6238e
--- a/lib/portage/package/ebuild/config.py
+++ b/lib/portage/package/ebuild/config.py
@@@ -70,2896 -111,3307 +111,3321 @@@ from portage.package.ebuild._config.unp
  
  _feature_flags_cache = {}
  
+ 
  def _get_feature_flags(eapi_attrs):
- 	cache_key = (eapi_attrs.feature_flag_test,)
- 	flags = _feature_flags_cache.get(cache_key)
- 	if flags is not None:
- 		return flags
+     cache_key = (eapi_attrs.feature_flag_test,)
+     flags = _feature_flags_cache.get(cache_key)
+     if flags is not None:
+         return flags
+ 
+     flags = []
+     if eapi_attrs.feature_flag_test:
+         flags.append("test")
  
- 	flags = []
- 	if eapi_attrs.feature_flag_test:
- 		flags.append("test")
+     flags = frozenset(flags)
+     _feature_flags_cache[cache_key] = flags
+     return flags
  
- 	flags = frozenset(flags)
- 	_feature_flags_cache[cache_key] = flags
- 	return flags
  
  def autouse(myvartree, use_cache=1, mysettings=None):
- 	warnings.warn("portage.autouse() is deprecated",
- 		DeprecationWarning, stacklevel=2)
- 	return ""
+     warnings.warn("portage.autouse() is deprecated", DeprecationWarning, stacklevel=2)
+     return ""
+ 
  
  def check_config_instance(test):
- 	if not isinstance(test, config):
- 		raise TypeError("Invalid type for config object: %s (should be %s)" % (test.__class__, config))
+     if not isinstance(test, config):
+         raise TypeError(
+             "Invalid type for config object: %s (should be %s)"
+             % (test.__class__, config)
+         )
+ 
  
  def best_from_dict(key, top_dict, key_order, EmptyOnError=1, FullCopy=1, AllowEmpty=1):
- 	for x in key_order:
- 		if x in top_dict and key in top_dict[x]:
- 			if FullCopy:
- 				return copy.deepcopy(top_dict[x][key])
- 			return top_dict[x][key]
- 	if EmptyOnError:
- 		return ""
- 	raise KeyError("Key not found in list; '%s'" % key)
+     for x in key_order:
+         if x in top_dict and key in top_dict[x]:
+             if FullCopy:
+                 return copy.deepcopy(top_dict[x][key])
+             return top_dict[x][key]
+     if EmptyOnError:
+         return ""
+     raise KeyError("Key not found in list; '%s'" % key)
+ 
  
  def _lazy_iuse_regex(iuse_implicit):
- 	"""
- 	The PORTAGE_IUSE value is lazily evaluated since re.escape() is slow
- 	and the value is only used when an ebuild phase needs to be executed
- 	(it's used only to generate QA notices).
- 	"""
- 	# Escape anything except ".*" which is supposed to pass through from
- 	# _get_implicit_iuse().
- 	regex = sorted(re.escape(x) for x in iuse_implicit)
- 	regex = "^(%s)$" % "|".join(regex)
- 	regex = regex.replace("\\.\\*", ".*")
- 	return regex
+     """
+     The PORTAGE_IUSE value is lazily evaluated since re.escape() is slow
+     and the value is only used when an ebuild phase needs to be executed
+     (it's used only to generate QA notices).
+     """
+     # Escape anything except ".*" which is supposed to pass through from
+     # _get_implicit_iuse().
+     regex = sorted(re.escape(x) for x in iuse_implicit)
+     regex = "^(%s)$" % "|".join(regex)
+     regex = regex.replace("\\.\\*", ".*")
+     return regex
+ 
  
  class _iuse_implicit_match_cache:
+     def __init__(self, settings):
+         self._iuse_implicit_re = re.compile(
+             "^(%s)$" % "|".join(settings._get_implicit_iuse())
+         )
+         self._cache = {}
+ 
+     def __call__(self, flag):
+         """
+         Returns True if the flag is matched, False otherwise.
+         """
+         try:
+             return self._cache[flag]
+         except KeyError:
+             m = self._iuse_implicit_re.match(flag) is not None
+             self._cache[flag] = m
+             return m
  
- 	def __init__(self, settings):
- 		self._iuse_implicit_re = re.compile("^(%s)$" % \
- 			"|".join(settings._get_implicit_iuse()))
- 		self._cache = {}
- 
- 	def __call__(self, flag):
- 		"""
- 		Returns True if the flag is matched, False otherwise.
- 		"""
- 		try:
- 			return self._cache[flag]
- 		except KeyError:
- 			m = self._iuse_implicit_re.match(flag) is not None
- 			self._cache[flag] = m
- 			return m
  
  class config:
- 	"""
- 	This class encompasses the main portage configuration.  Data is pulled from
- 	ROOT/PORTDIR/profiles/, from ROOT/etc/make.profile incrementally through all
- 	parent profiles as well as from ROOT/PORTAGE_CONFIGROOT/* for user specified
- 	overrides.
- 
- 	Generally if you need data like USE flags, FEATURES, environment variables,
- 	virtuals ...etc you look in here.
- 	"""
- 
- 	_constant_keys = frozenset(['PORTAGE_BIN_PATH', 'PORTAGE_GID',
- 		'PORTAGE_PYM_PATH', 'PORTAGE_PYTHONPATH'])
- 
- 	_deprecated_keys = {'PORTAGE_LOGDIR': 'PORT_LOGDIR',
- 		'PORTAGE_LOGDIR_CLEAN': 'PORT_LOGDIR_CLEAN',
- 		'SIGNED_OFF_BY': 'DCO_SIGNED_OFF_BY'}
- 
- 	_setcpv_aux_keys = ('BDEPEND', 'DEFINED_PHASES', 'DEPEND', 'EAPI', 'IDEPEND',
- 		'INHERITED', 'IUSE', 'REQUIRED_USE', 'KEYWORDS', 'LICENSE', 'PDEPEND',
- 		'PROPERTIES', 'RDEPEND', 'SLOT',
- 		'repository', 'RESTRICT', 'LICENSE',)
- 
- 	_module_aliases = {
- 		"cache.metadata_overlay.database" : "portage.cache.flat_hash.mtime_md5_database",
- 		"portage.cache.metadata_overlay.database" : "portage.cache.flat_hash.mtime_md5_database",
- 	}
- 
- 	_case_insensitive_vars = special_env_vars.case_insensitive_vars
- 	_default_globals = special_env_vars.default_globals
- 	_env_blacklist = special_env_vars.env_blacklist
- 	_environ_filter = special_env_vars.environ_filter
- 	_environ_whitelist = special_env_vars.environ_whitelist
- 	_environ_whitelist_re = special_env_vars.environ_whitelist_re
- 	_global_only_vars = special_env_vars.global_only_vars
- 
- 	def __init__(self, clone=None, mycpv=None, config_profile_path=None,
- 		config_incrementals=None, config_root=None, target_root=None,
- 		sysroot=None, eprefix=None, local_config=True, env=None,
- 		_unmatched_removal=False, repositories=None):
- 		"""
- 		@param clone: If provided, init will use deepcopy to copy by value the instance.
- 		@type clone: Instance of config class.
- 		@param mycpv: CPV to load up (see setcpv), this is the same as calling init with mycpv=None
- 		and then calling instance.setcpv(mycpv).
- 		@type mycpv: String
- 		@param config_profile_path: Configurable path to the profile (usually PROFILE_PATH from portage.const)
- 		@type config_profile_path: String
- 		@param config_incrementals: List of incremental variables
- 			(defaults to portage.const.INCREMENTALS)
- 		@type config_incrementals: List
- 		@param config_root: path to read local config from (defaults to "/", see PORTAGE_CONFIGROOT)
- 		@type config_root: String
- 		@param target_root: the target root, which typically corresponds to the
- 			value of the $ROOT env variable (default is /)
- 		@type target_root: String
- 		@param sysroot: the sysroot to build against, which typically corresponds
- 			 to the value of the $SYSROOT env variable (default is /)
- 		@type sysroot: String
- 		@param eprefix: set the EPREFIX variable (default is portage.const.EPREFIX)
- 		@type eprefix: String
- 		@param local_config: Enables loading of local config (/etc/portage); used most by repoman to
- 		ignore local config (keywording and unmasking)
- 		@type local_config: Boolean
- 		@param env: The calling environment which is used to override settings.
- 			Defaults to os.environ if unspecified.
- 		@type env: dict
- 		@param _unmatched_removal: Enabled by repoman when the
- 			--unmatched-removal option is given.
- 		@type _unmatched_removal: Boolean
- 		@param repositories: Configuration of repositories.
- 			Defaults to portage.repository.config.load_repository_config().
- 		@type repositories: Instance of portage.repository.config.RepoConfigLoader class.
- 		"""
- 
- 		# This is important when config is reloaded after emerge --sync.
- 		_eapi_cache.clear()
- 
- 		# When initializing the global portage.settings instance, avoid
- 		# raising exceptions whenever possible since exceptions thrown
- 		# from 'import portage' or 'import portage.exceptions' statements
- 		# can practically render the api unusable for api consumers.
- 		tolerant = hasattr(portage, '_initializing_globals')
- 		self._tolerant = tolerant
- 		self._unmatched_removal = _unmatched_removal
- 
- 		self.locked   = 0
- 		self.mycpv    = None
- 		self._setcpv_args_hash = None
- 		self.puse     = ""
- 		self._penv    = []
- 		self.modifiedkeys = []
- 		self.uvlist = []
- 		self._accept_chost_re = None
- 		self._accept_properties = None
- 		self._accept_restrict = None
- 		self._features_overrides = []
- 		self._make_defaults = None
- 		self._parent_stable = None
- 		self._soname_provided = None
- 
- 		# _unknown_features records unknown features that
- 		# have triggered warning messages, and ensures that
- 		# the same warning isn't shown twice.
- 		self._unknown_features = set()
- 
- 		self.local_config = local_config
- 
- 		if clone:
- 			# For immutable attributes, use shallow copy for
- 			# speed and memory conservation.
- 			self._tolerant = clone._tolerant
- 			self._unmatched_removal = clone._unmatched_removal
- 			self.categories = clone.categories
- 			self.depcachedir = clone.depcachedir
- 			self.incrementals = clone.incrementals
- 			self.module_priority = clone.module_priority
- 			self.profile_path = clone.profile_path
- 			self.profiles = clone.profiles
- 			self.packages = clone.packages
- 			self.repositories = clone.repositories
- 			self.unpack_dependencies = clone.unpack_dependencies
- 			self._default_features_use = clone._default_features_use
- 			self._iuse_effective = clone._iuse_effective
- 			self._iuse_implicit_match = clone._iuse_implicit_match
- 			self._non_user_variables = clone._non_user_variables
- 			self._env_d_blacklist = clone._env_d_blacklist
- 			self._pbashrc = clone._pbashrc
- 			self._repo_make_defaults = clone._repo_make_defaults
- 			self.usemask = clone.usemask
- 			self.useforce = clone.useforce
- 			self.puse = clone.puse
- 			self.user_profile_dir = clone.user_profile_dir
- 			self.local_config = clone.local_config
- 			self.make_defaults_use = clone.make_defaults_use
- 			self.mycpv = clone.mycpv
- 			self._setcpv_args_hash = clone._setcpv_args_hash
- 			self._soname_provided = clone._soname_provided
- 			self._profile_bashrc = clone._profile_bashrc
- 
- 			# immutable attributes (internal policy ensures lack of mutation)
- 			self._locations_manager = clone._locations_manager
- 			self._use_manager = clone._use_manager
- 			# force instantiation of lazy immutable objects when cloning, so
- 			# that they're not instantiated more than once
- 			self._keywords_manager_obj = clone._keywords_manager
- 			self._mask_manager_obj = clone._mask_manager
- 
- 			# shared mutable attributes
- 			self._unknown_features = clone._unknown_features
- 
- 			self.modules         = copy.deepcopy(clone.modules)
- 			self._penv = copy.deepcopy(clone._penv)
- 
- 			self.configdict = copy.deepcopy(clone.configdict)
- 			self.configlist = [
- 				self.configdict['env.d'],
- 				self.configdict['repo'],
- 				self.configdict['features'],
- 				self.configdict['pkginternal'],
- 				self.configdict['globals'],
- 				self.configdict['defaults'],
- 				self.configdict['conf'],
- 				self.configdict['pkg'],
- 				self.configdict['env'],
- 			]
- 			self.lookuplist = self.configlist[:]
- 			self.lookuplist.reverse()
- 			self._use_expand_dict = copy.deepcopy(clone._use_expand_dict)
- 			self.backupenv  = self.configdict["backupenv"]
- 			self.prevmaskdict = copy.deepcopy(clone.prevmaskdict)
- 			self.pprovideddict = copy.deepcopy(clone.pprovideddict)
- 			self.features = features_set(self)
- 			self.features._features = copy.deepcopy(clone.features._features)
- 			self._features_overrides = copy.deepcopy(clone._features_overrides)
- 
- 			#Strictly speaking _license_manager is not immutable. Users need to ensure that
- 			#extract_global_changes() is called right after __init__ (if at all).
- 			#It also has the mutable member _undef_lic_groups. It is used to track
- 			#undefined license groups, to not display an error message for the same
- 			#group again and again. Because of this, it's useful to share it between
- 			#all LicenseManager instances.
- 			self._license_manager = clone._license_manager
- 
- 			# force instantiation of lazy objects when cloning, so
- 			# that they're not instantiated more than once
- 			self._virtuals_manager_obj = copy.deepcopy(clone._virtuals_manager)
- 
- 			self._accept_properties = copy.deepcopy(clone._accept_properties)
- 			self._ppropertiesdict = copy.deepcopy(clone._ppropertiesdict)
- 			self._accept_restrict = copy.deepcopy(clone._accept_restrict)
- 			self._paccept_restrict = copy.deepcopy(clone._paccept_restrict)
- 			self._penvdict = copy.deepcopy(clone._penvdict)
- 			self._pbashrcdict = copy.deepcopy(clone._pbashrcdict)
- 			self._expand_map = copy.deepcopy(clone._expand_map)
- 
- 		else:
- 			# lazily instantiated objects
- 			self._keywords_manager_obj = None
- 			self._mask_manager_obj = None
- 			self._virtuals_manager_obj = None
- 
- 			locations_manager = LocationsManager(config_root=config_root,
- 				config_profile_path=config_profile_path, eprefix=eprefix,
- 				local_config=local_config, target_root=target_root,
- 				sysroot=sysroot)
- 			self._locations_manager = locations_manager
- 
- 			eprefix = locations_manager.eprefix
- 			config_root = locations_manager.config_root
- 			sysroot = locations_manager.sysroot
- 			esysroot = locations_manager.esysroot
- 			broot = locations_manager.broot
- 			abs_user_config = locations_manager.abs_user_config
- 			make_conf_paths = [
- 				os.path.join(config_root, 'etc', 'make.conf'),
- 				os.path.join(config_root, MAKE_CONF_FILE)
- 			]
- 			try:
- 				if os.path.samefile(*make_conf_paths):
- 					make_conf_paths.pop()
- 			except OSError:
- 				pass
- 
- 			make_conf_count = 0
- 			make_conf = {}
- 			for x in make_conf_paths:
- 				mygcfg = getconfig(x,
- 					tolerant=tolerant, allow_sourcing=True,
- 					expand=make_conf, recursive=True)
- 				if mygcfg is not None:
- 					make_conf.update(mygcfg)
- 					make_conf_count += 1
- 
- 			if make_conf_count == 2:
- 				writemsg("!!! %s\n" %
- 					_("Found 2 make.conf files, using both '%s' and '%s'") %
- 					tuple(make_conf_paths), noiselevel=-1)
- 
- 			# __* variables set in make.conf are local and are not be propagated.
- 			make_conf = {k: v for k, v in make_conf.items() if not k.startswith("__")}
- 
- 			# Allow ROOT setting to come from make.conf if it's not overridden
- 			# by the constructor argument (from the calling environment).
- 			locations_manager.set_root_override(make_conf.get("ROOT"))
- 			target_root = locations_manager.target_root
- 			eroot = locations_manager.eroot
- 			self.global_config_path = locations_manager.global_config_path
- 
- 			# The expand_map is used for variable substitution
- 			# in getconfig() calls, and the getconfig() calls
- 			# update expand_map with the value of each variable
- 			# assignment that occurs. Variable substitution occurs
- 			# in the following order, which corresponds to the
- 			# order of appearance in self.lookuplist:
- 			#
- 			#   * env.d
- 			#   * make.globals
- 			#   * make.defaults
- 			#   * make.conf
- 			#
- 			# Notably absent is "env", since we want to avoid any
- 			# interaction with the calling environment that might
- 			# lead to unexpected results.
- 
- 			env_d = getconfig(os.path.join(eroot, "etc", "profile.env"),
- 				tolerant=tolerant, expand=False) or {}
- 			expand_map = env_d.copy()
- 			self._expand_map = expand_map
- 
- 			# Allow make.globals and make.conf to set paths relative to vars like ${EPREFIX}.
- 			expand_map["BROOT"] = broot
- 			expand_map["EPREFIX"] = eprefix
- 			expand_map["EROOT"] = eroot
- 			expand_map["ESYSROOT"] = esysroot
- 			expand_map["PORTAGE_CONFIGROOT"] = config_root
- 			expand_map["ROOT"] = target_root
- 			expand_map["SYSROOT"] = sysroot
- 
- 			if portage._not_installed:
- 				make_globals_path = os.path.join(PORTAGE_BASE_PATH, "cnf", "make.globals")
- 			else:
- 				make_globals_path = os.path.join(self.global_config_path, "make.globals")
- 			old_make_globals = os.path.join(config_root, "etc", "make.globals")
- 			if os.path.isfile(old_make_globals) and \
- 				not os.path.samefile(make_globals_path, old_make_globals):
- 				# Don't warn if they refer to the same path, since
- 				# that can be used for backward compatibility with
- 				# old software.
- 				writemsg("!!! %s\n" %
- 					_("Found obsolete make.globals file: "
- 					"'%s', (using '%s' instead)") %
- 					(old_make_globals, make_globals_path),
- 					noiselevel=-1)
- 
- 			make_globals = getconfig(make_globals_path,
- 				tolerant=tolerant, expand=expand_map)
- 			if make_globals is None:
- 				make_globals = {}
- 
- 			for k, v in self._default_globals.items():
- 				make_globals.setdefault(k, v)
- 
- 			if config_incrementals is None:
- 				self.incrementals = INCREMENTALS
- 			else:
- 				self.incrementals = config_incrementals
- 			if not isinstance(self.incrementals, frozenset):
- 				self.incrementals = frozenset(self.incrementals)
- 
- 			self.module_priority    = ("user", "default")
- 			self.modules            = {}
- 			modules_file = os.path.join(config_root, MODULES_FILE_PATH)
- 			modules_loader = KeyValuePairFileLoader(modules_file, None, None)
- 			modules_dict, modules_errors = modules_loader.load()
- 			self.modules["user"] = modules_dict
- 			if self.modules["user"] is None:
- 				self.modules["user"] = {}
- 			user_auxdbmodule = \
- 				self.modules["user"].get("portdbapi.auxdbmodule")
- 			if user_auxdbmodule is not None and \
- 				user_auxdbmodule in self._module_aliases:
- 				warnings.warn("'%s' is deprecated: %s" %
- 				(user_auxdbmodule, modules_file))
- 
- 			self.modules["default"] = {
- 				"portdbapi.auxdbmodule":  "portage.cache.flat_hash.mtime_md5_database",
- 			}
- 
- 			self.configlist=[]
- 
- 			# back up our incremental variables:
- 			self.configdict={}
- 			self._use_expand_dict = {}
- 			# configlist will contain: [ env.d, globals, features, defaults, conf, pkg, backupenv, env ]
- 			self.configlist.append({})
- 			self.configdict["env.d"] = self.configlist[-1]
- 
- 			self.configlist.append({})
- 			self.configdict["repo"] = self.configlist[-1]
- 
- 			self.configlist.append({})
- 			self.configdict["features"] = self.configlist[-1]
- 
- 			self.configlist.append({})
- 			self.configdict["pkginternal"] = self.configlist[-1]
- 
- 			# env_d will be None if profile.env doesn't exist.
- 			if env_d:
- 				self.configdict["env.d"].update(env_d)
- 
- 			# backupenv is used for calculating incremental variables.
- 			if env is None:
- 				env = os.environ
- 
- 			# Avoid potential UnicodeDecodeError exceptions later.
- 			env_unicode = dict((_unicode_decode(k), _unicode_decode(v))
- 				for k, v in env.items())
- 
- 			self.backupenv = env_unicode
- 
- 			if env_d:
- 				# Remove duplicate values so they don't override updated
- 				# profile.env values later (profile.env is reloaded in each
- 				# call to self.regenerate).
- 				for k, v in env_d.items():
- 					try:
- 						if self.backupenv[k] == v:
- 							del self.backupenv[k]
- 					except KeyError:
- 						pass
- 				del k, v
- 
- 			self.configdict["env"] = LazyItemsDict(self.backupenv)
- 
- 			self.configlist.append(make_globals)
- 			self.configdict["globals"]=self.configlist[-1]
- 
- 			self.make_defaults_use = []
- 
- 			#Loading Repositories
- 			self["PORTAGE_CONFIGROOT"] = config_root
- 			self["ROOT"] = target_root
- 			self["SYSROOT"] = sysroot
- 			self["EPREFIX"] = eprefix
- 			self["EROOT"] = eroot
- 			self["ESYSROOT"] = esysroot
- 			self["BROOT"] = broot
- 			known_repos = []
- 			portdir = ""
- 			portdir_overlay = ""
- 			portdir_sync = None
- 			for confs in [make_globals, make_conf, self.configdict["env"]]:
- 				v = confs.get("PORTDIR")
- 				if v is not None:
- 					portdir = v
- 					known_repos.append(v)
- 				v = confs.get("PORTDIR_OVERLAY")
- 				if v is not None:
- 					portdir_overlay = v
- 					known_repos.extend(shlex_split(v))
- 				v = confs.get("SYNC")
- 				if v is not None:
- 					portdir_sync = v
- 				if 'PORTAGE_RSYNC_EXTRA_OPTS' in confs:
- 					self['PORTAGE_RSYNC_EXTRA_OPTS'] = confs['PORTAGE_RSYNC_EXTRA_OPTS']
- 
- 			self["PORTDIR"] = portdir
- 			self["PORTDIR_OVERLAY"] = portdir_overlay
- 			if portdir_sync:
- 				self["SYNC"] = portdir_sync
- 			self.lookuplist = [self.configdict["env"]]
- 			if repositories is None:
- 				self.repositories = load_repository_config(self)
- 			else:
- 				self.repositories = repositories
- 
- 			known_repos.extend(repo.location for repo in self.repositories)
- 			known_repos = frozenset(known_repos)
- 
- 			self['PORTAGE_REPOSITORIES'] = self.repositories.config_string()
- 			self.backup_changes('PORTAGE_REPOSITORIES')
- 
- 			#filling PORTDIR and PORTDIR_OVERLAY variable for compatibility
- 			main_repo = self.repositories.mainRepo()
- 			if main_repo is not None:
- 				self["PORTDIR"] = main_repo.location
- 				self.backup_changes("PORTDIR")
- 				expand_map["PORTDIR"] = self["PORTDIR"]
- 
- 			# repoman controls PORTDIR_OVERLAY via the environment, so no
- 			# special cases are needed here.
- 			portdir_overlay = list(self.repositories.repoLocationList())
- 			if portdir_overlay and portdir_overlay[0] == self["PORTDIR"]:
- 				portdir_overlay = portdir_overlay[1:]
- 
- 			new_ov = []
- 			if portdir_overlay:
- 				for ov in portdir_overlay:
- 					ov = normalize_path(ov)
- 					if isdir_raise_eaccess(ov) or portage._sync_mode:
- 						new_ov.append(portage._shell_quote(ov))
- 					else:
- 						writemsg(_("!!! Invalid PORTDIR_OVERLAY"
- 							" (not a dir): '%s'\n") % ov, noiselevel=-1)
- 
- 			self["PORTDIR_OVERLAY"] = " ".join(new_ov)
- 			self.backup_changes("PORTDIR_OVERLAY")
- 			expand_map["PORTDIR_OVERLAY"] = self["PORTDIR_OVERLAY"]
- 
- 			locations_manager.set_port_dirs(self["PORTDIR"], self["PORTDIR_OVERLAY"])
- 			locations_manager.load_profiles(self.repositories, known_repos)
- 
- 			profiles_complex = locations_manager.profiles_complex
- 			self.profiles = locations_manager.profiles
- 			self.profile_path = locations_manager.profile_path
- 			self.user_profile_dir = locations_manager.user_profile_dir
- 
- 			try:
- 				packages_list = [grabfile_package(
- 					os.path.join(x.location, "packages"),
- 					verify_eapi=True, eapi=x.eapi, eapi_default=None,
- 					allow_repo=allow_profile_repo_deps(x),
- 					allow_build_id=x.allow_build_id)
- 					for x in profiles_complex]
- 			except EnvironmentError as e:
- 				_raise_exc(e)
- 
- 			self.packages = tuple(stack_lists(packages_list, incremental=1))
- 
- 			# revmaskdict
- 			self.prevmaskdict={}
- 			for x in self.packages:
- 				# Negative atoms are filtered by the above stack_lists() call.
- 				if not isinstance(x, Atom):
- 					x = Atom(x.lstrip('*'))
- 				self.prevmaskdict.setdefault(x.cp, []).append(x)
- 
- 			self.unpack_dependencies = load_unpack_dependencies_configuration(self.repositories)
- 
- 			mygcfg = {}
- 			if profiles_complex:
- 				mygcfg_dlists = []
- 				for x in profiles_complex:
- 					# Prevent accidents triggered by USE="${USE} ..." settings
- 					# at the top of make.defaults which caused parent profile
- 					# USE to override parent profile package.use settings.
- 					# It would be nice to guard USE_EXPAND variables like
- 					# this too, but unfortunately USE_EXPAND is not known
- 					# until after make.defaults has been evaluated, so that
- 					# will require some form of make.defaults preprocessing.
- 					expand_map.pop("USE", None)
- 					mygcfg_dlists.append(
- 						getconfig(os.path.join(x.location, "make.defaults"),
- 						tolerant=tolerant, expand=expand_map,
- 						recursive=x.portage1_directories))
- 				self._make_defaults = mygcfg_dlists
- 				mygcfg = stack_dicts(mygcfg_dlists,
- 					incrementals=self.incrementals)
- 				if mygcfg is None:
- 					mygcfg = {}
- 			self.configlist.append(mygcfg)
- 			self.configdict["defaults"]=self.configlist[-1]
- 
- 			mygcfg = {}
- 			for x in make_conf_paths:
- 				mygcfg.update(getconfig(x,
- 					tolerant=tolerant, allow_sourcing=True,
- 					expand=expand_map, recursive=True) or {})
- 
- 			# __* variables set in make.conf are local and are not be propagated.
- 			mygcfg = {k: v for k, v in mygcfg.items() if not k.startswith("__")}
- 
- 			# Don't allow the user to override certain variables in make.conf
- 			profile_only_variables = self.configdict["defaults"].get(
- 				"PROFILE_ONLY_VARIABLES", "").split()
- 			profile_only_variables = stack_lists([profile_only_variables])
- 			non_user_variables = set()
- 			non_user_variables.update(profile_only_variables)
- 			non_user_variables.update(self._env_blacklist)
- 			non_user_variables.update(self._global_only_vars)
- 			non_user_variables = frozenset(non_user_variables)
- 			self._non_user_variables = non_user_variables
- 
- 			self._env_d_blacklist = frozenset(chain(
- 				profile_only_variables,
- 				self._env_blacklist,
- 			))
- 			env_d = self.configdict["env.d"]
- 			for k in self._env_d_blacklist:
- 				env_d.pop(k, None)
- 
- 			for k in profile_only_variables:
- 				mygcfg.pop(k, None)
- 
- 			self.configlist.append(mygcfg)
- 			self.configdict["conf"]=self.configlist[-1]
- 
- 			self.configlist.append(LazyItemsDict())
- 			self.configdict["pkg"]=self.configlist[-1]
- 
- 			self.configdict["backupenv"] = self.backupenv
- 
- 			# Don't allow the user to override certain variables in the env
- 			for k in profile_only_variables:
- 				self.backupenv.pop(k, None)
- 
- 			self.configlist.append(self.configdict["env"])
- 
- 			# make lookuplist for loading package.*
- 			self.lookuplist=self.configlist[:]
- 			self.lookuplist.reverse()
- 
- 			# Blacklist vars that could interfere with portage internals.
- 			for blacklisted in self._env_blacklist:
- 				for cfg in self.lookuplist:
- 					cfg.pop(blacklisted, None)
- 				self.backupenv.pop(blacklisted, None)
- 			del blacklisted, cfg
- 
- 			self["PORTAGE_CONFIGROOT"] = config_root
- 			self.backup_changes("PORTAGE_CONFIGROOT")
- 			self["ROOT"] = target_root
- 			self.backup_changes("ROOT")
- 			self["SYSROOT"] = sysroot
- 			self.backup_changes("SYSROOT")
- 			self["EPREFIX"] = eprefix
- 			self.backup_changes("EPREFIX")
- 			self["EROOT"] = eroot
- 			self.backup_changes("EROOT")
- 			self["ESYSROOT"] = esysroot
- 			self.backup_changes("ESYSROOT")
- 			self["BROOT"] = broot
- 			self.backup_changes("BROOT")
- 
- 			# The prefix of the running portage instance is used in the
- 			# ebuild environment to implement the --host-root option for
- 			# best_version and has_version.
- 			self["PORTAGE_OVERRIDE_EPREFIX"] = portage.const.EPREFIX
- 			self.backup_changes("PORTAGE_OVERRIDE_EPREFIX")
- 
- 			self._ppropertiesdict = portage.dep.ExtendedAtomDict(dict)
- 			self._paccept_restrict = portage.dep.ExtendedAtomDict(dict)
- 			self._penvdict = portage.dep.ExtendedAtomDict(dict)
- 			self._pbashrcdict = {}
- 			self._pbashrc = ()
- 
- 			self._repo_make_defaults = {}
- 			for repo in self.repositories.repos_with_profiles():
- 				d = getconfig(os.path.join(repo.location, "profiles", "make.defaults"),
- 					tolerant=tolerant, expand=self.configdict["globals"].copy(), recursive=repo.portage1_profiles) or {}
- 				if d:
- 					for k in chain(self._env_blacklist,
- 						profile_only_variables, self._global_only_vars):
- 						d.pop(k, None)
- 				self._repo_make_defaults[repo.name] = d
- 
- 			#Read all USE related files from profiles and optionally from user config.
- 			self._use_manager = UseManager(self.repositories, profiles_complex,
- 				abs_user_config, self._isStable, user_config=local_config)
- 			#Initialize all USE related variables we track ourselves.
- 			self.usemask = self._use_manager.getUseMask()
- 			self.useforce = self._use_manager.getUseForce()
- 			self.configdict["conf"]["USE"] = \
- 				self._use_manager.extract_global_USE_changes( \
- 					self.configdict["conf"].get("USE", ""))
- 
- 			#Read license_groups and optionally license_groups and package.license from user config
- 			self._license_manager = LicenseManager(locations_manager.profile_locations, \
- 				abs_user_config, user_config=local_config)
- 			#Extract '*/*' entries from package.license
- 			self.configdict["conf"]["ACCEPT_LICENSE"] = \
- 				self._license_manager.extract_global_changes( \
- 					self.configdict["conf"].get("ACCEPT_LICENSE", ""))
- 
- 			# profile.bashrc
- 			self._profile_bashrc = tuple(os.path.isfile(os.path.join(profile.location, 'profile.bashrc'))
- 				for profile in profiles_complex)
- 
- 			if local_config:
- 				#package.properties
- 				propdict = grabdict_package(os.path.join(
- 					abs_user_config, "package.properties"), recursive=1, allow_wildcard=True, \
- 					allow_repo=True, verify_eapi=False,
- 					allow_build_id=True)
- 				v = propdict.pop("*/*", None)
- 				if v is not None:
- 					if "ACCEPT_PROPERTIES" in self.configdict["conf"]:
- 						self.configdict["conf"]["ACCEPT_PROPERTIES"] += " " + " ".join(v)
- 					else:
- 						self.configdict["conf"]["ACCEPT_PROPERTIES"] = " ".join(v)
- 				for k, v in propdict.items():
- 					self._ppropertiesdict.setdefault(k.cp, {})[k] = v
- 
- 				# package.accept_restrict
- 				d = grabdict_package(os.path.join(
- 					abs_user_config, "package.accept_restrict"),
- 					recursive=True, allow_wildcard=True,
- 					allow_repo=True, verify_eapi=False,
- 					allow_build_id=True)
- 				v = d.pop("*/*", None)
- 				if v is not None:
- 					if "ACCEPT_RESTRICT" in self.configdict["conf"]:
- 						self.configdict["conf"]["ACCEPT_RESTRICT"] += " " + " ".join(v)
- 					else:
- 						self.configdict["conf"]["ACCEPT_RESTRICT"] = " ".join(v)
- 				for k, v in d.items():
- 					self._paccept_restrict.setdefault(k.cp, {})[k] = v
- 
- 				#package.env
- 				penvdict = grabdict_package(os.path.join(
- 					abs_user_config, "package.env"), recursive=1, allow_wildcard=True, \
- 					allow_repo=True, verify_eapi=False,
- 					allow_build_id=True)
- 				v = penvdict.pop("*/*", None)
- 				if v is not None:
- 					global_wildcard_conf = {}
- 					self._grab_pkg_env(v, global_wildcard_conf)
- 					incrementals = self.incrementals
- 					conf_configdict = self.configdict["conf"]
- 					for k, v in global_wildcard_conf.items():
- 						if k in incrementals:
- 							if k in conf_configdict:
- 								conf_configdict[k] = \
- 									conf_configdict[k] + " " + v
- 							else:
- 								conf_configdict[k] = v
- 						else:
- 							conf_configdict[k] = v
- 						expand_map[k] = v
- 
- 				for k, v in penvdict.items():
- 					self._penvdict.setdefault(k.cp, {})[k] = v
- 
- 				# package.bashrc
- 				for profile in profiles_complex:
- 					if not 'profile-bashrcs' in profile.profile_formats:
- 						continue
- 					self._pbashrcdict[profile] = \
- 						portage.dep.ExtendedAtomDict(dict)
- 					bashrc = grabdict_package(os.path.join(profile.location,
- 						"package.bashrc"), recursive=1, allow_wildcard=True,
- 								allow_repo=allow_profile_repo_deps(profile),
- 								verify_eapi=True,
- 								eapi=profile.eapi, eapi_default=None,
- 								allow_build_id=profile.allow_build_id)
- 					if not bashrc:
- 						continue
- 
- 					for k, v in bashrc.items():
- 						envfiles = [os.path.join(profile.location,
- 							"bashrc",
- 							envname) for envname in v]
- 						self._pbashrcdict[profile].setdefault(k.cp, {})\
- 							.setdefault(k, []).extend(envfiles)
- 
- 			#getting categories from an external file now
- 			self.categories = [grabfile(os.path.join(x, "categories")) \
- 				for x in locations_manager.profile_and_user_locations]
- 			category_re = dbapi._category_re
- 			# categories used to be a tuple, but now we use a frozenset
- 			# for hashed category validation in pordbapi.cp_list()
- 			self.categories = frozenset(
- 				x for x in stack_lists(self.categories, incremental=1)
- 				if category_re.match(x) is not None)
- 
- 			archlist = [grabfile(os.path.join(x, "arch.list")) \
- 				for x in locations_manager.profile_and_user_locations]
- 			archlist = sorted(stack_lists(archlist, incremental=1))
- 			self.configdict["conf"]["PORTAGE_ARCHLIST"] = " ".join(archlist)
- 
- 			pkgprovidedlines = []
- 			for x in profiles_complex:
- 				provpath = os.path.join(x.location, "package.provided")
- 				if os.path.exists(provpath):
- 					if _get_eapi_attrs(x.eapi).allows_package_provided:
- 						pkgprovidedlines.append(grabfile(provpath,
- 							recursive=x.portage1_directories))
- 					else:
- 						# TODO: bail out?
- 						writemsg((_("!!! package.provided not allowed in EAPI %s: ")
- 								%x.eapi)+x.location+"\n",
- 							noiselevel=-1)
- 
- 			pkgprovidedlines = stack_lists(pkgprovidedlines, incremental=1)
- 			has_invalid_data = False
- 			for x in range(len(pkgprovidedlines)-1, -1, -1):
- 				myline = pkgprovidedlines[x]
- 				if not isvalidatom("=" + myline):
- 					writemsg(_("Invalid package name in package.provided: %s\n") % \
- 						myline, noiselevel=-1)
- 					has_invalid_data = True
- 					del pkgprovidedlines[x]
- 					continue
- 				cpvr = catpkgsplit(pkgprovidedlines[x])
- 				if not cpvr or cpvr[0] == "null":
- 					writemsg(_("Invalid package name in package.provided: ")+pkgprovidedlines[x]+"\n",
- 						noiselevel=-1)
- 					has_invalid_data = True
- 					del pkgprovidedlines[x]
- 					continue
- 			if has_invalid_data:
- 				writemsg(_("See portage(5) for correct package.provided usage.\n"),
- 					noiselevel=-1)
- 			self.pprovideddict = {}
- 			for x in pkgprovidedlines:
- 				x_split = catpkgsplit(x)
- 				if x_split is None:
- 					continue
- 				mycatpkg = cpv_getkey(x)
- 				if mycatpkg in self.pprovideddict:
- 					self.pprovideddict[mycatpkg].append(x)
- 				else:
- 					self.pprovideddict[mycatpkg]=[x]
- 
- 			# reasonable defaults; this is important as without USE_ORDER,
- 			# USE will always be "" (nothing set)!
- 			if "USE_ORDER" not in self:
- 				self["USE_ORDER"] = "env:pkg:conf:defaults:pkginternal:features:repo:env.d"
- 				self.backup_changes("USE_ORDER")
- 
- 			if "CBUILD" not in self and "CHOST" in self:
- 				self["CBUILD"] = self["CHOST"]
- 				self.backup_changes("CBUILD")
- 
- 			if "USERLAND" not in self:
- 				# Set default USERLAND so that our test cases can assume that
- 				# it's always set. This allows isolated-functions.sh to avoid
- 				# calling uname -s when sourced.
- 				system = platform.system()
- 				if system is not None and \
- 					(system.endswith("BSD") or system == "DragonFly"):
- 					self["USERLAND"] = "BSD"
- 				else:
- 					self["USERLAND"] = "GNU"
- 				self.backup_changes("USERLAND")
- 
- 			default_inst_ids = {
- 				"PORTAGE_INST_GID": "0",
- 				"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")
- 
- 			for var, default_val in default_inst_ids.items():
- 				try:
- 					self[var] = str(int(self.get(var, default_val)))
- 				except ValueError:
- 					writemsg(_("!!! %s='%s' is not a valid integer.  "
- 						"Falling back to %s.\n") % (var, self[var], default_val),
- 						noiselevel=-1)
- 					self[var] = default_val
- 				self.backup_changes(var)
- 
- 			self.depcachedir = self.get("PORTAGE_DEPCACHEDIR")
- 			if self.depcachedir is None:
- 				self.depcachedir = os.path.join(os.sep,
- 					portage.const.EPREFIX, DEPCACHE_PATH.lstrip(os.sep))
- 				if unprivileged and target_root != os.sep:
- 					# In unprivileged mode, automatically make
- 					# depcachedir relative to target_root if the
- 					# default depcachedir is not writable.
- 					if not os.access(first_existing(self.depcachedir),
- 						os.W_OK):
- 						self.depcachedir = os.path.join(eroot,
- 							DEPCACHE_PATH.lstrip(os.sep))
- 
- 			self["PORTAGE_DEPCACHEDIR"] = self.depcachedir
- 			self.backup_changes("PORTAGE_DEPCACHEDIR")
- 
- 			if portage._internal_caller:
- 				self["PORTAGE_INTERNAL_CALLER"] = "1"
- 				self.backup_changes("PORTAGE_INTERNAL_CALLER")
- 
- 			# initialize self.features
- 			self.regenerate()
- 			feature_use = []
- 			if "test" in self.features:
- 				feature_use.append("test")
- 			self.configdict["features"]["USE"] = self._default_features_use = " ".join(feature_use)
- 			if feature_use:
- 				# Regenerate USE so that the initial "test" flag state is
- 				# correct for evaluation of !test? conditionals in RESTRICT.
- 				self.regenerate()
+     """
+     This class encompasses the main portage configuration.  Data is pulled from
+     ROOT/PORTDIR/profiles/, from ROOT/etc/make.profile incrementally through all
+     parent profiles as well as from ROOT/PORTAGE_CONFIGROOT/* for user specified
+     overrides.
+ 
+     Generally if you need data like USE flags, FEATURES, environment variables,
+     virtuals ...etc you look in here.
+     """
+ 
+     _constant_keys = frozenset(
+         ["PORTAGE_BIN_PATH", "PORTAGE_GID", "PORTAGE_PYM_PATH", "PORTAGE_PYTHONPATH"]
+     )
+ 
+     _deprecated_keys = {
+         "PORTAGE_LOGDIR": "PORT_LOGDIR",
+         "PORTAGE_LOGDIR_CLEAN": "PORT_LOGDIR_CLEAN",
+         "SIGNED_OFF_BY": "DCO_SIGNED_OFF_BY",
+     }
+ 
+     _setcpv_aux_keys = (
+         "BDEPEND",
+         "DEFINED_PHASES",
+         "DEPEND",
+         "EAPI",
+         "IDEPEND",
+         "INHERITED",
+         "IUSE",
+         "REQUIRED_USE",
+         "KEYWORDS",
+         "LICENSE",
+         "PDEPEND",
+         "PROPERTIES",
+         "RDEPEND",
+         "SLOT",
+         "repository",
+         "RESTRICT",
+         "LICENSE",
+     )
+ 
+     _module_aliases = {
+         "cache.metadata_overlay.database": "portage.cache.flat_hash.mtime_md5_database",
+         "portage.cache.metadata_overlay.database": "portage.cache.flat_hash.mtime_md5_database",
+     }
+ 
+     _case_insensitive_vars = special_env_vars.case_insensitive_vars
+     _default_globals = special_env_vars.default_globals
+     _env_blacklist = special_env_vars.env_blacklist
+     _environ_filter = special_env_vars.environ_filter
+     _environ_whitelist = special_env_vars.environ_whitelist
+     _environ_whitelist_re = special_env_vars.environ_whitelist_re
+     _global_only_vars = special_env_vars.global_only_vars
+ 
+     def __init__(
+         self,
+         clone=None,
+         mycpv=None,
+         config_profile_path=None,
+         config_incrementals=None,
+         config_root=None,
+         target_root=None,
+         sysroot=None,
+         eprefix=None,
+         local_config=True,
+         env=None,
+         _unmatched_removal=False,
+         repositories=None,
+     ):
+         """
+         @param clone: If provided, init will use deepcopy to copy by value the instance.
+         @type clone: Instance of config class.
+         @param mycpv: CPV to load up (see setcpv), this is the same as calling init with mycpv=None
+         and then calling instance.setcpv(mycpv).
+         @type mycpv: String
+         @param config_profile_path: Configurable path to the profile (usually PROFILE_PATH from portage.const)
+         @type config_profile_path: String
+         @param config_incrementals: List of incremental variables
+                 (defaults to portage.const.INCREMENTALS)
+         @type config_incrementals: List
+         @param config_root: path to read local config from (defaults to "/", see PORTAGE_CONFIGROOT)
+         @type config_root: String
+         @param target_root: the target root, which typically corresponds to the
+                 value of the $ROOT env variable (default is /)
+         @type target_root: String
+         @param sysroot: the sysroot to build against, which typically corresponds
+                  to the value of the $SYSROOT env variable (default is /)
+         @type sysroot: String
+         @param eprefix: set the EPREFIX variable (default is portage.const.EPREFIX)
+         @type eprefix: String
+         @param local_config: Enables loading of local config (/etc/portage); used most by repoman to
+         ignore local config (keywording and unmasking)
+         @type local_config: Boolean
+         @param env: The calling environment which is used to override settings.
+                 Defaults to os.environ if unspecified.
+         @type env: dict
+         @param _unmatched_removal: Enabled by repoman when the
+                 --unmatched-removal option is given.
+         @type _unmatched_removal: Boolean
+         @param repositories: Configuration of repositories.
+                 Defaults to portage.repository.config.load_repository_config().
+         @type repositories: Instance of portage.repository.config.RepoConfigLoader class.
+         """
+ 
+         # This is important when config is reloaded after emerge --sync.
+         _eapi_cache.clear()
+ 
+         # When initializing the global portage.settings instance, avoid
+         # raising exceptions whenever possible since exceptions thrown
+         # from 'import portage' or 'import portage.exceptions' statements
+         # can practically render the api unusable for api consumers.
+         tolerant = hasattr(portage, "_initializing_globals")
+         self._tolerant = tolerant
+         self._unmatched_removal = _unmatched_removal
+ 
+         self.locked = 0
+         self.mycpv = None
+         self._setcpv_args_hash = None
+         self.puse = ""
+         self._penv = []
+         self.modifiedkeys = []
+         self.uvlist = []
+         self._accept_chost_re = None
+         self._accept_properties = None
+         self._accept_restrict = None
+         self._features_overrides = []
+         self._make_defaults = None
+         self._parent_stable = None
+         self._soname_provided = None
+ 
+         # _unknown_features records unknown features that
+         # have triggered warning messages, and ensures that
+         # the same warning isn't shown twice.
+         self._unknown_features = set()
+ 
+         self.local_config = local_config
+ 
+         if clone:
+             # For immutable attributes, use shallow copy for
+             # speed and memory conservation.
+             self._tolerant = clone._tolerant
+             self._unmatched_removal = clone._unmatched_removal
+             self.categories = clone.categories
+             self.depcachedir = clone.depcachedir
+             self.incrementals = clone.incrementals
+             self.module_priority = clone.module_priority
+             self.profile_path = clone.profile_path
+             self.profiles = clone.profiles
+             self.packages = clone.packages
+             self.repositories = clone.repositories
+             self.unpack_dependencies = clone.unpack_dependencies
+             self._default_features_use = clone._default_features_use
+             self._iuse_effective = clone._iuse_effective
+             self._iuse_implicit_match = clone._iuse_implicit_match
+             self._non_user_variables = clone._non_user_variables
+             self._env_d_blacklist = clone._env_d_blacklist
+             self._pbashrc = clone._pbashrc
+             self._repo_make_defaults = clone._repo_make_defaults
+             self.usemask = clone.usemask
+             self.useforce = clone.useforce
+             self.puse = clone.puse
+             self.user_profile_dir = clone.user_profile_dir
+             self.local_config = clone.local_config
+             self.make_defaults_use = clone.make_defaults_use
+             self.mycpv = clone.mycpv
+             self._setcpv_args_hash = clone._setcpv_args_hash
+             self._soname_provided = clone._soname_provided
+             self._profile_bashrc = clone._profile_bashrc
+ 
+             # immutable attributes (internal policy ensures lack of mutation)
+             self._locations_manager = clone._locations_manager
+             self._use_manager = clone._use_manager
+             # force instantiation of lazy immutable objects when cloning, so
+             # that they're not instantiated more than once
+             self._keywords_manager_obj = clone._keywords_manager
+             self._mask_manager_obj = clone._mask_manager
+ 
+             # shared mutable attributes
+             self._unknown_features = clone._unknown_features
+ 
+             self.modules = copy.deepcopy(clone.modules)
+             self._penv = copy.deepcopy(clone._penv)
+ 
+             self.configdict = copy.deepcopy(clone.configdict)
+             self.configlist = [
+                 self.configdict["env.d"],
+                 self.configdict["repo"],
+                 self.configdict["features"],
+                 self.configdict["pkginternal"],
+                 self.configdict["globals"],
+                 self.configdict["defaults"],
+                 self.configdict["conf"],
+                 self.configdict["pkg"],
+                 self.configdict["env"],
+             ]
+             self.lookuplist = self.configlist[:]
+             self.lookuplist.reverse()
+             self._use_expand_dict = copy.deepcopy(clone._use_expand_dict)
+             self.backupenv = self.configdict["backupenv"]
+             self.prevmaskdict = copy.deepcopy(clone.prevmaskdict)
+             self.pprovideddict = copy.deepcopy(clone.pprovideddict)
+             self.features = features_set(self)
+             self.features._features = copy.deepcopy(clone.features._features)
+             self._features_overrides = copy.deepcopy(clone._features_overrides)
+ 
+             # Strictly speaking _license_manager is not immutable. Users need to ensure that
+             # extract_global_changes() is called right after __init__ (if at all).
+             # It also has the mutable member _undef_lic_groups. It is used to track
+             # undefined license groups, to not display an error message for the same
+             # group again and again. Because of this, it's useful to share it between
+             # all LicenseManager instances.
+             self._license_manager = clone._license_manager
+ 
+             # force instantiation of lazy objects when cloning, so
+             # that they're not instantiated more than once
+             self._virtuals_manager_obj = copy.deepcopy(clone._virtuals_manager)
+ 
+             self._accept_properties = copy.deepcopy(clone._accept_properties)
+             self._ppropertiesdict = copy.deepcopy(clone._ppropertiesdict)
+             self._accept_restrict = copy.deepcopy(clone._accept_restrict)
+             self._paccept_restrict = copy.deepcopy(clone._paccept_restrict)
+             self._penvdict = copy.deepcopy(clone._penvdict)
+             self._pbashrcdict = copy.deepcopy(clone._pbashrcdict)
+             self._expand_map = copy.deepcopy(clone._expand_map)
+ 
+         else:
+             # lazily instantiated objects
+             self._keywords_manager_obj = None
+             self._mask_manager_obj = None
+             self._virtuals_manager_obj = None
+ 
+             locations_manager = LocationsManager(
+                 config_root=config_root,
+                 config_profile_path=config_profile_path,
+                 eprefix=eprefix,
+                 local_config=local_config,
+                 target_root=target_root,
+                 sysroot=sysroot,
+             )
+             self._locations_manager = locations_manager
+ 
+             eprefix = locations_manager.eprefix
+             config_root = locations_manager.config_root
+             sysroot = locations_manager.sysroot
+             esysroot = locations_manager.esysroot
+             broot = locations_manager.broot
+             abs_user_config = locations_manager.abs_user_config
+             make_conf_paths = [
+                 os.path.join(config_root, "etc", "make.conf"),
+                 os.path.join(config_root, MAKE_CONF_FILE),
+             ]
+             try:
+                 if os.path.samefile(*make_conf_paths):
+                     make_conf_paths.pop()
+             except OSError:
+                 pass
+ 
+             make_conf_count = 0
+             make_conf = {}
+             for x in make_conf_paths:
+                 mygcfg = getconfig(
+                     x,
+                     tolerant=tolerant,
+                     allow_sourcing=True,
+                     expand=make_conf,
+                     recursive=True,
+                 )
+                 if mygcfg is not None:
+                     make_conf.update(mygcfg)
+                     make_conf_count += 1
+ 
+             if make_conf_count == 2:
+                 writemsg(
+                     "!!! %s\n"
+                     % _("Found 2 make.conf files, using both '%s' and '%s'")
+                     % tuple(make_conf_paths),
+                     noiselevel=-1,
+                 )
+ 
+             # __* variables set in make.conf are local and are not be propagated.
+             make_conf = {k: v for k, v in make_conf.items() if not k.startswith("__")}
+ 
+             # Allow ROOT setting to come from make.conf if it's not overridden
+             # by the constructor argument (from the calling environment).
+             locations_manager.set_root_override(make_conf.get("ROOT"))
+             target_root = locations_manager.target_root
+             eroot = locations_manager.eroot
+             self.global_config_path = locations_manager.global_config_path
+ 
+             # The expand_map is used for variable substitution
+             # in getconfig() calls, and the getconfig() calls
+             # update expand_map with the value of each variable
+             # assignment that occurs. Variable substitution occurs
+             # in the following order, which corresponds to the
+             # order of appearance in self.lookuplist:
+             #
+             #   * env.d
+             #   * make.globals
+             #   * make.defaults
+             #   * make.conf
+             #
+             # Notably absent is "env", since we want to avoid any
+             # interaction with the calling environment that might
+             # lead to unexpected results.
+ 
+             env_d = (
+                 getconfig(
+                     os.path.join(eroot, "etc", "profile.env"),
+                     tolerant=tolerant,
+                     expand=False,
+                 )
+                 or {}
+             )
+             expand_map = env_d.copy()
+             self._expand_map = expand_map
+ 
+             # Allow make.globals and make.conf to set paths relative to vars like ${EPREFIX}.
+             expand_map["BROOT"] = broot
+             expand_map["EPREFIX"] = eprefix
+             expand_map["EROOT"] = eroot
+             expand_map["ESYSROOT"] = esysroot
+             expand_map["PORTAGE_CONFIGROOT"] = config_root
+             expand_map["ROOT"] = target_root
+             expand_map["SYSROOT"] = sysroot
+ 
+             if portage._not_installed:
+                 make_globals_path = os.path.join(
+                     PORTAGE_BASE_PATH, "cnf", "make.globals"
+                 )
+             else:
+                 make_globals_path = os.path.join(
+                     self.global_config_path, "make.globals"
+                 )
+             old_make_globals = os.path.join(config_root, "etc", "make.globals")
+             if os.path.isfile(old_make_globals) and not os.path.samefile(
+                 make_globals_path, old_make_globals
+             ):
+                 # Don't warn if they refer to the same path, since
+                 # that can be used for backward compatibility with
+                 # old software.
+                 writemsg(
+                     "!!! %s\n"
+                     % _(
+                         "Found obsolete make.globals file: "
+                         "'%s', (using '%s' instead)"
+                     )
+                     % (old_make_globals, make_globals_path),
+                     noiselevel=-1,
+                 )
+ 
+             make_globals = getconfig(
+                 make_globals_path, tolerant=tolerant, expand=expand_map
+             )
+             if make_globals is None:
+                 make_globals = {}
+ 
+             for k, v in self._default_globals.items():
+                 make_globals.setdefault(k, v)
+ 
+             if config_incrementals is None:
+                 self.incrementals = INCREMENTALS
+             else:
+                 self.incrementals = config_incrementals
+             if not isinstance(self.incrementals, frozenset):
+                 self.incrementals = frozenset(self.incrementals)
+ 
+             self.module_priority = ("user", "default")
+             self.modules = {}
+             modules_file = os.path.join(config_root, MODULES_FILE_PATH)
+             modules_loader = KeyValuePairFileLoader(modules_file, None, None)
+             modules_dict, modules_errors = modules_loader.load()
+             self.modules["user"] = modules_dict
+             if self.modules["user"] is None:
+                 self.modules["user"] = {}
+             user_auxdbmodule = self.modules["user"].get("portdbapi.auxdbmodule")
+             if (
+                 user_auxdbmodule is not None
+                 and user_auxdbmodule in self._module_aliases
+             ):
+                 warnings.warn(
+                     "'%s' is deprecated: %s" % (user_auxdbmodule, modules_file)
+                 )
+ 
+             self.modules["default"] = {
+                 "portdbapi.auxdbmodule": "portage.cache.flat_hash.mtime_md5_database",
+             }
+ 
+             self.configlist = []
+ 
+             # back up our incremental variables:
+             self.configdict = {}
+             self._use_expand_dict = {}
+             # configlist will contain: [ env.d, globals, features, defaults, conf, pkg, backupenv, env ]
+             self.configlist.append({})
+             self.configdict["env.d"] = self.configlist[-1]
+ 
+             self.configlist.append({})
+             self.configdict["repo"] = self.configlist[-1]
+ 
+             self.configlist.append({})
+             self.configdict["features"] = self.configlist[-1]
+ 
+             self.configlist.append({})
+             self.configdict["pkginternal"] = self.configlist[-1]
+ 
+             # env_d will be None if profile.env doesn't exist.
+             if env_d:
+                 self.configdict["env.d"].update(env_d)
+ 
+             # backupenv is used for calculating incremental variables.
+             if env is None:
+                 env = os.environ
+ 
+             # Avoid potential UnicodeDecodeError exceptions later.
+             env_unicode = dict(
+                 (_unicode_decode(k), _unicode_decode(v)) for k, v in env.items()
+             )
+ 
+             self.backupenv = env_unicode
+ 
+             if env_d:
+                 # Remove duplicate values so they don't override updated
+                 # profile.env values later (profile.env is reloaded in each
+                 # call to self.regenerate).
+                 for k, v in env_d.items():
+                     try:
+                         if self.backupenv[k] == v:
+                             del self.backupenv[k]
+                     except KeyError:
+                         pass
+                 del k, v
+ 
+             self.configdict["env"] = LazyItemsDict(self.backupenv)
+ 
+             self.configlist.append(make_globals)
+             self.configdict["globals"] = self.configlist[-1]
+ 
+             self.make_defaults_use = []
+ 
+             # Loading Repositories
+             self["PORTAGE_CONFIGROOT"] = config_root
+             self["ROOT"] = target_root
+             self["SYSROOT"] = sysroot
+             self["EPREFIX"] = eprefix
+             self["EROOT"] = eroot
+             self["ESYSROOT"] = esysroot
+             self["BROOT"] = broot
+             known_repos = []
+             portdir = ""
+             portdir_overlay = ""
+             portdir_sync = None
+             for confs in [make_globals, make_conf, self.configdict["env"]]:
+                 v = confs.get("PORTDIR")
+                 if v is not None:
+                     portdir = v
+                     known_repos.append(v)
+                 v = confs.get("PORTDIR_OVERLAY")
+                 if v is not None:
+                     portdir_overlay = v
+                     known_repos.extend(shlex_split(v))
+                 v = confs.get("SYNC")
+                 if v is not None:
+                     portdir_sync = v
+                 if "PORTAGE_RSYNC_EXTRA_OPTS" in confs:
+                     self["PORTAGE_RSYNC_EXTRA_OPTS"] = confs["PORTAGE_RSYNC_EXTRA_OPTS"]
+ 
+             self["PORTDIR"] = portdir
+             self["PORTDIR_OVERLAY"] = portdir_overlay
+             if portdir_sync:
+                 self["SYNC"] = portdir_sync
+             self.lookuplist = [self.configdict["env"]]
+             if repositories is None:
+                 self.repositories = load_repository_config(self)
+             else:
+                 self.repositories = repositories
+ 
+             known_repos.extend(repo.location for repo in self.repositories)
+             known_repos = frozenset(known_repos)
+ 
+             self["PORTAGE_REPOSITORIES"] = self.repositories.config_string()
+             self.backup_changes("PORTAGE_REPOSITORIES")
+ 
+             # filling PORTDIR and PORTDIR_OVERLAY variable for compatibility
+             main_repo = self.repositories.mainRepo()
+             if main_repo is not None:
+                 self["PORTDIR"] = main_repo.location
+                 self.backup_changes("PORTDIR")
+                 expand_map["PORTDIR"] = self["PORTDIR"]
+ 
+             # repoman controls PORTDIR_OVERLAY via the environment, so no
+             # special cases are needed here.
+             portdir_overlay = list(self.repositories.repoLocationList())
+             if portdir_overlay and portdir_overlay[0] == self["PORTDIR"]:
+                 portdir_overlay = portdir_overlay[1:]
+ 
+             new_ov = []
+             if portdir_overlay:
+                 for ov in portdir_overlay:
+                     ov = normalize_path(ov)
+                     if isdir_raise_eaccess(ov) or portage._sync_mode:
+                         new_ov.append(portage._shell_quote(ov))
+                     else:
+                         writemsg(
+                             _("!!! Invalid PORTDIR_OVERLAY" " (not a dir): '%s'\n")
+                             % ov,
+                             noiselevel=-1,
+                         )
+ 
+             self["PORTDIR_OVERLAY"] = " ".join(new_ov)
+             self.backup_changes("PORTDIR_OVERLAY")
+             expand_map["PORTDIR_OVERLAY"] = self["PORTDIR_OVERLAY"]
+ 
+             locations_manager.set_port_dirs(self["PORTDIR"], self["PORTDIR_OVERLAY"])
+             locations_manager.load_profiles(self.repositories, known_repos)
+ 
+             profiles_complex = locations_manager.profiles_complex
+             self.profiles = locations_manager.profiles
+             self.profile_path = locations_manager.profile_path
+             self.user_profile_dir = locations_manager.user_profile_dir
+ 
+             try:
+                 packages_list = [
+                     grabfile_package(
+                         os.path.join(x.location, "packages"),
+                         verify_eapi=True,
+                         eapi=x.eapi,
+                         eapi_default=None,
+                         allow_repo=allow_profile_repo_deps(x),
+                         allow_build_id=x.allow_build_id,
+                     )
+                     for x in profiles_complex
+                 ]
+             except EnvironmentError as e:
+                 _raise_exc(e)
+ 
+             self.packages = tuple(stack_lists(packages_list, incremental=1))
+ 
+             # revmaskdict
+             self.prevmaskdict = {}
+             for x in self.packages:
+                 # Negative atoms are filtered by the above stack_lists() call.
+                 if not isinstance(x, Atom):
+                     x = Atom(x.lstrip("*"))
+                 self.prevmaskdict.setdefault(x.cp, []).append(x)
+ 
+             self.unpack_dependencies = load_unpack_dependencies_configuration(
+                 self.repositories
+             )
+ 
+             mygcfg = {}
+             if profiles_complex:
+                 mygcfg_dlists = []
+                 for x in profiles_complex:
+                     # Prevent accidents triggered by USE="${USE} ..." settings
+                     # at the top of make.defaults which caused parent profile
+                     # USE to override parent profile package.use settings.
+                     # It would be nice to guard USE_EXPAND variables like
+                     # this too, but unfortunately USE_EXPAND is not known
+                     # until after make.defaults has been evaluated, so that
+                     # will require some form of make.defaults preprocessing.
+                     expand_map.pop("USE", None)
+                     mygcfg_dlists.append(
+                         getconfig(
+                             os.path.join(x.location, "make.defaults"),
+                             tolerant=tolerant,
+                             expand=expand_map,
+                             recursive=x.portage1_directories,
+                         )
+                     )
+                 self._make_defaults = mygcfg_dlists
+                 mygcfg = stack_dicts(mygcfg_dlists, incrementals=self.incrementals)
+                 if mygcfg is None:
+                     mygcfg = {}
+             self.configlist.append(mygcfg)
+             self.configdict["defaults"] = self.configlist[-1]
+ 
+             mygcfg = {}
+             for x in make_conf_paths:
+                 mygcfg.update(
+                     getconfig(
+                         x,
+                         tolerant=tolerant,
+                         allow_sourcing=True,
+                         expand=expand_map,
+                         recursive=True,
+                     )
+                     or {}
+                 )
+ 
+             # __* variables set in make.conf are local and are not be propagated.
+             mygcfg = {k: v for k, v in mygcfg.items() if not k.startswith("__")}
+ 
+             # Don't allow the user to override certain variables in make.conf
+             profile_only_variables = (
+                 self.configdict["defaults"].get("PROFILE_ONLY_VARIABLES", "").split()
+             )
+             profile_only_variables = stack_lists([profile_only_variables])
+             non_user_variables = set()
+             non_user_variables.update(profile_only_variables)
+             non_user_variables.update(self._env_blacklist)
+             non_user_variables.update(self._global_only_vars)
+             non_user_variables = frozenset(non_user_variables)
+             self._non_user_variables = non_user_variables
+ 
+             self._env_d_blacklist = frozenset(
+                 chain(
+                     profile_only_variables,
+                     self._env_blacklist,
+                 )
+             )
+             env_d = self.configdict["env.d"]
+             for k in self._env_d_blacklist:
+                 env_d.pop(k, None)
+ 
+             for k in profile_only_variables:
+                 mygcfg.pop(k, None)
+ 
+             self.configlist.append(mygcfg)
+             self.configdict["conf"] = self.configlist[-1]
+ 
+             self.configlist.append(LazyItemsDict())
+             self.configdict["pkg"] = self.configlist[-1]
+ 
+             self.configdict["backupenv"] = self.backupenv
+ 
+             # Don't allow the user to override certain variables in the env
+             for k in profile_only_variables:
+                 self.backupenv.pop(k, None)
+ 
+             self.configlist.append(self.configdict["env"])
+ 
+             # make lookuplist for loading package.*
+             self.lookuplist = self.configlist[:]
+             self.lookuplist.reverse()
+ 
+             # Blacklist vars that could interfere with portage internals.
+             for blacklisted in self._env_blacklist:
+                 for cfg in self.lookuplist:
+                     cfg.pop(blacklisted, None)
+                 self.backupenv.pop(blacklisted, None)
+             del blacklisted, cfg
+ 
+             self["PORTAGE_CONFIGROOT"] = config_root
+             self.backup_changes("PORTAGE_CONFIGROOT")
+             self["ROOT"] = target_root
+             self.backup_changes("ROOT")
+             self["SYSROOT"] = sysroot
+             self.backup_changes("SYSROOT")
+             self["EPREFIX"] = eprefix
+             self.backup_changes("EPREFIX")
+             self["EROOT"] = eroot
+             self.backup_changes("EROOT")
+             self["ESYSROOT"] = esysroot
+             self.backup_changes("ESYSROOT")
+             self["BROOT"] = broot
+             self.backup_changes("BROOT")
+ 
+             # The prefix of the running portage instance is used in the
+             # ebuild environment to implement the --host-root option for
+             # best_version and has_version.
+             self["PORTAGE_OVERRIDE_EPREFIX"] = portage.const.EPREFIX
+             self.backup_changes("PORTAGE_OVERRIDE_EPREFIX")
+ 
+             self._ppropertiesdict = portage.dep.ExtendedAtomDict(dict)
+             self._paccept_restrict = portage.dep.ExtendedAtomDict(dict)
+             self._penvdict = portage.dep.ExtendedAtomDict(dict)
+             self._pbashrcdict = {}
+             self._pbashrc = ()
+ 
+             self._repo_make_defaults = {}
+             for repo in self.repositories.repos_with_profiles():
+                 d = (
+                     getconfig(
+                         os.path.join(repo.location, "profiles", "make.defaults"),
+                         tolerant=tolerant,
+                         expand=self.configdict["globals"].copy(),
+                         recursive=repo.portage1_profiles,
+                     )
+                     or {}
+                 )
+                 if d:
+                     for k in chain(
+                         self._env_blacklist,
+                         profile_only_variables,
+                         self._global_only_vars,
+                     ):
+                         d.pop(k, None)
+                 self._repo_make_defaults[repo.name] = d
+ 
+             # Read all USE related files from profiles and optionally from user config.
+             self._use_manager = UseManager(
+                 self.repositories,
+                 profiles_complex,
+                 abs_user_config,
+                 self._isStable,
+                 user_config=local_config,
+             )
+             # Initialize all USE related variables we track ourselves.
+             self.usemask = self._use_manager.getUseMask()
+             self.useforce = self._use_manager.getUseForce()
+             self.configdict["conf"][
+                 "USE"
+             ] = self._use_manager.extract_global_USE_changes(
+                 self.configdict["conf"].get("USE", "")
+             )
+ 
+             # Read license_groups and optionally license_groups and package.license from user config
+             self._license_manager = LicenseManager(
+                 locations_manager.profile_locations,
+                 abs_user_config,
+                 user_config=local_config,
+             )
+             # Extract '*/*' entries from package.license
+             self.configdict["conf"][
+                 "ACCEPT_LICENSE"
+             ] = self._license_manager.extract_global_changes(
+                 self.configdict["conf"].get("ACCEPT_LICENSE", "")
+             )
+ 
+             # profile.bashrc
+             self._profile_bashrc = tuple(
+                 os.path.isfile(os.path.join(profile.location, "profile.bashrc"))
+                 for profile in profiles_complex
+             )
+ 
+             if local_config:
+                 # package.properties
+                 propdict = grabdict_package(
+                     os.path.join(abs_user_config, "package.properties"),
+                     recursive=1,
+                     allow_wildcard=True,
+                     allow_repo=True,
+                     verify_eapi=False,
+                     allow_build_id=True,
+                 )
+                 v = propdict.pop("*/*", None)
+                 if v is not None:
+                     if "ACCEPT_PROPERTIES" in self.configdict["conf"]:
+                         self.configdict["conf"]["ACCEPT_PROPERTIES"] += " " + " ".join(
+                             v
+                         )
+                     else:
+                         self.configdict["conf"]["ACCEPT_PROPERTIES"] = " ".join(v)
+                 for k, v in propdict.items():
+                     self._ppropertiesdict.setdefault(k.cp, {})[k] = v
+ 
+                 # package.accept_restrict
+                 d = grabdict_package(
+                     os.path.join(abs_user_config, "package.accept_restrict"),
+                     recursive=True,
+                     allow_wildcard=True,
+                     allow_repo=True,
+                     verify_eapi=False,
+                     allow_build_id=True,
+                 )
+                 v = d.pop("*/*", None)
+                 if v is not None:
+                     if "ACCEPT_RESTRICT" in self.configdict["conf"]:
+                         self.configdict["conf"]["ACCEPT_RESTRICT"] += " " + " ".join(v)
+                     else:
+                         self.configdict["conf"]["ACCEPT_RESTRICT"] = " ".join(v)
+                 for k, v in d.items():
+                     self._paccept_restrict.setdefault(k.cp, {})[k] = v
+ 
+                 # package.env
+                 penvdict = grabdict_package(
+                     os.path.join(abs_user_config, "package.env"),
+                     recursive=1,
+                     allow_wildcard=True,
+                     allow_repo=True,
+                     verify_eapi=False,
+                     allow_build_id=True,
+                 )
+                 v = penvdict.pop("*/*", None)
+                 if v is not None:
+                     global_wildcard_conf = {}
+                     self._grab_pkg_env(v, global_wildcard_conf)
+                     incrementals = self.incrementals
+                     conf_configdict = self.configdict["conf"]
+                     for k, v in global_wildcard_conf.items():
+                         if k in incrementals:
+                             if k in conf_configdict:
+                                 conf_configdict[k] = conf_configdict[k] + " " + v
+                             else:
+                                 conf_configdict[k] = v
+                         else:
+                             conf_configdict[k] = v
+                         expand_map[k] = v
+ 
+                 for k, v in penvdict.items():
+                     self._penvdict.setdefault(k.cp, {})[k] = v
+ 
+                 # package.bashrc
+                 for profile in profiles_complex:
+                     if not "profile-bashrcs" in profile.profile_formats:
+                         continue
+                     self._pbashrcdict[profile] = portage.dep.ExtendedAtomDict(dict)
+                     bashrc = grabdict_package(
+                         os.path.join(profile.location, "package.bashrc"),
+                         recursive=1,
+                         allow_wildcard=True,
+                         allow_repo=allow_profile_repo_deps(profile),
+                         verify_eapi=True,
+                         eapi=profile.eapi,
+                         eapi_default=None,
+                         allow_build_id=profile.allow_build_id,
+                     )
+                     if not bashrc:
+                         continue
+ 
+                     for k, v in bashrc.items():
+                         envfiles = [
+                             os.path.join(profile.location, "bashrc", envname)
+                             for envname in v
+                         ]
+                         self._pbashrcdict[profile].setdefault(k.cp, {}).setdefault(
+                             k, []
+                         ).extend(envfiles)
+ 
+             # getting categories from an external file now
+             self.categories = [
+                 grabfile(os.path.join(x, "categories"))
+                 for x in locations_manager.profile_and_user_locations
+             ]
+             category_re = dbapi._category_re
+             # categories used to be a tuple, but now we use a frozenset
+             # for hashed category validation in pordbapi.cp_list()
+             self.categories = frozenset(
+                 x
+                 for x in stack_lists(self.categories, incremental=1)
+                 if category_re.match(x) is not None
+             )
+ 
+             archlist = [
+                 grabfile(os.path.join(x, "arch.list"))
+                 for x in locations_manager.profile_and_user_locations
+             ]
+             archlist = sorted(stack_lists(archlist, incremental=1))
+             self.configdict["conf"]["PORTAGE_ARCHLIST"] = " ".join(archlist)
+ 
+             pkgprovidedlines = []
+             for x in profiles_complex:
+                 provpath = os.path.join(x.location, "package.provided")
+                 if os.path.exists(provpath):
+                     if _get_eapi_attrs(x.eapi).allows_package_provided:
+                         pkgprovidedlines.append(
+                             grabfile(provpath, recursive=x.portage1_directories)
+                         )
+                     else:
+                         # TODO: bail out?
+                         writemsg(
+                             (
+                                 _("!!! package.provided not allowed in EAPI %s: ")
+                                 % x.eapi
+                             )
+                             + x.location
+                             + "\n",
+                             noiselevel=-1,
+                         )
+ 
+             pkgprovidedlines = stack_lists(pkgprovidedlines, incremental=1)
+             has_invalid_data = False
+             for x in range(len(pkgprovidedlines) - 1, -1, -1):
+                 myline = pkgprovidedlines[x]
+                 if not isvalidatom("=" + myline):
+                     writemsg(
+                         _("Invalid package name in package.provided: %s\n") % myline,
+                         noiselevel=-1,
+                     )
+                     has_invalid_data = True
+                     del pkgprovidedlines[x]
+                     continue
+                 cpvr = catpkgsplit(pkgprovidedlines[x])
+                 if not cpvr or cpvr[0] == "null":
+                     writemsg(
+                         _("Invalid package name in package.provided: ")
+                         + pkgprovidedlines[x]
+                         + "\n",
+                         noiselevel=-1,
+                     )
+                     has_invalid_data = True
+                     del pkgprovidedlines[x]
+                     continue
+             if has_invalid_data:
+                 writemsg(
+                     _("See portage(5) for correct package.provided usage.\n"),
+                     noiselevel=-1,
+                 )
+             self.pprovideddict = {}
+             for x in pkgprovidedlines:
+                 x_split = catpkgsplit(x)
+                 if x_split is None:
+                     continue
+                 mycatpkg = cpv_getkey(x)
+                 if mycatpkg in self.pprovideddict:
+                     self.pprovideddict[mycatpkg].append(x)
+                 else:
+                     self.pprovideddict[mycatpkg] = [x]
+ 
+             # reasonable defaults; this is important as without USE_ORDER,
+             # USE will always be "" (nothing set)!
+             if "USE_ORDER" not in self:
+                 self[
+                     "USE_ORDER"
+                 ] = "env:pkg:conf:defaults:pkginternal:features:repo:env.d"
+                 self.backup_changes("USE_ORDER")
+ 
+             if "CBUILD" not in self and "CHOST" in self:
+                 self["CBUILD"] = self["CHOST"]
+                 self.backup_changes("CBUILD")
+ 
+             if "USERLAND" not in self:
+                 # Set default USERLAND so that our test cases can assume that
+                 # it's always set. This allows isolated-functions.sh to avoid
+                 # calling uname -s when sourced.
+                 system = platform.system()
+                 if system is not None and (
+                     system.endswith("BSD") or system == "DragonFly"
+                 ):
+                     self["USERLAND"] = "BSD"
+                 else:
+                     self["USERLAND"] = "GNU"
+                 self.backup_changes("USERLAND")
+ 
+             default_inst_ids = {
+                 "PORTAGE_INST_GID": "0",
+                 "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")
+ 
+             for var, default_val in default_inst_ids.items():
+                 try:
+                     self[var] = str(int(self.get(var, default_val)))
+                 except ValueError:
+                     writemsg(
+                         _(
+                             "!!! %s='%s' is not a valid integer.  "
+                             "Falling back to %s.\n"
+                         )
+                         % (var, self[var], default_val),
+                         noiselevel=-1,
+                     )
+                     self[var] = default_val
+                 self.backup_changes(var)
+ 
+             self.depcachedir = self.get("PORTAGE_DEPCACHEDIR")
+             if self.depcachedir is None:
+                 self.depcachedir = os.path.join(
+                     os.sep, portage.const.EPREFIX, DEPCACHE_PATH.lstrip(os.sep)
+                 )
+                 if unprivileged and target_root != os.sep:
+                     # In unprivileged mode, automatically make
+                     # depcachedir relative to target_root if the
+                     # default depcachedir is not writable.
+                     if not os.access(first_existing(self.depcachedir), os.W_OK):
+                         self.depcachedir = os.path.join(
+                             eroot, DEPCACHE_PATH.lstrip(os.sep)
+                         )
+ 
+             self["PORTAGE_DEPCACHEDIR"] = self.depcachedir
+             self.backup_changes("PORTAGE_DEPCACHEDIR")
+ 
+             if portage._internal_caller:
+                 self["PORTAGE_INTERNAL_CALLER"] = "1"
+                 self.backup_changes("PORTAGE_INTERNAL_CALLER")
+ 
+             # initialize self.features
+             self.regenerate()
+             feature_use = []
+             if "test" in self.features:
+                 feature_use.append("test")
+             self.configdict["features"]["USE"] = self._default_features_use = " ".join(
+                 feature_use
+             )
+             if feature_use:
+                 # Regenerate USE so that the initial "test" flag state is
+                 # correct for evaluation of !test? conditionals in RESTRICT.
+                 self.regenerate()
  
 +			if 'force-multilib' in self.features:
 +				#add multilib_abi internally to list of USE_EXPANDed vars
 +				self["USE_EXPAND"] = "MULTILIB_ABI" + " " + self.get("USE_EXPAND", "")
 +				self.backup_changes("USE_EXPAND")
 +				default_abi = self.configdict["defaults"].get('DEFAULT_ABI', '').strip()
 +				if default_abi:
 +					self.configdict["defaults"]["USE"] = self.configdict["defaults"].get("USE", "") + " multilib_abi_" + default_abi
- 			if unprivileged:
- 				self.features.add('unprivileged')
- 
- 			if bsd_chflags:
- 				self.features.add('chflags')
- 
- 			self._init_iuse()
- 
- 			self._validate_commands()
- 
- 			for k in self._case_insensitive_vars:
- 				if k in self:
- 					self[k] = self[k].lower()
- 					self.backup_changes(k)
- 
- 			# The first constructed config object initializes these modules,
- 			# and subsequent calls to the _init() functions have no effect.
- 			portage.output._init(config_root=self['PORTAGE_CONFIGROOT'])
- 			portage.data._init(self)
- 
- 		if mycpv:
- 			self.setcpv(mycpv)
- 
- 	def _init_iuse(self):
- 		self._iuse_effective = self._calc_iuse_effective()
- 		self._iuse_implicit_match = _iuse_implicit_match_cache(self)
- 
- 	@property
- 	def mygcfg(self):
- 		warnings.warn("portage.config.mygcfg is deprecated", stacklevel=3)
- 		return {}
- 
- 	def _validate_commands(self):
- 		for k in special_env_vars.validate_commands:
- 			v = self.get(k)
- 			if v is not None:
- 				valid, v_split = validate_cmd_var(v)
- 
- 				if not valid:
- 					if v_split:
- 						writemsg_level(_("%s setting is invalid: '%s'\n") % \
- 							(k, v), level=logging.ERROR, noiselevel=-1)
- 
- 					# before deleting the invalid setting, backup
- 					# the default value if available
- 					v = self.configdict['globals'].get(k)
- 					if v is not None:
- 						default_valid, v_split = validate_cmd_var(v)
- 						if not default_valid:
- 							if v_split:
- 								writemsg_level(
- 									_("%s setting from make.globals" + \
- 									" is invalid: '%s'\n") % \
- 									(k, v), level=logging.ERROR, noiselevel=-1)
- 							# make.globals seems corrupt, so try for
- 							# a hardcoded default instead
- 							v = self._default_globals.get(k)
- 
- 					# delete all settings for this key,
- 					# including the invalid one
- 					del self[k]
- 					self.backupenv.pop(k, None)
- 					if v:
- 						# restore validated default
- 						self.configdict['globals'][k] = v
- 
- 	def _init_dirs(self):
- 		"""
- 		Create a few directories that are critical to portage operation
- 		"""
- 		if not os.access(self["EROOT"], os.W_OK):
- 			return
- 
- 		#                                gid, mode, mask, preserve_perms
- 		dir_mode_map = {
- 			"tmp"             : (         -1, 0o1777,  0,  True),
- 			"var/tmp"         : (         -1, 0o1777,  0,  True),
- 			PRIVATE_PATH      : (portage_gid, 0o2750, 0o2, False),
- 			CACHE_PATH        : (portage_gid,  0o755, 0o2, False)
- 		}
- 
- 		for mypath, (gid, mode, modemask, preserve_perms) \
- 			in dir_mode_map.items():
- 			mydir = os.path.join(self["EROOT"], mypath)
- 			if preserve_perms and os.path.isdir(mydir):
- 				# Only adjust permissions on some directories if
- 				# they don't exist yet. This gives freedom to the
- 				# user to adjust permissions to suit their taste.
- 				continue
- 			try:
- 				ensure_dirs(mydir, gid=gid, mode=mode, mask=modemask)
- 			except PortageException as e:
- 				writemsg(_("!!! Directory initialization failed: '%s'\n") % mydir,
- 					noiselevel=-1)
- 				writemsg("!!! %s\n" % str(e),
- 					noiselevel=-1)
- 
- 	@property
- 	def _keywords_manager(self):
- 		if self._keywords_manager_obj is None:
- 			self._keywords_manager_obj = KeywordsManager(
- 				self._locations_manager.profiles_complex,
- 				self._locations_manager.abs_user_config,
- 				self.local_config,
- 				global_accept_keywords=self.configdict["defaults"].get("ACCEPT_KEYWORDS", ""))
- 		return self._keywords_manager_obj
- 
- 	@property
- 	def _mask_manager(self):
- 		if self._mask_manager_obj is None:
- 			self._mask_manager_obj = MaskManager(self.repositories,
- 				self._locations_manager.profiles_complex,
- 				self._locations_manager.abs_user_config,
- 				user_config=self.local_config,
- 				strict_umatched_removal=self._unmatched_removal)
- 		return self._mask_manager_obj
- 
- 	@property
- 	def _virtuals_manager(self):
- 		if self._virtuals_manager_obj is None:
- 			self._virtuals_manager_obj = VirtualsManager(self.profiles)
- 		return self._virtuals_manager_obj
- 
- 	@property
- 	def pkeywordsdict(self):
- 		result = self._keywords_manager.pkeywordsdict.copy()
- 		for k, v in result.items():
- 			result[k] = v.copy()
- 		return result
- 
- 	@property
- 	def pmaskdict(self):
- 		return self._mask_manager._pmaskdict.copy()
- 
- 	@property
- 	def punmaskdict(self):
- 		return self._mask_manager._punmaskdict.copy()
- 
- 	@property
- 	def soname_provided(self):
- 		if self._soname_provided is None:
- 			d = stack_dictlist((grabdict(
- 				os.path.join(x, "soname.provided"), recursive=True)
- 				for x in self.profiles), incremental=True)
- 			self._soname_provided = frozenset(SonameAtom(cat, soname)
- 				for cat, sonames in d.items() for soname in sonames)
- 		return self._soname_provided
- 
- 	def expandLicenseTokens(self, tokens):
- 		""" Take a token from ACCEPT_LICENSE or package.license and expand it
- 		if it's a group token (indicated by @) or just return it if it's not a
- 		group.  If a group is negated then negate all group elements."""
- 		return self._license_manager.expandLicenseTokens(tokens)
- 
- 	def validate(self):
- 		"""Validate miscellaneous settings and display warnings if necessary.
- 		(This code was previously in the global scope of portage.py)"""
- 
- 		groups = self.get("ACCEPT_KEYWORDS", "").split()
- 		archlist = self.archlist()
- 		if not archlist:
- 			writemsg(_("--- 'profiles/arch.list' is empty or "
- 				"not available. Empty ebuild repository?\n"), noiselevel=1)
- 		else:
- 			for group in groups:
- 				if group not in archlist and \
- 					not (group.startswith("-") and group[1:] in archlist) and \
- 					group not in ("*", "~*", "**"):
- 					writemsg(_("!!! INVALID ACCEPT_KEYWORDS: %s\n") % str(group),
- 						noiselevel=-1)
- 
- 		profile_broken = False
- 
- 		# getmaskingstatus requires ARCH for ACCEPT_KEYWORDS support
- 		arch = self.get('ARCH')
- 		if not self.profile_path or not arch:
- 			profile_broken = True
- 		else:
- 			# If any one of these files exists, then
- 			# the profile is considered valid.
- 			for x in ("make.defaults", "parent",
- 				"packages", "use.force", "use.mask"):
- 				if exists_raise_eaccess(os.path.join(self.profile_path, x)):
- 					break
- 			else:
- 				profile_broken = True
- 
- 		if profile_broken and not portage._sync_mode:
- 			abs_profile_path = None
- 			for x in (PROFILE_PATH, 'etc/make.profile'):
- 				x = os.path.join(self["PORTAGE_CONFIGROOT"], x)
- 				try:
- 					os.lstat(x)
- 				except OSError:
- 					pass
- 				else:
- 					abs_profile_path = x
- 					break
- 
- 			if abs_profile_path is None:
- 				abs_profile_path = os.path.join(self["PORTAGE_CONFIGROOT"],
- 					PROFILE_PATH)
- 
- 			writemsg(_("\n\n!!! %s is not a symlink and will probably prevent most merges.\n") % abs_profile_path,
- 				noiselevel=-1)
- 			writemsg(_("!!! It should point into a profile within %s/profiles/\n") % self["PORTDIR"])
- 			writemsg(_("!!! (You can safely ignore this message when syncing. It's harmless.)\n\n\n"))
- 
- 		abs_user_virtuals = os.path.join(self["PORTAGE_CONFIGROOT"],
- 			USER_VIRTUALS_FILE)
- 		if os.path.exists(abs_user_virtuals):
- 			writemsg("\n!!! /etc/portage/virtuals is deprecated in favor of\n")
- 			writemsg("!!! /etc/portage/profile/virtuals. Please move it to\n")
- 			writemsg("!!! this new location.\n\n")
- 
- 		if not sandbox_capable and \
- 			("sandbox" in self.features or "usersandbox" in self.features):
- 			if self.profile_path is not None and \
- 				os.path.realpath(self.profile_path) == \
- 				os.path.realpath(os.path.join(
- 				self["PORTAGE_CONFIGROOT"], PROFILE_PATH)):
- 				# Don't show this warning when running repoman and the
- 				# sandbox feature came from a profile that doesn't belong
- 				# to the user.
- 				writemsg(colorize("BAD", _("!!! Problem with sandbox"
- 					" binary. Disabling...\n\n")), noiselevel=-1)
- 
- 		if "fakeroot" in self.features and \
- 			not fakeroot_capable:
- 			writemsg(_("!!! FEATURES=fakeroot is enabled, but the "
- 				"fakeroot binary is not installed.\n"), noiselevel=-1)
- 
- 		if "webrsync-gpg" in self.features:
- 			writemsg(_("!!! FEATURES=webrsync-gpg is deprecated, see the make.conf(5) man page.\n"),
- 				noiselevel=-1)
- 
- 		if os.getuid() == 0 and not hasattr(os, "setgroups"):
- 			warning_shown = False
- 
- 			if "userpriv" in self.features:
- 				writemsg(_("!!! FEATURES=userpriv is enabled, but "
- 					"os.setgroups is not available.\n"), noiselevel=-1)
- 				warning_shown = True
- 
- 			if "userfetch" in self.features:
- 				writemsg(_("!!! FEATURES=userfetch is enabled, but "
- 					"os.setgroups is not available.\n"), noiselevel=-1)
- 				warning_shown = True
- 
- 			if warning_shown and platform.python_implementation() == 'PyPy':
- 				writemsg(_("!!! See https://bugs.pypy.org/issue833 for details.\n"),
- 					noiselevel=-1)
- 
- 		binpkg_compression = self.get("BINPKG_COMPRESS")
- 		if binpkg_compression:
- 			try:
- 				compression = _compressors[binpkg_compression]
- 			except KeyError as e:
- 				writemsg("!!! BINPKG_COMPRESS contains invalid or "
- 					"unsupported compression method: %s" % e.args[0],
- 					noiselevel=-1)
- 			else:
- 				try:
- 					compression_binary = shlex_split(
- 						portage.util.varexpand(compression["compress"],
- 						mydict=self))[0]
- 				except IndexError as e:
- 					writemsg("!!! BINPKG_COMPRESS contains invalid or "
- 						"unsupported compression method: %s" % e.args[0],
- 						noiselevel=-1)
- 				else:
- 					if portage.process.find_binary(
- 						compression_binary) is None:
- 						missing_package = compression["package"]
- 						writemsg("!!! BINPKG_COMPRESS unsupported %s. "
- 							"Missing package: %s" %
- 							(binpkg_compression, missing_package),
- 							noiselevel=-1)
- 
- 	def load_best_module(self,property_string):
- 		best_mod = best_from_dict(property_string,self.modules,self.module_priority)
- 		mod = None
- 		try:
- 			mod = load_mod(best_mod)
- 		except ImportError:
- 			if best_mod in self._module_aliases:
- 				mod = load_mod(self._module_aliases[best_mod])
- 			elif not best_mod.startswith("cache."):
- 				raise
- 			else:
- 				best_mod = "portage." + best_mod
- 				try:
- 					mod = load_mod(best_mod)
- 				except ImportError:
- 					raise
- 		return mod
- 
- 	def lock(self):
- 		self.locked = 1
- 
- 	def unlock(self):
- 		self.locked = 0
- 
- 	def modifying(self):
- 		if self.locked:
- 			raise Exception(_("Configuration is locked."))
- 
- 	def backup_changes(self,key=None):
- 		self.modifying()
- 		if key and key in self.configdict["env"]:
- 			self.backupenv[key] = copy.deepcopy(self.configdict["env"][key])
- 		else:
- 			raise KeyError(_("No such key defined in environment: %s") % key)
- 
- 	def reset(self, keeping_pkg=0, use_cache=None):
- 		"""
- 		Restore environment from self.backupenv, call self.regenerate()
- 		@param keeping_pkg: Should we keep the setcpv() data or delete it.
- 		@type keeping_pkg: Boolean
- 		@rype: None
- 		"""
- 
- 		if use_cache is not None:
- 			warnings.warn("The use_cache parameter for config.reset() is deprecated and without effect.",
- 				DeprecationWarning, stacklevel=2)
- 
- 		self.modifying()
- 		self.configdict["env"].clear()
- 		self.configdict["env"].update(self.backupenv)
- 
- 		self.modifiedkeys = []
- 		if not keeping_pkg:
- 			self.mycpv = None
- 			self._setcpv_args_hash = None
- 			self.puse = ""
- 			del self._penv[:]
- 			self.configdict["pkg"].clear()
- 			self.configdict["pkginternal"].clear()
- 			self.configdict["features"]["USE"] = self._default_features_use
- 			self.configdict["repo"].clear()
- 			self.configdict["defaults"]["USE"] = \
- 				" ".join(self.make_defaults_use)
- 			self.usemask = self._use_manager.getUseMask()
- 			self.useforce = self._use_manager.getUseForce()
- 		self.regenerate()
- 
- 	class _lazy_vars:
- 
- 		__slots__ = ('built_use', 'settings', 'values')
- 
- 		def __init__(self, built_use, settings):
- 			self.built_use = built_use
- 			self.settings = settings
- 			self.values = None
- 
- 		def __getitem__(self, k):
- 			if self.values is None:
- 				self.values = self._init_values()
- 			return self.values[k]
- 
- 		def _init_values(self):
- 			values = {}
- 			settings = self.settings
- 			use = self.built_use
- 			if use is None:
- 				use = frozenset(settings['PORTAGE_USE'].split())
- 
- 			values['ACCEPT_LICENSE'] = settings._license_manager.get_prunned_accept_license( \
- 				settings.mycpv, use, settings.get('LICENSE', ''), settings.get('SLOT'), settings.get('PORTAGE_REPO_NAME'))
- 			values['PORTAGE_PROPERTIES'] = self._flatten('PROPERTIES', use, settings)
- 			values['PORTAGE_RESTRICT'] = self._flatten('RESTRICT', use, settings)
- 			return values
- 
- 		def _flatten(self, var, use, settings):
- 			try:
- 				restrict = set(use_reduce(settings.get(var, ''), uselist=use, flat=True))
- 			except InvalidDependString:
- 				restrict = set()
- 			return ' '.join(sorted(restrict))
- 
- 	class _lazy_use_expand:
- 		"""
- 		Lazily evaluate USE_EXPAND variables since they are only needed when
- 		an ebuild shell is spawned. Variables values are made consistent with
- 		the previously calculated USE settings.
- 		"""
- 
- 		def __init__(self, settings, unfiltered_use,
- 			use, usemask, iuse_effective,
- 			use_expand_split, use_expand_dict):
- 			self._settings = settings
- 			self._unfiltered_use = unfiltered_use
- 			self._use = use
- 			self._usemask = usemask
- 			self._iuse_effective = iuse_effective
- 			self._use_expand_split = use_expand_split
- 			self._use_expand_dict = use_expand_dict
- 
- 		def __getitem__(self, key):
- 			prefix = key.lower() + '_'
- 			prefix_len = len(prefix)
- 			expand_flags = set( x[prefix_len:] for x in self._use \
- 				if x[:prefix_len] == prefix )
- 			var_split = self._use_expand_dict.get(key, '').split()
- 			# Preserve the order of var_split because it can matter for things
- 			# like LINGUAS.
- 			var_split = [ x for x in var_split if x in expand_flags ]
- 			var_split.extend(expand_flags.difference(var_split))
- 			has_wildcard = '*' in expand_flags
- 			if has_wildcard:
- 				var_split = [ x for x in var_split if x != "*" ]
- 			has_iuse = set()
- 			for x in self._iuse_effective:
- 				if x[:prefix_len] == prefix:
- 					has_iuse.add(x[prefix_len:])
- 			if has_wildcard:
- 				# * means to enable everything in IUSE that's not masked
- 				if has_iuse:
- 					usemask = self._usemask
- 					for suffix in has_iuse:
- 						x = prefix + suffix
- 						if x not in usemask:
- 							if suffix not in expand_flags:
- 								var_split.append(suffix)
- 				else:
- 					# If there is a wildcard and no matching flags in IUSE then
- 					# LINGUAS should be unset so that all .mo files are
- 					# installed.
- 					var_split = []
- 			# Make the flags unique and filter them according to IUSE.
- 			# Also, continue to preserve order for things like LINGUAS
- 			# and filter any duplicates that variable may contain.
- 			filtered_var_split = []
- 			remaining = has_iuse.intersection(var_split)
- 			for x in var_split:
- 				if x in remaining:
- 					remaining.remove(x)
- 					filtered_var_split.append(x)
- 			var_split = filtered_var_split
- 
- 			return ' '.join(var_split)
- 
- 	def _setcpv_recursion_gate(f):
- 		"""
- 		Raise AssertionError for recursive setcpv calls.
- 		"""
- 		def wrapper(self, *args, **kwargs):
- 			if hasattr(self, '_setcpv_active'):
- 				raise AssertionError('setcpv recursion detected')
- 			self._setcpv_active = True
- 			try:
- 				return f(self, *args, **kwargs)
- 			finally:
- 				del self._setcpv_active
- 		return wrapper
- 
- 	@_setcpv_recursion_gate
- 	def setcpv(self, mycpv, use_cache=None, mydb=None):
- 		"""
- 		Load a particular CPV into the config, this lets us see the
- 		Default USE flags for a particular ebuild as well as the USE
- 		flags from package.use.
- 
- 		@param mycpv: A cpv to load
- 		@type mycpv: string
- 		@param mydb: a dbapi instance that supports aux_get with the IUSE key.
- 		@type mydb: dbapi or derivative.
- 		@rtype: None
- 		"""
- 
- 		if use_cache is not None:
- 			warnings.warn("The use_cache parameter for config.setcpv() is deprecated and without effect.",
- 				DeprecationWarning, stacklevel=2)
- 
- 		self.modifying()
- 
- 		pkg = None
- 		built_use = None
- 		explicit_iuse = None
- 		if not isinstance(mycpv, str):
- 			pkg = mycpv
- 			mycpv = pkg.cpv
- 			mydb = pkg._metadata
- 			explicit_iuse = pkg.iuse.all
- 			args_hash = (mycpv, id(pkg))
- 			if pkg.built:
- 				built_use = pkg.use.enabled
- 		else:
- 			args_hash = (mycpv, id(mydb))
- 
- 		if args_hash == self._setcpv_args_hash:
- 			return
- 		self._setcpv_args_hash = args_hash
- 
- 		has_changed = False
- 		self.mycpv = mycpv
- 		cat, pf = catsplit(mycpv)
- 		cp = cpv_getkey(mycpv)
- 		cpv_slot = self.mycpv
- 		pkginternaluse = ""
- 		pkginternaluse_list = []
- 		feature_use = []
- 		iuse = ""
- 		pkg_configdict = self.configdict["pkg"]
- 		previous_iuse = pkg_configdict.get("IUSE")
- 		previous_iuse_effective = pkg_configdict.get("IUSE_EFFECTIVE")
- 		previous_features = pkg_configdict.get("FEATURES")
- 		previous_penv = self._penv
- 
- 		aux_keys = self._setcpv_aux_keys
- 
- 		# Discard any existing metadata and package.env settings from
- 		# the previous package instance.
- 		pkg_configdict.clear()
- 
- 		pkg_configdict["CATEGORY"] = cat
- 		pkg_configdict["PF"] = pf
- 		repository = None
- 		eapi = None
- 		if mydb:
- 			if not hasattr(mydb, "aux_get"):
- 				for k in aux_keys:
- 					if k in mydb:
- 						# Make these lazy, since __getitem__ triggers
- 						# evaluation of USE conditionals which can't
- 						# occur until PORTAGE_USE is calculated below.
- 						pkg_configdict.addLazySingleton(k,
- 							mydb.__getitem__, k)
- 			else:
- 				# When calling dbapi.aux_get(), grab USE for built/installed
- 				# packages since we want to save it PORTAGE_BUILT_USE for
- 				# evaluating conditional USE deps in atoms passed via IPC to
- 				# helpers like has_version and best_version.
- 				aux_keys = set(aux_keys)
- 				if hasattr(mydb, '_aux_cache_keys'):
- 					aux_keys = aux_keys.intersection(mydb._aux_cache_keys)
- 				aux_keys.add('USE')
- 				aux_keys = list(aux_keys)
- 				for k, v in zip(aux_keys, mydb.aux_get(self.mycpv, aux_keys)):
- 					pkg_configdict[k] = v
- 				built_use = frozenset(pkg_configdict.pop('USE').split())
- 				if not built_use:
- 					# Empty USE means this dbapi instance does not contain
- 					# built packages.
- 					built_use = None
- 			eapi = pkg_configdict['EAPI']
- 
- 			repository = pkg_configdict.pop("repository", None)
- 			if repository is not None:
- 				pkg_configdict["PORTAGE_REPO_NAME"] = repository
- 			iuse = pkg_configdict["IUSE"]
- 			if pkg is None:
- 				self.mycpv = _pkg_str(self.mycpv, metadata=pkg_configdict,
- 					settings=self)
- 				cpv_slot = self.mycpv
- 			else:
- 				cpv_slot = pkg
- 			for x in iuse.split():
- 				if x.startswith("+"):
- 					pkginternaluse_list.append(x[1:])
- 				elif x.startswith("-"):
- 					pkginternaluse_list.append(x)
- 			pkginternaluse = " ".join(pkginternaluse_list)
- 
- 		eapi_attrs = _get_eapi_attrs(eapi)
- 
- 		if pkginternaluse != self.configdict["pkginternal"].get("USE", ""):
- 			self.configdict["pkginternal"]["USE"] = pkginternaluse
- 			has_changed = True
- 
- 		repo_env = []
- 		if repository and repository != Package.UNKNOWN_REPO:
- 			repos = []
- 			try:
- 				repos.extend(repo.name for repo in
- 					self.repositories[repository].masters)
- 			except KeyError:
- 				pass
- 			repos.append(repository)
- 			for repo in repos:
- 				d = self._repo_make_defaults.get(repo)
- 				if d is None:
- 					d = {}
- 				else:
- 					# make a copy, since we might modify it with
- 					# package.use settings
- 					d = d.copy()
- 				cpdict = self._use_manager._repo_puse_dict.get(repo, {}).get(cp)
- 				if cpdict:
- 					repo_puse = ordered_by_atom_specificity(cpdict, cpv_slot)
- 					if repo_puse:
- 						for x in repo_puse:
- 							d["USE"] = d.get("USE", "") + " " + " ".join(x)
- 				if d:
- 					repo_env.append(d)
- 
- 		if repo_env or self.configdict["repo"]:
- 			self.configdict["repo"].clear()
- 			self.configdict["repo"].update(stack_dicts(repo_env,
- 				incrementals=self.incrementals))
- 			has_changed = True
- 
- 		defaults = []
- 		for i, pkgprofileuse_dict in enumerate(self._use_manager._pkgprofileuse):
- 			if self.make_defaults_use[i]:
- 				defaults.append(self.make_defaults_use[i])
- 			cpdict = pkgprofileuse_dict.get(cp)
- 			if cpdict:
- 				pkg_defaults = ordered_by_atom_specificity(cpdict, cpv_slot)
- 				if pkg_defaults:
- 					defaults.extend(pkg_defaults)
- 		defaults = " ".join(defaults)
++
+             if unprivileged:
+                 self.features.add("unprivileged")
+ 
+             if bsd_chflags:
+                 self.features.add("chflags")
+ 
+             self._init_iuse()
+ 
+             self._validate_commands()
+ 
+             for k in self._case_insensitive_vars:
+                 if k in self:
+                     self[k] = self[k].lower()
+                     self.backup_changes(k)
+ 
+             # The first constructed config object initializes these modules,
+             # and subsequent calls to the _init() functions have no effect.
+             portage.output._init(config_root=self["PORTAGE_CONFIGROOT"])
+             portage.data._init(self)
+ 
+         if mycpv:
+             self.setcpv(mycpv)
+ 
+     def _init_iuse(self):
+         self._iuse_effective = self._calc_iuse_effective()
+         self._iuse_implicit_match = _iuse_implicit_match_cache(self)
+ 
+     @property
+     def mygcfg(self):
+         warnings.warn("portage.config.mygcfg is deprecated", stacklevel=3)
+         return {}
+ 
+     def _validate_commands(self):
+         for k in special_env_vars.validate_commands:
+             v = self.get(k)
+             if v is not None:
+                 valid, v_split = validate_cmd_var(v)
+ 
+                 if not valid:
+                     if v_split:
+                         writemsg_level(
+                             _("%s setting is invalid: '%s'\n") % (k, v),
+                             level=logging.ERROR,
+                             noiselevel=-1,
+                         )
+ 
+                     # before deleting the invalid setting, backup
+                     # the default value if available
+                     v = self.configdict["globals"].get(k)
+                     if v is not None:
+                         default_valid, v_split = validate_cmd_var(v)
+                         if not default_valid:
+                             if v_split:
+                                 writemsg_level(
+                                     _(
+                                         "%s setting from make.globals"
+                                         + " is invalid: '%s'\n"
+                                     )
+                                     % (k, v),
+                                     level=logging.ERROR,
+                                     noiselevel=-1,
+                                 )
+                             # make.globals seems corrupt, so try for
+                             # a hardcoded default instead
+                             v = self._default_globals.get(k)
+ 
+                     # delete all settings for this key,
+                     # including the invalid one
+                     del self[k]
+                     self.backupenv.pop(k, None)
+                     if v:
+                         # restore validated default
+                         self.configdict["globals"][k] = v
+ 
+     def _init_dirs(self):
+         """
+         Create a few directories that are critical to portage operation
+         """
+         if not os.access(self["EROOT"], os.W_OK):
+             return
+ 
+         #                                gid, mode, mask, preserve_perms
+         dir_mode_map = {
+             "tmp": (-1, 0o1777, 0, True),
+             "var/tmp": (-1, 0o1777, 0, True),
+             PRIVATE_PATH: (portage_gid, 0o2750, 0o2, False),
+             CACHE_PATH: (portage_gid, 0o755, 0o2, False),
+         }
+ 
+         for mypath, (gid, mode, modemask, preserve_perms) in dir_mode_map.items():
+             mydir = os.path.join(self["EROOT"], mypath)
+             if preserve_perms and os.path.isdir(mydir):
+                 # Only adjust permissions on some directories if
+                 # they don't exist yet. This gives freedom to the
+                 # user to adjust permissions to suit their taste.
+                 continue
+             try:
+                 ensure_dirs(mydir, gid=gid, mode=mode, mask=modemask)
+             except PortageException as e:
+                 writemsg(
+                     _("!!! Directory initialization failed: '%s'\n") % mydir,
+                     noiselevel=-1,
+                 )
+                 writemsg("!!! %s\n" % str(e), noiselevel=-1)
+ 
+     @property
+     def _keywords_manager(self):
+         if self._keywords_manager_obj is None:
+             self._keywords_manager_obj = KeywordsManager(
+                 self._locations_manager.profiles_complex,
+                 self._locations_manager.abs_user_config,
+                 self.local_config,
+                 global_accept_keywords=self.configdict["defaults"].get(
+                     "ACCEPT_KEYWORDS", ""
+                 ),
+             )
+         return self._keywords_manager_obj
+ 
+     @property
+     def _mask_manager(self):
+         if self._mask_manager_obj is None:
+             self._mask_manager_obj = MaskManager(
+                 self.repositories,
+                 self._locations_manager.profiles_complex,
+                 self._locations_manager.abs_user_config,
+                 user_config=self.local_config,
+                 strict_umatched_removal=self._unmatched_removal,
+             )
+         return self._mask_manager_obj
+ 
+     @property
+     def _virtuals_manager(self):
+         if self._virtuals_manager_obj is None:
+             self._virtuals_manager_obj = VirtualsManager(self.profiles)
+         return self._virtuals_manager_obj
+ 
+     @property
+     def pkeywordsdict(self):
+         result = self._keywords_manager.pkeywordsdict.copy()
+         for k, v in result.items():
+             result[k] = v.copy()
+         return result
+ 
+     @property
+     def pmaskdict(self):
+         return self._mask_manager._pmaskdict.copy()
+ 
+     @property
+     def punmaskdict(self):
+         return self._mask_manager._punmaskdict.copy()
+ 
+     @property
+     def soname_provided(self):
+         if self._soname_provided is None:
+             d = stack_dictlist(
+                 (
+                     grabdict(os.path.join(x, "soname.provided"), recursive=True)
+                     for x in self.profiles
+                 ),
+                 incremental=True,
+             )
+             self._soname_provided = frozenset(
+                 SonameAtom(cat, soname)
+                 for cat, sonames in d.items()
+                 for soname in sonames
+             )
+         return self._soname_provided
+ 
+     def expandLicenseTokens(self, tokens):
+         """Take a token from ACCEPT_LICENSE or package.license and expand it
+         if it's a group token (indicated by @) or just return it if it's not a
+         group.  If a group is negated then negate all group elements."""
+         return self._license_manager.expandLicenseTokens(tokens)
+ 
+     def validate(self):
+         """Validate miscellaneous settings and display warnings if necessary.
+         (This code was previously in the global scope of portage.py)"""
+ 
+         groups = self.get("ACCEPT_KEYWORDS", "").split()
+         archlist = self.archlist()
+         if not archlist:
+             writemsg(
+                 _(
+                     "--- 'profiles/arch.list' is empty or "
+                     "not available. Empty ebuild repository?\n"
+                 ),
+                 noiselevel=1,
+             )
+         else:
+             for group in groups:
+                 if (
+                     group not in archlist
+                     and not (group.startswith("-") and group[1:] in archlist)
+                     and group not in ("*", "~*", "**")
+                 ):
+                     writemsg(
+                         _("!!! INVALID ACCEPT_KEYWORDS: %s\n") % str(group),
+                         noiselevel=-1,
+                     )
+ 
+         profile_broken = False
+ 
+         # getmaskingstatus requires ARCH for ACCEPT_KEYWORDS support
+         arch = self.get("ARCH")
+         if not self.profile_path or not arch:
+             profile_broken = True
+         else:
+             # If any one of these files exists, then
+             # the profile is considered valid.
+             for x in ("make.defaults", "parent", "packages", "use.force", "use.mask"):
+                 if exists_raise_eaccess(os.path.join(self.profile_path, x)):
+                     break
+             else:
+                 profile_broken = True
+ 
+         if profile_broken and not portage._sync_mode:
+             abs_profile_path = None
+             for x in (PROFILE_PATH, "etc/make.profile"):
+                 x = os.path.join(self["PORTAGE_CONFIGROOT"], x)
+                 try:
+                     os.lstat(x)
+                 except OSError:
+                     pass
+                 else:
+                     abs_profile_path = x
+                     break
+ 
+             if abs_profile_path is None:
+                 abs_profile_path = os.path.join(
+                     self["PORTAGE_CONFIGROOT"], PROFILE_PATH
+                 )
+ 
+             writemsg(
+                 _(
+                     "\n\n!!! %s is not a symlink and will probably prevent most merges.\n"
+                 )
+                 % abs_profile_path,
+                 noiselevel=-1,
+             )
+             writemsg(
+                 _("!!! It should point into a profile within %s/profiles/\n")
+                 % self["PORTDIR"]
+             )
+             writemsg(
+                 _(
+                     "!!! (You can safely ignore this message when syncing. It's harmless.)\n\n\n"
+                 )
+             )
+ 
+         abs_user_virtuals = os.path.join(self["PORTAGE_CONFIGROOT"], USER_VIRTUALS_FILE)
+         if os.path.exists(abs_user_virtuals):
+             writemsg("\n!!! /etc/portage/virtuals is deprecated in favor of\n")
+             writemsg("!!! /etc/portage/profile/virtuals. Please move it to\n")
+             writemsg("!!! this new location.\n\n")
+ 
+         if not sandbox_capable and (
+             "sandbox" in self.features or "usersandbox" in self.features
+         ):
+             if self.profile_path is not None and os.path.realpath(
+                 self.profile_path
+             ) == os.path.realpath(
+                 os.path.join(self["PORTAGE_CONFIGROOT"], PROFILE_PATH)
+             ):
+                 # Don't show this warning when running repoman and the
+                 # sandbox feature came from a profile that doesn't belong
+                 # to the user.
+                 writemsg(
+                     colorize(
+                         "BAD", _("!!! Problem with sandbox" " binary. Disabling...\n\n")
+                     ),
+                     noiselevel=-1,
+                 )
+ 
+         if "fakeroot" in self.features and not fakeroot_capable:
+             writemsg(
+                 _(
+                     "!!! FEATURES=fakeroot is enabled, but the "
+                     "fakeroot binary is not installed.\n"
+                 ),
+                 noiselevel=-1,
+             )
+ 
+         if "webrsync-gpg" in self.features:
+             writemsg(
+                 _(
+                     "!!! FEATURES=webrsync-gpg is deprecated, see the make.conf(5) man page.\n"
+                 ),
+                 noiselevel=-1,
+             )
+ 
+         if os.getuid() == 0 and not hasattr(os, "setgroups"):
+             warning_shown = False
+ 
+             if "userpriv" in self.features:
+                 writemsg(
+                     _(
+                         "!!! FEATURES=userpriv is enabled, but "
+                         "os.setgroups is not available.\n"
+                     ),
+                     noiselevel=-1,
+                 )
+                 warning_shown = True
+ 
+             if "userfetch" in self.features:
+                 writemsg(
+                     _(
+                         "!!! FEATURES=userfetch is enabled, but "
+                         "os.setgroups is not available.\n"
+                     ),
+                     noiselevel=-1,
+                 )
+                 warning_shown = True
+ 
+             if warning_shown and platform.python_implementation() == "PyPy":
+                 writemsg(
+                     _("!!! See https://bugs.pypy.org/issue833 for details.\n"),
+                     noiselevel=-1,
+                 )
+ 
+         binpkg_compression = self.get("BINPKG_COMPRESS")
+         if binpkg_compression:
+             try:
+                 compression = _compressors[binpkg_compression]
+             except KeyError as e:
+                 writemsg(
+                     "!!! BINPKG_COMPRESS contains invalid or "
+                     "unsupported compression method: %s" % e.args[0],
+                     noiselevel=-1,
+                 )
+             else:
+                 try:
+                     compression_binary = shlex_split(
+                         portage.util.varexpand(compression["compress"], mydict=self)
+                     )[0]
+                 except IndexError as e:
+                     writemsg(
+                         "!!! BINPKG_COMPRESS contains invalid or "
+                         "unsupported compression method: %s" % e.args[0],
+                         noiselevel=-1,
+                     )
+                 else:
+                     if portage.process.find_binary(compression_binary) is None:
+                         missing_package = compression["package"]
+                         writemsg(
+                             "!!! BINPKG_COMPRESS unsupported %s. "
+                             "Missing package: %s"
+                             % (binpkg_compression, missing_package),
+                             noiselevel=-1,
+                         )
+ 
+     def load_best_module(self, property_string):
+         best_mod = best_from_dict(property_string, self.modules, self.module_priority)
+         mod = None
+         try:
+             mod = load_mod(best_mod)
+         except ImportError:
+             if best_mod in self._module_aliases:
+                 mod = load_mod(self._module_aliases[best_mod])
+             elif not best_mod.startswith("cache."):
+                 raise
+             else:
+                 best_mod = "portage." + best_mod
+                 try:
+                     mod = load_mod(best_mod)
+                 except ImportError:
+                     raise
+         return mod
+ 
+     def lock(self):
+         self.locked = 1
+ 
+     def unlock(self):
+         self.locked = 0
+ 
+     def modifying(self):
+         if self.locked:
+             raise Exception(_("Configuration is locked."))
+ 
+     def backup_changes(self, key=None):
+         self.modifying()
+         if key and key in self.configdict["env"]:
+             self.backupenv[key] = copy.deepcopy(self.configdict["env"][key])
+         else:
+             raise KeyError(_("No such key defined in environment: %s") % key)
+ 
+     def reset(self, keeping_pkg=0, use_cache=None):
+         """
+         Restore environment from self.backupenv, call self.regenerate()
+         @param keeping_pkg: Should we keep the setcpv() data or delete it.
+         @type keeping_pkg: Boolean
+         @rype: None
+         """
+ 
+         if use_cache is not None:
+             warnings.warn(
+                 "The use_cache parameter for config.reset() is deprecated and without effect.",
+                 DeprecationWarning,
+                 stacklevel=2,
+             )
+ 
+         self.modifying()
+         self.configdict["env"].clear()
+         self.configdict["env"].update(self.backupenv)
+ 
+         self.modifiedkeys = []
+         if not keeping_pkg:
+             self.mycpv = None
+             self._setcpv_args_hash = None
+             self.puse = ""
+             del self._penv[:]
+             self.configdict["pkg"].clear()
+             self.configdict["pkginternal"].clear()
+             self.configdict["features"]["USE"] = self._default_features_use
+             self.configdict["repo"].clear()
+             self.configdict["defaults"]["USE"] = " ".join(self.make_defaults_use)
+             self.usemask = self._use_manager.getUseMask()
+             self.useforce = self._use_manager.getUseForce()
+         self.regenerate()
+ 
+     class _lazy_vars:
+ 
+         __slots__ = ("built_use", "settings", "values")
+ 
+         def __init__(self, built_use, settings):
+             self.built_use = built_use
+             self.settings = settings
+             self.values = None
+ 
+         def __getitem__(self, k):
+             if self.values is None:
+                 self.values = self._init_values()
+             return self.values[k]
+ 
+         def _init_values(self):
+             values = {}
+             settings = self.settings
+             use = self.built_use
+             if use is None:
+                 use = frozenset(settings["PORTAGE_USE"].split())
+ 
+             values[
+                 "ACCEPT_LICENSE"
+             ] = settings._license_manager.get_prunned_accept_license(
+                 settings.mycpv,
+                 use,
+                 settings.get("LICENSE", ""),
+                 settings.get("SLOT"),
+                 settings.get("PORTAGE_REPO_NAME"),
+             )
+             values["PORTAGE_PROPERTIES"] = self._flatten("PROPERTIES", use, settings)
+             values["PORTAGE_RESTRICT"] = self._flatten("RESTRICT", use, settings)
+             return values
+ 
+         def _flatten(self, var, use, settings):
+             try:
+                 restrict = set(
+                     use_reduce(settings.get(var, ""), uselist=use, flat=True)
+                 )
+             except InvalidDependString:
+                 restrict = set()
+             return " ".join(sorted(restrict))
+ 
+     class _lazy_use_expand:
+         """
+         Lazily evaluate USE_EXPAND variables since they are only needed when
+         an ebuild shell is spawned. Variables values are made consistent with
+         the previously calculated USE settings.
+         """
+ 
+         def __init__(
+             self,
+             settings,
+             unfiltered_use,
+             use,
+             usemask,
+             iuse_effective,
+             use_expand_split,
+             use_expand_dict,
+         ):
+             self._settings = settings
+             self._unfiltered_use = unfiltered_use
+             self._use = use
+             self._usemask = usemask
+             self._iuse_effective = iuse_effective
+             self._use_expand_split = use_expand_split
+             self._use_expand_dict = use_expand_dict
+ 
+         def __getitem__(self, key):
+             prefix = key.lower() + "_"
+             prefix_len = len(prefix)
+             expand_flags = set(
+                 x[prefix_len:] for x in self._use if x[:prefix_len] == prefix
+             )
+             var_split = self._use_expand_dict.get(key, "").split()
+             # Preserve the order of var_split because it can matter for things
+             # like LINGUAS.
+             var_split = [x for x in var_split if x in expand_flags]
+             var_split.extend(expand_flags.difference(var_split))
+             has_wildcard = "*" in expand_flags
+             if has_wildcard:
+                 var_split = [x for x in var_split if x != "*"]
+             has_iuse = set()
+             for x in self._iuse_effective:
+                 if x[:prefix_len] == prefix:
+                     has_iuse.add(x[prefix_len:])
+             if has_wildcard:
+                 # * means to enable everything in IUSE that's not masked
+                 if has_iuse:
+                     usemask = self._usemask
+                     for suffix in has_iuse:
+                         x = prefix + suffix
+                         if x not in usemask:
+                             if suffix not in expand_flags:
+                                 var_split.append(suffix)
+                 else:
+                     # If there is a wildcard and no matching flags in IUSE then
+                     # LINGUAS should be unset so that all .mo files are
+                     # installed.
+                     var_split = []
+             # Make the flags unique and filter them according to IUSE.
+             # Also, continue to preserve order for things like LINGUAS
+             # and filter any duplicates that variable may contain.
+             filtered_var_split = []
+             remaining = has_iuse.intersection(var_split)
+             for x in var_split:
+                 if x in remaining:
+                     remaining.remove(x)
+                     filtered_var_split.append(x)
+             var_split = filtered_var_split
+ 
+             return " ".join(var_split)
+ 
+     def _setcpv_recursion_gate(f):
+         """
+         Raise AssertionError for recursive setcpv calls.
+         """
+ 
+         def wrapper(self, *args, **kwargs):
+             if hasattr(self, "_setcpv_active"):
+                 raise AssertionError("setcpv recursion detected")
+             self._setcpv_active = True
+             try:
+                 return f(self, *args, **kwargs)
+             finally:
+                 del self._setcpv_active
+ 
+         return wrapper
+ 
+     @_setcpv_recursion_gate
+     def setcpv(self, mycpv, use_cache=None, mydb=None):
+         """
+         Load a particular CPV into the config, this lets us see the
+         Default USE flags for a particular ebuild as well as the USE
+         flags from package.use.
+ 
+         @param mycpv: A cpv to load
+         @type mycpv: string
+         @param mydb: a dbapi instance that supports aux_get with the IUSE key.
+         @type mydb: dbapi or derivative.
+         @rtype: None
+         """
+ 
+         if use_cache is not None:
+             warnings.warn(
+                 "The use_cache parameter for config.setcpv() is deprecated and without effect.",
+                 DeprecationWarning,
+                 stacklevel=2,
+             )
+ 
+         self.modifying()
+ 
+         pkg = None
+         built_use = None
+         explicit_iuse = None
+         if not isinstance(mycpv, str):
+             pkg = mycpv
+             mycpv = pkg.cpv
+             mydb = pkg._metadata
+             explicit_iuse = pkg.iuse.all
+             args_hash = (mycpv, id(pkg))
+             if pkg.built:
+                 built_use = pkg.use.enabled
+         else:
+             args_hash = (mycpv, id(mydb))
+ 
+         if args_hash == self._setcpv_args_hash:
+             return
+         self._setcpv_args_hash = args_hash
+ 
+         has_changed = False
+         self.mycpv = mycpv
+         cat, pf = catsplit(mycpv)
+         cp = cpv_getkey(mycpv)
+         cpv_slot = self.mycpv
+         pkginternaluse = ""
+         pkginternaluse_list = []
+         feature_use = []
+         iuse = ""
+         pkg_configdict = self.configdict["pkg"]
+         previous_iuse = pkg_configdict.get("IUSE")
+         previous_iuse_effective = pkg_configdict.get("IUSE_EFFECTIVE")
+         previous_features = pkg_configdict.get("FEATURES")
+         previous_penv = self._penv
+ 
+         aux_keys = self._setcpv_aux_keys
+ 
+         # Discard any existing metadata and package.env settings from
+         # the previous package instance.
+         pkg_configdict.clear()
+ 
+         pkg_configdict["CATEGORY"] = cat
+         pkg_configdict["PF"] = pf
+         repository = None
+         eapi = None
+         if mydb:
+             if not hasattr(mydb, "aux_get"):
+                 for k in aux_keys:
+                     if k in mydb:
+                         # Make these lazy, since __getitem__ triggers
+                         # evaluation of USE conditionals which can't
+                         # occur until PORTAGE_USE is calculated below.
+                         pkg_configdict.addLazySingleton(k, mydb.__getitem__, k)
+             else:
+                 # When calling dbapi.aux_get(), grab USE for built/installed
+                 # packages since we want to save it PORTAGE_BUILT_USE for
+                 # evaluating conditional USE deps in atoms passed via IPC to
+                 # helpers like has_version and best_version.
+                 aux_keys = set(aux_keys)
+                 if hasattr(mydb, "_aux_cache_keys"):
+                     aux_keys = aux_keys.intersection(mydb._aux_cache_keys)
+                 aux_keys.add("USE")
+                 aux_keys = list(aux_keys)
+                 for k, v in zip(aux_keys, mydb.aux_get(self.mycpv, aux_keys)):
+                     pkg_configdict[k] = v
+                 built_use = frozenset(pkg_configdict.pop("USE").split())
+                 if not built_use:
+                     # Empty USE means this dbapi instance does not contain
+                     # built packages.
+                     built_use = None
+             eapi = pkg_configdict["EAPI"]
+ 
+             repository = pkg_configdict.pop("repository", None)
+             if repository is not None:
+                 pkg_configdict["PORTAGE_REPO_NAME"] = repository
+             iuse = pkg_configdict["IUSE"]
+             if pkg is None:
+                 self.mycpv = _pkg_str(
+                     self.mycpv, metadata=pkg_configdict, settings=self
+                 )
+                 cpv_slot = self.mycpv
+             else:
+                 cpv_slot = pkg
+             for x in iuse.split():
+                 if x.startswith("+"):
+                     pkginternaluse_list.append(x[1:])
+                 elif x.startswith("-"):
+                     pkginternaluse_list.append(x)
+             pkginternaluse = " ".join(pkginternaluse_list)
+ 
+         eapi_attrs = _get_eapi_attrs(eapi)
+ 
+         if pkginternaluse != self.configdict["pkginternal"].get("USE", ""):
+             self.configdict["pkginternal"]["USE"] = pkginternaluse
+             has_changed = True
+ 
+         repo_env = []
+         if repository and repository != Package.UNKNOWN_REPO:
+             repos = []
+             try:
+                 repos.extend(
+                     repo.name for repo in self.repositories[repository].masters
+                 )
+             except KeyError:
+                 pass
+             repos.append(repository)
+             for repo in repos:
+                 d = self._repo_make_defaults.get(repo)
+                 if d is None:
+                     d = {}
+                 else:
+                     # make a copy, since we might modify it with
+                     # package.use settings
+                     d = d.copy()
+                 cpdict = self._use_manager._repo_puse_dict.get(repo, {}).get(cp)
+                 if cpdict:
+                     repo_puse = ordered_by_atom_specificity(cpdict, cpv_slot)
+                     if repo_puse:
+                         for x in repo_puse:
+                             d["USE"] = d.get("USE", "") + " " + " ".join(x)
+                 if d:
+                     repo_env.append(d)
+ 
+         if repo_env or self.configdict["repo"]:
+             self.configdict["repo"].clear()
+             self.configdict["repo"].update(
+                 stack_dicts(repo_env, incrementals=self.incrementals)
+             )
+             has_changed = True
+ 
+         defaults = []
+         for i, pkgprofileuse_dict in enumerate(self._use_manager._pkgprofileuse):
+             if self.make_defaults_use[i]:
+                 defaults.append(self.make_defaults_use[i])
+             cpdict = pkgprofileuse_dict.get(cp)
+             if cpdict:
+                 pkg_defaults = ordered_by_atom_specificity(cpdict, cpv_slot)
+                 if pkg_defaults:
+                     defaults.extend(pkg_defaults)
+         defaults = " ".join(defaults)
 +		if self.configdict["defaults"].get("MULTILIB_ABIS", "").count(' ') != 0:
 +			defaults = defaults + " multilib_abi_" + self.configdict["defaults"].get("DEFAULT_ABI", "")
- 		if defaults != self.configdict["defaults"].get("USE",""):
- 			self.configdict["defaults"]["USE"] = defaults
- 			has_changed = True
- 
- 		useforce = self._use_manager.getUseForce(cpv_slot)
- 		if useforce != self.useforce:
- 			self.useforce = useforce
- 			has_changed = True
- 
- 		usemask = self._use_manager.getUseMask(cpv_slot)
- 		if usemask != self.usemask:
- 			self.usemask = usemask
- 			has_changed = True
- 
- 		oldpuse = self.puse
- 		self.puse = self._use_manager.getPUSE(cpv_slot)
- 		if oldpuse != self.puse:
- 			has_changed = True
- 		self.configdict["pkg"]["PKGUSE"] = self.puse[:] # For saving to PUSE file
- 		self.configdict["pkg"]["USE"]    = self.puse[:] # this gets appended to USE
- 
- 		if previous_features:
- 			# The package from the previous setcpv call had package.env
- 			# settings which modified FEATURES. Therefore, trigger a
- 			# regenerate() call in order to ensure that self.features
- 			# is accurate.
- 			has_changed = True
- 			# Prevent stale features USE from corrupting the evaluation
- 			# of USE conditional RESTRICT.
- 			self.configdict["features"]["USE"] = self._default_features_use
- 
- 		self._penv = []
- 		cpdict = self._penvdict.get(cp)
- 		if cpdict:
- 			penv_matches = ordered_by_atom_specificity(cpdict, cpv_slot)
- 			if penv_matches:
- 				for x in penv_matches:
- 					self._penv.extend(x)
- 
- 		bashrc_files = []
- 
- 		for profile, profile_bashrc in zip(self._locations_manager.profiles_complex, self._profile_bashrc):
- 			if profile_bashrc:
- 				bashrc_files.append(os.path.join(profile.location, 'profile.bashrc'))
- 			if profile in self._pbashrcdict:
- 				cpdict = self._pbashrcdict[profile].get(cp)
- 				if cpdict:
- 					bashrc_matches = \
- 						ordered_by_atom_specificity(cpdict, cpv_slot)
- 					for x in bashrc_matches:
- 						bashrc_files.extend(x)
- 
- 		self._pbashrc = tuple(bashrc_files)
- 
- 		protected_pkg_keys = set(pkg_configdict)
- 		protected_pkg_keys.discard('USE')
- 
- 		# If there are _any_ package.env settings for this package
- 		# then it automatically triggers config.reset(), in order
- 		# to account for possible incremental interaction between
- 		# package.use, package.env, and overrides from the calling
- 		# environment (configdict['env']).
- 		if self._penv:
- 			has_changed = True
- 			# USE is special because package.use settings override
- 			# it. Discard any package.use settings here and they'll
- 			# be added back later.
- 			pkg_configdict.pop('USE', None)
- 			self._grab_pkg_env(self._penv, pkg_configdict,
- 				protected_keys=protected_pkg_keys)
- 
- 			# Now add package.use settings, which override USE from
- 			# package.env
- 			if self.puse:
- 				if 'USE' in pkg_configdict:
- 					pkg_configdict['USE'] = \
- 						pkg_configdict['USE'] + " " + self.puse
- 				else:
- 					pkg_configdict['USE'] = self.puse
- 
- 		elif previous_penv:
- 			has_changed = True
- 
- 		if not (previous_iuse == iuse and
- 			previous_iuse_effective is not None == eapi_attrs.iuse_effective):
- 			has_changed = True
- 
- 		if has_changed:
- 			# This can modify self.features due to package.env settings.
- 			self.reset(keeping_pkg=1)
- 
- 		if "test" in self.features:
- 			# This is independent of IUSE and RESTRICT, so that the same
- 			# value can be shared between packages with different settings,
- 			# which is important when evaluating USE conditional RESTRICT.
- 			feature_use.append("test")
- 
- 		feature_use = " ".join(feature_use)
- 		if feature_use != self.configdict["features"]["USE"]:
- 			# Regenerate USE for evaluation of conditional RESTRICT.
- 			self.configdict["features"]["USE"] = feature_use
- 			self.reset(keeping_pkg=1)
- 			has_changed = True
- 
- 		if explicit_iuse is None:
- 			explicit_iuse = frozenset(x.lstrip("+-") for x in iuse.split())
- 		if eapi_attrs.iuse_effective:
- 			iuse_implicit_match = self._iuse_effective_match
- 		else:
- 			iuse_implicit_match = self._iuse_implicit_match
- 
- 		if pkg is None:
- 			raw_properties = pkg_configdict.get("PROPERTIES")
- 			raw_restrict = pkg_configdict.get("RESTRICT")
- 		else:
- 			raw_properties = pkg._raw_metadata["PROPERTIES"]
- 			raw_restrict = pkg._raw_metadata["RESTRICT"]
- 
- 		restrict_test = False
- 		if raw_restrict:
- 			try:
- 				if built_use is not None:
- 					properties = use_reduce(raw_properties,
- 						uselist=built_use, flat=True)
- 					restrict = use_reduce(raw_restrict,
- 						uselist=built_use, flat=True)
- 				else:
- 					properties = use_reduce(raw_properties,
- 						uselist=frozenset(x for x in self['USE'].split()
- 						if x in explicit_iuse or iuse_implicit_match(x)),
- 						flat=True)
- 					restrict = use_reduce(raw_restrict,
- 						uselist=frozenset(x for x in self['USE'].split()
- 						if x in explicit_iuse or iuse_implicit_match(x)),
- 						flat=True)
- 			except PortageException:
- 				pass
- 			else:
- 				allow_test = self.get('ALLOW_TEST', '').split()
- 				restrict_test = (
- 					"test" in restrict and not "all" in allow_test and
- 					not ("test_network" in properties and "network" in allow_test))
- 
- 		if restrict_test and "test" in self.features:
- 			# Handle it like IUSE="-test", since features USE is
- 			# independent of RESTRICT.
- 			pkginternaluse_list.append("-test")
- 			pkginternaluse = " ".join(pkginternaluse_list)
- 			self.configdict["pkginternal"]["USE"] = pkginternaluse
- 			# TODO: can we avoid that?
- 			self.reset(keeping_pkg=1)
- 			has_changed = True
- 
- 		env_configdict = self.configdict['env']
- 
- 		# Ensure that "pkg" values are always preferred over "env" values.
- 		# This must occur _after_ the above reset() call, since reset()
- 		# copies values from self.backupenv.
- 		for k in protected_pkg_keys:
- 			env_configdict.pop(k, None)
- 
- 		lazy_vars = self._lazy_vars(built_use, self)
- 		env_configdict.addLazySingleton('ACCEPT_LICENSE',
- 			lazy_vars.__getitem__, 'ACCEPT_LICENSE')
- 		env_configdict.addLazySingleton('PORTAGE_PROPERTIES',
- 			lazy_vars.__getitem__, 'PORTAGE_PROPERTIES')
- 		env_configdict.addLazySingleton('PORTAGE_RESTRICT',
- 			lazy_vars.__getitem__, 'PORTAGE_RESTRICT')
- 
- 		if built_use is not None:
- 			pkg_configdict['PORTAGE_BUILT_USE'] = ' '.join(built_use)
- 
- 		# If reset() has not been called, it's safe to return
- 		# early if IUSE has not changed.
- 		if not has_changed:
- 			return
- 
- 		# Filter out USE flags that aren't part of IUSE. This has to
- 		# be done for every setcpv() call since practically every
- 		# package has different IUSE.
- 		use = set(self["USE"].split())
- 		unfiltered_use = frozenset(use)
- 
- 		if eapi_attrs.iuse_effective:
- 			portage_iuse = set(self._iuse_effective)
- 			portage_iuse.update(explicit_iuse)
- 			if built_use is not None:
- 				# When the binary package was built, the profile may have
- 				# had different IUSE_IMPLICIT settings, so any member of
- 				# the built USE setting is considered to be a member of
- 				# IUSE_EFFECTIVE (see bug 640318).
- 				portage_iuse.update(built_use)
- 			self.configdict["pkg"]["IUSE_EFFECTIVE"] = \
- 				" ".join(sorted(portage_iuse))
- 
- 			self.configdict["env"]["BASH_FUNC____in_portage_iuse%%"] = (
- 				"() { "
- 				"if [[ ${#___PORTAGE_IUSE_HASH[@]} -lt 1 ]]; then "
- 				"  declare -gA ___PORTAGE_IUSE_HASH=(%s); "
- 				"fi; "
- 				"[[ -n ${___PORTAGE_IUSE_HASH[$1]} ]]; "
- 				"}" ) % " ".join('["%s"]=1' % x for x in portage_iuse)
- 		else:
- 			portage_iuse = self._get_implicit_iuse()
- 			portage_iuse.update(explicit_iuse)
- 
- 			# The _get_implicit_iuse() returns a regular expression
- 			# so we can't use the (faster) map.  Fall back to
- 			# implementing ___in_portage_iuse() the older/slower way.
- 
- 			# PORTAGE_IUSE is not always needed so it's lazily evaluated.
- 			self.configdict["env"].addLazySingleton(
- 				"PORTAGE_IUSE", _lazy_iuse_regex, portage_iuse)
- 			self.configdict["env"]["BASH_FUNC____in_portage_iuse%%"] = \
- 				"() { [[ $1 =~ ${PORTAGE_IUSE} ]]; }"
- 
- 		ebuild_force_test = not restrict_test and \
- 			self.get("EBUILD_FORCE_TEST") == "1"
- 
- 		if "test" in explicit_iuse or iuse_implicit_match("test"):
- 			if "test" in self.features:
- 				if ebuild_force_test and "test" in self.usemask:
- 					self.usemask = \
- 						frozenset(x for x in self.usemask if x != "test")
- 			if restrict_test or \
- 				("test" in self.usemask and not ebuild_force_test):
- 				# "test" is in IUSE and USE=test is masked, so execution
- 				# of src_test() probably is not reliable. Therefore,
- 				# temporarily disable FEATURES=test just for this package.
- 				self["FEATURES"] = " ".join(x for x in self.features \
- 					if x != "test")
- 
- 		# Allow _* flags from USE_EXPAND wildcards to pass through here.
- 		use.difference_update([x for x in use \
- 			if (x not in explicit_iuse and \
- 			not iuse_implicit_match(x)) and x[-2:] != '_*'])
- 
- 		# Use the calculated USE flags to regenerate the USE_EXPAND flags so
- 		# that they are consistent. For optimal performance, use slice
- 		# comparison instead of startswith().
- 		use_expand_split = set(x.lower() for \
- 			x in self.get('USE_EXPAND', '').split())
- 		lazy_use_expand = self._lazy_use_expand(
- 			self, unfiltered_use, use, self.usemask,
- 			portage_iuse, use_expand_split, self._use_expand_dict)
- 
- 		use_expand_iuses = dict((k, set()) for k in use_expand_split)
- 		for x in portage_iuse:
- 			x_split = x.split('_')
- 			if len(x_split) == 1:
- 				continue
- 			for i in range(len(x_split) - 1):
- 				k = '_'.join(x_split[:i+1])
- 				if k in use_expand_split:
- 					use_expand_iuses[k].add(x)
- 					break
- 
- 		for k, use_expand_iuse in use_expand_iuses.items():
- 			if k + '_*' in use:
- 				use.update( x for x in use_expand_iuse if x not in usemask )
- 			k = k.upper()
- 			self.configdict['env'].addLazySingleton(k,
- 				lazy_use_expand.__getitem__, k)
- 
- 		for k in self.get("USE_EXPAND_UNPREFIXED", "").split():
- 			var_split = self.get(k, '').split()
- 			var_split = [ x for x in var_split if x in use ]
- 			if var_split:
- 				self.configlist[-1][k] = ' '.join(var_split)
- 			elif k in self:
- 				self.configlist[-1][k] = ''
- 
- 		# Filtered for the ebuild environment. Store this in a separate
- 		# attribute since we still want to be able to see global USE
- 		# settings for things like emerge --info.
- 
- 		self.configdict["env"]["PORTAGE_USE"] = \
- 			" ".join(sorted(x for x in use if x[-2:] != '_*'))
- 
- 		# Clear the eapi cache here rather than in the constructor, since
- 		# setcpv triggers lazy instantiation of things like _use_manager.
- 		_eapi_cache.clear()
- 
- 	def _grab_pkg_env(self, penv, container, protected_keys=None):
- 		if protected_keys is None:
- 			protected_keys = ()
- 		abs_user_config = os.path.join(
- 			self['PORTAGE_CONFIGROOT'], USER_CONFIG_PATH)
- 		non_user_variables = self._non_user_variables
- 		# Make a copy since we don't want per-package settings
- 		# to pollute the global expand_map.
- 		expand_map = self._expand_map.copy()
- 		incrementals = self.incrementals
- 		for envname in penv:
- 			penvfile = os.path.join(abs_user_config, "env", envname)
- 			penvconfig = getconfig(penvfile, tolerant=self._tolerant,
- 				allow_sourcing=True, expand=expand_map)
- 			if penvconfig is None:
- 				writemsg("!!! %s references non-existent file: %s\n" % \
- 					(os.path.join(abs_user_config, 'package.env'), penvfile),
- 					noiselevel=-1)
- 			else:
- 				for k, v in penvconfig.items():
- 					if k in protected_keys or \
- 						k in non_user_variables:
- 						writemsg("!!! Illegal variable " + \
- 							"'%s' assigned in '%s'\n" % \
- 							(k, penvfile), noiselevel=-1)
- 					elif k in incrementals:
- 						if k in container:
- 							container[k] = container[k] + " " + v
- 						else:
- 							container[k] = v
- 					else:
- 						container[k] = v
- 
- 	def _iuse_effective_match(self, flag):
- 		return flag in self._iuse_effective
- 
- 	def _calc_iuse_effective(self):
- 		"""
- 		Beginning with EAPI 5, IUSE_EFFECTIVE is defined by PMS.
- 		"""
- 		iuse_effective = []
- 		iuse_effective.extend(self.get("IUSE_IMPLICIT", "").split())
- 
- 		# USE_EXPAND_IMPLICIT should contain things like ARCH, ELIBC,
- 		# KERNEL, and USERLAND.
- 		use_expand_implicit = frozenset(
- 			self.get("USE_EXPAND_IMPLICIT", "").split())
- 
- 		# USE_EXPAND_UNPREFIXED should contain at least ARCH, and
- 		# USE_EXPAND_VALUES_ARCH should contain all valid ARCH flags.
- 		for v in self.get("USE_EXPAND_UNPREFIXED", "").split():
- 			if v not in use_expand_implicit:
- 				continue
- 			iuse_effective.extend(
- 				self.get("USE_EXPAND_VALUES_" + v, "").split())
- 
- 		use_expand = frozenset(self.get("USE_EXPAND", "").split())
- 		for v in use_expand_implicit:
- 			if v not in use_expand:
- 				continue
- 			lower_v = v.lower()
- 			for x in self.get("USE_EXPAND_VALUES_" + v, "").split():
- 				iuse_effective.append(lower_v + "_" + x)
- 
- 		return frozenset(iuse_effective)
- 
- 	def _get_implicit_iuse(self):
- 		"""
- 		Prior to EAPI 5, these flags are considered to
- 		be implicit members of IUSE:
- 		  * Flags derived from ARCH
- 		  * Flags derived from USE_EXPAND_HIDDEN variables
- 		  * Masked flags, such as those from {,package}use.mask
- 		  * Forced flags, such as those from {,package}use.force
- 		  * build and bootstrap flags used by bootstrap.sh
- 		"""
- 		iuse_implicit = set()
- 		# Flags derived from ARCH.
- 		arch = self.configdict["defaults"].get("ARCH")
- 		if arch:
- 			iuse_implicit.add(arch)
- 		iuse_implicit.update(self.get("PORTAGE_ARCHLIST", "").split())
- 
- 		# Flags derived from USE_EXPAND_HIDDEN variables
- 		# such as ELIBC, KERNEL, and USERLAND.
- 		use_expand_hidden = self.get("USE_EXPAND_HIDDEN", "").split()
- 		for x in use_expand_hidden:
- 			iuse_implicit.add(x.lower() + "_.*")
- 
- 		# Flags that have been masked or forced.
- 		iuse_implicit.update(self.usemask)
- 		iuse_implicit.update(self.useforce)
- 
- 		# build and bootstrap flags used by bootstrap.sh
- 		iuse_implicit.add("build")
- 		iuse_implicit.add("bootstrap")
- 
- 		if 'force-multilib' in self.features:
+         if defaults != self.configdict["defaults"].get("USE", ""):
+             self.configdict["defaults"]["USE"] = defaults
+             has_changed = True
+ 
+         useforce = self._use_manager.getUseForce(cpv_slot)
+         if useforce != self.useforce:
+             self.useforce = useforce
+             has_changed = True
+ 
+         usemask = self._use_manager.getUseMask(cpv_slot)
+         if usemask != self.usemask:
+             self.usemask = usemask
+             has_changed = True
+ 
+         oldpuse = self.puse
+         self.puse = self._use_manager.getPUSE(cpv_slot)
+         if oldpuse != self.puse:
+             has_changed = True
+         self.configdict["pkg"]["PKGUSE"] = self.puse[:]  # For saving to PUSE file
+         self.configdict["pkg"]["USE"] = self.puse[:]  # this gets appended to USE
+ 
+         if previous_features:
+             # The package from the previous setcpv call had package.env
+             # settings which modified FEATURES. Therefore, trigger a
+             # regenerate() call in order to ensure that self.features
+             # is accurate.
+             has_changed = True
+             # Prevent stale features USE from corrupting the evaluation
+             # of USE conditional RESTRICT.
+             self.configdict["features"]["USE"] = self._default_features_use
+ 
+         self._penv = []
+         cpdict = self._penvdict.get(cp)
+         if cpdict:
+             penv_matches = ordered_by_atom_specificity(cpdict, cpv_slot)
+             if penv_matches:
+                 for x in penv_matches:
+                     self._penv.extend(x)
+ 
+         bashrc_files = []
+ 
+         for profile, profile_bashrc in zip(
+             self._locations_manager.profiles_complex, self._profile_bashrc
+         ):
+             if profile_bashrc:
+                 bashrc_files.append(os.path.join(profile.location, "profile.bashrc"))
+             if profile in self._pbashrcdict:
+                 cpdict = self._pbashrcdict[profile].get(cp)
+                 if cpdict:
+                     bashrc_matches = ordered_by_atom_specificity(cpdict, cpv_slot)
+                     for x in bashrc_matches:
+                         bashrc_files.extend(x)
+ 
+         self._pbashrc = tuple(bashrc_files)
+ 
+         protected_pkg_keys = set(pkg_configdict)
+         protected_pkg_keys.discard("USE")
+ 
+         # If there are _any_ package.env settings for this package
+         # then it automatically triggers config.reset(), in order
+         # to account for possible incremental interaction between
+         # package.use, package.env, and overrides from the calling
+         # environment (configdict['env']).
+         if self._penv:
+             has_changed = True
+             # USE is special because package.use settings override
+             # it. Discard any package.use settings here and they'll
+             # be added back later.
+             pkg_configdict.pop("USE", None)
+             self._grab_pkg_env(
+                 self._penv, pkg_configdict, protected_keys=protected_pkg_keys
+             )
+ 
+             # Now add package.use settings, which override USE from
+             # package.env
+             if self.puse:
+                 if "USE" in pkg_configdict:
+                     pkg_configdict["USE"] = pkg_configdict["USE"] + " " + self.puse
+                 else:
+                     pkg_configdict["USE"] = self.puse
+ 
+         elif previous_penv:
+             has_changed = True
+ 
+         if not (
+             previous_iuse == iuse
+             and previous_iuse_effective is not None == eapi_attrs.iuse_effective
+         ):
+             has_changed = True
+ 
+         if has_changed:
+             # This can modify self.features due to package.env settings.
+             self.reset(keeping_pkg=1)
+ 
+         if "test" in self.features:
+             # This is independent of IUSE and RESTRICT, so that the same
+             # value can be shared between packages with different settings,
+             # which is important when evaluating USE conditional RESTRICT.
+             feature_use.append("test")
+ 
+         feature_use = " ".join(feature_use)
+         if feature_use != self.configdict["features"]["USE"]:
+             # Regenerate USE for evaluation of conditional RESTRICT.
+             self.configdict["features"]["USE"] = feature_use
+             self.reset(keeping_pkg=1)
+             has_changed = True
+ 
+         if explicit_iuse is None:
+             explicit_iuse = frozenset(x.lstrip("+-") for x in iuse.split())
+         if eapi_attrs.iuse_effective:
+             iuse_implicit_match = self._iuse_effective_match
+         else:
+             iuse_implicit_match = self._iuse_implicit_match
+ 
+         if pkg is None:
+             raw_properties = pkg_configdict.get("PROPERTIES")
+             raw_restrict = pkg_configdict.get("RESTRICT")
+         else:
+             raw_properties = pkg._raw_metadata["PROPERTIES"]
+             raw_restrict = pkg._raw_metadata["RESTRICT"]
+ 
+         restrict_test = False
+         if raw_restrict:
+             try:
+                 if built_use is not None:
+                     properties = use_reduce(
+                         raw_properties, uselist=built_use, flat=True
+                     )
+                     restrict = use_reduce(raw_restrict, uselist=built_use, flat=True)
+                 else:
+                     properties = use_reduce(
+                         raw_properties,
+                         uselist=frozenset(
+                             x
+                             for x in self["USE"].split()
+                             if x in explicit_iuse or iuse_implicit_match(x)
+                         ),
+                         flat=True,
+                     )
+                     restrict = use_reduce(
+                         raw_restrict,
+                         uselist=frozenset(
+                             x
+                             for x in self["USE"].split()
+                             if x in explicit_iuse or iuse_implicit_match(x)
+                         ),
+                         flat=True,
+                     )
+             except PortageException:
+                 pass
+             else:
+                 allow_test = self.get("ALLOW_TEST", "").split()
+                 restrict_test = (
+                     "test" in restrict
+                     and not "all" in allow_test
+                     and not ("test_network" in properties and "network" in allow_test)
+                 )
+ 
+         if restrict_test and "test" in self.features:
+             # Handle it like IUSE="-test", since features USE is
+             # independent of RESTRICT.
+             pkginternaluse_list.append("-test")
+             pkginternaluse = " ".join(pkginternaluse_list)
+             self.configdict["pkginternal"]["USE"] = pkginternaluse
+             # TODO: can we avoid that?
+             self.reset(keeping_pkg=1)
+             has_changed = True
+ 
+         env_configdict = self.configdict["env"]
+ 
+         # Ensure that "pkg" values are always preferred over "env" values.
+         # This must occur _after_ the above reset() call, since reset()
+         # copies values from self.backupenv.
+         for k in protected_pkg_keys:
+             env_configdict.pop(k, None)
+ 
+         lazy_vars = self._lazy_vars(built_use, self)
+         env_configdict.addLazySingleton(
+             "ACCEPT_LICENSE", lazy_vars.__getitem__, "ACCEPT_LICENSE"
+         )
+         env_configdict.addLazySingleton(
+             "PORTAGE_PROPERTIES", lazy_vars.__getitem__, "PORTAGE_PROPERTIES"
+         )
+         env_configdict.addLazySingleton(
+             "PORTAGE_RESTRICT", lazy_vars.__getitem__, "PORTAGE_RESTRICT"
+         )
+ 
+         if built_use is not None:
+             pkg_configdict["PORTAGE_BUILT_USE"] = " ".join(built_use)
+ 
+         # If reset() has not been called, it's safe to return
+         # early if IUSE has not changed.
+         if not has_changed:
+             return
+ 
+         # Filter out USE flags that aren't part of IUSE. This has to
+         # be done for every setcpv() call since practically every
+         # package has different IUSE.
+         use = set(self["USE"].split())
+         unfiltered_use = frozenset(use)
+ 
+         if eapi_attrs.iuse_effective:
+             portage_iuse = set(self._iuse_effective)
+             portage_iuse.update(explicit_iuse)
+             if built_use is not None:
+                 # When the binary package was built, the profile may have
+                 # had different IUSE_IMPLICIT settings, so any member of
+                 # the built USE setting is considered to be a member of
+                 # IUSE_EFFECTIVE (see bug 640318).
+                 portage_iuse.update(built_use)
+             self.configdict["pkg"]["IUSE_EFFECTIVE"] = " ".join(sorted(portage_iuse))
+ 
+             self.configdict["env"]["BASH_FUNC____in_portage_iuse%%"] = (
+                 "() { "
+                 "if [[ ${#___PORTAGE_IUSE_HASH[@]} -lt 1 ]]; then "
+                 "  declare -gA ___PORTAGE_IUSE_HASH=(%s); "
+                 "fi; "
+                 "[[ -n ${___PORTAGE_IUSE_HASH[$1]} ]]; "
+                 "}"
+             ) % " ".join('["%s"]=1' % x for x in portage_iuse)
+         else:
+             portage_iuse = self._get_implicit_iuse()
+             portage_iuse.update(explicit_iuse)
+ 
+             # The _get_implicit_iuse() returns a regular expression
+             # so we can't use the (faster) map.  Fall back to
+             # implementing ___in_portage_iuse() the older/slower way.
+ 
+             # PORTAGE_IUSE is not always needed so it's lazily evaluated.
+             self.configdict["env"].addLazySingleton(
+                 "PORTAGE_IUSE", _lazy_iuse_regex, portage_iuse
+             )
+             self.configdict["env"][
+                 "BASH_FUNC____in_portage_iuse%%"
+             ] = "() { [[ $1 =~ ${PORTAGE_IUSE} ]]; }"
+ 
+         ebuild_force_test = not restrict_test and self.get("EBUILD_FORCE_TEST") == "1"
+ 
+         if "test" in explicit_iuse or iuse_implicit_match("test"):
+             if "test" in self.features:
+                 if ebuild_force_test and "test" in self.usemask:
+                     self.usemask = frozenset(x for x in self.usemask if x != "test")
+             if restrict_test or ("test" in self.usemask and not ebuild_force_test):
+                 # "test" is in IUSE and USE=test is masked, so execution
+                 # of src_test() probably is not reliable. Therefore,
+                 # temporarily disable FEATURES=test just for this package.
+                 self["FEATURES"] = " ".join(x for x in self.features if x != "test")
+ 
+         # Allow _* flags from USE_EXPAND wildcards to pass through here.
+         use.difference_update(
+             [
+                 x
+                 for x in use
+                 if (x not in explicit_iuse and not iuse_implicit_match(x))
+                 and x[-2:] != "_*"
+             ]
+         )
+ 
+         # Use the calculated USE flags to regenerate the USE_EXPAND flags so
+         # that they are consistent. For optimal performance, use slice
+         # comparison instead of startswith().
+         use_expand_split = set(x.lower() for x in self.get("USE_EXPAND", "").split())
+         lazy_use_expand = self._lazy_use_expand(
+             self,
+             unfiltered_use,
+             use,
+             self.usemask,
+             portage_iuse,
+             use_expand_split,
+             self._use_expand_dict,
+         )
+ 
+         use_expand_iuses = dict((k, set()) for k in use_expand_split)
+         for x in portage_iuse:
+             x_split = x.split("_")
+             if len(x_split) == 1:
+                 continue
+             for i in range(len(x_split) - 1):
+                 k = "_".join(x_split[: i + 1])
+                 if k in use_expand_split:
+                     use_expand_iuses[k].add(x)
+                     break
+ 
+         for k, use_expand_iuse in use_expand_iuses.items():
+             if k + "_*" in use:
+                 use.update(x for x in use_expand_iuse if x not in usemask)
+             k = k.upper()
+             self.configdict["env"].addLazySingleton(k, lazy_use_expand.__getitem__, k)
+ 
+         for k in self.get("USE_EXPAND_UNPREFIXED", "").split():
+             var_split = self.get(k, "").split()
+             var_split = [x for x in var_split if x in use]
+             if var_split:
+                 self.configlist[-1][k] = " ".join(var_split)
+             elif k in self:
+                 self.configlist[-1][k] = ""
+ 
+         # Filtered for the ebuild environment. Store this in a separate
+         # attribute since we still want to be able to see global USE
+         # settings for things like emerge --info.
+ 
+         self.configdict["env"]["PORTAGE_USE"] = " ".join(
+             sorted(x for x in use if x[-2:] != "_*")
+         )
+ 
+         # Clear the eapi cache here rather than in the constructor, since
+         # setcpv triggers lazy instantiation of things like _use_manager.
+         _eapi_cache.clear()
+ 
+     def _grab_pkg_env(self, penv, container, protected_keys=None):
+         if protected_keys is None:
+             protected_keys = ()
+         abs_user_config = os.path.join(self["PORTAGE_CONFIGROOT"], USER_CONFIG_PATH)
+         non_user_variables = self._non_user_variables
+         # Make a copy since we don't want per-package settings
+         # to pollute the global expand_map.
+         expand_map = self._expand_map.copy()
+         incrementals = self.incrementals
+         for envname in penv:
+             penvfile = os.path.join(abs_user_config, "env", envname)
+             penvconfig = getconfig(
+                 penvfile,
+                 tolerant=self._tolerant,
+                 allow_sourcing=True,
+                 expand=expand_map,
+             )
+             if penvconfig is None:
+                 writemsg(
+                     "!!! %s references non-existent file: %s\n"
+                     % (os.path.join(abs_user_config, "package.env"), penvfile),
+                     noiselevel=-1,
+                 )
+             else:
+                 for k, v in penvconfig.items():
+                     if k in protected_keys or k in non_user_variables:
+                         writemsg(
+                             "!!! Illegal variable "
+                             + "'%s' assigned in '%s'\n" % (k, penvfile),
+                             noiselevel=-1,
+                         )
+                     elif k in incrementals:
+                         if k in container:
+                             container[k] = container[k] + " " + v
+                         else:
+                             container[k] = v
+                     else:
+                         container[k] = v
+ 
+     def _iuse_effective_match(self, flag):
+         return flag in self._iuse_effective
+ 
+     def _calc_iuse_effective(self):
+         """
+         Beginning with EAPI 5, IUSE_EFFECTIVE is defined by PMS.
+         """
+         iuse_effective = []
+         iuse_effective.extend(self.get("IUSE_IMPLICIT", "").split())
+ 
+         # USE_EXPAND_IMPLICIT should contain things like ARCH, ELIBC,
+         # KERNEL, and USERLAND.
+         use_expand_implicit = frozenset(self.get("USE_EXPAND_IMPLICIT", "").split())
+ 
+         # USE_EXPAND_UNPREFIXED should contain at least ARCH, and
+         # USE_EXPAND_VALUES_ARCH should contain all valid ARCH flags.
+         for v in self.get("USE_EXPAND_UNPREFIXED", "").split():
+             if v not in use_expand_implicit:
+                 continue
+             iuse_effective.extend(self.get("USE_EXPAND_VALUES_" + v, "").split())
+ 
+         use_expand = frozenset(self.get("USE_EXPAND", "").split())
+         for v in use_expand_implicit:
+             if v not in use_expand:
+                 continue
+             lower_v = v.lower()
+             for x in self.get("USE_EXPAND_VALUES_" + v, "").split():
+                 iuse_effective.append(lower_v + "_" + x)
+ 
+         return frozenset(iuse_effective)
+ 
+     def _get_implicit_iuse(self):
+         """
+         Prior to EAPI 5, these flags are considered to
+         be implicit members of IUSE:
+           * Flags derived from ARCH
+           * Flags derived from USE_EXPAND_HIDDEN variables
+           * Masked flags, such as those from {,package}use.mask
+           * Forced flags, such as those from {,package}use.force
+           * build and bootstrap flags used by bootstrap.sh
+         """
+         iuse_implicit = set()
+         # Flags derived from ARCH.
+         arch = self.configdict["defaults"].get("ARCH")
+         if arch:
+             iuse_implicit.add(arch)
+         iuse_implicit.update(self.get("PORTAGE_ARCHLIST", "").split())
+ 
+         # Flags derived from USE_EXPAND_HIDDEN variables
+         # such as ELIBC, KERNEL, and USERLAND.
+         use_expand_hidden = self.get("USE_EXPAND_HIDDEN", "").split()
+         for x in use_expand_hidden:
+             iuse_implicit.add(x.lower() + "_.*")
+ 
+         # Flags that have been masked or forced.
+         iuse_implicit.update(self.usemask)
+         iuse_implicit.update(self.useforce)
+ 
+         # build and bootstrap flags used by bootstrap.sh
+         iuse_implicit.add("build")
+         iuse_implicit.add("bootstrap")
+ 
++        if 'force-multilib' in self.features:
 +			for multilib_abis in self.get('MULTILIB_ABIS', '').split():
 +				iuse_implicit.add("multilib_abi_" + multilib_abis)
 +
- 		return iuse_implicit
- 
- 	def _getUseMask(self, pkg, stable=None):
- 		return self._use_manager.getUseMask(pkg, stable=stable)
- 
- 	def _getUseForce(self, pkg, stable=None):
- 		return self._use_manager.getUseForce(pkg, stable=stable)
- 
- 	def _getMaskAtom(self, cpv, metadata):
- 		"""
- 		Take a package and return a matching package.mask atom, or None if no
- 		such atom exists or it has been cancelled by package.unmask.
- 
- 		@param cpv: The package name
- 		@type cpv: String
- 		@param metadata: A dictionary of raw package metadata
- 		@type metadata: dict
- 		@rtype: String
- 		@return: A matching atom string or None if one is not found.
- 		"""
- 		return self._mask_manager.getMaskAtom(cpv, metadata["SLOT"], metadata.get('repository'))
- 
- 	def _getRawMaskAtom(self, cpv, metadata):
- 		"""
- 		Take a package and return a matching package.mask atom, or None if no
- 		such atom exists or it has been cancelled by package.unmask.
- 
- 		@param cpv: The package name
- 		@type cpv: String
- 		@param metadata: A dictionary of raw package metadata
- 		@type metadata: dict
- 		@rtype: String
- 		@return: A matching atom string or None if one is not found.
- 		"""
- 		return self._mask_manager.getRawMaskAtom(cpv, metadata["SLOT"], metadata.get('repository'))
- 
- 
- 	def _getProfileMaskAtom(self, cpv, metadata):
- 		"""
- 		Take a package and return a matching profile atom, or None if no
- 		such atom exists. Note that a profile atom may or may not have a "*"
- 		prefix.
- 
- 		@param cpv: The package name
- 		@type cpv: String
- 		@param metadata: A dictionary of raw package metadata
- 		@type metadata: dict
- 		@rtype: String
- 		@return: A matching profile atom string or None if one is not found.
- 		"""
- 
- 		warnings.warn("The config._getProfileMaskAtom() method is deprecated.",
- 			DeprecationWarning, stacklevel=2)
- 
- 		cp = cpv_getkey(cpv)
- 		profile_atoms = self.prevmaskdict.get(cp)
- 		if profile_atoms:
- 			pkg = "".join((cpv, _slot_separator, metadata["SLOT"]))
- 			repo = metadata.get("repository")
- 			if repo and repo != Package.UNKNOWN_REPO:
- 				pkg = "".join((pkg, _repo_separator, repo))
- 			pkg_list = [pkg]
- 			for x in profile_atoms:
- 				if match_from_list(x, pkg_list):
- 					continue
- 				return x
- 		return None
- 
- 	def _isStable(self, pkg):
- 		return self._keywords_manager.isStable(pkg,
- 			self.get("ACCEPT_KEYWORDS", ""),
- 			self.configdict["backupenv"].get("ACCEPT_KEYWORDS", ""))
- 
- 	def _getKeywords(self, cpv, metadata):
- 		return self._keywords_manager.getKeywords(cpv, metadata["SLOT"], \
- 			metadata.get("KEYWORDS", ""), metadata.get("repository"))
- 
- 	def _getMissingKeywords(self, cpv, metadata):
- 		"""
- 		Take a package and return a list of any KEYWORDS that the user may
- 		need to accept for the given package. If the KEYWORDS are empty
- 		and the ** keyword has not been accepted, the returned list will
- 		contain ** alone (in order to distinguish from the case of "none
- 		missing").
- 
- 		@param cpv: The package name (for package.keywords support)
- 		@type cpv: String
- 		@param metadata: A dictionary of raw package metadata
- 		@type metadata: dict
- 		@rtype: List
- 		@return: A list of KEYWORDS that have not been accepted.
- 		"""
- 
- 		# Hack: Need to check the env directly here as otherwise stacking
- 		# doesn't work properly as negative values are lost in the config
- 		# object (bug #139600)
- 		backuped_accept_keywords = self.configdict["backupenv"].get("ACCEPT_KEYWORDS", "")
- 		global_accept_keywords = self.get("ACCEPT_KEYWORDS", "")
- 
- 		return self._keywords_manager.getMissingKeywords(cpv, metadata["SLOT"], \
- 			metadata.get("KEYWORDS", ""), metadata.get('repository'), \
- 			global_accept_keywords, backuped_accept_keywords)
- 
- 	def _getRawMissingKeywords(self, cpv, metadata):
- 		"""
- 		Take a package and return a list of any KEYWORDS that the user may
- 		need to accept for the given package. If the KEYWORDS are empty,
- 		the returned list will contain ** alone (in order to distinguish
- 		from the case of "none missing").  This DOES NOT apply any user config
- 		package.accept_keywords acceptance.
- 
- 		@param cpv: The package name (for package.keywords support)
- 		@type cpv: String
- 		@param metadata: A dictionary of raw package metadata
- 		@type metadata: dict
- 		@rtype: List
- 		@return: lists of KEYWORDS that have not been accepted
- 		and the keywords it looked for.
- 		"""
- 		return self._keywords_manager.getRawMissingKeywords(cpv, metadata["SLOT"], \
- 			metadata.get("KEYWORDS", ""), metadata.get('repository'), \
- 			self.get("ACCEPT_KEYWORDS", ""))
- 
- 	def _getPKeywords(self, cpv, metadata):
- 		global_accept_keywords = self.get("ACCEPT_KEYWORDS", "")
- 
- 		return self._keywords_manager.getPKeywords(cpv, metadata["SLOT"], \
- 			metadata.get('repository'), global_accept_keywords)
- 
- 	def _getMissingLicenses(self, cpv, metadata):
- 		"""
- 		Take a LICENSE string and return a list of any licenses that the user
- 		may need to accept for the given package.  The returned list will not
- 		contain any licenses that have already been accepted.  This method
- 		can throw an InvalidDependString exception.
- 
- 		@param cpv: The package name (for package.license support)
- 		@type cpv: String
- 		@param metadata: A dictionary of raw package metadata
- 		@type metadata: dict
- 		@rtype: List
- 		@return: A list of licenses that have not been accepted.
- 		"""
- 		return self._license_manager.getMissingLicenses( \
- 			cpv, metadata["USE"], metadata["LICENSE"], metadata["SLOT"], metadata.get('repository'))
- 
- 	def _getMissingProperties(self, cpv, metadata):
- 		"""
- 		Take a PROPERTIES string and return a list of any properties the user
- 		may need to accept for the given package.  The returned list will not
- 		contain any properties that have already been accepted.  This method
- 		can throw an InvalidDependString exception.
- 
- 		@param cpv: The package name (for package.properties support)
- 		@type cpv: String
- 		@param metadata: A dictionary of raw package metadata
- 		@type metadata: dict
- 		@rtype: List
- 		@return: A list of properties that have not been accepted.
- 		"""
- 		accept_properties = self._accept_properties
- 		try:
- 			cpv.slot
- 		except AttributeError:
- 			cpv = _pkg_str(cpv, metadata=metadata, settings=self)
- 		cp = cpv_getkey(cpv)
- 		cpdict = self._ppropertiesdict.get(cp)
- 		if cpdict:
- 			pproperties_list = ordered_by_atom_specificity(cpdict, cpv)
- 			if pproperties_list:
- 				accept_properties = list(self._accept_properties)
- 				for x in pproperties_list:
- 					accept_properties.extend(x)
- 
- 		properties_str = metadata.get("PROPERTIES", "")
- 		properties = set(use_reduce(properties_str, matchall=1, flat=True))
- 
- 		acceptable_properties = set()
- 		for x in accept_properties:
- 			if x == '*':
- 				acceptable_properties.update(properties)
- 			elif x == '-*':
- 				acceptable_properties.clear()
- 			elif x[:1] == '-':
- 				acceptable_properties.discard(x[1:])
- 			else:
- 				acceptable_properties.add(x)
- 
- 		if "?" in properties_str:
- 			use = metadata["USE"].split()
- 		else:
- 			use = []
- 
- 		return [x for x in use_reduce(properties_str, uselist=use, flat=True)
- 			if x not in acceptable_properties]
- 
- 	def _getMissingRestrict(self, cpv, metadata):
- 		"""
- 		Take a RESTRICT string and return a list of any tokens the user
- 		may need to accept for the given package.  The returned list will not
- 		contain any tokens that have already been accepted.  This method
- 		can throw an InvalidDependString exception.
- 
- 		@param cpv: The package name (for package.accept_restrict support)
- 		@type cpv: String
- 		@param metadata: A dictionary of raw package metadata
- 		@type metadata: dict
- 		@rtype: List
- 		@return: A list of tokens that have not been accepted.
- 		"""
- 		accept_restrict = self._accept_restrict
- 		try:
- 			cpv.slot
- 		except AttributeError:
- 			cpv = _pkg_str(cpv, metadata=metadata, settings=self)
- 		cp = cpv_getkey(cpv)
- 		cpdict = self._paccept_restrict.get(cp)
- 		if cpdict:
- 			paccept_restrict_list = ordered_by_atom_specificity(cpdict, cpv)
- 			if paccept_restrict_list:
- 				accept_restrict = list(self._accept_restrict)
- 				for x in paccept_restrict_list:
- 					accept_restrict.extend(x)
- 
- 		restrict_str = metadata.get("RESTRICT", "")
- 		all_restricts = set(use_reduce(restrict_str, matchall=1, flat=True))
- 
- 		acceptable_restricts = set()
- 		for x in accept_restrict:
- 			if x == '*':
- 				acceptable_restricts.update(all_restricts)
- 			elif x == '-*':
- 				acceptable_restricts.clear()
- 			elif x[:1] == '-':
- 				acceptable_restricts.discard(x[1:])
- 			else:
- 				acceptable_restricts.add(x)
- 
- 		if "?" in restrict_str:
- 			use = metadata["USE"].split()
- 		else:
- 			use = []
- 
- 		return [x for x in use_reduce(restrict_str, uselist=use, flat=True)
- 			if x not in acceptable_restricts]
- 
- 	def _accept_chost(self, cpv, metadata):
- 		"""
- 		@return True if pkg CHOST is accepted, False otherwise.
- 		"""
- 		if self._accept_chost_re is None:
- 			accept_chost = self.get("ACCEPT_CHOSTS", "").split()
- 			if not accept_chost:
- 				chost = self.get("CHOST")
- 				if chost:
- 					accept_chost.append(chost)
- 			if not accept_chost:
- 				self._accept_chost_re = re.compile(".*")
- 			elif len(accept_chost) == 1:
- 				try:
- 					self._accept_chost_re = re.compile(r'^%s$' % accept_chost[0])
- 				except re.error as e:
- 					writemsg(_("!!! Invalid ACCEPT_CHOSTS value: '%s': %s\n") % \
- 						(accept_chost[0], e), noiselevel=-1)
- 					self._accept_chost_re = re.compile("^$")
- 			else:
- 				try:
- 					self._accept_chost_re = re.compile(
- 						r'^(%s)$' % "|".join(accept_chost))
- 				except re.error as e:
- 					writemsg(_("!!! Invalid ACCEPT_CHOSTS value: '%s': %s\n") % \
- 						(" ".join(accept_chost), e), noiselevel=-1)
- 					self._accept_chost_re = re.compile("^$")
- 
- 		pkg_chost = metadata.get('CHOST', '')
- 		return not pkg_chost or \
- 			self._accept_chost_re.match(pkg_chost) is not None
- 
- 	def setinst(self, mycpv, mydbapi):
- 		"""This used to update the preferences for old-style virtuals.
- 		It is no-op now."""
- 		pass
- 
- 	def reload(self):
- 		"""Reload things like /etc/profile.env that can change during runtime."""
- 		env_d_filename = os.path.join(self["EROOT"], "etc", "profile.env")
- 		self.configdict["env.d"].clear()
- 		env_d = getconfig(env_d_filename,
- 			tolerant=self._tolerant, expand=False)
- 		if env_d:
- 			# env_d will be None if profile.env doesn't exist.
- 			for k in self._env_d_blacklist:
- 				env_d.pop(k, None)
- 			self.configdict["env.d"].update(env_d)
- 
- 	def regenerate(self, useonly=0, use_cache=None):
- 		"""
- 		Regenerate settings
- 		This involves regenerating valid USE flags, re-expanding USE_EXPAND flags
- 		re-stacking USE flags (-flag and -*), as well as any other INCREMENTAL
- 		variables.  This also updates the env.d configdict; useful in case an ebuild
- 		changes the environment.
- 
- 		If FEATURES has already stacked, it is not stacked twice.
- 
- 		@param useonly: Only regenerate USE flags (not any other incrementals)
- 		@type useonly: Boolean
- 		@rtype: None
- 		"""
- 
- 		if use_cache is not None:
- 			warnings.warn("The use_cache parameter for config.regenerate() is deprecated and without effect.",
- 				DeprecationWarning, stacklevel=2)
- 
- 		self.modifying()
- 
- 		if useonly:
- 			myincrementals=["USE"]
- 		else:
- 			myincrementals = self.incrementals
- 		myincrementals = set(myincrementals)
- 
- 		# Process USE last because it depends on USE_EXPAND which is also
- 		# an incremental!
- 		myincrementals.discard("USE")
- 
- 		mydbs = self.configlist[:-1]
- 		mydbs.append(self.backupenv)
- 
- 		# ACCEPT_LICENSE is a lazily evaluated incremental, so that * can be
- 		# used to match all licenses without every having to explicitly expand
- 		# it to all licenses.
- 		if self.local_config:
- 			mysplit = []
- 			for curdb in mydbs:
- 				mysplit.extend(curdb.get('ACCEPT_LICENSE', '').split())
- 			mysplit = prune_incremental(mysplit)
- 			accept_license_str = ' '.join(mysplit) or '* -@EULA'
- 			self.configlist[-1]['ACCEPT_LICENSE'] = accept_license_str
- 			self._license_manager.set_accept_license_str(accept_license_str)
- 		else:
- 			# repoman will accept any license
- 			self._license_manager.set_accept_license_str("*")
- 
- 		# ACCEPT_PROPERTIES works like ACCEPT_LICENSE, without groups
- 		if self.local_config:
- 			mysplit = []
- 			for curdb in mydbs:
- 				mysplit.extend(curdb.get('ACCEPT_PROPERTIES', '').split())
- 			mysplit = prune_incremental(mysplit)
- 			self.configlist[-1]['ACCEPT_PROPERTIES'] = ' '.join(mysplit)
- 			if tuple(mysplit) != self._accept_properties:
- 				self._accept_properties = tuple(mysplit)
- 		else:
- 			# repoman will accept any property
- 			self._accept_properties = ('*',)
- 
- 		if self.local_config:
- 			mysplit = []
- 			for curdb in mydbs:
- 				mysplit.extend(curdb.get('ACCEPT_RESTRICT', '').split())
- 			mysplit = prune_incremental(mysplit)
- 			self.configlist[-1]['ACCEPT_RESTRICT'] = ' '.join(mysplit)
- 			if tuple(mysplit) != self._accept_restrict:
- 				self._accept_restrict = tuple(mysplit)
- 		else:
- 			# repoman will accept any property
- 			self._accept_restrict = ('*',)
- 
- 		increment_lists = {}
- 		for k in myincrementals:
- 			incremental_list = []
- 			increment_lists[k] = incremental_list
- 			for curdb in mydbs:
- 				v = curdb.get(k)
- 				if v is not None:
- 					incremental_list.append(v.split())
- 
- 		if 'FEATURES' in increment_lists:
- 			increment_lists['FEATURES'].append(self._features_overrides)
- 
- 		myflags = set()
- 		for mykey, incremental_list in increment_lists.items():
- 
- 			myflags.clear()
- 			for mysplit in incremental_list:
- 
- 				for x in mysplit:
- 					if x=="-*":
- 						# "-*" is a special "minus" var that means "unset all settings".
- 						# so USE="-* gnome" will have *just* gnome enabled.
- 						myflags.clear()
- 						continue
- 
- 					if x[0]=="+":
- 						# Not legal. People assume too much. Complain.
- 						writemsg(colorize("BAD",
- 							_("%s values should not start with a '+': %s") % (mykey,x)) \
- 							+ "\n", noiselevel=-1)
- 						x=x[1:]
- 						if not x:
- 							continue
- 
- 					if x[0] == "-":
- 						myflags.discard(x[1:])
- 						continue
- 
- 					# We got here, so add it now.
- 					myflags.add(x)
- 
- 			#store setting in last element of configlist, the original environment:
- 			if myflags or mykey in self:
- 				self.configlist[-1][mykey] = " ".join(sorted(myflags))
- 
- 		# Do the USE calculation last because it depends on USE_EXPAND.
- 		use_expand = self.get("USE_EXPAND", "").split()
- 		use_expand_dict = self._use_expand_dict
- 		use_expand_dict.clear()
- 		for k in use_expand:
- 			v = self.get(k)
- 			if v is not None:
- 				use_expand_dict[k] = v
- 
- 		use_expand_unprefixed = self.get("USE_EXPAND_UNPREFIXED", "").split()
- 
- 		# In order to best accomodate the long-standing practice of
- 		# setting default USE_EXPAND variables in the profile's
- 		# make.defaults, we translate these variables into their
- 		# equivalent USE flags so that useful incremental behavior
- 		# is enabled (for sub-profiles).
- 		configdict_defaults = self.configdict['defaults']
- 		if self._make_defaults is not None:
- 			for i, cfg in enumerate(self._make_defaults):
- 				if not cfg:
- 					self.make_defaults_use.append("")
- 					continue
- 				use = cfg.get("USE", "")
- 				expand_use = []
- 
- 				for k in use_expand_unprefixed:
- 					v = cfg.get(k)
- 					if v is not None:
- 						expand_use.extend(v.split())
- 
- 				for k in use_expand_dict:
- 					v = cfg.get(k)
- 					if v is None:
- 						continue
- 					prefix = k.lower() + '_'
- 					for x in v.split():
- 						if x[:1] == '-':
- 							expand_use.append('-' + prefix + x[1:])
- 						else:
- 							expand_use.append(prefix + x)
- 
- 				if expand_use:
- 					expand_use.append(use)
- 					use  = ' '.join(expand_use)
- 				self.make_defaults_use.append(use)
- 			self.make_defaults_use = tuple(self.make_defaults_use)
- 			# Preserve both positive and negative flags here, since
- 			# negative flags may later interact with other flags pulled
- 			# in via USE_ORDER.
- 			configdict_defaults['USE'] = ' '.join(
- 				filter(None, self.make_defaults_use))
- 			# Set to None so this code only runs once.
- 			self._make_defaults = None
- 
- 		if not self.uvlist:
- 			for x in self["USE_ORDER"].split(":"):
- 				if x in self.configdict:
- 					self.uvlist.append(self.configdict[x])
- 			self.uvlist.reverse()
- 
- 		# For optimal performance, use slice
- 		# comparison instead of startswith().
- 		iuse = self.configdict["pkg"].get("IUSE")
- 		if iuse is not None:
- 			iuse = [x.lstrip("+-") for x in iuse.split()]
- 		myflags = set()
- 		for curdb in self.uvlist:
- 
- 			for k in use_expand_unprefixed:
- 				v = curdb.get(k)
- 				if v is None:
- 					continue
- 				for x in v.split():
- 					if x[:1] == "-":
- 						myflags.discard(x[1:])
- 					else:
- 						myflags.add(x)
- 
- 			cur_use_expand = [x for x in use_expand if x in curdb]
- 			mysplit = curdb.get("USE", "").split()
- 			if not mysplit and not cur_use_expand:
- 				continue
- 			for x in mysplit:
- 				if x == "-*":
- 					myflags.clear()
- 					continue
- 
- 				if x[0] == "+":
- 					writemsg(colorize("BAD", _("USE flags should not start "
- 						"with a '+': %s\n") % x), noiselevel=-1)
- 					x = x[1:]
- 					if not x:
- 						continue
- 
- 				if x[0] == "-":
- 					if x[-2:] == '_*':
- 						prefix = x[1:-1]
- 						prefix_len = len(prefix)
- 						myflags.difference_update(
- 							[y for y in myflags if \
- 							y[:prefix_len] == prefix])
- 					myflags.discard(x[1:])
- 					continue
- 
- 				if iuse is not None and x[-2:] == '_*':
- 					# Expand wildcards here, so that cases like
- 					# USE="linguas_* -linguas_en_US" work correctly.
- 					prefix = x[:-1]
- 					prefix_len = len(prefix)
- 					has_iuse = False
- 					for y in iuse:
- 						if y[:prefix_len] == prefix:
- 							has_iuse = True
- 							myflags.add(y)
- 					if not has_iuse:
- 						# There are no matching IUSE, so allow the
- 						# wildcard to pass through. This allows
- 						# linguas_* to trigger unset LINGUAS in
- 						# cases when no linguas_ flags are in IUSE.
- 						myflags.add(x)
- 				else:
- 					myflags.add(x)
- 
- 			if curdb is configdict_defaults:
- 				# USE_EXPAND flags from make.defaults are handled
- 				# earlier, in order to provide useful incremental
- 				# behavior (for sub-profiles).
- 				continue
- 
- 			for var in cur_use_expand:
- 				var_lower = var.lower()
- 				is_not_incremental = var not in myincrementals
- 				if is_not_incremental:
- 					prefix = var_lower + "_"
- 					prefix_len = len(prefix)
- 					for x in list(myflags):
- 						if x[:prefix_len] == prefix:
- 							myflags.remove(x)
- 				for x in curdb[var].split():
- 					if x[0] == "+":
- 						if is_not_incremental:
- 							writemsg(colorize("BAD", _("Invalid '+' "
- 								"operator in non-incremental variable "
- 								 "'%s': '%s'\n") % (var, x)), noiselevel=-1)
- 							continue
- 						else:
- 							writemsg(colorize("BAD", _("Invalid '+' "
- 								"operator in incremental variable "
- 								 "'%s': '%s'\n") % (var, x)), noiselevel=-1)
- 						x = x[1:]
- 					if x[0] == "-":
- 						if is_not_incremental:
- 							writemsg(colorize("BAD", _("Invalid '-' "
- 								"operator in non-incremental variable "
- 								 "'%s': '%s'\n") % (var, x)), noiselevel=-1)
- 							continue
- 						myflags.discard(var_lower + "_" + x[1:])
- 						continue
- 					myflags.add(var_lower + "_" + x)
- 
- 		if hasattr(self, "features"):
- 			self.features._features.clear()
- 		else:
- 			self.features = features_set(self)
- 		self.features._features.update(self.get('FEATURES', '').split())
- 		self.features._sync_env_var()
- 		self.features._validate()
- 
- 		myflags.update(self.useforce)
- 		arch = self.configdict["defaults"].get("ARCH")
- 		if arch:
- 			myflags.add(arch)
- 
- 		myflags.difference_update(self.usemask)
- 		self.configlist[-1]["USE"]= " ".join(sorted(myflags))
- 
- 		if self.mycpv is None:
- 			# Generate global USE_EXPAND variables settings that are
- 			# consistent with USE, for display by emerge --info. For
- 			# package instances, these are instead generated via
- 			# setcpv().
- 			for k in use_expand:
- 				prefix = k.lower() + '_'
- 				prefix_len = len(prefix)
- 				expand_flags = set( x[prefix_len:] for x in myflags \
- 					if x[:prefix_len] == prefix )
- 				var_split = use_expand_dict.get(k, '').split()
- 				var_split = [ x for x in var_split if x in expand_flags ]
- 				var_split.extend(sorted(expand_flags.difference(var_split)))
- 				if var_split:
- 					self.configlist[-1][k] = ' '.join(var_split)
- 				elif k in self:
- 					self.configlist[-1][k] = ''
- 
- 			for k in use_expand_unprefixed:
- 				var_split = self.get(k, '').split()
- 				var_split = [ x for x in var_split if x in myflags ]
- 				if var_split:
- 					self.configlist[-1][k] = ' '.join(var_split)
- 				elif k in self:
- 					self.configlist[-1][k] = ''
- 
- 	@property
- 	def virts_p(self):
- 		warnings.warn("portage config.virts_p attribute " + \
- 			"is deprecated, use config.get_virts_p()",
- 			DeprecationWarning, stacklevel=2)
- 		return self.get_virts_p()
- 
- 	@property
- 	def virtuals(self):
- 		warnings.warn("portage config.virtuals attribute " + \
- 			"is deprecated, use config.getvirtuals()",
- 			DeprecationWarning, stacklevel=2)
- 		return self.getvirtuals()
- 
- 	def get_virts_p(self):
- 		# Ensure that we don't trigger the _treeVirtuals
- 		# assertion in VirtualsManager._compile_virtuals().
- 		self.getvirtuals()
- 		return self._virtuals_manager.get_virts_p()
- 
- 	def getvirtuals(self):
- 		if self._virtuals_manager._treeVirtuals is None:
- 			#Hack around the fact that VirtualsManager needs a vartree
- 			#and vartree needs a config instance.
- 			#This code should be part of VirtualsManager.getvirtuals().
- 			if self.local_config:
- 				temp_vartree = vartree(settings=self)
- 				self._virtuals_manager._populate_treeVirtuals(temp_vartree)
- 			else:
- 				self._virtuals_manager._treeVirtuals = {}
- 
- 		return self._virtuals_manager.getvirtuals()
- 
- 	def _populate_treeVirtuals_if_needed(self, vartree):
- 		"""Reduce the provides into a list by CP."""
- 		if self._virtuals_manager._treeVirtuals is None:
- 			if self.local_config:
- 				self._virtuals_manager._populate_treeVirtuals(vartree)
- 			else:
- 				self._virtuals_manager._treeVirtuals = {}
- 
- 	def __delitem__(self,mykey):
- 		self.pop(mykey)
- 
- 	def __getitem__(self, key):
- 		try:
- 			return self._getitem(key)
- 		except KeyError:
- 			if portage._internal_caller:
- 				stack = traceback.format_stack()[:-1] + traceback.format_exception(*sys.exc_info())[1:]
- 				try:
- 					# Ensure that output is written to terminal.
- 					with open("/dev/tty", "w") as f:
- 						f.write("=" * 96 + "\n")
- 						f.write("=" * 8 + " Traceback for invalid call to portage.package.ebuild.config.config.__getitem__ " + "=" * 8 + "\n")
- 						f.writelines(stack)
- 						f.write("=" * 96 + "\n")
- 				except Exception:
- 					pass
- 				raise
- 			else:
- 				warnings.warn(_("Passing nonexistent key %r to %s is deprecated. Use %s instead.") %
- 					(key, "portage.package.ebuild.config.config.__getitem__",
- 					"portage.package.ebuild.config.config.get"), DeprecationWarning, stacklevel=2)
- 				return ""
- 
- 	def _getitem(self, mykey):
- 
- 		if mykey in self._constant_keys:
- 			# These two point to temporary values when
- 			# portage plans to update itself.
- 			if mykey == "PORTAGE_BIN_PATH":
- 				return portage._bin_path
- 			if mykey == "PORTAGE_PYM_PATH":
- 				return portage._pym_path
- 
- 			if mykey == "PORTAGE_PYTHONPATH":
- 				value = [x for x in \
- 					self.backupenv.get("PYTHONPATH", "").split(":") if x]
- 				need_pym_path = True
- 				if value:
- 					try:
- 						need_pym_path = not os.path.samefile(value[0],
- 							portage._pym_path)
- 					except OSError:
- 						pass
- 				if need_pym_path:
- 					value.insert(0, portage._pym_path)
- 				return ":".join(value)
- 
- 			if mykey == "PORTAGE_GID":
- 				return "%s" % portage_gid
- 
- 		for d in self.lookuplist:
- 			try:
- 				return d[mykey]
- 			except KeyError:
- 				pass
- 
- 		deprecated_key = self._deprecated_keys.get(mykey)
- 		if deprecated_key is not None:
- 			value = self._getitem(deprecated_key)
- 			#warnings.warn(_("Key %s has been renamed to %s. Please ",
- 			#	"update your configuration") % (deprecated_key, mykey),
- 			#	UserWarning)
- 			return value
- 
- 		raise KeyError(mykey)
- 
- 	def get(self, k, x=None):
- 		try:
- 			return self._getitem(k)
- 		except KeyError:
- 			return x
- 
- 	def pop(self, key, *args):
- 		self.modifying()
- 		if len(args) > 1:
- 			raise TypeError(
- 				"pop expected at most 2 arguments, got " + \
- 				repr(1 + len(args)))
- 		v = self
- 		for d in reversed(self.lookuplist):
- 			v = d.pop(key, v)
- 		if v is self:
- 			if args:
- 				return args[0]
- 			raise KeyError(key)
- 		return v
- 
- 	def __contains__(self, mykey):
- 		"""Called to implement membership test operators (in and not in)."""
- 		try:
- 			self._getitem(mykey)
- 		except KeyError:
- 			return False
- 		else:
- 			return True
- 
- 	def setdefault(self, k, x=None):
- 		v = self.get(k)
- 		if v is not None:
- 			return v
- 		self[k] = x
- 		return x
- 
- 	def __iter__(self):
- 		keys = set()
- 		keys.update(self._constant_keys)
- 		for d in self.lookuplist:
- 			keys.update(d)
- 		return iter(keys)
- 
- 	def iterkeys(self):
- 		return iter(self)
- 
- 	def iteritems(self):
- 		for k in self:
- 			yield (k, self._getitem(k))
- 
- 	def __setitem__(self,mykey,myvalue):
- 		"set a value; will be thrown away at reset() time"
- 		if not isinstance(myvalue, str):
- 			raise ValueError("Invalid type being used as a value: '%s': '%s'" % (str(mykey),str(myvalue)))
- 
- 		# Avoid potential UnicodeDecodeError exceptions later.
- 		mykey = _unicode_decode(mykey)
- 		myvalue = _unicode_decode(myvalue)
- 
- 		self.modifying()
- 		self.modifiedkeys.append(mykey)
- 		self.configdict["env"][mykey]=myvalue
- 
- 	def environ(self):
- 		"return our locally-maintained environment"
- 		mydict={}
- 		environ_filter = self._environ_filter
- 
- 		eapi = self.get('EAPI')
- 		eapi_attrs = _get_eapi_attrs(eapi)
- 		phase = self.get('EBUILD_PHASE')
- 		emerge_from = self.get('EMERGE_FROM')
- 		filter_calling_env = False
- 		if self.mycpv is not None and \
- 			not (emerge_from == 'ebuild' and phase == 'setup') and \
- 			phase not in ('clean', 'cleanrm', 'depend', 'fetch'):
- 			temp_dir = self.get('T')
- 			if temp_dir is not None and \
- 				os.path.exists(os.path.join(temp_dir, 'environment')):
- 				filter_calling_env = True
- 
- 		environ_whitelist = self._environ_whitelist
- 		for x, myvalue in self.iteritems():
- 			if x in environ_filter:
- 				continue
- 			if not isinstance(myvalue, str):
- 				writemsg(_("!!! Non-string value in config: %s=%s\n") % \
- 					(x, myvalue), noiselevel=-1)
- 				continue
- 			if filter_calling_env and \
- 				x not in environ_whitelist and \
- 				not self._environ_whitelist_re.match(x):
- 				# Do not allow anything to leak into the ebuild
- 				# environment unless it is explicitly whitelisted.
- 				# This ensures that variables unset by the ebuild
- 				# remain unset (bug #189417).
- 				continue
- 			mydict[x] = myvalue
- 		if "HOME" not in mydict and "BUILD_PREFIX" in mydict:
- 			writemsg("*** HOME not set. Setting to "+mydict["BUILD_PREFIX"]+"\n")
- 			mydict["HOME"]=mydict["BUILD_PREFIX"][:]
- 
- 		if filter_calling_env:
- 			if phase:
- 				whitelist = []
- 				if "rpm" == phase:
- 					whitelist.append("RPMDIR")
- 				for k in whitelist:
- 					v = self.get(k)
- 					if v is not None:
- 						mydict[k] = v
- 
- 		# At some point we may want to stop exporting FEATURES to the ebuild
- 		# environment, in order to prevent ebuilds from abusing it. In
- 		# preparation for that, export it as PORTAGE_FEATURES so that bashrc
- 		# users will be able to migrate any FEATURES conditional code to
- 		# use this alternative variable.
- 		mydict["PORTAGE_FEATURES"] = self["FEATURES"]
- 
- 		# Filtered by IUSE and implicit IUSE.
- 		mydict["USE"] = self.get("PORTAGE_USE", "")
- 
- 		# Don't export AA to the ebuild environment in EAPIs that forbid it
- 		if not eapi_exports_AA(eapi):
- 			mydict.pop("AA", None)
- 
- 		if not eapi_exports_merge_type(eapi):
- 			mydict.pop("MERGE_TYPE", None)
- 
- 		src_like_phase = (phase == 'setup' or
- 				_phase_func_map.get(phase, '').startswith('src_'))
- 
- 		if not (src_like_phase and eapi_attrs.sysroot):
- 			mydict.pop("ESYSROOT", None)
- 
- 		if not (src_like_phase and eapi_attrs.broot):
- 			mydict.pop("BROOT", None)
- 
- 		# 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
- 		# the prefix branch of portage, which also supports EPREFIX for all
- 		# EAPIs (for obvious reasons).
- 		if phase == 'depend' or \
- 			('force-prefix' not in self.features and
- 			eapi is not None and not eapi_supports_prefix(eapi)):
- 			mydict.pop("ED", None)
- 			mydict.pop("EPREFIX", None)
- 			mydict.pop("EROOT", None)
- 			mydict.pop("ESYSROOT", None)
- 
- 		if phase not in ("pretend", "setup", "preinst", "postinst") or \
- 			not eapi_exports_replace_vars(eapi):
- 			mydict.pop("REPLACING_VERSIONS", None)
- 
- 		if phase not in ("prerm", "postrm") or \
- 			not eapi_exports_replace_vars(eapi):
- 			mydict.pop("REPLACED_BY_VERSION", None)
- 
- 		if phase is not None and eapi_attrs.exports_EBUILD_PHASE_FUNC:
- 			phase_func = _phase_func_map.get(phase)
- 			if phase_func is not None:
- 				mydict["EBUILD_PHASE_FUNC"] = phase_func
- 
- 		if eapi_attrs.posixish_locale:
- 			split_LC_ALL(mydict)
- 			mydict["LC_COLLATE"] = "C"
- 			# check_locale() returns None when check can not be executed.
- 			if check_locale(silent=True, env=mydict) is False:
- 				# try another locale
- 				for l in ("C.UTF-8", "en_US.UTF-8", "en_GB.UTF-8", "C"):
- 					mydict["LC_CTYPE"] = l
- 					if check_locale(silent=True, env=mydict):
- 						# TODO: output the following only once
- #						writemsg(_("!!! LC_CTYPE unsupported, using %s instead\n")
- #								% mydict["LC_CTYPE"])
- 						break
- 				else:
- 					raise AssertionError("C locale did not pass the test!")
- 
- 		if not eapi_attrs.exports_PORTDIR:
- 			mydict.pop("PORTDIR", None)
- 		if not eapi_attrs.exports_ECLASSDIR:
- 			mydict.pop("ECLASSDIR", None)
- 
- 		if not eapi_attrs.path_variables_end_with_trailing_slash:
- 			for v in ("D", "ED", "ROOT", "EROOT", "ESYSROOT", "BROOT"):
- 				if v in mydict:
- 					mydict[v] = mydict[v].rstrip(os.path.sep)
- 
- 		# Since SYSROOT=/ interacts badly with autotools.eclass (bug 654600),
- 		# and no EAPI expects SYSROOT to have a trailing slash, always strip
- 		# the trailing slash from SYSROOT.
- 		if 'SYSROOT' in mydict:
- 			mydict['SYSROOT'] = mydict['SYSROOT'].rstrip(os.sep)
- 
- 		try:
- 			builddir = mydict["PORTAGE_BUILDDIR"]
- 			distdir = mydict["DISTDIR"]
- 		except KeyError:
- 			pass
- 		else:
- 			mydict["PORTAGE_ACTUAL_DISTDIR"] = distdir
- 			mydict["DISTDIR"] = os.path.join(builddir, "distdir")
- 
- 		return mydict
- 
- 	def thirdpartymirrors(self):
- 		if getattr(self, "_thirdpartymirrors", None) is None:
- 			thirdparty_lists = []
- 			for repo_name in reversed(self.repositories.prepos_order):
- 				thirdparty_lists.append(grabdict(os.path.join(
- 					self.repositories[repo_name].location,
- 					"profiles", "thirdpartymirrors")))
- 			self._thirdpartymirrors = stack_dictlist(thirdparty_lists, incremental=True)
- 		return self._thirdpartymirrors
- 
- 	def archlist(self):
- 		_archlist = []
- 		for myarch in self["PORTAGE_ARCHLIST"].split():
- 			_archlist.append(myarch)
- 			_archlist.append("~" + myarch)
- 		return _archlist
- 
- 	def selinux_enabled(self):
- 		if getattr(self, "_selinux_enabled", None) is None:
- 			self._selinux_enabled = 0
- 			if "selinux" in self["USE"].split():
- 				if selinux:
- 					if selinux.is_selinux_enabled() == 1:
- 						self._selinux_enabled = 1
- 					else:
- 						self._selinux_enabled = 0
- 				else:
- 					writemsg(_("!!! SELinux module not found. Please verify that it was installed.\n"),
- 						noiselevel=-1)
- 					self._selinux_enabled = 0
- 
- 		return self._selinux_enabled
- 
- 	keys = __iter__
- 	items = iteritems
+         return iuse_implicit
+ 
+     def _getUseMask(self, pkg, stable=None):
+         return self._use_manager.getUseMask(pkg, stable=stable)
+ 
+     def _getUseForce(self, pkg, stable=None):
+         return self._use_manager.getUseForce(pkg, stable=stable)
+ 
+     def _getMaskAtom(self, cpv, metadata):
+         """
+         Take a package and return a matching package.mask atom, or None if no
+         such atom exists or it has been cancelled by package.unmask.
+ 
+         @param cpv: The package name
+         @type cpv: String
+         @param metadata: A dictionary of raw package metadata
+         @type metadata: dict
+         @rtype: String
+         @return: A matching atom string or None if one is not found.
+         """
+         return self._mask_manager.getMaskAtom(
+             cpv, metadata["SLOT"], metadata.get("repository")
+         )
+ 
+     def _getRawMaskAtom(self, cpv, metadata):
+         """
+         Take a package and return a matching package.mask atom, or None if no
+         such atom exists or it has been cancelled by package.unmask.
+ 
+         @param cpv: The package name
+         @type cpv: String
+         @param metadata: A dictionary of raw package metadata
+         @type metadata: dict
+         @rtype: String
+         @return: A matching atom string or None if one is not found.
+         """
+         return self._mask_manager.getRawMaskAtom(
+             cpv, metadata["SLOT"], metadata.get("repository")
+         )
+ 
+     def _getProfileMaskAtom(self, cpv, metadata):
+         """
+         Take a package and return a matching profile atom, or None if no
+         such atom exists. Note that a profile atom may or may not have a "*"
+         prefix.
+ 
+         @param cpv: The package name
+         @type cpv: String
+         @param metadata: A dictionary of raw package metadata
+         @type metadata: dict
+         @rtype: String
+         @return: A matching profile atom string or None if one is not found.
+         """
+ 
+         warnings.warn(
+             "The config._getProfileMaskAtom() method is deprecated.",
+             DeprecationWarning,
+             stacklevel=2,
+         )
+ 
+         cp = cpv_getkey(cpv)
+         profile_atoms = self.prevmaskdict.get(cp)
+         if profile_atoms:
+             pkg = "".join((cpv, _slot_separator, metadata["SLOT"]))
+             repo = metadata.get("repository")
+             if repo and repo != Package.UNKNOWN_REPO:
+                 pkg = "".join((pkg, _repo_separator, repo))
+             pkg_list = [pkg]
+             for x in profile_atoms:
+                 if match_from_list(x, pkg_list):
+                     continue
+                 return x
+         return None
+ 
+     def _isStable(self, pkg):
+         return self._keywords_manager.isStable(
+             pkg,
+             self.get("ACCEPT_KEYWORDS", ""),
+             self.configdict["backupenv"].get("ACCEPT_KEYWORDS", ""),
+         )
+ 
+     def _getKeywords(self, cpv, metadata):
+         return self._keywords_manager.getKeywords(
+             cpv,
+             metadata["SLOT"],
+             metadata.get("KEYWORDS", ""),
+             metadata.get("repository"),
+         )
+ 
+     def _getMissingKeywords(self, cpv, metadata):
+         """
+         Take a package and return a list of any KEYWORDS that the user may
+         need to accept for the given package. If the KEYWORDS are empty
+         and the ** keyword has not been accepted, the returned list will
+         contain ** alone (in order to distinguish from the case of "none
+         missing").
+ 
+         @param cpv: The package name (for package.keywords support)
+         @type cpv: String
+         @param metadata: A dictionary of raw package metadata
+         @type metadata: dict
+         @rtype: List
+         @return: A list of KEYWORDS that have not been accepted.
+         """
+ 
+         # Hack: Need to check the env directly here as otherwise stacking
+         # doesn't work properly as negative values are lost in the config
+         # object (bug #139600)
+         backuped_accept_keywords = self.configdict["backupenv"].get(
+             "ACCEPT_KEYWORDS", ""
+         )
+         global_accept_keywords = self.get("ACCEPT_KEYWORDS", "")
+ 
+         return self._keywords_manager.getMissingKeywords(
+             cpv,
+             metadata["SLOT"],
+             metadata.get("KEYWORDS", ""),
+             metadata.get("repository"),
+             global_accept_keywords,
+             backuped_accept_keywords,
+         )
+ 
+     def _getRawMissingKeywords(self, cpv, metadata):
+         """
+         Take a package and return a list of any KEYWORDS that the user may
+         need to accept for the given package. If the KEYWORDS are empty,
+         the returned list will contain ** alone (in order to distinguish
+         from the case of "none missing").  This DOES NOT apply any user config
+         package.accept_keywords acceptance.
+ 
+         @param cpv: The package name (for package.keywords support)
+         @type cpv: String
+         @param metadata: A dictionary of raw package metadata
+         @type metadata: dict
+         @rtype: List
+         @return: lists of KEYWORDS that have not been accepted
+         and the keywords it looked for.
+         """
+         return self._keywords_manager.getRawMissingKeywords(
+             cpv,
+             metadata["SLOT"],
+             metadata.get("KEYWORDS", ""),
+             metadata.get("repository"),
+             self.get("ACCEPT_KEYWORDS", ""),
+         )
+ 
+     def _getPKeywords(self, cpv, metadata):
+         global_accept_keywords = self.get("ACCEPT_KEYWORDS", "")
+ 
+         return self._keywords_manager.getPKeywords(
+             cpv, metadata["SLOT"], metadata.get("repository"), global_accept_keywords
+         )
+ 
+     def _getMissingLicenses(self, cpv, metadata):
+         """
+         Take a LICENSE string and return a list of any licenses that the user
+         may need to accept for the given package.  The returned list will not
+         contain any licenses that have already been accepted.  This method
+         can throw an InvalidDependString exception.
+ 
+         @param cpv: The package name (for package.license support)
+         @type cpv: String
+         @param metadata: A dictionary of raw package metadata
+         @type metadata: dict
+         @rtype: List
+         @return: A list of licenses that have not been accepted.
+         """
+         return self._license_manager.getMissingLicenses(
+             cpv,
+             metadata["USE"],
+             metadata["LICENSE"],
+             metadata["SLOT"],
+             metadata.get("repository"),
+         )
+ 
+     def _getMissingProperties(self, cpv, metadata):
+         """
+         Take a PROPERTIES string and return a list of any properties the user
+         may need to accept for the given package.  The returned list will not
+         contain any properties that have already been accepted.  This method
+         can throw an InvalidDependString exception.
+ 
+         @param cpv: The package name (for package.properties support)
+         @type cpv: String
+         @param metadata: A dictionary of raw package metadata
+         @type metadata: dict
+         @rtype: List
+         @return: A list of properties that have not been accepted.
+         """
+         accept_properties = self._accept_properties
+         try:
+             cpv.slot
+         except AttributeError:
+             cpv = _pkg_str(cpv, metadata=metadata, settings=self)
+         cp = cpv_getkey(cpv)
+         cpdict = self._ppropertiesdict.get(cp)
+         if cpdict:
+             pproperties_list = ordered_by_atom_specificity(cpdict, cpv)
+             if pproperties_list:
+                 accept_properties = list(self._accept_properties)
+                 for x in pproperties_list:
+                     accept_properties.extend(x)
+ 
+         properties_str = metadata.get("PROPERTIES", "")
+         properties = set(use_reduce(properties_str, matchall=1, flat=True))
+ 
+         acceptable_properties = set()
+         for x in accept_properties:
+             if x == "*":
+                 acceptable_properties.update(properties)
+             elif x == "-*":
+                 acceptable_properties.clear()
+             elif x[:1] == "-":
+                 acceptable_properties.discard(x[1:])
+             else:
+                 acceptable_properties.add(x)
+ 
+         if "?" in properties_str:
+             use = metadata["USE"].split()
+         else:
+             use = []
+ 
+         return [
+             x
+             for x in use_reduce(properties_str, uselist=use, flat=True)
+             if x not in acceptable_properties
+         ]
+ 
+     def _getMissingRestrict(self, cpv, metadata):
+         """
+         Take a RESTRICT string and return a list of any tokens the user
+         may need to accept for the given package.  The returned list will not
+         contain any tokens that have already been accepted.  This method
+         can throw an InvalidDependString exception.
+ 
+         @param cpv: The package name (for package.accept_restrict support)
+         @type cpv: String
+         @param metadata: A dictionary of raw package metadata
+         @type metadata: dict
+         @rtype: List
+         @return: A list of tokens that have not been accepted.
+         """
+         accept_restrict = self._accept_restrict
+         try:
+             cpv.slot
+         except AttributeError:
+             cpv = _pkg_str(cpv, metadata=metadata, settings=self)
+         cp = cpv_getkey(cpv)
+         cpdict = self._paccept_restrict.get(cp)
+         if cpdict:
+             paccept_restrict_list = ordered_by_atom_specificity(cpdict, cpv)
+             if paccept_restrict_list:
+                 accept_restrict = list(self._accept_restrict)
+                 for x in paccept_restrict_list:
+                     accept_restrict.extend(x)
+ 
+         restrict_str = metadata.get("RESTRICT", "")
+         all_restricts = set(use_reduce(restrict_str, matchall=1, flat=True))
+ 
+         acceptable_restricts = set()
+         for x in accept_restrict:
+             if x == "*":
+                 acceptable_restricts.update(all_restricts)
+             elif x == "-*":
+                 acceptable_restricts.clear()
+             elif x[:1] == "-":
+                 acceptable_restricts.discard(x[1:])
+             else:
+                 acceptable_restricts.add(x)
+ 
+         if "?" in restrict_str:
+             use = metadata["USE"].split()
+         else:
+             use = []
+ 
+         return [
+             x
+             for x in use_reduce(restrict_str, uselist=use, flat=True)
+             if x not in acceptable_restricts
+         ]
+ 
+     def _accept_chost(self, cpv, metadata):
+         """
+         @return True if pkg CHOST is accepted, False otherwise.
+         """
+         if self._accept_chost_re is None:
+             accept_chost = self.get("ACCEPT_CHOSTS", "").split()
+             if not accept_chost:
+                 chost = self.get("CHOST")
+                 if chost:
+                     accept_chost.append(chost)
+             if not accept_chost:
+                 self._accept_chost_re = re.compile(".*")
+             elif len(accept_chost) == 1:
+                 try:
+                     self._accept_chost_re = re.compile(r"^%s$" % accept_chost[0])
+                 except re.error as e:
+                     writemsg(
+                         _("!!! Invalid ACCEPT_CHOSTS value: '%s': %s\n")
+                         % (accept_chost[0], e),
+                         noiselevel=-1,
+                     )
+                     self._accept_chost_re = re.compile("^$")
+             else:
+                 try:
+                     self._accept_chost_re = re.compile(
+                         r"^(%s)$" % "|".join(accept_chost)
+                     )
+                 except re.error as e:
+                     writemsg(
+                         _("!!! Invalid ACCEPT_CHOSTS value: '%s': %s\n")
+                         % (" ".join(accept_chost), e),
+                         noiselevel=-1,
+                     )
+                     self._accept_chost_re = re.compile("^$")
+ 
+         pkg_chost = metadata.get("CHOST", "")
+         return not pkg_chost or self._accept_chost_re.match(pkg_chost) is not None
+ 
+     def setinst(self, mycpv, mydbapi):
+         """This used to update the preferences for old-style virtuals.
+         It is no-op now."""
+         pass
+ 
+     def reload(self):
+         """Reload things like /etc/profile.env that can change during runtime."""
+         env_d_filename = os.path.join(self["EROOT"], "etc", "profile.env")
+         self.configdict["env.d"].clear()
+         env_d = getconfig(env_d_filename, tolerant=self._tolerant, expand=False)
+         if env_d:
+             # env_d will be None if profile.env doesn't exist.
+             for k in self._env_d_blacklist:
+                 env_d.pop(k, None)
+             self.configdict["env.d"].update(env_d)
+ 
+     def regenerate(self, useonly=0, use_cache=None):
+         """
+         Regenerate settings
+         This involves regenerating valid USE flags, re-expanding USE_EXPAND flags
+         re-stacking USE flags (-flag and -*), as well as any other INCREMENTAL
+         variables.  This also updates the env.d configdict; useful in case an ebuild
+         changes the environment.
+ 
+         If FEATURES has already stacked, it is not stacked twice.
+ 
+         @param useonly: Only regenerate USE flags (not any other incrementals)
+         @type useonly: Boolean
+         @rtype: None
+         """
+ 
+         if use_cache is not None:
+             warnings.warn(
+                 "The use_cache parameter for config.regenerate() is deprecated and without effect.",
+                 DeprecationWarning,
+                 stacklevel=2,
+             )
+ 
+         self.modifying()
+ 
+         if useonly:
+             myincrementals = ["USE"]
+         else:
+             myincrementals = self.incrementals
+         myincrementals = set(myincrementals)
+ 
+         # Process USE last because it depends on USE_EXPAND which is also
+         # an incremental!
+         myincrementals.discard("USE")
+ 
+         mydbs = self.configlist[:-1]
+         mydbs.append(self.backupenv)
+ 
+         # ACCEPT_LICENSE is a lazily evaluated incremental, so that * can be
+         # used to match all licenses without every having to explicitly expand
+         # it to all licenses.
+         if self.local_config:
+             mysplit = []
+             for curdb in mydbs:
+                 mysplit.extend(curdb.get("ACCEPT_LICENSE", "").split())
+             mysplit = prune_incremental(mysplit)
+             accept_license_str = " ".join(mysplit) or "* -@EULA"
+             self.configlist[-1]["ACCEPT_LICENSE"] = accept_license_str
+             self._license_manager.set_accept_license_str(accept_license_str)
+         else:
+             # repoman will accept any license
+             self._license_manager.set_accept_license_str("*")
+ 
+         # ACCEPT_PROPERTIES works like ACCEPT_LICENSE, without groups
+         if self.local_config:
+             mysplit = []
+             for curdb in mydbs:
+                 mysplit.extend(curdb.get("ACCEPT_PROPERTIES", "").split())
+             mysplit = prune_incremental(mysplit)
+             self.configlist[-1]["ACCEPT_PROPERTIES"] = " ".join(mysplit)
+             if tuple(mysplit) != self._accept_properties:
+                 self._accept_properties = tuple(mysplit)
+         else:
+             # repoman will accept any property
+             self._accept_properties = ("*",)
+ 
+         if self.local_config:
+             mysplit = []
+             for curdb in mydbs:
+                 mysplit.extend(curdb.get("ACCEPT_RESTRICT", "").split())
+             mysplit = prune_incremental(mysplit)
+             self.configlist[-1]["ACCEPT_RESTRICT"] = " ".join(mysplit)
+             if tuple(mysplit) != self._accept_restrict:
+                 self._accept_restrict = tuple(mysplit)
+         else:
+             # repoman will accept any property
+             self._accept_restrict = ("*",)
+ 
+         increment_lists = {}
+         for k in myincrementals:
+             incremental_list = []
+             increment_lists[k] = incremental_list
+             for curdb in mydbs:
+                 v = curdb.get(k)
+                 if v is not None:
+                     incremental_list.append(v.split())
+ 
+         if "FEATURES" in increment_lists:
+             increment_lists["FEATURES"].append(self._features_overrides)
+ 
+         myflags = set()
+         for mykey, incremental_list in increment_lists.items():
+ 
+             myflags.clear()
+             for mysplit in incremental_list:
+ 
+                 for x in mysplit:
+                     if x == "-*":
+                         # "-*" is a special "minus" var that means "unset all settings".
+                         # so USE="-* gnome" will have *just* gnome enabled.
+                         myflags.clear()
+                         continue
+ 
+                     if x[0] == "+":
+                         # Not legal. People assume too much. Complain.
+                         writemsg(
+                             colorize(
+                                 "BAD",
+                                 _("%s values should not start with a '+': %s")
+                                 % (mykey, x),
+                             )
+                             + "\n",
+                             noiselevel=-1,
+                         )
+                         x = x[1:]
+                         if not x:
+                             continue
+ 
+                     if x[0] == "-":
+                         myflags.discard(x[1:])
+                         continue
+ 
+                     # We got here, so add it now.
+                     myflags.add(x)
+ 
+             # store setting in last element of configlist, the original environment:
+             if myflags or mykey in self:
+                 self.configlist[-1][mykey] = " ".join(sorted(myflags))
+ 
+         # Do the USE calculation last because it depends on USE_EXPAND.
+         use_expand = self.get("USE_EXPAND", "").split()
+         use_expand_dict = self._use_expand_dict
+         use_expand_dict.clear()
+         for k in use_expand:
+             v = self.get(k)
+             if v is not None:
+                 use_expand_dict[k] = v
+ 
+         use_expand_unprefixed = self.get("USE_EXPAND_UNPREFIXED", "").split()
+ 
+         # In order to best accomodate the long-standing practice of
+         # setting default USE_EXPAND variables in the profile's
+         # make.defaults, we translate these variables into their
+         # equivalent USE flags so that useful incremental behavior
+         # is enabled (for sub-profiles).
+         configdict_defaults = self.configdict["defaults"]
+         if self._make_defaults is not None:
+             for i, cfg in enumerate(self._make_defaults):
+                 if not cfg:
+                     self.make_defaults_use.append("")
+                     continue
+                 use = cfg.get("USE", "")
+                 expand_use = []
+ 
+                 for k in use_expand_unprefixed:
+                     v = cfg.get(k)
+                     if v is not None:
+                         expand_use.extend(v.split())
+ 
+                 for k in use_expand_dict:
+                     v = cfg.get(k)
+                     if v is None:
+                         continue
+                     prefix = k.lower() + "_"
+                     for x in v.split():
+                         if x[:1] == "-":
+                             expand_use.append("-" + prefix + x[1:])
+                         else:
+                             expand_use.append(prefix + x)
+ 
+                 if expand_use:
+                     expand_use.append(use)
+                     use = " ".join(expand_use)
+                 self.make_defaults_use.append(use)
+             self.make_defaults_use = tuple(self.make_defaults_use)
+             # Preserve both positive and negative flags here, since
+             # negative flags may later interact with other flags pulled
+             # in via USE_ORDER.
+             configdict_defaults["USE"] = " ".join(filter(None, self.make_defaults_use))
+             # Set to None so this code only runs once.
+             self._make_defaults = None
+ 
+         if not self.uvlist:
+             for x in self["USE_ORDER"].split(":"):
+                 if x in self.configdict:
+                     self.uvlist.append(self.configdict[x])
+             self.uvlist.reverse()
+ 
+         # For optimal performance, use slice
+         # comparison instead of startswith().
+         iuse = self.configdict["pkg"].get("IUSE")
+         if iuse is not None:
+             iuse = [x.lstrip("+-") for x in iuse.split()]
+         myflags = set()
+         for curdb in self.uvlist:
+ 
+             for k in use_expand_unprefixed:
+                 v = curdb.get(k)
+                 if v is None:
+                     continue
+                 for x in v.split():
+                     if x[:1] == "-":
+                         myflags.discard(x[1:])
+                     else:
+                         myflags.add(x)
+ 
+             cur_use_expand = [x for x in use_expand if x in curdb]
+             mysplit = curdb.get("USE", "").split()
+             if not mysplit and not cur_use_expand:
+                 continue
+             for x in mysplit:
+                 if x == "-*":
+                     myflags.clear()
+                     continue
+ 
+                 if x[0] == "+":
+                     writemsg(
+                         colorize(
+                             "BAD",
+                             _("USE flags should not start " "with a '+': %s\n") % x,
+                         ),
+                         noiselevel=-1,
+                     )
+                     x = x[1:]
+                     if not x:
+                         continue
+ 
+                 if x[0] == "-":
+                     if x[-2:] == "_*":
+                         prefix = x[1:-1]
+                         prefix_len = len(prefix)
+                         myflags.difference_update(
+                             [y for y in myflags if y[:prefix_len] == prefix]
+                         )
+                     myflags.discard(x[1:])
+                     continue
+ 
+                 if iuse is not None and x[-2:] == "_*":
+                     # Expand wildcards here, so that cases like
+                     # USE="linguas_* -linguas_en_US" work correctly.
+                     prefix = x[:-1]
+                     prefix_len = len(prefix)
+                     has_iuse = False
+                     for y in iuse:
+                         if y[:prefix_len] == prefix:
+                             has_iuse = True
+                             myflags.add(y)
+                     if not has_iuse:
+                         # There are no matching IUSE, so allow the
+                         # wildcard to pass through. This allows
+                         # linguas_* to trigger unset LINGUAS in
+                         # cases when no linguas_ flags are in IUSE.
+                         myflags.add(x)
+                 else:
+                     myflags.add(x)
+ 
+             if curdb is configdict_defaults:
+                 # USE_EXPAND flags from make.defaults are handled
+                 # earlier, in order to provide useful incremental
+                 # behavior (for sub-profiles).
+                 continue
+ 
+             for var in cur_use_expand:
+                 var_lower = var.lower()
+                 is_not_incremental = var not in myincrementals
+                 if is_not_incremental:
+                     prefix = var_lower + "_"
+                     prefix_len = len(prefix)
+                     for x in list(myflags):
+                         if x[:prefix_len] == prefix:
+                             myflags.remove(x)
+                 for x in curdb[var].split():
+                     if x[0] == "+":
+                         if is_not_incremental:
+                             writemsg(
+                                 colorize(
+                                     "BAD",
+                                     _(
+                                         "Invalid '+' "
+                                         "operator in non-incremental variable "
+                                         "'%s': '%s'\n"
+                                     )
+                                     % (var, x),
+                                 ),
+                                 noiselevel=-1,
+                             )
+                             continue
+                         else:
+                             writemsg(
+                                 colorize(
+                                     "BAD",
+                                     _(
+                                         "Invalid '+' "
+                                         "operator in incremental variable "
+                                         "'%s': '%s'\n"
+                                     )
+                                     % (var, x),
+                                 ),
+                                 noiselevel=-1,
+                             )
+                         x = x[1:]
+                     if x[0] == "-":
+                         if is_not_incremental:
+                             writemsg(
+                                 colorize(
+                                     "BAD",
+                                     _(
+                                         "Invalid '-' "
+                                         "operator in non-incremental variable "
+                                         "'%s': '%s'\n"
+                                     )
+                                     % (var, x),
+                                 ),
+                                 noiselevel=-1,
+                             )
+                             continue
+                         myflags.discard(var_lower + "_" + x[1:])
+                         continue
+                     myflags.add(var_lower + "_" + x)
+ 
+         if hasattr(self, "features"):
+             self.features._features.clear()
+         else:
+             self.features = features_set(self)
+         self.features._features.update(self.get("FEATURES", "").split())
+         self.features._sync_env_var()
+         self.features._validate()
+ 
+         myflags.update(self.useforce)
+         arch = self.configdict["defaults"].get("ARCH")
+         if arch:
+             myflags.add(arch)
+ 
+         myflags.difference_update(self.usemask)
+         self.configlist[-1]["USE"] = " ".join(sorted(myflags))
+ 
+         if self.mycpv is None:
+             # Generate global USE_EXPAND variables settings that are
+             # consistent with USE, for display by emerge --info. For
+             # package instances, these are instead generated via
+             # setcpv().
+             for k in use_expand:
+                 prefix = k.lower() + "_"
+                 prefix_len = len(prefix)
+                 expand_flags = set(
+                     x[prefix_len:] for x in myflags if x[:prefix_len] == prefix
+                 )
+                 var_split = use_expand_dict.get(k, "").split()
+                 var_split = [x for x in var_split if x in expand_flags]
+                 var_split.extend(sorted(expand_flags.difference(var_split)))
+                 if var_split:
+                     self.configlist[-1][k] = " ".join(var_split)
+                 elif k in self:
+                     self.configlist[-1][k] = ""
+ 
+             for k in use_expand_unprefixed:
+                 var_split = self.get(k, "").split()
+                 var_split = [x for x in var_split if x in myflags]
+                 if var_split:
+                     self.configlist[-1][k] = " ".join(var_split)
+                 elif k in self:
+                     self.configlist[-1][k] = ""
+ 
+     @property
+     def virts_p(self):
+         warnings.warn(
+             "portage config.virts_p attribute "
+             + "is deprecated, use config.get_virts_p()",
+             DeprecationWarning,
+             stacklevel=2,
+         )
+         return self.get_virts_p()
+ 
+     @property
+     def virtuals(self):
+         warnings.warn(
+             "portage config.virtuals attribute "
+             + "is deprecated, use config.getvirtuals()",
+             DeprecationWarning,
+             stacklevel=2,
+         )
+         return self.getvirtuals()
+ 
+     def get_virts_p(self):
+         # Ensure that we don't trigger the _treeVirtuals
+         # assertion in VirtualsManager._compile_virtuals().
+         self.getvirtuals()
+         return self._virtuals_manager.get_virts_p()
+ 
+     def getvirtuals(self):
+         if self._virtuals_manager._treeVirtuals is None:
+             # Hack around the fact that VirtualsManager needs a vartree
+             # and vartree needs a config instance.
+             # This code should be part of VirtualsManager.getvirtuals().
+             if self.local_config:
+                 temp_vartree = vartree(settings=self)
+                 self._virtuals_manager._populate_treeVirtuals(temp_vartree)
+             else:
+                 self._virtuals_manager._treeVirtuals = {}
+ 
+         return self._virtuals_manager.getvirtuals()
+ 
+     def _populate_treeVirtuals_if_needed(self, vartree):
+         """Reduce the provides into a list by CP."""
+         if self._virtuals_manager._treeVirtuals is None:
+             if self.local_config:
+                 self._virtuals_manager._populate_treeVirtuals(vartree)
+             else:
+                 self._virtuals_manager._treeVirtuals = {}
+ 
+     def __delitem__(self, mykey):
+         self.pop(mykey)
+ 
+     def __getitem__(self, key):
+         try:
+             return self._getitem(key)
+         except KeyError:
+             if portage._internal_caller:
+                 stack = (
+                     traceback.format_stack()[:-1]
+                     + traceback.format_exception(*sys.exc_info())[1:]
+                 )
+                 try:
+                     # Ensure that output is written to terminal.
+                     with open("/dev/tty", "w") as f:
+                         f.write("=" * 96 + "\n")
+                         f.write(
+                             "=" * 8
+                             + " Traceback for invalid call to portage.package.ebuild.config.config.__getitem__ "
+                             + "=" * 8
+                             + "\n"
+                         )
+                         f.writelines(stack)
+                         f.write("=" * 96 + "\n")
+                 except Exception:
+                     pass
+                 raise
+             else:
+                 warnings.warn(
+                     _("Passing nonexistent key %r to %s is deprecated. Use %s instead.")
+                     % (
+                         key,
+                         "portage.package.ebuild.config.config.__getitem__",
+                         "portage.package.ebuild.config.config.get",
+                     ),
+                     DeprecationWarning,
+                     stacklevel=2,
+                 )
+                 return ""
+ 
+     def _getitem(self, mykey):
+ 
+         if mykey in self._constant_keys:
+             # These two point to temporary values when
+             # portage plans to update itself.
+             if mykey == "PORTAGE_BIN_PATH":
+                 return portage._bin_path
+             if mykey == "PORTAGE_PYM_PATH":
+                 return portage._pym_path
+ 
+             if mykey == "PORTAGE_PYTHONPATH":
+                 value = [
+                     x for x in self.backupenv.get("PYTHONPATH", "").split(":") if x
+                 ]
+                 need_pym_path = True
+                 if value:
+                     try:
+                         need_pym_path = not os.path.samefile(
+                             value[0], portage._pym_path
+                         )
+                     except OSError:
+                         pass
+                 if need_pym_path:
+                     value.insert(0, portage._pym_path)
+                 return ":".join(value)
+ 
+             if mykey == "PORTAGE_GID":
+                 return "%s" % portage_gid
+ 
+         for d in self.lookuplist:
+             try:
+                 return d[mykey]
+             except KeyError:
+                 pass
+ 
+         deprecated_key = self._deprecated_keys.get(mykey)
+         if deprecated_key is not None:
+             value = self._getitem(deprecated_key)
+             # warnings.warn(_("Key %s has been renamed to %s. Please ",
+             # 	"update your configuration") % (deprecated_key, mykey),
+             # 	UserWarning)
+             return value
+ 
+         raise KeyError(mykey)
+ 
+     def get(self, k, x=None):
+         try:
+             return self._getitem(k)
+         except KeyError:
+             return x
+ 
+     def pop(self, key, *args):
+         self.modifying()
+         if len(args) > 1:
+             raise TypeError(
+                 "pop expected at most 2 arguments, got " + repr(1 + len(args))
+             )
+         v = self
+         for d in reversed(self.lookuplist):
+             v = d.pop(key, v)
+         if v is self:
+             if args:
+                 return args[0]
+             raise KeyError(key)
+         return v
+ 
+     def __contains__(self, mykey):
+         """Called to implement membership test operators (in and not in)."""
+         try:
+             self._getitem(mykey)
+         except KeyError:
+             return False
+         else:
+             return True
+ 
+     def setdefault(self, k, x=None):
+         v = self.get(k)
+         if v is not None:
+             return v
+         self[k] = x
+         return x
+ 
+     def __iter__(self):
+         keys = set()
+         keys.update(self._constant_keys)
+         for d in self.lookuplist:
+             keys.update(d)
+         return iter(keys)
+ 
+     def iterkeys(self):
+         return iter(self)
+ 
+     def iteritems(self):
+         for k in self:
+             yield (k, self._getitem(k))
+ 
+     def __setitem__(self, mykey, myvalue):
+         "set a value; will be thrown away at reset() time"
+         if not isinstance(myvalue, str):
+             raise ValueError(
+                 "Invalid type being used as a value: '%s': '%s'"
+                 % (str(mykey), str(myvalue))
+             )
+ 
+         # Avoid potential UnicodeDecodeError exceptions later.
+         mykey = _unicode_decode(mykey)
+         myvalue = _unicode_decode(myvalue)
+ 
+         self.modifying()
+         self.modifiedkeys.append(mykey)
+         self.configdict["env"][mykey] = myvalue
+ 
+     def environ(self):
+         "return our locally-maintained environment"
+         mydict = {}
+         environ_filter = self._environ_filter
+ 
+         eapi = self.get("EAPI")
+         eapi_attrs = _get_eapi_attrs(eapi)
+         phase = self.get("EBUILD_PHASE")
+         emerge_from = self.get("EMERGE_FROM")
+         filter_calling_env = False
+         if (
+             self.mycpv is not None
+             and not (emerge_from == "ebuild" and phase == "setup")
+             and phase not in ("clean", "cleanrm", "depend", "fetch")
+         ):
+             temp_dir = self.get("T")
+             if temp_dir is not None and os.path.exists(
+                 os.path.join(temp_dir, "environment")
+             ):
+                 filter_calling_env = True
+ 
+         environ_whitelist = self._environ_whitelist
+         for x, myvalue in self.iteritems():
+             if x in environ_filter:
+                 continue
+             if not isinstance(myvalue, str):
+                 writemsg(
+                     _("!!! Non-string value in config: %s=%s\n") % (x, myvalue),
+                     noiselevel=-1,
+                 )
+                 continue
+             if (
+                 filter_calling_env
+                 and x not in environ_whitelist
+                 and not self._environ_whitelist_re.match(x)
+             ):
+                 # Do not allow anything to leak into the ebuild
+                 # environment unless it is explicitly whitelisted.
+                 # This ensures that variables unset by the ebuild
+                 # remain unset (bug #189417).
+                 continue
+             mydict[x] = myvalue
+         if "HOME" not in mydict and "BUILD_PREFIX" in mydict:
+             writemsg("*** HOME not set. Setting to " + mydict["BUILD_PREFIX"] + "\n")
+             mydict["HOME"] = mydict["BUILD_PREFIX"][:]
+ 
+         if filter_calling_env:
+             if phase:
+                 whitelist = []
+                 if "rpm" == phase:
+                     whitelist.append("RPMDIR")
+                 for k in whitelist:
+                     v = self.get(k)
+                     if v is not None:
+                         mydict[k] = v
+ 
+         # At some point we may want to stop exporting FEATURES to the ebuild
+         # environment, in order to prevent ebuilds from abusing it. In
+         # preparation for that, export it as PORTAGE_FEATURES so that bashrc
+         # users will be able to migrate any FEATURES conditional code to
+         # use this alternative variable.
+         mydict["PORTAGE_FEATURES"] = self["FEATURES"]
+ 
+         # Filtered by IUSE and implicit IUSE.
+         mydict["USE"] = self.get("PORTAGE_USE", "")
+ 
+         # Don't export AA to the ebuild environment in EAPIs that forbid it
+         if not eapi_exports_AA(eapi):
+             mydict.pop("AA", None)
+ 
+         if not eapi_exports_merge_type(eapi):
+             mydict.pop("MERGE_TYPE", None)
+ 
+         src_like_phase = phase == "setup" or _phase_func_map.get(phase, "").startswith(
+             "src_"
+         )
+ 
+         if not (src_like_phase and eapi_attrs.sysroot):
+             mydict.pop("ESYSROOT", None)
+ 
+         if not (src_like_phase and eapi_attrs.broot):
+             mydict.pop("BROOT", None)
+ 
+         # 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
+         # the prefix branch of portage, which also supports EPREFIX for all
+         # EAPIs (for obvious reasons).
+         if phase == "depend" or (
+             "force-prefix" not in self.features
+             and eapi is not None
+             and not eapi_supports_prefix(eapi)
+         ):
+             mydict.pop("ED", None)
+             mydict.pop("EPREFIX", None)
+             mydict.pop("EROOT", None)
+             mydict.pop("ESYSROOT", None)
+ 
+         if (
+             phase
+             not in (
+                 "pretend",
+                 "setup",
+                 "preinst",
+                 "postinst",
+             )
+             or not eapi_exports_replace_vars(eapi)
+         ):
+             mydict.pop("REPLACING_VERSIONS", None)
+ 
+         if phase not in ("prerm", "postrm") or not eapi_exports_replace_vars(eapi):
+             mydict.pop("REPLACED_BY_VERSION", None)
+ 
+         if phase is not None and eapi_attrs.exports_EBUILD_PHASE_FUNC:
+             phase_func = _phase_func_map.get(phase)
+             if phase_func is not None:
+                 mydict["EBUILD_PHASE_FUNC"] = phase_func
+ 
+         if eapi_attrs.posixish_locale:
+             split_LC_ALL(mydict)
+             mydict["LC_COLLATE"] = "C"
+             # check_locale() returns None when check can not be executed.
+             if check_locale(silent=True, env=mydict) is False:
+                 # try another locale
+                 for l in ("C.UTF-8", "en_US.UTF-8", "en_GB.UTF-8", "C"):
+                     mydict["LC_CTYPE"] = l
+                     if check_locale(silent=True, env=mydict):
+                         # TODO: output the following only once
+                         # 						writemsg(_("!!! LC_CTYPE unsupported, using %s instead\n")
+                         # 								% mydict["LC_CTYPE"])
+                         break
+                 else:
+                     raise AssertionError("C locale did not pass the test!")
+ 
+         if not eapi_attrs.exports_PORTDIR:
+             mydict.pop("PORTDIR", None)
+         if not eapi_attrs.exports_ECLASSDIR:
+             mydict.pop("ECLASSDIR", None)
+ 
+         if not eapi_attrs.path_variables_end_with_trailing_slash:
+             for v in ("D", "ED", "ROOT", "EROOT", "ESYSROOT", "BROOT"):
+                 if v in mydict:
+                     mydict[v] = mydict[v].rstrip(os.path.sep)
+ 
+         # Since SYSROOT=/ interacts badly with autotools.eclass (bug 654600),
+         # and no EAPI expects SYSROOT to have a trailing slash, always strip
+         # the trailing slash from SYSROOT.
+         if "SYSROOT" in mydict:
+             mydict["SYSROOT"] = mydict["SYSROOT"].rstrip(os.sep)
+ 
+         try:
+             builddir = mydict["PORTAGE_BUILDDIR"]
+             distdir = mydict["DISTDIR"]
+         except KeyError:
+             pass
+         else:
+             mydict["PORTAGE_ACTUAL_DISTDIR"] = distdir
+             mydict["DISTDIR"] = os.path.join(builddir, "distdir")
+ 
+         return mydict
+ 
+     def thirdpartymirrors(self):
+         if getattr(self, "_thirdpartymirrors", None) is None:
+             thirdparty_lists = []
+             for repo_name in reversed(self.repositories.prepos_order):
+                 thirdparty_lists.append(
+                     grabdict(
+                         os.path.join(
+                             self.repositories[repo_name].location,
+                             "profiles",
+                             "thirdpartymirrors",
+                         )
+                     )
+                 )
+             self._thirdpartymirrors = stack_dictlist(thirdparty_lists, incremental=True)
+         return self._thirdpartymirrors
+ 
+     def archlist(self):
+         _archlist = []
+         for myarch in self["PORTAGE_ARCHLIST"].split():
+             _archlist.append(myarch)
+             _archlist.append("~" + myarch)
+         return _archlist
+ 
+     def selinux_enabled(self):
+         if getattr(self, "_selinux_enabled", None) is None:
+             self._selinux_enabled = 0
+             if "selinux" in self["USE"].split():
+                 if selinux:
+                     if selinux.is_selinux_enabled() == 1:
+                         self._selinux_enabled = 1
+                     else:
+                         self._selinux_enabled = 0
+                 else:
+                     writemsg(
+                         _(
+                             "!!! SELinux module not found. Please verify that it was installed.\n"
+                         ),
+                         noiselevel=-1,
+                     )
+                     self._selinux_enabled = 0
+ 
+         return self._selinux_enabled
+ 
+     keys = __iter__
+     items = iteritems
diff --cc lib/portage/package/ebuild/doebuild.py
index 190c34528,9650a8444..1829a8209
--- a/lib/portage/package/ebuild/doebuild.py
+++ b/lib/portage/package/ebuild/doebuild.py
@@@ -1776,811 -2246,960 +2246,971 @@@ def _post_phase_emptydir_cleanup(mysett
  
  
  def _check_build_log(mysettings, out=None):
- 	"""
- 	Search the content of $PORTAGE_LOG_FILE if it exists
- 	and generate the following QA Notices when appropriate:
- 
- 	  * Automake "maintainer mode"
- 	  * command not found
- 	  * Unrecognized configure options
- 	"""
- 	logfile = mysettings.get("PORTAGE_LOG_FILE")
- 	if logfile is None:
- 		return
- 	try:
- 		f = open(_unicode_encode(logfile, encoding=_encodings['fs'],
- 			errors='strict'), mode='rb')
- 	except EnvironmentError:
- 		return
+     """
+     Search the content of $PORTAGE_LOG_FILE if it exists
+     and generate the following QA Notices when appropriate:
+ 
+       * Automake "maintainer mode"
+       * command not found
+       * Unrecognized configure options
+     """
+     logfile = mysettings.get("PORTAGE_LOG_FILE")
+     if logfile is None:
+         return
+     try:
+         f = open(
+             _unicode_encode(logfile, encoding=_encodings["fs"], errors="strict"),
+             mode="rb",
+         )
+     except EnvironmentError:
+         return
+ 
+     f_real = None
+     if logfile.endswith(".gz"):
+         f_real = f
+         f = gzip.GzipFile(filename="", mode="rb", fileobj=f)
+ 
+     am_maintainer_mode = []
+     bash_command_not_found = []
+     bash_command_not_found_re = re.compile(
+         r"(.*): line (\d*): (.*): command not found$"
+     )
+     command_not_found_exclude_re = re.compile(r"/configure: line ")
+     helper_missing_file = []
+     helper_missing_file_re = re.compile(r"^!!! (do|new).*: .* does not exist$")
+ 
+     configure_opts_warn = []
+     configure_opts_warn_re = re.compile(
+         r"^configure: WARNING: [Uu]nrecognized options: (.*)"
+     )
+ 
+     qa_configure_opts = ""
+     try:
+         with io.open(
+             _unicode_encode(
+                 os.path.join(
+                     mysettings["PORTAGE_BUILDDIR"], "build-info", "QA_CONFIGURE_OPTIONS"
+                 ),
+                 encoding=_encodings["fs"],
+                 errors="strict",
+             ),
+             mode="r",
+             encoding=_encodings["repo.content"],
+             errors="replace",
+         ) as qa_configure_opts_f:
+             qa_configure_opts = qa_configure_opts_f.read()
+     except IOError as e:
+         if e.errno not in (errno.ENOENT, errno.ESTALE):
+             raise
+ 
+     qa_configure_opts = qa_configure_opts.split()
+     if qa_configure_opts:
+         if len(qa_configure_opts) > 1:
+             qa_configure_opts = "|".join("(%s)" % x for x in qa_configure_opts)
+             qa_configure_opts = "^(%s)$" % qa_configure_opts
+         else:
+             qa_configure_opts = "^%s$" % qa_configure_opts[0]
+         qa_configure_opts = re.compile(qa_configure_opts)
+ 
+     qa_am_maintainer_mode = []
+     try:
+         with io.open(
+             _unicode_encode(
+                 os.path.join(
+                     mysettings["PORTAGE_BUILDDIR"],
+                     "build-info",
+                     "QA_AM_MAINTAINER_MODE",
+                 ),
+                 encoding=_encodings["fs"],
+                 errors="strict",
+             ),
+             mode="r",
+             encoding=_encodings["repo.content"],
+             errors="replace",
+         ) as qa_am_maintainer_mode_f:
+             qa_am_maintainer_mode = [
+                 x for x in qa_am_maintainer_mode_f.read().splitlines() if x
+             ]
+     except IOError as e:
+         if e.errno not in (errno.ENOENT, errno.ESTALE):
+             raise
+ 
+     if qa_am_maintainer_mode:
+         if len(qa_am_maintainer_mode) > 1:
+             qa_am_maintainer_mode = "|".join("(%s)" % x for x in qa_am_maintainer_mode)
+             qa_am_maintainer_mode = "^(%s)$" % qa_am_maintainer_mode
+         else:
+             qa_am_maintainer_mode = "^%s$" % qa_am_maintainer_mode[0]
+         qa_am_maintainer_mode = re.compile(qa_am_maintainer_mode)
+ 
+     # Exclude output from dev-libs/yaz-3.0.47 which looks like this:
+     #
+     # Configuration:
+     #  Automake:                   ${SHELL} /var/tmp/portage/dev-libs/yaz-3.0.47/work/yaz-3.0.47/config/missing --run automake-1.10
+     am_maintainer_mode_re = re.compile(r"/missing --run ")
+     am_maintainer_mode_exclude_re = re.compile(
+         r"(/missing --run (autoheader|autotest|help2man|makeinfo)|^\s*Automake:\s)"
+     )
+ 
+     make_jobserver_re = re.compile(r"g?make\[\d+\]: warning: jobserver unavailable:")
+     make_jobserver = []
+ 
+     # we deduplicate these since they is repeated for every setup.py call
+     setuptools_warn = set()
+     setuptools_warn_re = re.compile(r".*\/setuptools\/.*: .*Warning: (.*)")
+     # skip useless version normalization warnings
+     setuptools_warn_ignore_re = [re.compile(r"Normalizing .*")]
+ 
+     def _eerror(lines):
+         for line in lines:
+             eerror(line, phase="install", key=mysettings.mycpv, out=out)
+ 
+     try:
+         for line in f:
+             line = _unicode_decode(line)
+             if (
+                 am_maintainer_mode_re.search(line) is not None
+                 and am_maintainer_mode_exclude_re.search(line) is None
+                 and (
+                     not qa_am_maintainer_mode
+                     or qa_am_maintainer_mode.search(line) is None
+                 )
+             ):
+                 am_maintainer_mode.append(line.rstrip("\n"))
+ 
+             if (
+                 bash_command_not_found_re.match(line) is not None
+                 and command_not_found_exclude_re.search(line) is None
+             ):
+                 bash_command_not_found.append(line.rstrip("\n"))
+ 
+             if helper_missing_file_re.match(line) is not None:
+                 helper_missing_file.append(line.rstrip("\n"))
+ 
+             m = configure_opts_warn_re.match(line)
+             if m is not None:
+                 for x in m.group(1).split(", "):
+                     if not qa_configure_opts or qa_configure_opts.match(x) is None:
+                         configure_opts_warn.append(x)
+ 
+             if make_jobserver_re.match(line) is not None:
+                 make_jobserver.append(line.rstrip("\n"))
+ 
+             m = setuptools_warn_re.match(line)
+             if m is not None:
+                 warn_text = m.group(1)
+                 for ign in setuptools_warn_ignore_re:
+                     if ign.match(warn_text):
+                         break
+                 else:
+                     setuptools_warn.add(warn_text)
+ 
+     except (EOFError, zlib.error) as e:
+         _eerror(
+             [
+                 "portage encountered a zlib error: '%s'" % (e,),
+                 "while reading the log file: '%s'" % logfile,
+             ]
+         )
+     finally:
+         f.close()
+ 
+     def _eqawarn(lines):
+         for line in lines:
+             eqawarn(line, phase="install", key=mysettings.mycpv, out=out)
+ 
+     wrap_width = 70
+ 
+     if am_maintainer_mode:
+         msg = [_('QA Notice: Automake "maintainer mode" detected:')]
+         msg.append("")
+         msg.extend("\t" + line for line in am_maintainer_mode)
+         msg.append("")
+         msg.extend(
+             wrap(
+                 _(
+                     "If you patch Makefile.am, "
+                     "configure.in,  or configure.ac then you "
+                     "should use autotools.eclass and "
+                     "eautomake or eautoreconf. Exceptions "
+                     "are limited to system packages "
+                     "for which it is impossible to run "
+                     "autotools during stage building. "
+                     "See https://wiki.gentoo.org/wiki/Project:Quality_Assurance/Autotools_failures"
+                     " for more information."
+                 ),
+                 wrap_width,
+             )
+         )
+         _eqawarn(msg)
+ 
+     if bash_command_not_found:
+         msg = [_("QA Notice: command not found:")]
+         msg.append("")
+         msg.extend("\t" + line for line in bash_command_not_found)
+         _eqawarn(msg)
+ 
+     if helper_missing_file:
+         msg = [_("QA Notice: file does not exist:")]
+         msg.append("")
+         msg.extend("\t" + line[4:] for line in helper_missing_file)
+         _eqawarn(msg)
+ 
+     if configure_opts_warn:
+         msg = [_("QA Notice: Unrecognized configure options:")]
+         msg.append("")
+         msg.extend("\t%s" % x for x in configure_opts_warn)
+         _eqawarn(msg)
+ 
+     if make_jobserver:
+         msg = [_("QA Notice: make jobserver unavailable:")]
+         msg.append("")
+         msg.extend("\t" + line for line in make_jobserver)
+         _eqawarn(msg)
+ 
+     if setuptools_warn:
+         msg = [_("QA Notice: setuptools warnings detected:")]
+         msg.append("")
+         msg.extend("\t" + line for line in sorted(setuptools_warn))
+         _eqawarn(msg)
+ 
+     f.close()
+     if f_real is not None:
+         f_real.close()
  
- 	f_real = None
- 	if logfile.endswith('.gz'):
- 		f_real = f
- 		f =  gzip.GzipFile(filename='', mode='rb', fileobj=f)
- 
- 	am_maintainer_mode = []
- 	bash_command_not_found = []
- 	bash_command_not_found_re = re.compile(
- 		r'(.*): line (\d*): (.*): command not found$')
- 	command_not_found_exclude_re = re.compile(r'/configure: line ')
- 	helper_missing_file = []
- 	helper_missing_file_re = re.compile(
- 		r'^!!! (do|new).*: .* does not exist$')
- 
- 	configure_opts_warn = []
- 	configure_opts_warn_re = re.compile(
- 		r'^configure: WARNING: [Uu]nrecognized options: (.*)')
- 
- 	qa_configure_opts = ""
- 	try:
- 		with io.open(_unicode_encode(os.path.join(
- 			mysettings["PORTAGE_BUILDDIR"],
- 			"build-info", "QA_CONFIGURE_OPTIONS"),
- 			encoding=_encodings['fs'], errors='strict'),
- 			mode='r', encoding=_encodings['repo.content'],
- 			errors='replace') as qa_configure_opts_f:
- 			qa_configure_opts = qa_configure_opts_f.read()
- 	except IOError as e:
- 		if e.errno not in (errno.ENOENT, errno.ESTALE):
- 			raise
- 
- 	qa_configure_opts = qa_configure_opts.split()
- 	if qa_configure_opts:
- 		if len(qa_configure_opts) > 1:
- 			qa_configure_opts = "|".join("(%s)" % x for x in qa_configure_opts)
- 			qa_configure_opts = "^(%s)$" % qa_configure_opts
- 		else:
- 			qa_configure_opts = "^%s$" % qa_configure_opts[0]
- 		qa_configure_opts = re.compile(qa_configure_opts)
- 
- 	qa_am_maintainer_mode = []
- 	try:
- 		with io.open(_unicode_encode(os.path.join(
- 			mysettings["PORTAGE_BUILDDIR"],
- 			"build-info", "QA_AM_MAINTAINER_MODE"),
- 			encoding=_encodings['fs'], errors='strict'),
- 			mode='r', encoding=_encodings['repo.content'],
- 			errors='replace') as qa_am_maintainer_mode_f:
- 			qa_am_maintainer_mode = [x for x in
- 				qa_am_maintainer_mode_f.read().splitlines() if x]
- 	except IOError as e:
- 		if e.errno not in (errno.ENOENT, errno.ESTALE):
- 			raise
- 
- 	if qa_am_maintainer_mode:
- 		if len(qa_am_maintainer_mode) > 1:
- 			qa_am_maintainer_mode = \
- 				"|".join("(%s)" % x for x in qa_am_maintainer_mode)
- 			qa_am_maintainer_mode = "^(%s)$" % qa_am_maintainer_mode
- 		else:
- 			qa_am_maintainer_mode = "^%s$" % qa_am_maintainer_mode[0]
- 		qa_am_maintainer_mode = re.compile(qa_am_maintainer_mode)
- 
- 	# Exclude output from dev-libs/yaz-3.0.47 which looks like this:
- 	#
- 	#Configuration:
- 	#  Automake:                   ${SHELL} /var/tmp/portage/dev-libs/yaz-3.0.47/work/yaz-3.0.47/config/missing --run automake-1.10
- 	am_maintainer_mode_re = re.compile(r'/missing --run ')
- 	am_maintainer_mode_exclude_re = \
- 		re.compile(r'(/missing --run (autoheader|autotest|help2man|makeinfo)|^\s*Automake:\s)')
- 
- 	make_jobserver_re = \
- 		re.compile(r'g?make\[\d+\]: warning: jobserver unavailable:')
- 	make_jobserver = []
- 
- 	# we deduplicate these since they is repeated for every setup.py call
- 	setuptools_warn = set()
- 	setuptools_warn_re = re.compile(r'.*\/setuptools\/.*: .*Warning: (.*)')
- 	# skip useless version normalization warnings
- 	setuptools_warn_ignore_re = [
- 		re.compile(r'Normalizing .*')
- 	]
- 
- 	def _eerror(lines):
- 		for line in lines:
- 			eerror(line, phase="install", key=mysettings.mycpv, out=out)
- 
- 	try:
- 		for line in f:
- 			line = _unicode_decode(line)
- 			if am_maintainer_mode_re.search(line) is not None and \
- 				am_maintainer_mode_exclude_re.search(line) is None and \
- 				(not qa_am_maintainer_mode or
- 					qa_am_maintainer_mode.search(line) is None):
- 				am_maintainer_mode.append(line.rstrip("\n"))
- 
- 			if bash_command_not_found_re.match(line) is not None and \
- 				command_not_found_exclude_re.search(line) is None:
- 				bash_command_not_found.append(line.rstrip("\n"))
- 
- 			if helper_missing_file_re.match(line) is not None:
- 				helper_missing_file.append(line.rstrip("\n"))
- 
- 			m = configure_opts_warn_re.match(line)
- 			if m is not None:
- 				for x in m.group(1).split(", "):
- 					if not qa_configure_opts or qa_configure_opts.match(x) is None:
- 						configure_opts_warn.append(x)
- 
- 			if make_jobserver_re.match(line) is not None:
- 				make_jobserver.append(line.rstrip("\n"))
- 
- 			m = setuptools_warn_re.match(line)
- 			if m is not None:
- 				warn_text = m.group(1)
- 				for ign in setuptools_warn_ignore_re:
- 					if ign.match(warn_text):
- 						break
- 				else:
- 					setuptools_warn.add(warn_text)
- 
- 	except (EOFError, zlib.error) as e:
- 		_eerror(["portage encountered a zlib error: '%s'" % (e,),
- 			"while reading the log file: '%s'" % logfile])
- 	finally:
- 		f.close()
- 
- 	def _eqawarn(lines):
- 		for line in lines:
- 			eqawarn(line, phase="install", key=mysettings.mycpv, out=out)
- 	wrap_width = 70
- 
- 	if am_maintainer_mode:
- 		msg = [_("QA Notice: Automake \"maintainer mode\" detected:")]
- 		msg.append("")
- 		msg.extend("\t" + line for line in am_maintainer_mode)
- 		msg.append("")
- 		msg.extend(wrap(_(
- 			"If you patch Makefile.am, "
- 			"configure.in,  or configure.ac then you "
- 			"should use autotools.eclass and "
- 			"eautomake or eautoreconf. Exceptions "
- 			"are limited to system packages "
- 			"for which it is impossible to run "
- 			"autotools during stage building. "
- 			"See https://wiki.gentoo.org/wiki/Project:Quality_Assurance/Autotools_failures"
-             " for more information."),
- 			wrap_width))
- 		_eqawarn(msg)
- 
- 	if bash_command_not_found:
- 		msg = [_("QA Notice: command not found:")]
- 		msg.append("")
- 		msg.extend("\t" + line for line in bash_command_not_found)
- 		_eqawarn(msg)
- 
- 	if helper_missing_file:
- 		msg = [_("QA Notice: file does not exist:")]
- 		msg.append("")
- 		msg.extend("\t" + line[4:] for line in helper_missing_file)
- 		_eqawarn(msg)
- 
- 	if configure_opts_warn:
- 		msg = [_("QA Notice: Unrecognized configure options:")]
- 		msg.append("")
- 		msg.extend("\t%s" % x for x in configure_opts_warn)
- 		_eqawarn(msg)
- 
- 	if make_jobserver:
- 		msg = [_("QA Notice: make jobserver unavailable:")]
- 		msg.append("")
- 		msg.extend("\t" + line for line in make_jobserver)
- 		_eqawarn(msg)
- 
- 	if setuptools_warn:
- 		msg = [_("QA Notice: setuptools warnings detected:")]
- 		msg.append("")
- 		msg.extend("\t" + line for line in sorted(setuptools_warn))
- 		_eqawarn(msg)
- 
- 	f.close()
- 	if f_real is not None:
- 		f_real.close()
  
  def _post_src_install_write_metadata(settings):
- 	"""
- 	It's possible that the ebuild has changed the
- 	CHOST variable, so revert it to the initial
- 	setting. Also, revert IUSE in case it's corrupted
- 	due to local environment settings like in bug #386829.
- 	"""
+     """
+     It's possible that the ebuild has changed the
+     CHOST variable, so revert it to the initial
+     setting. Also, revert IUSE in case it's corrupted
+     due to local environment settings like in bug #386829.
+     """
  
- 	eapi_attrs = _get_eapi_attrs(settings.configdict['pkg']['EAPI'])
+     eapi_attrs = _get_eapi_attrs(settings.configdict["pkg"]["EAPI"])
  
- 	build_info_dir = os.path.join(settings['PORTAGE_BUILDDIR'], 'build-info')
+     build_info_dir = os.path.join(settings["PORTAGE_BUILDDIR"], "build-info")
  
- 	metadata_keys = ['IUSE']
- 	if eapi_attrs.iuse_effective:
- 		metadata_keys.append('IUSE_EFFECTIVE')
+     metadata_keys = ["IUSE"]
+     if eapi_attrs.iuse_effective:
+         metadata_keys.append("IUSE_EFFECTIVE")
  
- 	for k in metadata_keys:
- 		v = settings.configdict['pkg'].get(k)
+     for k in metadata_keys:
+         v = settings.configdict["pkg"].get(k)
 +		if "force-multilib" in settings.features:
 +			v = v + " abiwrapper"
 +			for i in settings.get('MULTILIB_ABIS').split():
 +				v = v + " multilib_abi_" + i
- 		if v is not None:
- 			write_atomic(os.path.join(build_info_dir, k), v + '\n')
- 
- 	for k in ('CHOST',):
- 		v = settings.get(k)
- 		if v is not None:
- 			write_atomic(os.path.join(build_info_dir, k), v + '\n')
- 
- 	with io.open(_unicode_encode(os.path.join(build_info_dir,
- 		'BUILD_TIME'), encoding=_encodings['fs'], errors='strict'),
- 		mode='w', encoding=_encodings['repo.content'],
- 		errors='strict') as f:
- 		f.write("%.0f\n" % (time.time(),))
- 
- 	use = frozenset(settings['PORTAGE_USE'].split())
- 	for k in _vdb_use_conditional_keys:
- 		v = settings.configdict['pkg'].get(k)
- 		filename = os.path.join(build_info_dir, k)
- 		if v is None:
- 			try:
- 				os.unlink(filename)
- 			except OSError:
- 				pass
- 			continue
- 
- 		if k.endswith('DEPEND'):
- 			if eapi_attrs.slot_operator:
- 				continue
- 			token_class = Atom
- 		else:
- 			token_class = None
- 
- 		v = use_reduce(v, uselist=use, token_class=token_class)
- 		v = paren_enclose(v)
- 		if not v:
- 			try:
- 				os.unlink(filename)
- 			except OSError:
- 				pass
- 			continue
- 		with io.open(_unicode_encode(os.path.join(build_info_dir,
- 			k), encoding=_encodings['fs'], errors='strict'),
- 			mode='w', encoding=_encodings['repo.content'],
- 			errors='strict') as f:
- 			f.write('%s\n' % v)
- 
- 	if eapi_attrs.slot_operator:
- 		deps = evaluate_slot_operator_equal_deps(settings, use, QueryCommand.get_db())
- 		for k, v in deps.items():
- 			filename = os.path.join(build_info_dir, k)
- 			if not v:
- 				try:
- 					os.unlink(filename)
- 				except OSError:
- 					pass
- 				continue
- 			with io.open(_unicode_encode(os.path.join(build_info_dir,
- 				k), encoding=_encodings['fs'], errors='strict'),
- 				mode='w', encoding=_encodings['repo.content'],
- 				errors='strict') as f:
- 				f.write('%s\n' % v)
+         if v is not None:
+             write_atomic(os.path.join(build_info_dir, k), v + "\n")
+ 
+     for k in ("CHOST",):
+         v = settings.get(k)
+         if v is not None:
+             write_atomic(os.path.join(build_info_dir, k), v + "\n")
+ 
+     with io.open(
+         _unicode_encode(
+             os.path.join(build_info_dir, "BUILD_TIME"),
+             encoding=_encodings["fs"],
+             errors="strict",
+         ),
+         mode="w",
+         encoding=_encodings["repo.content"],
+         errors="strict",
+     ) as f:
+         f.write("%.0f\n" % (time.time(),))
+ 
+     use = frozenset(settings["PORTAGE_USE"].split())
+     for k in _vdb_use_conditional_keys:
+         v = settings.configdict["pkg"].get(k)
+         filename = os.path.join(build_info_dir, k)
+         if v is None:
+             try:
+                 os.unlink(filename)
+             except OSError:
+                 pass
+             continue
+ 
+         if k.endswith("DEPEND"):
+             if eapi_attrs.slot_operator:
+                 continue
+             token_class = Atom
+         else:
+             token_class = None
+ 
+         v = use_reduce(v, uselist=use, token_class=token_class)
+         v = paren_enclose(v)
+         if not v:
+             try:
+                 os.unlink(filename)
+             except OSError:
+                 pass
+             continue
+         with io.open(
+             _unicode_encode(
+                 os.path.join(build_info_dir, k),
+                 encoding=_encodings["fs"],
+                 errors="strict",
+             ),
+             mode="w",
+             encoding=_encodings["repo.content"],
+             errors="strict",
+         ) as f:
+             f.write("%s\n" % v)
+ 
+     if eapi_attrs.slot_operator:
+         deps = evaluate_slot_operator_equal_deps(settings, use, QueryCommand.get_db())
+         for k, v in deps.items():
+             filename = os.path.join(build_info_dir, k)
+             if not v:
+                 try:
+                     os.unlink(filename)
+                 except OSError:
+                     pass
+                 continue
+             with io.open(
+                 _unicode_encode(
+                     os.path.join(build_info_dir, k),
+                     encoding=_encodings["fs"],
+                     errors="strict",
+                 ),
+                 mode="w",
+                 encoding=_encodings["repo.content"],
+                 errors="strict",
+             ) as f:
+                 f.write("%s\n" % v)
  
- def _preinst_bsdflags(mysettings):
- 	if bsd_chflags:
- 		# Save all the file flags for restoration later.
- 		os.system("mtree -c -p %s -k flags > %s" % \
- 			(_shell_quote(mysettings["D"]),
- 			_shell_quote(os.path.join(mysettings["T"], "bsdflags.mtree"))))
  
- 		# Remove all the file flags to avoid EPERM errors.
- 		os.system("chflags -R noschg,nouchg,nosappnd,nouappnd %s" % \
- 			(_shell_quote(mysettings["D"]),))
- 		os.system("chflags -R nosunlnk,nouunlnk %s 2>/dev/null" % \
- 			(_shell_quote(mysettings["D"]),))
+ def _preinst_bsdflags(mysettings):
+     if bsd_chflags:
+         # Save all the file flags for restoration later.
+         os.system(
+             "mtree -c -p %s -k flags > %s"
+             % (
+                 _shell_quote(mysettings["D"]),
+                 _shell_quote(os.path.join(mysettings["T"], "bsdflags.mtree")),
+             )
+         )
+ 
+         # Remove all the file flags to avoid EPERM errors.
+         os.system(
+             "chflags -R noschg,nouchg,nosappnd,nouappnd %s"
+             % (_shell_quote(mysettings["D"]),)
+         )
+         os.system(
+             "chflags -R nosunlnk,nouunlnk %s 2>/dev/null"
+             % (_shell_quote(mysettings["D"]),)
+         )
  
  
  def _postinst_bsdflags(mysettings):
- 	if bsd_chflags:
- 		# Restore all of the flags saved above.
- 		os.system("mtree -e -p %s -U -k flags < %s > /dev/null" % \
- 			(_shell_quote(mysettings["ROOT"]),
- 			_shell_quote(os.path.join(mysettings["T"], "bsdflags.mtree"))))
+     if bsd_chflags:
+         # Restore all of the flags saved above.
+         os.system(
+             "mtree -e -p %s -U -k flags < %s > /dev/null"
+             % (
+                 _shell_quote(mysettings["ROOT"]),
+                 _shell_quote(os.path.join(mysettings["T"], "bsdflags.mtree")),
+             )
+         )
+ 
  
  def _post_src_install_uid_fix(mysettings, out):
- 	"""
- 	Files in $D with user and group bits that match the "portage"
- 	user or group are automatically mapped to PORTAGE_INST_UID and
- 	PORTAGE_INST_GID if necessary. The chown system call may clear
- 	S_ISUID and S_ISGID bits, so those bits are restored if
- 	necessary.
- 	"""
- 
- 	os = _os_merge
- 
- 	inst_uid = int(mysettings["PORTAGE_INST_UID"])
- 	inst_gid = int(mysettings["PORTAGE_INST_GID"])
- 
- 	_preinst_bsdflags(mysettings)
- 
- 	destdir = mysettings["D"]
- 	ed_len = len(mysettings["ED"])
- 	unicode_errors = []
- 	desktop_file_validate = \
- 		portage.process.find_binary("desktop-file-validate") is not None
- 	xdg_dirs = mysettings.get('XDG_DATA_DIRS', '/usr/share').split(':')
- 	xdg_dirs = tuple(os.path.join(i, "applications") + os.sep
- 		for i in xdg_dirs if i)
- 
- 	qa_desktop_file = ""
- 	try:
- 		with io.open(_unicode_encode(os.path.join(
- 			mysettings["PORTAGE_BUILDDIR"],
- 			"build-info", "QA_DESKTOP_FILE"),
- 			encoding=_encodings['fs'], errors='strict'),
- 			mode='r', encoding=_encodings['repo.content'],
- 			errors='replace') as f:
- 			qa_desktop_file = f.read()
- 	except IOError as e:
- 		if e.errno not in (errno.ENOENT, errno.ESTALE):
- 			raise
- 
- 	qa_desktop_file = qa_desktop_file.split()
- 	if qa_desktop_file:
- 		if len(qa_desktop_file) > 1:
- 			qa_desktop_file = "|".join("(%s)" % x for x in qa_desktop_file)
- 			qa_desktop_file = "^(%s)$" % qa_desktop_file
- 		else:
- 			qa_desktop_file = "^%s$" % qa_desktop_file[0]
- 		qa_desktop_file = re.compile(qa_desktop_file)
- 
- 	while True:
- 
- 		unicode_error = False
- 		size = 0
- 		counted_inodes = set()
- 		fixlafiles_announced = False
- 		fixlafiles = "fixlafiles" in mysettings.features
- 		desktopfile_errors = []
- 
- 		for parent, dirs, files in os.walk(destdir):
- 			try:
- 				parent = _unicode_decode(parent,
- 					encoding=_encodings['merge'], errors='strict')
- 			except UnicodeDecodeError:
- 				new_parent = _unicode_decode(parent,
- 					encoding=_encodings['merge'], errors='replace')
- 				new_parent = _unicode_encode(new_parent,
- 					encoding='ascii', errors='backslashreplace')
- 				new_parent = _unicode_decode(new_parent,
- 					encoding=_encodings['merge'], errors='replace')
- 				os.rename(parent, new_parent)
- 				unicode_error = True
- 				unicode_errors.append(new_parent[ed_len:])
- 				break
- 
- 			for fname in chain(dirs, files):
- 				try:
- 					fname = _unicode_decode(fname,
- 						encoding=_encodings['merge'], errors='strict')
- 				except UnicodeDecodeError:
- 					fpath = _os.path.join(
- 						parent.encode(_encodings['merge']), fname)
- 					new_fname = _unicode_decode(fname,
- 						encoding=_encodings['merge'], errors='replace')
- 					new_fname = _unicode_encode(new_fname,
- 						encoding='ascii', errors='backslashreplace')
- 					new_fname = _unicode_decode(new_fname,
- 						encoding=_encodings['merge'], errors='replace')
- 					new_fpath = os.path.join(parent, new_fname)
- 					os.rename(fpath, new_fpath)
- 					unicode_error = True
- 					unicode_errors.append(new_fpath[ed_len:])
- 					fname = new_fname
- 					fpath = new_fpath
- 				else:
- 					fpath = os.path.join(parent, fname)
- 
- 				fpath_relative = fpath[ed_len - 1:]
- 				if desktop_file_validate and fname.endswith(".desktop") and \
- 					os.path.isfile(fpath) and \
- 					fpath_relative.startswith(xdg_dirs) and \
- 					not (qa_desktop_file and qa_desktop_file.match(fpath_relative.strip(os.sep)) is not None):
- 
- 					desktop_validate = validate_desktop_entry(fpath)
- 					if desktop_validate:
- 						desktopfile_errors.extend(desktop_validate)
- 
- 				if fixlafiles and \
- 					fname.endswith(".la") and os.path.isfile(fpath):
- 					f = open(_unicode_encode(fpath,
- 						encoding=_encodings['merge'], errors='strict'),
- 						mode='rb')
- 					has_lafile_header = b'.la - a libtool library file' \
- 						in f.readline()
- 					f.seek(0)
- 					contents = f.read()
- 					f.close()
- 					try:
- 						needs_update, new_contents = rewrite_lafile(contents)
- 					except portage.exception.InvalidData as e:
- 						needs_update = False
- 						if not fixlafiles_announced:
- 							fixlafiles_announced = True
- 							writemsg("Fixing .la files\n", fd=out)
- 
- 						# Suppress warnings if the file does not have the
- 						# expected header (bug #340725). Even if the header is
- 						# missing, we still call rewrite_lafile() since some
- 						# valid libtool archives may not have the header.
- 						msg = "   %s is not a valid libtool archive, skipping\n" % fpath[len(destdir):]
- 						qa_msg = "QA Notice: invalid .la file found: %s, %s" % (fpath[len(destdir):], e)
- 						if has_lafile_header:
- 							writemsg(msg, fd=out)
- 							eqawarn(qa_msg, key=mysettings.mycpv, out=out)
- 
- 					if needs_update:
- 						if not fixlafiles_announced:
- 							fixlafiles_announced = True
- 							writemsg("Fixing .la files\n", fd=out)
- 						writemsg("   %s\n" % fpath[len(destdir):], fd=out)
- 						# write_atomic succeeds even in some cases in which
- 						# a normal write might fail due to file permission
- 						# settings on some operating systems such as HP-UX
- 						write_atomic(_unicode_encode(fpath,
- 							encoding=_encodings['merge'], errors='strict'),
- 							new_contents, mode='wb')
- 
- 				mystat = os.lstat(fpath)
- 				if stat.S_ISREG(mystat.st_mode) and \
- 					mystat.st_ino not in counted_inodes:
- 					counted_inodes.add(mystat.st_ino)
- 					size += mystat.st_size
- 				if mystat.st_uid != portage_uid and \
- 					mystat.st_gid != portage_gid:
- 					continue
- 				myuid = -1
- 				mygid = -1
- 				if mystat.st_uid == portage_uid:
- 					myuid = inst_uid
- 				if mystat.st_gid == portage_gid:
- 					mygid = inst_gid
- 				apply_secpass_permissions(
- 					_unicode_encode(fpath, encoding=_encodings['merge']),
- 					uid=myuid, gid=mygid,
- 					mode=mystat.st_mode, stat_cached=mystat,
- 					follow_links=False)
- 
- 			if unicode_error:
- 				break
- 
- 		if not unicode_error:
- 			break
- 
- 	if desktopfile_errors:
- 		for l in _merge_desktopfile_error(desktopfile_errors):
- 			l = l.replace(mysettings["ED"], '/')
- 			eqawarn(l, phase='install', key=mysettings.mycpv, out=out)
- 
- 	if unicode_errors:
- 		for l in _merge_unicode_error(unicode_errors):
- 			eqawarn(l, phase='install', key=mysettings.mycpv, out=out)
- 
- 	build_info_dir = os.path.join(mysettings['PORTAGE_BUILDDIR'],
- 		'build-info')
- 
- 	f = io.open(_unicode_encode(os.path.join(build_info_dir,
- 		'SIZE'), encoding=_encodings['fs'], errors='strict'),
- 		mode='w', encoding=_encodings['repo.content'],
- 		errors='strict')
- 	f.write('%d\n' % size)
- 	f.close()
- 
- 	_reapply_bsdflags_to_image(mysettings)
+     """
+     Files in $D with user and group bits that match the "portage"
+     user or group are automatically mapped to PORTAGE_INST_UID and
+     PORTAGE_INST_GID if necessary. The chown system call may clear
+     S_ISUID and S_ISGID bits, so those bits are restored if
+     necessary.
+     """
+ 
+     os = _os_merge
+ 
+     inst_uid = int(mysettings["PORTAGE_INST_UID"])
+     inst_gid = int(mysettings["PORTAGE_INST_GID"])
+ 
+     _preinst_bsdflags(mysettings)
+ 
+     destdir = mysettings["D"]
+     ed_len = len(mysettings["ED"])
+     unicode_errors = []
+     desktop_file_validate = (
+         portage.process.find_binary("desktop-file-validate") is not None
+     )
+     xdg_dirs = mysettings.get("XDG_DATA_DIRS", "/usr/share").split(":")
+     xdg_dirs = tuple(os.path.join(i, "applications") + os.sep for i in xdg_dirs if i)
+ 
+     qa_desktop_file = ""
+     try:
+         with io.open(
+             _unicode_encode(
+                 os.path.join(
+                     mysettings["PORTAGE_BUILDDIR"], "build-info", "QA_DESKTOP_FILE"
+                 ),
+                 encoding=_encodings["fs"],
+                 errors="strict",
+             ),
+             mode="r",
+             encoding=_encodings["repo.content"],
+             errors="replace",
+         ) as f:
+             qa_desktop_file = f.read()
+     except IOError as e:
+         if e.errno not in (errno.ENOENT, errno.ESTALE):
+             raise
+ 
+     qa_desktop_file = qa_desktop_file.split()
+     if qa_desktop_file:
+         if len(qa_desktop_file) > 1:
+             qa_desktop_file = "|".join("(%s)" % x for x in qa_desktop_file)
+             qa_desktop_file = "^(%s)$" % qa_desktop_file
+         else:
+             qa_desktop_file = "^%s$" % qa_desktop_file[0]
+         qa_desktop_file = re.compile(qa_desktop_file)
+ 
+     while True:
+ 
+         unicode_error = False
+         size = 0
+         counted_inodes = set()
+         fixlafiles_announced = False
+         fixlafiles = "fixlafiles" in mysettings.features
+         desktopfile_errors = []
+ 
+         for parent, dirs, files in os.walk(destdir):
+             try:
+                 parent = _unicode_decode(
+                     parent, encoding=_encodings["merge"], errors="strict"
+                 )
+             except UnicodeDecodeError:
+                 new_parent = _unicode_decode(
+                     parent, encoding=_encodings["merge"], errors="replace"
+                 )
+                 new_parent = _unicode_encode(
+                     new_parent, encoding="ascii", errors="backslashreplace"
+                 )
+                 new_parent = _unicode_decode(
+                     new_parent, encoding=_encodings["merge"], errors="replace"
+                 )
+                 os.rename(parent, new_parent)
+                 unicode_error = True
+                 unicode_errors.append(new_parent[ed_len:])
+                 break
+ 
+             for fname in chain(dirs, files):
+                 try:
+                     fname = _unicode_decode(
+                         fname, encoding=_encodings["merge"], errors="strict"
+                     )
+                 except UnicodeDecodeError:
+                     fpath = _os.path.join(parent.encode(_encodings["merge"]), fname)
+                     new_fname = _unicode_decode(
+                         fname, encoding=_encodings["merge"], errors="replace"
+                     )
+                     new_fname = _unicode_encode(
+                         new_fname, encoding="ascii", errors="backslashreplace"
+                     )
+                     new_fname = _unicode_decode(
+                         new_fname, encoding=_encodings["merge"], errors="replace"
+                     )
+                     new_fpath = os.path.join(parent, new_fname)
+                     os.rename(fpath, new_fpath)
+                     unicode_error = True
+                     unicode_errors.append(new_fpath[ed_len:])
+                     fname = new_fname
+                     fpath = new_fpath
+                 else:
+                     fpath = os.path.join(parent, fname)
+ 
+                 fpath_relative = fpath[ed_len - 1 :]
+                 if (
+                     desktop_file_validate
+                     and fname.endswith(".desktop")
+                     and os.path.isfile(fpath)
+                     and fpath_relative.startswith(xdg_dirs)
+                     and not (
+                         qa_desktop_file
+                         and qa_desktop_file.match(fpath_relative.strip(os.sep))
+                         is not None
+                     )
+                 ):
+ 
+                     desktop_validate = validate_desktop_entry(fpath)
+                     if desktop_validate:
+                         desktopfile_errors.extend(desktop_validate)
+ 
+                 if fixlafiles and fname.endswith(".la") and os.path.isfile(fpath):
+                     f = open(
+                         _unicode_encode(
+                             fpath, encoding=_encodings["merge"], errors="strict"
+                         ),
+                         mode="rb",
+                     )
+                     has_lafile_header = b".la - a libtool library file" in f.readline()
+                     f.seek(0)
+                     contents = f.read()
+                     f.close()
+                     try:
+                         needs_update, new_contents = rewrite_lafile(contents)
+                     except portage.exception.InvalidData as e:
+                         needs_update = False
+                         if not fixlafiles_announced:
+                             fixlafiles_announced = True
+                             writemsg("Fixing .la files\n", fd=out)
+ 
+                         # Suppress warnings if the file does not have the
+                         # expected header (bug #340725). Even if the header is
+                         # missing, we still call rewrite_lafile() since some
+                         # valid libtool archives may not have the header.
+                         msg = (
+                             "   %s is not a valid libtool archive, skipping\n"
+                             % fpath[len(destdir) :]
+                         )
+                         qa_msg = "QA Notice: invalid .la file found: %s, %s" % (
+                             fpath[len(destdir) :],
+                             e,
+                         )
+                         if has_lafile_header:
+                             writemsg(msg, fd=out)
+                             eqawarn(qa_msg, key=mysettings.mycpv, out=out)
+ 
+                     if needs_update:
+                         if not fixlafiles_announced:
+                             fixlafiles_announced = True
+                             writemsg("Fixing .la files\n", fd=out)
+                         writemsg("   %s\n" % fpath[len(destdir) :], fd=out)
+                         # write_atomic succeeds even in some cases in which
+                         # a normal write might fail due to file permission
+                         # settings on some operating systems such as HP-UX
+                         write_atomic(
+                             _unicode_encode(
+                                 fpath, encoding=_encodings["merge"], errors="strict"
+                             ),
+                             new_contents,
+                             mode="wb",
+                         )
+ 
+                 mystat = os.lstat(fpath)
+                 if stat.S_ISREG(mystat.st_mode) and mystat.st_ino not in counted_inodes:
+                     counted_inodes.add(mystat.st_ino)
+                     size += mystat.st_size
+                 if mystat.st_uid != portage_uid and mystat.st_gid != portage_gid:
+                     continue
+                 myuid = -1
+                 mygid = -1
+                 if mystat.st_uid == portage_uid:
+                     myuid = inst_uid
+                 if mystat.st_gid == portage_gid:
+                     mygid = inst_gid
+                 apply_secpass_permissions(
+                     _unicode_encode(fpath, encoding=_encodings["merge"]),
+                     uid=myuid,
+                     gid=mygid,
+                     mode=mystat.st_mode,
+                     stat_cached=mystat,
+                     follow_links=False,
+                 )
+ 
+             if unicode_error:
+                 break
+ 
+         if not unicode_error:
+             break
+ 
+     if desktopfile_errors:
+         for l in _merge_desktopfile_error(desktopfile_errors):
+             l = l.replace(mysettings["ED"], "/")
+             eqawarn(l, phase="install", key=mysettings.mycpv, out=out)
+ 
+     if unicode_errors:
+         for l in _merge_unicode_error(unicode_errors):
+             eqawarn(l, phase="install", key=mysettings.mycpv, out=out)
+ 
+     build_info_dir = os.path.join(mysettings["PORTAGE_BUILDDIR"], "build-info")
+ 
+     f = io.open(
+         _unicode_encode(
+             os.path.join(build_info_dir, "SIZE"),
+             encoding=_encodings["fs"],
+             errors="strict",
+         ),
+         mode="w",
+         encoding=_encodings["repo.content"],
+         errors="strict",
+     )
+     f.write("%d\n" % size)
+     f.close()
+ 
+     _reapply_bsdflags_to_image(mysettings)
+ 
  
  def _reapply_bsdflags_to_image(mysettings):
- 	"""
- 	Reapply flags saved and removed by _preinst_bsdflags.
- 	"""
- 	if bsd_chflags:
- 		os.system("mtree -e -p %s -U -k flags < %s > /dev/null" % \
- 			(_shell_quote(mysettings["D"]),
- 			_shell_quote(os.path.join(mysettings["T"], "bsdflags.mtree"))))
+     """
+     Reapply flags saved and removed by _preinst_bsdflags.
+     """
+     if bsd_chflags:
+         os.system(
+             "mtree -e -p %s -U -k flags < %s > /dev/null"
+             % (
+                 _shell_quote(mysettings["D"]),
+                 _shell_quote(os.path.join(mysettings["T"], "bsdflags.mtree")),
+             )
+         )
+ 
  
  def _post_src_install_soname_symlinks(mysettings, out):
- 	"""
- 	Check that libraries in $D have corresponding soname symlinks.
- 	If symlinks are missing then create them and trigger a QA Notice.
- 	This requires $PORTAGE_BUILDDIR/build-info/NEEDED.ELF.2 for
- 	operation.
- 	"""
+     """
+     Check that libraries in $D have corresponding soname symlinks.
+     If symlinks are missing then create them and trigger a QA Notice.
+     This requires $PORTAGE_BUILDDIR/build-info/NEEDED.ELF.2 for
+     operation.
+     """
  
- 	image_dir = mysettings["D"]
+     image_dir = mysettings["D"]
 +
- 	#only run this function when the installation is actually done and the final
++    #only run this function when the installation is actually done and the final
 +	#image_dir exists (workaround for multilib-portage as this is first called
 +	#before all ABIs are done and the image_dir is created)
 +	if not os.path.isdir (image_dir):
 +		return
 +
- 	needed_filename = os.path.join(mysettings["PORTAGE_BUILDDIR"],
- 		"build-info", "NEEDED.ELF.2")
- 
- 	f = None
- 	try:
- 		f = io.open(_unicode_encode(needed_filename,
- 			encoding=_encodings['fs'], errors='strict'),
- 			mode='r', encoding=_encodings['repo.content'],
- 			errors='replace')
- 		lines = f.readlines()
- 	except IOError as e:
- 		if e.errno not in (errno.ENOENT, errno.ESTALE):
- 			raise
- 		return
- 	finally:
- 		if f is not None:
- 			f.close()
- 
- 	metadata = {}
- 	for k in ("QA_PREBUILT", "QA_SONAME_NO_SYMLINK"):
- 		try:
- 			with io.open(_unicode_encode(os.path.join(
- 				mysettings["PORTAGE_BUILDDIR"],
- 				"build-info", k),
- 				encoding=_encodings['fs'], errors='strict'),
- 				mode='r', encoding=_encodings['repo.content'],
- 				errors='replace') as f:
- 				v = f.read()
- 		except IOError as e:
- 			if e.errno not in (errno.ENOENT, errno.ESTALE):
- 				raise
- 		else:
- 			metadata[k] = v
- 
- 	qa_prebuilt = metadata.get("QA_PREBUILT", "").strip()
- 	if qa_prebuilt:
- 		qa_prebuilt = re.compile("|".join(
- 			fnmatch.translate(x.lstrip(os.sep))
- 			for x in portage.util.shlex_split(qa_prebuilt)))
- 
- 	qa_soname_no_symlink = metadata.get("QA_SONAME_NO_SYMLINK", "").split()
- 	if qa_soname_no_symlink:
- 		if len(qa_soname_no_symlink) > 1:
- 			qa_soname_no_symlink = "|".join("(%s)" % x for x in qa_soname_no_symlink)
- 			qa_soname_no_symlink = "^(%s)$" % qa_soname_no_symlink
- 		else:
- 			qa_soname_no_symlink = "^%s$" % qa_soname_no_symlink[0]
- 		qa_soname_no_symlink = re.compile(qa_soname_no_symlink)
- 
- 	libpaths = set(portage.util.getlibpaths(
- 		mysettings["ROOT"], env=mysettings))
- 	libpath_inodes = set()
- 	for libpath in libpaths:
- 		libdir = os.path.join(mysettings["ROOT"], libpath.lstrip(os.sep))
- 		try:
- 			s = os.stat(libdir)
- 		except OSError:
- 			continue
- 		else:
- 			libpath_inodes.add((s.st_dev, s.st_ino))
- 
- 	is_libdir_cache = {}
- 
- 	def is_libdir(obj_parent):
- 		try:
- 			return is_libdir_cache[obj_parent]
- 		except KeyError:
- 			pass
- 
- 		rval = False
- 		if obj_parent in libpaths:
- 			rval = True
- 		else:
- 			parent_path = os.path.join(mysettings["ROOT"],
- 				obj_parent.lstrip(os.sep))
- 			try:
- 				s = os.stat(parent_path)
- 			except OSError:
- 				pass
- 			else:
- 				if (s.st_dev, s.st_ino) in libpath_inodes:
- 					rval = True
- 
- 		is_libdir_cache[obj_parent] = rval
- 		return rval
- 
- 	build_info_dir = os.path.join(
- 		mysettings['PORTAGE_BUILDDIR'], 'build-info')
- 	try:
- 		with io.open(_unicode_encode(os.path.join(build_info_dir,
- 			"PROVIDES_EXCLUDE"), encoding=_encodings['fs'],
- 			errors='strict'), mode='r', encoding=_encodings['repo.content'],
- 			errors='replace') as f:
- 			provides_exclude = f.read()
- 	except IOError as e:
- 		if e.errno not in (errno.ENOENT, errno.ESTALE):
- 			raise
- 		provides_exclude = ""
- 
- 	try:
- 		with io.open(_unicode_encode(os.path.join(build_info_dir,
- 			"REQUIRES_EXCLUDE"), encoding=_encodings['fs'],
- 			errors='strict'), mode='r', encoding=_encodings['repo.content'],
- 			errors='replace') as f:
- 			requires_exclude = f.read()
- 	except IOError as e:
- 		if e.errno not in (errno.ENOENT, errno.ESTALE):
- 			raise
- 		requires_exclude = ""
- 
- 	missing_symlinks = []
- 	unrecognized_elf_files = []
- 	soname_deps = SonameDepsProcessor(
- 		provides_exclude, requires_exclude)
- 
- 	# Parse NEEDED.ELF.2 like LinkageMapELF.rebuild() does, and
- 	# rewrite it to include multilib categories.
- 	needed_file = portage.util.atomic_ofstream(needed_filename,
- 		encoding=_encodings["repo.content"], errors="strict")
- 
- 	for l in lines:
- 		l = l.rstrip("\n")
- 		if not l:
- 			continue
- 		try:
- 			entry = NeededEntry.parse(needed_filename, l)
- 		except InvalidData as e:
- 			portage.util.writemsg_level("\n%s\n\n" % (e,),
- 				level=logging.ERROR, noiselevel=-1)
- 			continue
- 
- 		filename = os.path.join(image_dir,
- 			entry.filename.lstrip(os.sep))
- 		with open(_unicode_encode(filename, encoding=_encodings['fs'],
- 			errors='strict'), 'rb') as f:
- 			elf_header = ELFHeader.read(f)
- 
- 		# Compute the multilib category and write it back to the file.
- 		entry.multilib_category = compute_multilib_category(elf_header)
- 		needed_file.write(str(entry))
- 
- 		if entry.multilib_category is None:
- 			if not qa_prebuilt or qa_prebuilt.match(
- 				entry.filename[len(mysettings["EPREFIX"]):].lstrip(
- 				os.sep)) is None:
- 				unrecognized_elf_files.append(entry)
- 		else:
- 			soname_deps.add(entry)
- 
- 		obj = entry.filename
- 		soname = entry.soname
- 
- 		if not soname:
- 			continue
- 		if not is_libdir(os.path.dirname(obj)):
- 			continue
- 		if qa_soname_no_symlink and qa_soname_no_symlink.match(obj.strip(os.sep)) is not None:
- 			continue
- 
- 		obj_file_path = os.path.join(image_dir, obj.lstrip(os.sep))
- 		sym_file_path = os.path.join(os.path.dirname(obj_file_path), soname)
- 		try:
- 			os.lstat(sym_file_path)
- 		except OSError as e:
- 			if e.errno not in (errno.ENOENT, errno.ESTALE):
- 				raise
- 		else:
- 			continue
- 
- 		missing_symlinks.append((obj, soname))
- 
- 	needed_file.close()
- 
- 	if soname_deps.requires is not None:
- 		with io.open(_unicode_encode(os.path.join(build_info_dir,
- 			'REQUIRES'), encoding=_encodings['fs'], errors='strict'),
- 			mode='w', encoding=_encodings['repo.content'],
- 			errors='strict') as f:
- 			f.write(soname_deps.requires)
- 
- 	if soname_deps.provides is not None:
- 		with io.open(_unicode_encode(os.path.join(build_info_dir,
- 			'PROVIDES'), encoding=_encodings['fs'], errors='strict'),
- 			mode='w', encoding=_encodings['repo.content'],
- 			errors='strict') as f:
- 			f.write(soname_deps.provides)
- 
- 	if unrecognized_elf_files:
- 		qa_msg = ["QA Notice: Unrecognized ELF file(s):"]
- 		qa_msg.append("")
- 		qa_msg.extend("\t%s" % str(entry).rstrip()
- 			for entry in unrecognized_elf_files)
- 		qa_msg.append("")
- 		for line in qa_msg:
- 			eqawarn(line, key=mysettings.mycpv, out=out)
- 
- 	if not missing_symlinks:
- 		return
+     needed_filename = os.path.join(
+         mysettings["PORTAGE_BUILDDIR"], "build-info", "NEEDED.ELF.2"
+     )
+ 
+     f = None
+     try:
+         f = io.open(
+             _unicode_encode(
+                 needed_filename, encoding=_encodings["fs"], errors="strict"
+             ),
+             mode="r",
+             encoding=_encodings["repo.content"],
+             errors="replace",
+         )
+         lines = f.readlines()
+     except IOError as e:
+         if e.errno not in (errno.ENOENT, errno.ESTALE):
+             raise
+         return
+     finally:
+         if f is not None:
+             f.close()
+ 
+     metadata = {}
+     for k in ("QA_PREBUILT", "QA_SONAME_NO_SYMLINK"):
+         try:
+             with io.open(
+                 _unicode_encode(
+                     os.path.join(mysettings["PORTAGE_BUILDDIR"], "build-info", k),
+                     encoding=_encodings["fs"],
+                     errors="strict",
+                 ),
+                 mode="r",
+                 encoding=_encodings["repo.content"],
+                 errors="replace",
+             ) as f:
+                 v = f.read()
+         except IOError as e:
+             if e.errno not in (errno.ENOENT, errno.ESTALE):
+                 raise
+         else:
+             metadata[k] = v
+ 
+     qa_prebuilt = metadata.get("QA_PREBUILT", "").strip()
+     if qa_prebuilt:
+         qa_prebuilt = re.compile(
+             "|".join(
+                 fnmatch.translate(x.lstrip(os.sep))
+                 for x in portage.util.shlex_split(qa_prebuilt)
+             )
+         )
+ 
+     qa_soname_no_symlink = metadata.get("QA_SONAME_NO_SYMLINK", "").split()
+     if qa_soname_no_symlink:
+         if len(qa_soname_no_symlink) > 1:
+             qa_soname_no_symlink = "|".join("(%s)" % x for x in qa_soname_no_symlink)
+             qa_soname_no_symlink = "^(%s)$" % qa_soname_no_symlink
+         else:
+             qa_soname_no_symlink = "^%s$" % qa_soname_no_symlink[0]
+         qa_soname_no_symlink = re.compile(qa_soname_no_symlink)
+ 
+     libpaths = set(portage.util.getlibpaths(mysettings["ROOT"], env=mysettings))
+     libpath_inodes = set()
+     for libpath in libpaths:
+         libdir = os.path.join(mysettings["ROOT"], libpath.lstrip(os.sep))
+         try:
+             s = os.stat(libdir)
+         except OSError:
+             continue
+         else:
+             libpath_inodes.add((s.st_dev, s.st_ino))
+ 
+     is_libdir_cache = {}
+ 
+     def is_libdir(obj_parent):
+         try:
+             return is_libdir_cache[obj_parent]
+         except KeyError:
+             pass
+ 
+         rval = False
+         if obj_parent in libpaths:
+             rval = True
+         else:
+             parent_path = os.path.join(mysettings["ROOT"], obj_parent.lstrip(os.sep))
+             try:
+                 s = os.stat(parent_path)
+             except OSError:
+                 pass
+             else:
+                 if (s.st_dev, s.st_ino) in libpath_inodes:
+                     rval = True
+ 
+         is_libdir_cache[obj_parent] = rval
+         return rval
+ 
+     build_info_dir = os.path.join(mysettings["PORTAGE_BUILDDIR"], "build-info")
+     try:
+         with io.open(
+             _unicode_encode(
+                 os.path.join(build_info_dir, "PROVIDES_EXCLUDE"),
+                 encoding=_encodings["fs"],
+                 errors="strict",
+             ),
+             mode="r",
+             encoding=_encodings["repo.content"],
+             errors="replace",
+         ) as f:
+             provides_exclude = f.read()
+     except IOError as e:
+         if e.errno not in (errno.ENOENT, errno.ESTALE):
+             raise
+         provides_exclude = ""
+ 
+     try:
+         with io.open(
+             _unicode_encode(
+                 os.path.join(build_info_dir, "REQUIRES_EXCLUDE"),
+                 encoding=_encodings["fs"],
+                 errors="strict",
+             ),
+             mode="r",
+             encoding=_encodings["repo.content"],
+             errors="replace",
+         ) as f:
+             requires_exclude = f.read()
+     except IOError as e:
+         if e.errno not in (errno.ENOENT, errno.ESTALE):
+             raise
+         requires_exclude = ""
+ 
+     missing_symlinks = []
+     unrecognized_elf_files = []
+     soname_deps = SonameDepsProcessor(provides_exclude, requires_exclude)
+ 
+     # Parse NEEDED.ELF.2 like LinkageMapELF.rebuild() does, and
+     # rewrite it to include multilib categories.
+     needed_file = portage.util.atomic_ofstream(
+         needed_filename, encoding=_encodings["repo.content"], errors="strict"
+     )
+ 
+     for l in lines:
+         l = l.rstrip("\n")
+         if not l:
+             continue
+         try:
+             entry = NeededEntry.parse(needed_filename, l)
+         except InvalidData as e:
+             portage.util.writemsg_level(
+                 "\n%s\n\n" % (e,), level=logging.ERROR, noiselevel=-1
+             )
+             continue
+ 
+         filename = os.path.join(image_dir, entry.filename.lstrip(os.sep))
+         with open(
+             _unicode_encode(filename, encoding=_encodings["fs"], errors="strict"), "rb"
+         ) as f:
+             elf_header = ELFHeader.read(f)
+ 
+         # Compute the multilib category and write it back to the file.
+         entry.multilib_category = compute_multilib_category(elf_header)
+         needed_file.write(str(entry))
+ 
+         if entry.multilib_category is None:
+             if (
+                 not qa_prebuilt
+                 or qa_prebuilt.match(
+                     entry.filename[len(mysettings["EPREFIX"]) :].lstrip(os.sep)
+                 )
+                 is None
+             ):
+                 unrecognized_elf_files.append(entry)
+         else:
+             soname_deps.add(entry)
+ 
+         obj = entry.filename
+         soname = entry.soname
+ 
+         if not soname:
+             continue
+         if not is_libdir(os.path.dirname(obj)):
+             continue
+         if (
+             qa_soname_no_symlink
+             and qa_soname_no_symlink.match(obj.strip(os.sep)) is not None
+         ):
+             continue
+ 
+         obj_file_path = os.path.join(image_dir, obj.lstrip(os.sep))
+         sym_file_path = os.path.join(os.path.dirname(obj_file_path), soname)
+         try:
+             os.lstat(sym_file_path)
+         except OSError as e:
+             if e.errno not in (errno.ENOENT, errno.ESTALE):
+                 raise
+         else:
+             continue
+ 
+         missing_symlinks.append((obj, soname))
+ 
+     needed_file.close()
+ 
+     if soname_deps.requires is not None:
+         with io.open(
+             _unicode_encode(
+                 os.path.join(build_info_dir, "REQUIRES"),
+                 encoding=_encodings["fs"],
+                 errors="strict",
+             ),
+             mode="w",
+             encoding=_encodings["repo.content"],
+             errors="strict",
+         ) as f:
+             f.write(soname_deps.requires)
+ 
+     if soname_deps.provides is not None:
+         with io.open(
+             _unicode_encode(
+                 os.path.join(build_info_dir, "PROVIDES"),
+                 encoding=_encodings["fs"],
+                 errors="strict",
+             ),
+             mode="w",
+             encoding=_encodings["repo.content"],
+             errors="strict",
+         ) as f:
+             f.write(soname_deps.provides)
+ 
+     if unrecognized_elf_files:
+         qa_msg = ["QA Notice: Unrecognized ELF file(s):"]
+         qa_msg.append("")
+         qa_msg.extend("\t%s" % str(entry).rstrip() for entry in unrecognized_elf_files)
+         qa_msg.append("")
+         for line in qa_msg:
+             eqawarn(line, key=mysettings.mycpv, out=out)
+ 
+     if not missing_symlinks:
+         return
+ 
+     qa_msg = ["QA Notice: Missing soname symlink(s):"]
+     qa_msg.append("")
+     qa_msg.extend(
+         "\t%s -> %s"
+         % (
+             os.path.join(os.path.dirname(obj).lstrip(os.sep), soname),
+             os.path.basename(obj),
+         )
+         for obj, soname in missing_symlinks
+     )
+     qa_msg.append("")
+     for line in qa_msg:
+         eqawarn(line, key=mysettings.mycpv, out=out)
  
- 	qa_msg = ["QA Notice: Missing soname symlink(s):"]
- 	qa_msg.append("")
- 	qa_msg.extend("\t%s -> %s" % (os.path.join(
- 		os.path.dirname(obj).lstrip(os.sep), soname),
- 		os.path.basename(obj))
- 		for obj, soname in missing_symlinks)
- 	qa_msg.append("")
- 	for line in qa_msg:
- 		eqawarn(line, key=mysettings.mycpv, out=out)
  
  def _merge_desktopfile_error(errors):
- 	lines = []
+     lines = []
+ 
+     msg = _(
+         "QA Notice: This package installs one or more .desktop files "
+         "that do not pass validation."
+     )
+     lines.extend(wrap(msg, 72))
  
- 	msg = _("QA Notice: This package installs one or more .desktop files "
- 		"that do not pass validation.")
- 	lines.extend(wrap(msg, 72))
+     lines.append("")
+     errors.sort()
+     lines.extend("\t" + x for x in errors)
+     lines.append("")
  
- 	lines.append("")
- 	errors.sort()
- 	lines.extend("\t" + x for x in errors)
- 	lines.append("")
+     return lines
  
- 	return lines
  
  def _merge_unicode_error(errors):
- 	lines = []
+     lines = []
  
- 	msg = _("QA Notice: This package installs one or more file names "
- 		"containing characters that are not encoded with the UTF-8 encoding.")
- 	lines.extend(wrap(msg, 72))
+     msg = _(
+         "QA Notice: This package installs one or more file names "
+         "containing characters that are not encoded with the UTF-8 encoding."
+     )
+     lines.extend(wrap(msg, 72))
  
- 	lines.append("")
- 	errors.sort()
- 	lines.extend("\t" + x for x in errors)
- 	lines.append("")
+     lines.append("")
+     errors.sort()
+     lines.extend("\t" + x for x in errors)
+     lines.append("")
+ 
+     return lines
  
- 	return lines
  
  def _prepare_self_update(settings):
- 	"""
- 	Call this when portage is updating itself, in order to create
- 	temporary copies of PORTAGE_BIN_PATH and PORTAGE_PYM_PATH, since
- 	the new versions may be incompatible. An atexit hook will
- 	automatically clean up the temporary copies.
- 	"""
- 
- 	# sanity check: ensure that that this routine only runs once
- 	if portage._bin_path != portage.const.PORTAGE_BIN_PATH:
- 		return
+     """
+     Call this when portage is updating itself, in order to create
+     temporary copies of PORTAGE_BIN_PATH and PORTAGE_PYM_PATH, since
+     the new versions may be incompatible. An atexit hook will
+     automatically clean up the temporary copies.
+     """
+ 
+     # sanity check: ensure that that this routine only runs once
+     if portage._bin_path != portage.const.PORTAGE_BIN_PATH:
+         return
+ 
+     # Load lazily referenced portage submodules into memory,
+     # so imports won't fail during portage upgrade/downgrade.
+     _preload_elog_modules(settings)
+     portage.proxy.lazyimport._preload_portage_submodules()
+ 
+     # Make the temp directory inside $PORTAGE_TMPDIR/portage, since
+     # it's common for /tmp and /var/tmp to be mounted with the
+     # "noexec" option (see bug #346899).
+     build_prefix = os.path.join(settings["PORTAGE_TMPDIR"], "portage")
+     portage.util.ensure_dirs(build_prefix)
+     base_path_tmp = tempfile.mkdtemp("", "._portage_reinstall_.", build_prefix)
+     portage.process.atexit_register(shutil.rmtree, base_path_tmp)
+ 
+     orig_bin_path = portage._bin_path
+     portage._bin_path = os.path.join(base_path_tmp, "bin")
+     shutil.copytree(orig_bin_path, portage._bin_path, symlinks=True)
+ 
+     orig_pym_path = portage._pym_path
+     portage._pym_path = os.path.join(base_path_tmp, "lib")
+     os.mkdir(portage._pym_path)
+     for pmod in PORTAGE_PYM_PACKAGES:
+         shutil.copytree(
+             os.path.join(orig_pym_path, pmod),
+             os.path.join(portage._pym_path, pmod),
+             symlinks=True,
+         )
+ 
+     for dir_path in (base_path_tmp, portage._bin_path, portage._pym_path):
+         os.chmod(dir_path, 0o755)
  
- 	# Load lazily referenced portage submodules into memory,
- 	# so imports won't fail during portage upgrade/downgrade.
- 	_preload_elog_modules(settings)
- 	portage.proxy.lazyimport._preload_portage_submodules()
- 
- 	# Make the temp directory inside $PORTAGE_TMPDIR/portage, since
- 	# it's common for /tmp and /var/tmp to be mounted with the
- 	# "noexec" option (see bug #346899).
- 	build_prefix = os.path.join(settings["PORTAGE_TMPDIR"], "portage")
- 	portage.util.ensure_dirs(build_prefix)
- 	base_path_tmp = tempfile.mkdtemp(
- 		"", "._portage_reinstall_.", build_prefix)
- 	portage.process.atexit_register(shutil.rmtree, base_path_tmp)
- 
- 	orig_bin_path = portage._bin_path
- 	portage._bin_path = os.path.join(base_path_tmp, "bin")
- 	shutil.copytree(orig_bin_path, portage._bin_path, symlinks=True)
- 
- 	orig_pym_path = portage._pym_path
- 	portage._pym_path = os.path.join(base_path_tmp, "lib")
- 	os.mkdir(portage._pym_path)
- 	for pmod in PORTAGE_PYM_PACKAGES:
- 		shutil.copytree(os.path.join(orig_pym_path, pmod),
- 			os.path.join(portage._pym_path, pmod),
- 			symlinks=True)
- 
- 	for dir_path in (base_path_tmp, portage._bin_path, portage._pym_path):
- 		os.chmod(dir_path, 0o755)
  
  def _handle_self_update(settings, vardb):
- 	cpv = settings.mycpv
- 	if settings["ROOT"] == "/" and \
- 		portage.dep.match_from_list(
- 		portage.const.PORTAGE_PACKAGE_ATOM, [cpv]):
- 		_prepare_self_update(settings)
- 		return True
- 	return False
+     cpv = settings.mycpv
+     if settings["ROOT"] == "/" and portage.dep.match_from_list(
+         portage.const.PORTAGE_PACKAGE_ATOM, [cpv]
+     ):
+         _prepare_self_update(settings)
+         return True
+     return False


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2022-03-21 11:26 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2022-03-21 11:26 UTC (permalink / raw
  To: gentoo-commits

commit:     b6385d6a20d226f3269841b576b7c8815a7ab2a1
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Mon Mar 21 11:24:59 2022 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Mon Mar 21 11:25:53 2022 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=b6385d6a

Merge tag 'portage-3.0.25' into multilib

portage-3.0.25

Signed-off-by: Thomas Sachau <tommy <AT> gentoo.org>

 NEWS                                             |  4 ++++
 RELEASE-NOTES                                    |  7 +++++++
 bin/isolated-functions.sh                        |  1 +
 lib/portage/package/ebuild/prepare_build_dirs.py | 13 ++++++++++---
 setup.py                                         |  2 +-
 5 files changed, 23 insertions(+), 4 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2022-03-21 11:27 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2022-03-21 11:27 UTC (permalink / raw
  To: gentoo-commits

commit:     8ac6d6ca167c003150fa2aea3835042144574f6e
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Mon Mar 21 11:27:20 2022 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Mon Mar 21 11:27:26 2022 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=8ac6d6ca

Merge tag 'portage-3.0.26' into multilib

portage-3.0.26

Signed-off-by: Thomas Sachau <tommy <AT> gentoo.org>

 NEWS                                             | 6 +++++-
 RELEASE-NOTES                                    | 2 +-
 lib/portage/package/ebuild/prepare_build_dirs.py | 3 +--
 setup.py                                         | 2 +-
 4 files changed, 8 insertions(+), 5 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2022-03-21 11:33 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2022-03-21 11:33 UTC (permalink / raw
  To: gentoo-commits

commit:     a7abb6f0d89a89e5225038909410c2781802adbb
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Mon Mar 21 11:33:10 2022 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Mon Mar 21 11:33:14 2022 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=a7abb6f0

Merge tag 'portage-3.0.27' into multilib

portage-3.0.27

Signed-off-by: Thomas Sachau <tommy <AT> gentoo.org>

 NEWS                                             |  6 +++
 RELEASE-NOTES                                    |  4 ++
 bin/install-qa-check.d/10ignored-flags           |  4 +-
 bin/isolated-functions.sh                        | 50 +++++++++++--------
 bin/save-ebuild-env.sh                           | 18 ++++---
 lib/_emerge/resolver/output.py                   |  2 +-
 lib/_emerge/resolver/output_helpers.py           |  2 +
 lib/portage/elog/messages.py                     | 10 ++--
 lib/portage/elog/mod_echo.py                     |  4 +-
 lib/portage/output.py                            | 63 ++++++++++++++++++++----
 lib/portage/package/ebuild/prepare_build_dirs.py | 10 +++-
 setup.py                                         |  2 +-
 12 files changed, 125 insertions(+), 50 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2022-03-21 11:34 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2022-03-21 11:34 UTC (permalink / raw
  To: gentoo-commits

commit:     e2085b63a9063d3a548347ec37f0a8448e6d35e7
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Mon Mar 21 11:33:54 2022 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Mon Mar 21 11:33:58 2022 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=e2085b63

Merge tag 'portage-3.0.28' into multilib

portage-3.0.28

Signed-off-by: Thomas Sachau <tommy <AT> gentoo.org>

 RELEASE-NOTES                                    |  4 +++
 bin/phase-functions.sh                           |  2 +-
 lib/portage/package/ebuild/prepare_build_dirs.py | 35 ++++++++----------------
 setup.py                                         |  2 +-
 4 files changed, 17 insertions(+), 26 deletions(-)

diff --cc bin/phase-functions.sh
index 4b8adb82c,d3221993d..f549832e4
--- a/bin/phase-functions.sh
+++ b/bin/phase-functions.sh
@@@ -319,9 -294,9 +319,9 @@@ __dyn_clean() 
  			"$PORTAGE_BUILDDIR"/.ipc_{in,out,lock} \
  			"$PORTAGE_BUILDDIR"/.exit_status
  
 -		rm -rf "${PORTAGE_BUILDDIR}/build-info"
 +		rm -rf "${PORTAGE_BUILDDIR}"/{build-info,abi-code}
  		rm -rf "${WORKDIR}"
- 		rm -rf "${PORTAGE_BUILDDIR}/files"
+ 		rm -f "${PORTAGE_BUILDDIR}/files"
  	fi
  
  	if [ -f "${PORTAGE_BUILDDIR}/.unpacked" ]; then


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2022-03-21 11:43 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2022-03-21 11:43 UTC (permalink / raw
  To: gentoo-commits

commit:     c492a43e90013713e05ba3e0ede1de30dc9a48e2
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Mon Mar 21 11:42:33 2022 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Mon Mar 21 11:42:55 2022 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=c492a43e

Merge tag 'portage-3.0.29' into multilib

Signed-off-by: Thomas Sachau <tommy <AT> gentoo.org>

 .github/workflows/ci.yml                           |  2 +-
 .gitignorerevs                                     |  2 +
 NEWS                                               | 10 +++
 RELEASE-NOTES                                      |  5 ++
 bin/ebuild-ipc.py                                  |  6 +-
 bin/ebuild.sh                                      | 39 ---------
 bin/estrip                                         | 99 +++++++++++++---------
 bin/isolated-functions.sh                          | 39 +++++++++
 bin/phase-functions.sh                             |  4 +-
 bin/phase-helpers.sh                               | 14 ++-
 cnf/make.conf.example.riscv.diff                   | 61 +++++++++++++
 cnf/make.globals                                   |  2 +-
 lib/_emerge/AbstractEbuildProcess.py               |  4 +-
 lib/_emerge/Binpkg.py                              | 15 +++-
 lib/_emerge/EbuildBuild.py                         | 19 ++++-
 lib/_emerge/EbuildIpcDaemon.py                     |  2 +-
 lib/_emerge/actions.py                             | 33 +++++---
 lib/_emerge/create_depgraph_params.py              |  2 +-
 lib/_emerge/depgraph.py                            | 27 +++---
 lib/_emerge/main.py                                | 10 +++
 lib/portage/const.py                               |  1 +
 lib/portage/dbapi/bintree.py                       |  9 +-
 lib/portage/dep/dep_check.py                       |  6 +-
 lib/portage/output.py                              |  6 +-
 lib/portage/package/ebuild/doebuild.py             | 17 +++-
 lib/portage/package/ebuild/fetch.py                |  7 +-
 lib/portage/package/ebuild/prepare_build_dirs.py   |  9 ++
 lib/portage/process.py                             |  2 -
 lib/portage/tests/ebuild/test_doebuild_spawn.py    |  1 +
 lib/portage/tests/ebuild/test_ipc_daemon.py        |  6 +-
 .../tests/resolver/test_unecessary_slot_upgrade.py | 62 ++++++++++++++
 lib/portage/util/_dyn_libs/dyn_libs.py             | 28 ++++++
 lib/portage/util/_xattr.py                         |  1 -
 lib/portage/util/futures/unix_events.py            |  1 -
 man/color.map.5                                    |  6 +-
 man/emerge.1                                       | 12 ++-
 man/make.conf.5                                    |  7 +-
 setup.py                                           | 10 ++-
 38 files changed, 434 insertions(+), 152 deletions(-)

diff --cc bin/phase-functions.sh
index f549832e4,5eb031805..32cf85b33
--- a/bin/phase-functions.sh
+++ b/bin/phase-functions.sh
@@@ -312,14 -288,13 +312,14 @@@ __dyn_clean() 
  	fi
  
  	if [[ $EMERGE_FROM = binary ]] || ! has keepwork $FEATURES; then
 -		rm -f "$PORTAGE_BUILDDIR"/.{ebuild_changed,logid,pretended,setuped,unpacked,prepared} \
 -			"$PORTAGE_BUILDDIR"/.{configured,compiled,tested,packaged,instprepped} \
 +		rm -f "$PORTAGE_BUILDDIR"/.{ebuild_changed,logid,pretended*,setuped*,unpacked*,prepared*} \
 +			"$PORTAGE_BUILDDIR"/.{configured*,compiled*,tested*,packaged*,instprepped} \
 +			"$PORTAGE_BUILDDIR"/.abi \
  			"$PORTAGE_BUILDDIR"/.die_hooks \
- 			"$PORTAGE_BUILDDIR"/.ipc_{in,out,lock} \
  			"$PORTAGE_BUILDDIR"/.exit_status
  
- 		rm -rf "${PORTAGE_BUILDDIR}"/{build-info,abi-code}
 -		rm -rf "${PORTAGE_BUILDDIR}/build-info" \
++		rm -rf "${PORTAGE_BUILDDIR}"/{build-info,abi-code} \
+ 			"${PORTAGE_BUILDDIR}/.ipc"
  		rm -rf "${WORKDIR}"
  		rm -f "${PORTAGE_BUILDDIR}/files"
  	fi


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [gentoo-commits] proj/portage:multilib commit in: /
@ 2022-03-21 11:57 Thomas Sachau
  0 siblings, 0 replies; 192+ messages in thread
From: Thomas Sachau @ 2022-03-21 11:57 UTC (permalink / raw
  To: gentoo-commits

commit:     a5893dcca4aae2fdcccbcb6578bf48c203f5e1d9
Author:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
AuthorDate: Mon Mar 21 11:52:31 2022 +0000
Commit:     Thomas Sachau <tommy <AT> gentoo <DOT> org>
CommitDate: Mon Mar 21 11:52:41 2022 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=a5893dcc

Merge tag 'portage-3.0.30' into multilib

portage-3.0.30

Signed-off-by: Thomas Sachau <tommy <AT> gentoo.org>

 DEVELOPING                                 | 19 ++++++++++++-------
 NEWS                                       |  5 +++++
 lib/portage/package/ebuild/doebuild.py     | 12 +++++-------
 setup.py                                   |  2 +-
 src/portage_util_file_copy_reflink_linux.c |  7 ++++---
 5 files changed, 27 insertions(+), 18 deletions(-)


^ permalink raw reply	[flat|nested] 192+ messages in thread

end of thread, other threads:[~2022-03-21 11:57 UTC | newest]

Thread overview: 192+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-05-20 10:41 [gentoo-commits] proj/portage:multilib commit in: / Thomas Sachau
  -- strict thread matches above, loose matches on Subject: below --
2022-03-21 11:57 Thomas Sachau
2022-03-21 11:43 Thomas Sachau
2022-03-21 11:34 Thomas Sachau
2022-03-21 11:33 Thomas Sachau
2022-03-21 11:27 Thomas Sachau
2022-03-21 11:26 Thomas Sachau
2022-03-21 10:01 Thomas Sachau
2021-10-30  9:44 Thomas Sachau
2021-10-30  9:44 Thomas Sachau
2021-07-25 11:43 Thomas Sachau
2021-07-25 11:43 Thomas Sachau
2021-07-25 11:43 Thomas Sachau
2021-04-03  8:28 Thomas Sachau
2021-04-03  8:28 Thomas Sachau
2021-04-03  8:28 Thomas Sachau
2021-04-03  8:28 Thomas Sachau
2021-01-23  9:52 Thomas Sachau
2021-01-15 16:20 Thomas Sachau
2021-01-15 16:20 Thomas Sachau
2021-01-15 16:20 Thomas Sachau
2021-01-15 16:20 Thomas Sachau
2021-01-15 16:20 Thomas Sachau
2020-10-30 10:29 Thomas Sachau
2020-08-23 12:22 Thomas Sachau
2020-07-05 17:57 Thomas Sachau
2019-12-26 11:56 Thomas Sachau
2019-03-17 11:35 Thomas Sachau
2019-03-09  9:56 Thomas Sachau
2018-09-01 11:03 Thomas Sachau
2018-05-23 12:23 Thomas Sachau
2018-04-14 12:16 Thomas Sachau
2018-03-03 15:18 Thomas Sachau
2018-01-07 10:43 Thomas Sachau
2018-01-07 10:43 Thomas Sachau
2018-01-07 10:43 Thomas Sachau
2018-01-07 10:43 Thomas Sachau
2018-01-07 10:43 Thomas Sachau
2018-01-07 10:43 Thomas Sachau
2018-01-07 10:43 Thomas Sachau
2018-01-07 10:43 Thomas Sachau
2018-01-07 10:43 Thomas Sachau
2018-01-07 10:43 Thomas Sachau
2018-01-07 10:43 Thomas Sachau
2018-01-07 10:38 Thomas Sachau
2018-01-07 10:33 Thomas Sachau
2018-01-07 10:33 Thomas Sachau
2018-01-07 10:33 Thomas Sachau
2018-01-07 10:33 Thomas Sachau
2018-01-07 10:33 Thomas Sachau
2018-01-07 10:30 Thomas Sachau
2018-01-07 10:09 Thomas Sachau
2018-01-07  9:50 Thomas Sachau
2018-01-07  9:39 Thomas Sachau
2016-02-28 12:37 Thomas Sachau
2016-02-28 12:37 Thomas Sachau
2016-02-28 12:37 Thomas Sachau
2016-02-28 12:37 Thomas Sachau
2016-02-28 12:37 Thomas Sachau
2016-02-28 12:37 Thomas Sachau
2015-10-04 11:38 Thomas Sachau
2015-10-04 11:38 Thomas Sachau
2015-10-04 11:38 Thomas Sachau
2015-10-04 11:38 Thomas Sachau
2015-10-04 11:38 Thomas Sachau
2015-05-05 11:29 Thomas Sachau
2014-12-12 20:23 Thomas Sachau
2014-12-12 20:23 Thomas Sachau
2014-12-12 20:23 Thomas Sachau
2014-12-12 20:23 Thomas Sachau
2014-12-12 20:23 Thomas Sachau
2014-06-02 20:00 Thomas Sachau
2013-09-15 20:54 Thomas Sachau
2013-09-15 11:39 Thomas Sachau
2013-09-15 11:06 Thomas Sachau
2013-09-10 16:53 Thomas Sachau
2013-08-25 19:50 Thomas Sachau
2013-08-18 20:55 Thomas Sachau
2013-08-04 11:19 Thomas Sachau
2013-08-04 11:19 Thomas Sachau
2013-05-31 12:16 Thomas Sachau
2013-05-10  8:01 Thomas Sachau
2013-04-14 13:20 Thomas Sachau
2013-04-03 11:51 Thomas Sachau
2013-03-28 19:31 Thomas Sachau
2013-03-23 16:24 Thomas Sachau
2013-03-08 17:46 Thomas Sachau
2013-03-03 13:44 Thomas Sachau
2013-02-16 18:47 Thomas Sachau
2013-01-26 17:19 Thomas Sachau
2013-01-26 17:19 Thomas Sachau
2013-01-26 17:19 Thomas Sachau
2013-01-26 17:19 Thomas Sachau
2013-01-26 17:19 Thomas Sachau
2013-01-26 17:19 Thomas Sachau
2013-01-26 17:19 Thomas Sachau
2013-01-26 17:19 Thomas Sachau
2013-01-26 17:19 Thomas Sachau
2013-01-26 17:19 Thomas Sachau
2013-01-12 11:21 Thomas Sachau
2012-12-16 10:49 Thomas Sachau
2012-12-14 20:16 Thomas Sachau
2012-12-14 20:14 Thomas Sachau
2012-12-09 10:54 Thomas Sachau
2012-12-07 22:24 Thomas Sachau
2012-11-30 16:44 Thomas Sachau
2012-10-29 12:23 Thomas Sachau
2012-10-22  8:57 Thomas Sachau
2012-10-14  9:35 Thomas Sachau
2012-10-06 11:34 Thomas Sachau
2012-09-29 12:51 Thomas Sachau
2012-09-24 20:38 Thomas Sachau
2012-09-22 15:33 Thomas Sachau
2012-09-22 15:23 Thomas Sachau
2012-09-17 17:07 Thomas Sachau
2012-09-08 12:55 Thomas Sachau
2012-09-08 12:55 Thomas Sachau
2012-09-08 12:55 Thomas Sachau
2012-09-08 12:55 Thomas Sachau
2012-09-08 12:55 Thomas Sachau
2012-09-08 12:55 Thomas Sachau
2012-09-08 12:55 Thomas Sachau
2012-09-08 12:55 Thomas Sachau
2012-07-08 10:03 Thomas Sachau
2012-07-01 12:01 Thomas Sachau
2012-06-10 12:42 Thomas Sachau
2012-06-03 12:33 Thomas Sachau
2012-05-28 10:19 Thomas Sachau
2012-05-17 10:00 Thomas Sachau
2012-05-12  7:57 Thomas Sachau
2012-05-11 20:38 Thomas Sachau
2012-04-24 21:26 Thomas Sachau
2012-04-06 11:50 Thomas Sachau
2012-04-04 12:42 Thomas Sachau
2012-04-01 22:00 Thomas Sachau
2012-03-30 18:55 Thomas Sachau
2012-03-24 10:51 Thomas Sachau
2012-03-23 14:42 Thomas Sachau
2012-03-21 18:50 Thomas Sachau
2012-03-18 15:29 Thomas Sachau
2012-03-06 18:21 Thomas Sachau
2012-02-26 16:27 Thomas Sachau
2012-02-25 12:04 Thomas Sachau
2012-02-23 19:08 Thomas Sachau
2012-02-18 15:52 Thomas Sachau
2012-02-06 19:38 Thomas Sachau
2011-12-28 13:33 Thomas Sachau
2011-12-24 14:16 Thomas Sachau
2011-12-16 16:30 Thomas Sachau
2011-12-07 21:31 Thomas Sachau
2011-11-26 14:03 Thomas Sachau
2011-11-19 14:25 Thomas Sachau
2011-11-18 23:27 Thomas Sachau
2011-11-11 22:52 Thomas Sachau
2011-10-31 19:53 Thomas Sachau
2011-10-24 18:54 Thomas Sachau
2011-10-23 11:05 Thomas Sachau
2011-10-23 11:05 Thomas Sachau
2011-10-21 13:57 Thomas Sachau
2011-10-12 16:28 Thomas Sachau
2011-10-09 10:33 Thomas Sachau
2011-10-08  8:34 Thomas Sachau
2011-10-07 12:41 Thomas Sachau
2011-10-01 13:56 Thomas Sachau
2011-10-01 13:56 Thomas Sachau
2011-09-11 14:33 Thomas Sachau
2011-09-09 13:03 Thomas Sachau
2011-08-16 12:20 Thomas Sachau
2011-08-05 12:29 Thomas Sachau
2011-08-01 16:53 Thomas Sachau
2011-07-28 17:07 Thomas Sachau
2011-07-21 19:18 Thomas Sachau
2011-07-15 13:24 Thomas Sachau
2011-07-05 17:34 Thomas Sachau
2011-06-16 16:54 Thomas Sachau
2011-06-07 15:44 Thomas Sachau
2011-05-28 13:14 Thomas Sachau
2011-05-26 17:55 Thomas Sachau
2011-05-22  9:42 Thomas Sachau
2011-05-14  9:59 Thomas Sachau
2011-05-07 18:38 Thomas Sachau
2011-04-16 10:17 Thomas Sachau
2011-04-16 10:17 Thomas Sachau
2011-03-28 17:24 Thomas Sachau
2011-03-19 19:39 Thomas Sachau
2011-03-17 17:58 Thomas Sachau
2011-03-03 19:53 Thomas Sachau
2011-02-25 13:45 Thomas Sachau
2011-02-16 20:15 Thomas Sachau
2011-02-10 18:12 Thomas Sachau
2011-02-08 18:12 Thomas Sachau
2011-02-06 13:10 Thomas Sachau

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox