From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from lists.gentoo.org (pigeon.gentoo.org [208.92.234.80]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by finch.gentoo.org (Postfix) with ESMTPS id 2E403158009 for ; Sat, 17 Jun 2023 08:41:08 +0000 (UTC) Received: from pigeon.gentoo.org (localhost [127.0.0.1]) by pigeon.gentoo.org (Postfix) with SMTP id 6776BE09C9; Sat, 17 Jun 2023 08:41:07 +0000 (UTC) Received: from smtp.gentoo.org (dev.gentoo.org [IPv6:2001:470:ea4a:1:5054:ff:fec7:86e4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by pigeon.gentoo.org (Postfix) with ESMTPS id 25DA7E09C9 for ; Sat, 17 Jun 2023 08:41:07 +0000 (UTC) Received: from oystercatcher.gentoo.org (oystercatcher.gentoo.org [148.251.78.52]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by smtp.gentoo.org (Postfix) with ESMTPS id E40C6340CC3 for ; Sat, 17 Jun 2023 08:41:05 +0000 (UTC) Received: from localhost.localdomain (localhost [IPv6:::1]) by oystercatcher.gentoo.org (Postfix) with ESMTP id 4D66AA80 for ; Sat, 17 Jun 2023 08:41:04 +0000 (UTC) From: "Fabian Groffen" To: gentoo-commits@lists.gentoo.org Content-Transfer-Encoding: 8bit Content-type: text/plain; charset=UTF-8 Reply-To: gentoo-dev@lists.gentoo.org, "Fabian Groffen" Message-ID: <1686991227.46fc4d8a2205d98584c4198070e42933c1cd1e62.grobian@gentoo> Subject: [gentoo-commits] proj/portage:prefix commit in: / X-VCS-Repository: proj/portage X-VCS-Committer: grobian X-VCS-Committer-Name: Fabian Groffen X-VCS-Revision: 46fc4d8a2205d98584c4198070e42933c1cd1e62 X-VCS-Branch: prefix Date: Sat, 17 Jun 2023 08:41:04 +0000 (UTC) Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-Id: Gentoo Linux mail X-BeenThere: gentoo-commits@lists.gentoo.org X-Auto-Response-Suppress: DR, RN, NRN, OOF, AutoReply X-Archives-Salt: 7ddf4875-6f4d-4fd5-9dc9-f1ee33f818be X-Archives-Hash: f92384fc0b25fa598c3dc5024c4c46f7 commit: 46fc4d8a2205d98584c4198070e42933c1cd1e62 Author: Fabian Groffen gentoo org> AuthorDate: Sat Jun 17 08:40:27 2023 +0000 Commit: Fabian Groffen gentoo org> CommitDate: Sat Jun 17 08:40:27 2023 +0000 URL: https://gitweb.gentoo.org/proj/portage.git/commit/?id=46fc4d8a Merge remote-tracking branch 'origin/master' into prefix Signed-off-by: Fabian Groffen gentoo.org> .builds/ci.yml | 39 + .builds/lint.yml | 47 + .builds/setup-python.sh | 30 + .editorconfig | 4 + .git-blame-ignore-revs | 6 + .github/workflows/black.yml | 18 - .github/workflows/ci.yml | 64 +- .github/workflows/lint.yml | 49 + .github/workflows/pre-commit.yml | 14 + .gitignore | 6 + .pre-commit-config.yaml | 21 + DEVELOPING | 47 +- NEWS | 695 ++++- README.md | 11 + bin/archive-conf | 23 +- bin/bashrc-functions.sh | 18 +- bin/binhost-snapshot | 33 +- bin/check-implicit-pointer-usage.py | 79 - bin/chmod-lite.py | 1 - bin/chpathtool.py | 20 +- bin/clean_locks | 6 +- bin/deprecated-path | 28 - bin/dispatch-conf | 51 +- bin/dohtml.py | 26 +- bin/doins.py | 24 +- bin/eapi.sh | 4 +- bin/ebuild | 773 +++--- bin/ebuild-helpers/bsd/sed | 3 +- bin/ebuild-helpers/dobin | 16 +- bin/ebuild-helpers/doconfd | 6 +- bin/ebuild-helpers/dodir | 4 +- bin/ebuild-helpers/dodoc | 8 +- bin/ebuild-helpers/doenvd | 6 +- bin/ebuild-helpers/doexe | 23 +- bin/ebuild-helpers/dohard | 4 +- bin/ebuild-helpers/doheader | 6 +- bin/ebuild-helpers/dohtml | 10 +- bin/ebuild-helpers/doinfo | 6 +- bin/ebuild-helpers/doinitd | 4 +- bin/ebuild-helpers/doins | 20 +- bin/ebuild-helpers/dolib | 22 +- bin/ebuild-helpers/doman | 10 +- bin/ebuild-helpers/domo | 20 +- bin/ebuild-helpers/dosbin | 14 +- bin/ebuild-helpers/dosed | 8 +- bin/ebuild-helpers/dosym | 20 +- bin/ebuild-helpers/fowners | 36 +- bin/ebuild-helpers/fperms | 33 +- bin/ebuild-helpers/newins | 14 +- bin/ebuild-helpers/portageq | 27 +- bin/ebuild-helpers/prepallstrip | 6 +- bin/ebuild-helpers/prepinfo | 11 +- bin/ebuild-helpers/prepman | 6 +- bin/ebuild-helpers/prepstrip | 6 +- bin/ebuild-helpers/unprivileged/chown | 3 +- bin/ebuild-helpers/xattr/install | 2 +- bin/ebuild-ipc.py | 526 ++-- bin/ebuild-pyhelper | 4 +- bin/ebuild.sh | 192 +- bin/ecompress | 25 +- bin/ecompress-file | 15 +- bin/egencache | 2433 +++++++++-------- bin/emaint | 87 +- bin/emerge | 62 +- bin/emerge-webrsync | 490 ++-- bin/env-update | 2 +- bin/estrip | 108 +- bin/etc-update | 32 +- bin/filter-bash-environment.py | 2 +- bin/fixpackages | 4 +- bin/glsa-check | 37 +- bin/gpkg-helper.py | 27 +- bin/gpkg-sign | 77 + bin/install-qa-check.d/05prefix | 8 +- bin/install-qa-check.d/10executable-issues | 2 +- bin/install-qa-check.d/10ignored-flags | 2 +- bin/install-qa-check.d/20deprecated-directories | 6 +- bin/install-qa-check.d/60pkgconfig | 61 +- bin/install-qa-check.d/60udev | 5 +- bin/install-qa-check.d/80libraries | 2 +- bin/install-qa-check.d/90bad-bin-owner | 2 +- bin/install-qa-check.d/90config-impl-decl | 141 + bin/install-qa-check.d/90cython-dep | 45 + bin/install-qa-check.d/90gcc-warnings | 132 +- bin/install-qa-check.d/90world-writable | 10 +- bin/install.py | 3 +- bin/isolated-functions.sh | 80 +- bin/lock-helper.py | 1 - bin/misc-functions.sh | 133 +- bin/phase-functions.sh | 278 +- bin/phase-helpers.sh | 246 +- bin/pid-ns-init | 6 +- bin/portageq | 2854 ++++++++++---------- bin/portageq-wrapper | 19 + bin/postinst-qa-check.d/50xdg-utils | 21 +- bin/quickpkg | 102 +- bin/regenworld | 14 +- bin/save-ebuild-env.sh | 12 +- bin/socks5-server.py | 2 +- bin/xattr-helper.py | 7 +- bin/xpak-helper.py | 14 +- cnf/make.conf.example | 17 + cnf/make.conf.example.loong.diff | 56 + cnf/sets/portage.conf | 12 +- doc/api/conf.py | 6 +- lib/_emerge/AbstractEbuildProcess.py | 94 +- lib/_emerge/AbstractPollTask.py | 5 +- lib/_emerge/AsynchronousLock.py | 40 +- lib/_emerge/AsynchronousTask.py | 3 +- lib/_emerge/AtomArg.py | 1 - lib/_emerge/Binpkg.py | 88 +- lib/_emerge/BinpkgEnvExtractor.py | 6 +- lib/_emerge/BinpkgExtractorAsync.py | 71 +- lib/_emerge/BinpkgFetcher.py | 50 +- lib/_emerge/BinpkgPrefetcher.py | 10 +- lib/_emerge/BinpkgVerifier.py | 22 +- lib/_emerge/Blocker.py | 1 - lib/_emerge/BlockerCache.py | 5 +- lib/_emerge/BlockerDB.py | 5 +- lib/_emerge/CompositeTask.py | 3 +- lib/_emerge/DepPriority.py | 1 - lib/_emerge/DependencyArg.py | 3 +- lib/_emerge/EbuildBinpkg.py | 36 +- lib/_emerge/EbuildBuild.py | 34 +- lib/_emerge/EbuildBuildDir.py | 3 +- lib/_emerge/EbuildExecuter.py | 7 +- lib/_emerge/EbuildFetcher.py | 17 +- lib/_emerge/EbuildFetchonly.py | 5 +- lib/_emerge/EbuildIpcDaemon.py | 3 +- lib/_emerge/EbuildMerge.py | 11 +- lib/_emerge/EbuildMetadataPhase.py | 5 +- lib/_emerge/EbuildPhase.py | 33 +- lib/_emerge/EbuildProcess.py | 2 - lib/_emerge/EbuildSpawnProcess.py | 1 - lib/_emerge/FakeVartree.py | 7 +- lib/_emerge/FifoIpcDaemon.py | 1 - lib/_emerge/JobStatusDisplay.py | 23 +- lib/_emerge/MergeListItem.py | 13 +- lib/_emerge/MetadataRegen.py | 21 +- lib/_emerge/Package.py | 50 +- lib/_emerge/PackageMerge.py | 65 +- lib/_emerge/PackagePhase.py | 6 +- lib/_emerge/PackageUninstall.py | 10 +- lib/_emerge/PipeReader.py | 2 - lib/_emerge/PollScheduler.py | 8 +- lib/_emerge/Scheduler.py | 105 +- lib/_emerge/SequentialTaskQueue.py | 2 - lib/_emerge/SetArg.py | 1 - lib/_emerge/SpawnProcess.py | 27 +- lib/_emerge/SubProcess.py | 9 +- lib/_emerge/Task.py | 7 +- lib/_emerge/UseFlagDisplay.py | 7 +- lib/_emerge/UserQuery.py | 7 +- lib/_emerge/actions.py | 496 ++-- lib/_emerge/chk_updated_cfg_files.py | 8 +- lib/_emerge/countdown.py | 6 +- lib/_emerge/create_depgraph_params.py | 8 +- lib/_emerge/create_world_atom.py | 4 +- lib/_emerge/depgraph.py | 1060 ++++---- lib/_emerge/emergelog.py | 10 +- lib/_emerge/getloadavg.py | 2 +- lib/_emerge/is_valid_package_atom.py | 2 +- lib/_emerge/main.py | 22 +- lib/_emerge/post_emerge.py | 9 +- lib/_emerge/resolver/backtracking.py | 8 +- lib/_emerge/resolver/circular_dependency.py | 24 +- lib/_emerge/resolver/output.py | 59 +- lib/_emerge/resolver/output_helpers.py | 50 +- lib/_emerge/resolver/package_tracker.py | 6 +- lib/_emerge/resolver/slot_collision.py | 95 +- lib/_emerge/search.py | 25 +- lib/_emerge/show_invalid_depstring_notice.py | 11 +- lib/_emerge/stdout_spinner.py | 1 + lib/_emerge/unmerge.py | 49 +- lib/portage/__init__.py | 31 +- lib/portage/_compat_upgrade/binpkg_compression.py | 4 +- .../_compat_upgrade/binpkg_multi_instance.py | 8 +- lib/portage/_compat_upgrade/default_locations.py | 12 +- lib/portage/_emirrordist/Config.py | 17 +- lib/portage/_emirrordist/ContentDB.py | 16 +- lib/portage/_emirrordist/DeletionIterator.py | 18 +- lib/portage/_emirrordist/DeletionTask.py | 40 +- lib/portage/_emirrordist/FetchIterator.py | 21 +- lib/portage/_emirrordist/FetchTask.py | 118 +- lib/portage/_emirrordist/MirrorDistTask.py | 55 +- lib/portage/_emirrordist/main.py | 12 +- lib/portage/_global_updates.py | 4 +- lib/portage/_selinux.py | 4 +- lib/portage/_sets/ProfilePackageSet.py | 6 +- lib/portage/_sets/__init__.py | 42 +- lib/portage/_sets/base.py | 16 +- lib/portage/_sets/dbapi.py | 74 +- lib/portage/_sets/files.py | 38 +- lib/portage/_sets/libs.py | 6 +- lib/portage/_sets/profiles.py | 12 +- lib/portage/_sets/security.py | 4 +- lib/portage/_sets/shell.py | 4 +- lib/portage/binpkg.py | 32 +- lib/portage/cache/anydbm.py | 5 +- lib/portage/cache/cache_errors.py | 15 +- lib/portage/cache/ebuild_xattr.py | 17 +- lib/portage/cache/flat_hash.py | 22 +- lib/portage/cache/fs_template.py | 7 +- lib/portage/cache/index/IndexStreamIterator.py | 4 - lib/portage/cache/index/pkg_desc_index.py | 3 +- lib/portage/cache/mappings.py | 3 - lib/portage/cache/metadata.py | 20 +- lib/portage/cache/sql_template.py | 18 +- lib/portage/cache/sqlite.py | 25 +- lib/portage/cache/template.py | 35 +- lib/portage/cache/volatile.py | 3 +- lib/portage/checksum.py | 235 +- lib/portage/const.py | 10 +- lib/portage/cvstree.py | 12 +- lib/portage/data.py | 7 +- lib/portage/dbapi/IndexedPortdb.py | 8 +- .../dbapi/_ContentsCaseSensitivityManager.py | 8 +- lib/portage/dbapi/_MergeProcess.py | 15 +- lib/portage/dbapi/_SyncfsProcess.py | 2 - lib/portage/dbapi/_VdbMetadataDelta.py | 11 +- lib/portage/dbapi/__init__.py | 19 +- lib/portage/dbapi/_similar_name_search.py | 1 - lib/portage/dbapi/bintree.py | 717 +++-- lib/portage/dbapi/porttree.py | 67 +- lib/portage/dbapi/vartree.py | 378 ++- lib/portage/dbapi/virtual.py | 21 +- lib/portage/debug.py | 12 +- lib/portage/dep/__init__.py | 51 +- lib/portage/dep/_dnf.py | 10 +- lib/portage/dep/_slot_operator.py | 9 +- lib/portage/dep/dep_check.py | 36 +- lib/portage/dep/soname/SonameAtom.py | 11 +- lib/portage/dep/soname/multilib_category.py | 7 +- lib/portage/dispatch_conf.py | 7 +- lib/portage/elog/__init__.py | 9 +- lib/portage/elog/messages.py | 4 +- lib/portage/elog/mod_mail.py | 2 +- lib/portage/elog/mod_mail_summary.py | 4 +- lib/portage/elog/mod_save.py | 10 +- lib/portage/elog/mod_save_summary.py | 9 +- lib/portage/elog/mod_syslog.py | 2 +- lib/portage/emaint/main.py | 40 +- lib/portage/emaint/modules/binhost/binhost.py | 8 +- lib/portage/emaint/modules/config/config.py | 5 +- lib/portage/emaint/modules/logs/logs.py | 5 +- lib/portage/emaint/modules/merges/merges.py | 26 +- lib/portage/emaint/modules/move/move.py | 13 +- lib/portage/emaint/modules/resume/resume.py | 9 +- lib/portage/emaint/modules/sync/sync.py | 6 +- lib/portage/emaint/modules/world/world.py | 9 +- lib/portage/env/config.py | 16 +- lib/portage/env/loaders.py | 8 +- lib/portage/exception.py | 2 +- lib/portage/getbinpkg.py | 15 +- lib/portage/glsa.py | 33 +- lib/portage/gpkg.py | 386 ++- lib/portage/locks.py | 32 +- lib/portage/mail.py | 5 +- lib/portage/manifest.py | 36 +- lib/portage/module.py | 16 +- lib/portage/news.py | 137 +- lib/portage/output.py | 29 +- .../package/ebuild/_config/LicenseManager.py | 1 - .../package/ebuild/_config/LocationsManager.py | 29 +- .../package/ebuild/_config/special_env_vars.py | 545 ++-- lib/portage/package/ebuild/_ipc/ExitCommand.py | 2 - lib/portage/package/ebuild/_ipc/IpcCommand.py | 1 - lib/portage/package/ebuild/_ipc/QueryCommand.py | 29 +- lib/portage/package/ebuild/_metadata_invalid.py | 3 +- .../ebuild/_parallel_manifest/ManifestProcess.py | 7 +- .../ebuild/_parallel_manifest/ManifestScheduler.py | 5 +- .../ebuild/_parallel_manifest/ManifestTask.py | 3 +- lib/portage/package/ebuild/config.py | 74 +- .../package/ebuild/deprecated_profile_check.py | 4 +- lib/portage/package/ebuild/digestcheck.py | 2 +- lib/portage/package/ebuild/digestgen.py | 8 +- lib/portage/package/ebuild/doebuild.py | 277 +- lib/portage/package/ebuild/fetch.py | 70 +- lib/portage/package/ebuild/getmaskingstatus.py | 13 +- lib/portage/package/ebuild/prepare_build_dirs.py | 32 +- lib/portage/process.py | 87 +- lib/portage/proxy/lazyimport.py | 12 +- lib/portage/repository/config.py | 80 +- .../repository/storage/hardlink_quarantine.py | 6 +- lib/portage/repository/storage/hardlink_rcu.py | 4 +- lib/portage/sync/controller.py | 13 +- lib/portage/sync/modules/git/git.py | 258 +- lib/portage/sync/modules/mercurial/mercurial.py | 40 +- lib/portage/sync/modules/rsync/rsync.py | 58 +- lib/portage/sync/modules/svn/svn.py | 10 +- lib/portage/sync/modules/webrsync/__init__.py | 4 +- lib/portage/sync/modules/webrsync/webrsync.py | 56 +- lib/portage/sync/old_tree_timestamp.py | 4 +- lib/portage/sync/syncbase.py | 33 +- lib/portage/tests/__init__.py | 23 +- lib/portage/tests/bin/test_doins.py | 4 +- lib/portage/tests/bin/test_eapi7_ver_funcs.py | 30 +- lib/portage/tests/bin/test_filter_bash_env.py | 23 +- lib/portage/tests/conftest.py | 89 + lib/portage/tests/dbapi/test_auxdb.py | 5 +- lib/portage/tests/dbapi/test_bintree.py | 155 ++ lib/portage/tests/dbapi/test_fakedbapi.py | 2 +- lib/portage/tests/dbapi/test_portdb_cache.py | 32 +- lib/portage/tests/dep/testAtom.py | 27 +- lib/portage/tests/dep/testStandalone.py | 5 +- lib/portage/tests/dep/test_dep_getcpv.py | 1 - lib/portage/tests/dep/test_dep_getrepo.py | 1 - lib/portage/tests/dep/test_dep_getslot.py | 1 - lib/portage/tests/dep/test_dep_getusedeps.py | 3 +- lib/portage/tests/dep/test_dnf_convert.py | 1 - lib/portage/tests/dep/test_get_operator.py | 3 +- .../tests/dep/test_get_required_use_flags.py | 2 +- lib/portage/tests/dep/test_isjustname.py | 5 +- lib/portage/tests/dep/test_isvalidatom.py | 3 +- lib/portage/tests/dep/test_match_from_list.py | 2 +- lib/portage/tests/dep/test_overlap_dnf.py | 1 - lib/portage/tests/dep/test_paren_reduce.py | 1 - lib/portage/tests/dep/test_soname_atom_pickle.py | 1 - lib/portage/tests/dep/test_use_reduce.py | 3 +- .../tests/ebuild/test_array_fromfile_eof.py | 2 +- lib/portage/tests/ebuild/test_config.py | 10 +- lib/portage/tests/ebuild/test_doebuild_fd_pipes.py | 2 - lib/portage/tests/ebuild/test_doebuild_spawn.py | 2 - lib/portage/tests/ebuild/test_fetch.py | 48 +- lib/portage/tests/ebuild/test_ipc_daemon.py | 1 - lib/portage/tests/ebuild/test_shell_quote.py | 2 +- lib/portage/tests/ebuild/test_spawn.py | 8 +- .../tests/ebuild/test_use_expand_incremental.py | 8 +- lib/portage/tests/emerge/test_actions.py | 45 + lib/portage/tests/emerge/test_config_protect.py | 12 +- .../emerge/test_emerge_blocker_file_collision.py | 10 +- lib/portage/tests/emerge/test_emerge_slot_abi.py | 10 +- lib/portage/tests/emerge/test_simple.py | 19 +- .../tests/env/config/test_PackageKeywordsFile.py | 3 +- .../tests/env/config/test_PackageUseFile.py | 3 +- .../tests/env/config/test_PortageModulesFile.py | 3 +- lib/portage/tests/glsa/test_security_set.py | 139 +- lib/portage/tests/gpkg/test_gpkg_checksum.py | 46 +- lib/portage/tests/gpkg/test_gpkg_gpg.py | 48 +- .../tests/gpkg/test_gpkg_metadata_update.py | 3 - lib/portage/tests/gpkg/test_gpkg_metadata_url.py | 13 - lib/portage/tests/gpkg/test_gpkg_path.py | 20 - lib/portage/tests/gpkg/test_gpkg_size.py | 4 - lib/portage/tests/gpkg/test_gpkg_stream.py | 19 - .../test_lazy_import_portage_baseline.py | 1 - lib/portage/tests/lint/test_compile_modules.py | 2 +- lib/portage/tests/lint/test_import_modules.py | 2 +- lib/portage/tests/locks/test_asynchronous_lock.py | 31 +- lib/portage/tests/news/test_NewsItem.py | 442 ++- lib/portage/tests/process/test_PipeLogger.py | 2 +- lib/portage/tests/process/test_PopenProcess.py | 15 +- .../tests/process/test_PopenProcessBlockingIO.py | 22 +- lib/portage/tests/process/test_poll.py | 15 +- lib/portage/tests/process/test_spawn_fail_e2big.py | 30 + .../tests/process/test_spawn_warn_large_env.py | 46 + lib/portage/tests/process/test_unshare_net.py | 38 +- lib/portage/tests/resolver/ResolverPlayground.py | 78 +- .../test_build_id_profile_format.py | 4 +- .../binpkg_multi_instance/test_rebuilt_binaries.py | 4 +- .../tests/resolver/soname/test_autounmask.py | 4 +- lib/portage/tests/resolver/soname/test_depclean.py | 1 - .../tests/resolver/soname/test_downgrade.py | 7 +- .../tests/resolver/soname/test_or_choices.py | 4 +- .../tests/resolver/soname/test_reinstall.py | 4 +- .../tests/resolver/soname/test_skip_update.py | 4 +- .../soname/test_slot_conflict_reinstall.py | 18 +- .../resolver/soname/test_slot_conflict_update.py | 4 +- .../tests/resolver/soname/test_soname_provided.py | 4 +- .../tests/resolver/soname/test_unsatisfiable.py | 4 +- .../tests/resolver/soname/test_unsatisfied.py | 4 +- .../test_aggressive_backtrack_downgrade.py | 1 - lib/portage/tests/resolver/test_autounmask.py | 26 +- .../tests/resolver/test_autounmask_binpkg_use.py | 3 +- .../tests/resolver/test_autounmask_multilib_use.py | 6 +- .../tests/resolver/test_autounmask_parent.py | 1 - .../tests/resolver/test_autounmask_use_breakage.py | 1 - .../resolver/test_autounmask_use_slot_conflict.py | 5 +- lib/portage/tests/resolver/test_bdeps.py | 4 +- .../resolver/test_binary_pkg_ebuild_visibility.py | 4 +- lib/portage/tests/resolver/test_changed_deps.py | 4 +- .../tests/resolver/test_circular_choices.py | 5 - .../tests/resolver/test_circular_choices_rust.py | 1 - .../tests/resolver/test_circular_dependencies.py | 2 - ...test_complete_if_new_subslot_without_revbump.py | 4 +- lib/portage/tests/resolver/test_depclean.py | 3 - lib/portage/tests/resolver/test_depclean_order.py | 1 - lib/portage/tests/resolver/test_depth.py | 1 - .../resolver/test_disjunctive_depend_order.py | 3 +- lib/portage/tests/resolver/test_eapi.py | 44 +- .../resolver/test_imagemagick_graphicsmagick.py | 1 - lib/portage/tests/resolver/test_multirepo.py | 5 +- lib/portage/tests/resolver/test_onlydeps_ideps.py | 172 ++ .../tests/resolver/test_onlydeps_minimal.py | 25 + lib/portage/tests/resolver/test_or_choices.py | 8 +- lib/portage/tests/resolver/test_package_tracker.py | 3 +- .../tests/resolver/test_perl_rebuild_bug.py | 121 + .../tests/resolver/test_profile_default_eapi.py | 6 +- .../tests/resolver/test_profile_package_set.py | 6 +- .../test_regular_slot_change_without_revbump.py | 4 +- lib/portage/tests/resolver/test_required_use.py | 1 - lib/portage/tests/resolver/test_simple.py | 3 +- lib/portage/tests/resolver/test_slot_abi.py | 9 +- .../tests/resolver/test_slot_abi_downgrade.py | 7 +- .../resolver/test_slot_change_without_revbump.py | 4 +- lib/portage/tests/resolver/test_slot_collisions.py | 1 - .../resolver/test_slot_conflict_blocked_prune.py | 78 + .../resolver/test_slot_conflict_force_rebuild.py | 1 - .../tests/resolver/test_slot_conflict_rebuild.py | 10 +- .../test_slot_conflict_unsatisfied_deep_deps.py | 1 - .../tests/resolver/test_slot_conflict_update.py | 1 - .../resolver/test_slot_conflict_update_virt.py | 1 - .../resolver/test_slot_operator_autounmask.py | 5 +- .../tests/resolver/test_slot_operator_bdeps.py | 4 +- .../resolver/test_slot_operator_complete_graph.py | 1 - .../resolver/test_slot_operator_exclusive_slots.py | 1 - .../resolver/test_slot_operator_missed_update.py | 1 - .../tests/resolver/test_slot_operator_rebuild.py | 4 +- .../resolver/test_slot_operator_required_use.py | 1 - .../resolver/test_slot_operator_reverse_deps.py | 1 - .../test_slot_operator_runtime_pkg_mask.py | 1 - .../resolver/test_slot_operator_unsatisfied.py | 1 - .../tests/resolver/test_slot_operator_unsolved.py | 5 +- ..._slot_operator_update_probe_parent_downgrade.py | 1 - .../test_solve_non_slot_operator_slot_conflicts.py | 1 - lib/portage/tests/resolver/test_update.py | 106 + .../tests/resolver/test_use_dep_defaults.py | 1 - lib/portage/tests/resolver/test_useflags.py | 3 +- lib/portage/tests/resolver/test_virtual_slot.py | 4 - lib/portage/tests/runTests.py | 14 +- .../tests/sets/base/testInternalPackageSet.py | 4 +- .../base/testVariableSet.py} | 24 +- lib/portage/tests/sets/shell/testShell.py | 3 +- lib/portage/tests/sync/test_sync_local.py | 21 +- lib/portage/tests/unicode/test_string_format.py | 15 +- lib/portage/tests/update/test_move_ent.py | 7 +- lib/portage/tests/update/test_move_slot_ent.py | 4 +- lib/portage/tests/update/test_update_dbentry.py | 4 +- .../tests/util/eventloop/test_call_soon_fifo.py | 1 - lib/portage/tests/util/file_copy/test_copyfile.py | 16 +- .../util/futures/asyncio/test_child_watcher.py | 1 - .../tests/util/futures/asyncio/test_pipe_closed.py | 4 +- .../util/futures/asyncio/test_subprocess_exec.py | 2 - .../util/futures/asyncio/test_wakeup_fd_sigchld.py | 2 +- .../tests/util/futures/test_compat_coroutine.py | 1 - .../tests/util/futures/test_done_callback.py | 1 - .../tests/util/futures/test_iter_completed.py | 2 - lib/portage/tests/util/futures/test_retry.py | 16 +- lib/portage/tests/util/test_checksum.py | 49 +- lib/portage/tests/util/test_digraph.py | 60 +- lib/portage/tests/util/test_file_copier.py | 1 - lib/portage/tests/util/test_getconfig.py | 4 +- lib/portage/tests/util/test_install_mask.py | 6 +- lib/portage/tests/util/test_manifest.py | 31 + lib/portage/tests/util/test_normalizedPath.py | 1 - lib/portage/tests/util/test_shelve.py | 4 +- lib/portage/tests/util/test_socks5.py | 4 +- lib/portage/tests/util/test_stackDicts.py | 2 - lib/portage/tests/util/test_stackLists.py | 1 - lib/portage/tests/util/test_varExpand.py | 17 +- lib/portage/tests/util/test_whirlpool.py | 49 +- lib/portage/tests/util/test_xattr.py | 2 +- lib/portage/tests/versions/test_cpv_sort_key.py | 1 - lib/portage/tests/versions/test_vercmp.py | 11 +- lib/portage/tests/xpak/test_decodeint.py | 1 - lib/portage/update.py | 23 +- lib/portage/util/ExtractKernelVersion.py | 10 +- lib/portage/util/__init__.py | 163 +- lib/portage/util/_async/AsyncScheduler.py | 4 +- lib/portage/util/_async/BuildLogger.py | 2 +- lib/portage/util/_async/FileCopier.py | 2 +- lib/portage/util/_async/FileDigester.py | 1 - lib/portage/util/_async/ForkProcess.py | 9 +- lib/portage/util/_async/PipeLogger.py | 1 - lib/portage/util/_async/PipeReaderBlockingIO.py | 23 +- lib/portage/util/_async/PopenProcess.py | 2 - lib/portage/util/_async/SchedulerInterface.py | 4 +- lib/portage/util/_dyn_libs/LinkageMapELF.py | 46 +- .../util/_dyn_libs/PreservedLibsRegistry.py | 6 +- .../util/_dyn_libs/display_preserved_libs.py | 13 +- lib/portage/util/_dyn_libs/soname_deps.py | 4 +- lib/portage/util/_dyn_libs/soname_deps_qa.py | 9 +- lib/portage/util/_get_vm_info.py | 2 - lib/portage/util/_info_files.py | 13 +- lib/portage/util/_path.py | 4 +- lib/portage/util/_pty.py | 4 +- lib/portage/util/_xattr.py | 10 +- lib/portage/util/backoff.py | 2 +- lib/portage/util/bin_entry_point.py | 2 +- lib/portage/util/changelog.py | 2 +- lib/portage/util/compression_probe.py | 9 +- lib/portage/util/configparser.py | 7 +- lib/portage/util/cpuinfo.py | 22 +- lib/portage/util/digraph.py | 12 +- lib/portage/util/elf/constants.py | 1 + lib/portage/util/elf/header.py | 1 - lib/portage/util/env_update.py | 69 +- lib/portage/util/file_copy/__init__.py | 2 - lib/portage/util/futures/_asyncio/__init__.py | 6 +- lib/portage/util/futures/_asyncio/streams.py | 2 +- lib/portage/util/futures/_sync_decorator.py | 1 - lib/portage/util/futures/compat_coroutine.py | 1 + lib/portage/util/futures/executor/fork.py | 13 +- lib/portage/util/futures/extendedfutures.py | 10 +- lib/portage/util/futures/iter_completed.py | 3 +- lib/portage/util/futures/unix_events.py | 4 +- lib/portage/util/hooks.py | 2 +- lib/portage/util/iterators/MultiIterGroupBy.py | 5 - lib/portage/util/listdir.py | 6 +- lib/portage/util/locale.py | 7 +- lib/portage/util/movefile.py | 77 +- lib/portage/util/mtimedb.py | 4 +- lib/portage/util/netlink.py | 2 +- lib/portage/util/shelve.py | 4 +- lib/portage/util/socks5.py | 2 +- lib/portage/util/whirlpool.py | 81 +- lib/portage/util/writeable_check.py | 7 +- lib/portage/versions.py | 21 +- lib/portage/xml/metadata.py | 12 +- lib/portage/xpak.py | 23 +- man/ebuild.1 | 9 +- man/ebuild.5 | 100 +- man/emerge.1 | 53 +- man/make.conf.5 | 70 +- man/portage.5 | 51 +- man/ru/ebuild.1 | 10 +- man/xpak.5 | 9 +- runtests | 17 +- setup.py | 50 +- src/portage_util__whirlpool.c | 1141 ++++++++ src/portage_util_file_copy_reflink_linux.c | 25 +- src/portage_util_libc.c | 27 +- tox.ini | 30 +- 532 files changed, 13827 insertions(+), 10224 deletions(-) diff --cc bin/ebuild-helpers/dohtml index e061bc173,55339238e..5384eeb8b --- a/bin/ebuild-helpers/dohtml +++ b/bin/ebuild-helpers/dohtml @@@ -16,10 -16,8 +16,10 @@@ f # Use safe cwd, avoiding unsafe import for bug #469338. export __PORTAGE_HELPER_CWD=${PWD} cd "${PORTAGE_PYM_PATH}" || die +# BEGIN PREFIX LOCAL: use Prefix Python fallback PYTHONPATH=${PORTAGE_PYTHONPATH:-${PORTAGE_PYM_PATH}} \ - "${PORTAGE_PYTHON:-@PREFIX_PORTAGE_PYTHON@}" "$PORTAGE_BIN_PATH/dohtml.py" "$@" - "${PORTAGE_PYTHON:-/usr/bin/python}" "${PORTAGE_BIN_PATH}/dohtml.py" "$@" ++ "${PORTAGE_PYTHON:-@PREFIX_PORTAGE_PYTHON@}" "${PORTAGE_BIN_PATH}/dohtml.py" "$@" +# END PREFIX LOCAL ret=$? # Restore cwd for display by __helpers_die diff --cc bin/emerge-webrsync index 85a4d15d7,3835977fc..db4bb6d1e --- a/bin/emerge-webrsync +++ b/bin/emerge-webrsync @@@ -43,10 -79,9 +79,10 @@@ if [[ -x "${scriptpath%/*}/portageq" ]] elif type -P portageq > /dev/null ; then portageq=portageq else - eecho "could not find 'portageq'; aborting" - exit 1 + die "could not find 'portageq'; aborting" fi + +# PREFIX LOCAL: retrieve PORTAGE_USER/PORTAGE_GROUP eval "$("${portageq}" envvar -v DISTDIR EPREFIX FEATURES \ FETCHCOMMAND GENTOO_MIRRORS \ PORTAGE_BIN_PATH PORTAGE_CONFIGROOT PORTAGE_GPG_DIR \ @@@ -252,11 -411,9 +418,11 @@@ get_snapshot_timestamp() sync_local() { local file="$1" - __vecho "Syncing local tree ..." + [[ ${PORTAGE_QUIET} -eq 1 ]] || einfo "Syncing local repository ..." - local ownership="portage:portage" + # PREFIX LOCAL: use PORTAGE_USER and PORTAGE_GROUP + local ownership="${PORTAGE_USER:-portage}:${PORTAGE_GROUP:-portage}" + # END PREFIX LOCAL if has usersync ${FEATURES} ; then case "${USERLAND}" in BSD) diff --cc bin/install-qa-check.d/05prefix index ac059723f,7488ad9e4..8a83893f1 --- a/bin/install-qa-check.d/05prefix +++ b/bin/install-qa-check.d/05prefix @@@ -80,14 -76,12 +80,14 @@@ install_qa_check_prefix() fi continue fi - # unprefixed shebang, is the script directly in ${PATH}? - if [[ ":${PATH}:" == *":${fp}:"* ]] ; then + # BEGIN PREFIX LOCAL: also check init scripts - # unprefixed shebang, is the script directly in $PATH or an init ++ # unprefixed shebang, is the script directly in ${PATH} or an init + # script? + if [[ ":${PATH}:${EPREFIX}/etc/init.d:" == *":${fp}:"* ]] ; then if [[ -e ${EROOT}${line[0]} || -e ${ED}${line[0]} ]] ; then - # is it unprefixed, but we can just fix it because a - # prefixed variant exists - eqawarn "prefixing shebang of ${fn#${D}}" + # is it unprefixed, but we can just fix it because an + # eprefixed variant exists + eqawarn "eprefixing shebang of ${fn#${D%/}/}" # statement is made idempotent on purpose, because # symlinks may point to the same target, and hence the # same real file may be sedded multiple times since we diff --cc bin/isolated-functions.sh index 20e9c735c,06be030fb..47e18cc6b --- a/bin/isolated-functions.sh +++ b/bin/isolated-functions.sh @@@ -439,26 -444,22 +444,30 @@@ if [[ -z ${NO_COLOR} ]] ; the no|false) __set_colors ;; - esac + esac + else + __unset_colors + fi + -if [[ -z ${USERLAND} ]] ; then - case $(uname -s) in - *BSD|DragonFly) - export USERLAND="BSD" - ;; - *) - export USERLAND="GNU" - ;; - esac -fi +# BEGIN PREFIX LOCAL +# In Prefix every platform has USERLAND=GNU, even FreeBSD. Since I +# don't know how to reliably "figure out" we are in a Prefix instance of +# portage here, I for now disable this check, and hardcode it to GNU. +# Somehow it appears stange to me that this code is in this file, +# non-ebuilds/eclasses should never rely on USERLAND and XARGS, don't they? +#if [[ -z ${USERLAND} ]] ; then +# case $(uname -s) in +# *BSD|DragonFly) +# export USERLAND="BSD" +# ;; +# *) +# export USERLAND="GNU" +# ;; +# esac +#fi +[[ -z ${USERLAND} ]] && USERLAND="GNU" +# END PREFIX LOCAL if [[ -z ${XARGS} ]] ; then case ${USERLAND} in @@@ -644,12 -653,12 +661,13 @@@ debug-print() printf 'debug: %s\n' "${@}" >> "${ECLASS_DEBUG_OUTPUT}" fi - if [[ -w $T ]] ; then - # default target + if [[ -w ${T} ]] ; then + # Default target printf '%s\n' "${@}" >> "${T}/eclass-debug.log" - # let the portage user own/write to this file + + # Let the portage user own/write to this file - chgrp "${PORTAGE_GRPNAME:-portage}" "${T}/eclass-debug.log" + # PREFIX LOCAL: fallback to configured group + chgrp "${PORTAGE_GRPNAME:-${PORTAGE_GROUP}}" "${T}/eclass-debug.log" chmod g+w "${T}/eclass-debug.log" fi } diff --cc bin/misc-functions.sh index 91010ec65,d9319d5af..b32d06483 --- a/bin/misc-functions.sh +++ b/bin/misc-functions.sh @@@ -275,163 -265,14 +292,160 @@@ install_qa_check_misc() "${PORTAGE_BIN_PATH}"/estrip --ignore "${PORTAGE_DOSTRIP_SKIP[@]}" "${PORTAGE_BIN_PATH}"/estrip --dequeue else - prepallstrip + "${PORTAGE_BIN_PATH}"/estrip --prepallstrip fi fi - - # Portage regenerates this on the installed system. - rm -f "${ED%/}"/usr/share/info/dir{,.gz,.bz2} || die "rm failed!" } +install_qa_check_macho() { + if ! has binchecks ${RESTRICT} ; then + # on Darwin, dynamic libraries are called .dylibs instead of + # .sos. In addition the version component is before the + # extension, not after it. Check for this, and *only* warn + # about it. Some packages do ship .so files on Darwin and make + # it work (ugly!). + rm -f "${T}/mach-o.check" + find ${ED%/} -name "*.so" -or -name "*.so.*" | \ + while read i ; do + [[ $(file $i) == *"Mach-O"* ]] && \ + echo "${i#${D}}" >> "${T}/mach-o.check" + done + if [[ -f ${T}/mach-o.check ]] ; then + f=$(< "${T}/mach-o.check") + __vecho -ne '\a\n' + eqawarn "QA Notice: Found .so dynamic libraries on Darwin:" + eqawarn " ${f//$'\n'/\n }" + fi + rm -f "${T}/mach-o.check" + + # The naming for dynamic libraries is different on Darwin; the + # version component is before the extention, instead of after + # it, as with .sos. Again, make this a warning only. + rm -f "${T}/mach-o.check" + find ${ED%/} -name "*.dylib.*" | \ + while read i ; do + echo "${i#${D}}" >> "${T}/mach-o.check" + done + if [[ -f "${T}/mach-o.check" ]] ; then + f=$(< "${T}/mach-o.check") + __vecho -ne '\a\n' + eqawarn "QA Notice: Found wrongly named dynamic libraries on Darwin:" + eqawarn " ${f// /\n }" + fi + rm -f "${T}/mach-o.check" + fi + + install_name_is_relative() { + case $1 in + "@executable_path/"*) return 0 ;; + "@loader_path"/*) return 0 ;; + "@rpath/"*) return 0 ;; + *) return 1 ;; + esac + } + + # While we generate the NEEDED files, check that we don't get kernel + # traps at runtime because of broken install_names on Darwin. + rm -f "${T}"/.install_name_check_failed + scanmacho -qyRF '%a;%p;%S;%n' "${D}" | { while IFS= read l ; do + arch=${l%%;*}; l=${l#*;} + obj="/${l%%;*}"; l=${l#*;} + install_name=${l%%;*}; l=${l#*;} + needed=${l%%;*}; l=${l#*;} + + ignore= + qa_var="QA_IGNORE_INSTALL_NAME_FILES_${ARCH/-/_}" + eval "[[ -n \${!qa_var} ]] && + QA_IGNORE_INSTALL_NAME_FILES=(\"\${${qa_var}[@]}\")" + + if [[ ${#QA_IGNORE_INSTALL_NAME_FILES[@]} -gt 1 ]] ; then + for x in "${QA_IGNORE_INSTALL_NAME_FILES[@]}" ; do + [[ ${obj##*/} == ${x} ]] && \ + ignore=true + done + else + local shopts=$- + set -o noglob + for x in ${QA_IGNORE_INSTALL_NAME_FILES} ; do + [[ ${obj##*/} == ${x} ]] && \ + ignore=true + done + set +o noglob + set -${shopts} + fi + + # See if the self-reference install_name points to an existing + # and to be installed file. This usually is a symlink for the + # major version. + if install_name_is_relative ${install_name} ; then + # try to locate the library in the installed image + local inpath=${install_name#@*/} + local libl + for libl in $(find "${ED}" -name "${inpath##*/}") ; do + if [[ ${libl} == */${inpath} ]] ; then + install_name=/${libl#${D}} + break + fi + done + fi + if [[ ! -e ${D}${install_name} ]] ; then + eqawarn "QA Notice: invalid self-reference install_name ${install_name} in ${obj}" + # remember we are in an implicit subshell, that's + # why we touch a file here ... ideally we should be + # able to die correctly/nicely here + [[ -z ${ignore} ]] && touch "${T}"/.install_name_check_failed + fi + + # this is ugly, paths with spaces won't work + for lib in ${needed//,/ } ; do + if [[ ${lib} == ${D}* ]] ; then + eqawarn "QA Notice: install_name references \${D}: ${lib} in ${obj}" + [[ -z ${ignore} ]] && touch "${T}"/.install_name_check_failed + elif [[ ${lib} == ${S}* ]] ; then + eqawarn "QA Notice: install_name references \${S}: ${lib} in ${obj}" + [[ -z ${ignore} ]] && touch "${T}"/.install_name_check_failed + elif ! install_name_is_relative ${lib} ; then + local isok=no + if [[ -e ${lib} || -e ${D}${lib} ]] ; then + isok=yes # yay, we're ok + elif [[ -e "${EROOT}"/MacOSX.sdk ]] ; then + # trigger SDK mode, at least since Big Sur (11.0) + # there are no libraries in /usr/lib any more, but + # there are references too it (some library cache is + # in place), yet we can validate it sort of is sane + # by looking at the SDK metacaches, TAPI-files, .tbd + # text versions of libraries, so just look there + local tbd=${lib%.*}.tbd + if [[ -e ${EROOT}/MacOSX.sdk/${lib%.*}.tbd ]] ; then + isok=yes # it's in the SDK, so ok + elif [[ -e ${EROOT}/MacOSX.sdk/${lib}.tbd ]] ; then + isok=yes # this happens in case of Framework refs + fi + fi + if [[ ${isok} == no ]] ; then + eqawarn "QA Notice: invalid reference to ${lib} in ${obj}" + [[ -z ${ignore} ]] && \ + touch "${T}"/.install_name_check_failed + fi + fi + done + + # backwards compatibility + echo "${obj} ${needed}" >> "${PORTAGE_BUILDDIR}"/build-info/NEEDED + # what we use + echo "${arch};${obj};${install_name};${needed}" >> "${PORTAGE_BUILDDIR}"/build-info/NEEDED.MACHO.3 + done } + if [[ -f ${T}/.install_name_check_failed ]] ; then + # secret switch "allow_broken_install_names" to get + # around this and install broken crap (not a good idea) + has allow_broken_install_names ${FEATURES} || \ + die "invalid install_name found, your application or library will crash at runtime" + fi +} + __dyn_instprep() { if [[ -e ${PORTAGE_BUILDDIR}/.instprepped ]] ; then - __vecho ">>> It appears that '$PF' is already instprepped; skipping." + __vecho ">>> It appears that '${PF}' is already instprepped; skipping." __vecho ">>> Remove '${PORTAGE_BUILDDIR}/.instprepped' to force instprep." return 0 fi @@@ -686,20 -526,25 +699,27 @@@ __dyn_package() die "PORTAGE_BINPKG_TMPFILE is unset" mkdir -p "${PORTAGE_BINPKG_TMPFILE%/*}" || die "mkdir failed" + if [[ ! -z "${BUILD_ID}" ]]; then + echo -n "${BUILD_ID}" > "${PORTAGE_BUILDDIR}"/build-info/BUILD_ID + fi + if [[ "${BINPKG_FORMAT}" == "xpak" ]]; then local tar_options="" - [[ $PORTAGE_VERBOSE = 1 ]] && tar_options+=" -v" + + [[ ${PORTAGE_VERBOSE} = 1 ]] && tar_options+=" -v" has xattr ${FEATURES} && [[ $(tar --help 2> /dev/null) == *--xattrs* ]] && tar_options+=" --xattrs" - [[ -z "${PORTAGE_COMPRESSION_COMMAND}" ]] && \ - die "PORTAGE_COMPRESSION_COMMAND is unset" - tar $tar_options -cf - $PORTAGE_BINPKG_TAR_OPTS -C "${D}" . | \ - $PORTAGE_COMPRESSION_COMMAND > "$PORTAGE_BINPKG_TMPFILE" - assert "failed to pack binary package: '$PORTAGE_BINPKG_TMPFILE'" + + [[ -z "${PORTAGE_COMPRESSION_COMMAND}" ]] && die "PORTAGE_COMPRESSION_COMMAND is unset" + + tar ${tar_options} -cf - ${PORTAGE_BINPKG_TAR_OPTS} -C "${D}" . | \ + ${PORTAGE_COMPRESSION_COMMAND} > "${PORTAGE_BINPKG_TMPFILE}" + assert "failed to pack binary package: '${PORTAGE_BINPKG_TMPFILE}'" + + # BEGIN PREFIX LOCAL: use PREFIX_PORTAGE_PYTHON fallback PYTHONPATH=${PORTAGE_PYTHONPATH:-${PORTAGE_PYM_PATH}} \ - "${PORTAGE_PYTHON:-@PREFIX_PORTAGE_PYTHON@}" "$PORTAGE_BIN_PATH"/xpak-helper.py recompose \ - "$PORTAGE_BINPKG_TMPFILE" "$PORTAGE_BUILDDIR/build-info" - "${PORTAGE_PYTHON:-/usr/bin/python}" "${PORTAGE_BIN_PATH}"/xpak-helper.py recompose \ ++ "${PORTAGE_PYTHON:-@PREFIX_PORTAGE_PYTHON@}" "${PORTAGE_BIN_PATH}"/xpak-helper.py recompose \ + "${PORTAGE_BINPKG_TMPFILE}" "${PORTAGE_BUILDDIR}/build-info" + # END PREFIX LOCAL if [[ $? -ne 0 ]]; then rm -f "${PORTAGE_BINPKG_TMPFILE}" die "Failed to append metadata to the tbz2 file" @@@ -717,11 -563,9 +738,11 @@@ __vecho ">>> Done." elif [[ "${BINPKG_FORMAT}" == "gpkg" ]]; then + # BEGIN PREFIX LOCAL: use PREFIX_PORTAGE_PYTHON fallback PYTHONPATH=${PORTAGE_PYTHONPATH:-${PORTAGE_PYM_PATH}} \ - "${PORTAGE_PYTHON:-@PREFIX_PORTAGE_PYTHON@}" "$PORTAGE_BIN_PATH"/gpkg-helper.py compress \ - "${CATEGORY}/${PF}" "$PORTAGE_BINPKG_TMPFILE" "$PORTAGE_BUILDDIR/build-info" "${D}" - "${PORTAGE_PYTHON:-/usr/bin/python}" "${PORTAGE_BIN_PATH}"/gpkg-helper.py compress \ ++ "${PORTAGE_PYTHON:-@PREFIX_PORTAGE_PYTHON@}" "${PORTAGE_BIN_PATH}"/gpkg-helper.py compress \ + "${PF}${BUILD_ID:+-${BUILD_ID}}" "${PORTAGE_BINPKG_TMPFILE}" "${PORTAGE_BUILDDIR}/build-info" "${D}" + # END PREFIX LOCAL if [[ $? -ne 0 ]]; then rm -f "${PORTAGE_BINPKG_TMPFILE}" die "Failed to create binpkg file" diff --cc bin/phase-functions.sh index 8efd12f22,071941ff7..d0f3a0f85 --- a/bin/phase-functions.sh +++ b/bin/phase-functions.sh @@@ -1099,15 -1108,17 +1109,17 @@@ __ebuild_main() # Use safe cwd, avoiding unsafe import for bug #469338. cd "${PORTAGE_PYM_PATH}" __save_ebuild_env | __filter_readonly_variables \ - --filter-features > "$T/environment" + --filter-features > "${T}/environment" assert "__save_ebuild_env failed" - # PREFIX LOCAL: use configure group - chgrp "${PORTAGE_GRPNAME:-${PORTAGE_GROUP}}" "$T/environment" - chmod g+w "$T/environment" - - chgrp "${PORTAGE_GRPNAME:-portage}" "${T}/environment" ++ # PREFIX LOCAL: use configured group ++ chgrp "${PORTAGE_GRPNAME:-${PORTAGE_GROUP}}" "${T}/environment" + chmod g+w "${T}/environment" 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 $? + + [[ -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/save-ebuild-env.sh index 3520d0416,bba468da1..36eedc7fa mode 100755,100644..100755 --- a/bin/save-ebuild-env.sh +++ b/bin/save-ebuild-env.sh diff --cc lib/_emerge/depgraph.py index c5d0343b7,28acfed9d..c6b63738a --- a/lib/_emerge/depgraph.py +++ b/lib/_emerge/depgraph.py @@@ -11869,20 -11801,8 +11801,20 @@@ def _get_masking_status(pkg, pkgsetting if not pkg.installed: if not pkgsettings._accept_chost(pkg.cpv, pkg._metadata): - mreasons.append(_MaskReason("CHOST", "CHOST: %s" % pkg._metadata["CHOST"])) + mreasons.append(_MaskReason("CHOST", f"CHOST: {pkg._metadata['CHOST']}")) + # BEGIN PREFIX LOCAL: check EPREFIX + eprefix = pkgsettings["EPREFIX"] + if len(eprefix.rstrip('/')) > 0 and pkg.built and not pkg.installed: + if not "EPREFIX" in pkg._metadata: + mreasons.append(_MaskReason("EPREFIX", + "missing EPREFIX")) + elif len(pkg._metadata["EPREFIX"].strip()) < len(eprefix): + mreasons.append(_MaskReason("EPREFIX", + "EPREFIX: '%s' too small" % \ + pkg._metadata["EPREFIX"])) + # END PREFIX LOCAL + if pkg.invalid: for msgs in pkg.invalid.values(): for msg in msgs: diff --cc lib/portage/__init__.py index ab3017a5d,aa7e69920..ea1ebc2bb --- a/lib/portage/__init__.py +++ b/lib/portage/__init__.py @@@ -53,18 -51,7 +53,17 @@@ except ImportError as e sys.stderr.write(f" {e}\n\n") raise +# BEGIN PREFIX LOCAL +# for bug #758230, on macOS the default was switched from fork to spawn, +# the latter causing issues because all kinds of things can't be +# pickled, so force fork mode for now +try: + multiprocessing.set_start_method('fork') +except RuntimeError: + pass +# END PREFIX LOCAL + try: - import portage.proxy.lazyimport import portage.proxy as proxy diff --cc lib/portage/const.py index 980b40b4b,10a208ceb..8aa7e557f --- a/lib/portage/const.py +++ b/lib/portage/const.py @@@ -1,16 -1,8 +1,15 @@@ # portage: Constants - # Copyright 1998-2021 Gentoo Authors + # Copyright 1998-2023 Gentoo Authors # Distributed under the terms of the GNU General Public License v2 +# BEGIN PREFIX LOCAL +# =========================================================================== +# autotool supplied constants. +# =========================================================================== +from portage.const_autotool import * +# END PREFIX LOCAL + import os - import sys # =========================================================================== # START OF CONSTANTS -- START OF CONSTANTS -- START OF CONSTANTS -- START OF diff --cc lib/portage/dbapi/bintree.py index 986ffeb3d,5f58c548d..78f760444 --- a/lib/portage/dbapi/bintree.py +++ b/lib/portage/dbapi/bintree.py @@@ -104,36 -104,31 +104,33 @@@ class bindbapi(fakedbapi) self.bintree = mybintree self.move_ent = mybintree.move_ent # Selectively cache metadata in order to optimize dep matching. - self._aux_cache_keys = set( - [ - "BDEPEND", - "BINPKG_FORMAT", - "BUILD_ID", - "BUILD_TIME", - "CHOST", - "DEFINED_PHASES", - "DEPEND", - "EAPI", - "IDEPEND", - "IUSE", - "KEYWORDS", - "LICENSE", - "MD5", - "PDEPEND", - "PROPERTIES", - "PROVIDES", - "RDEPEND", - "repository", - "REQUIRES", - "RESTRICT", - "SIZE", - "SLOT", - "USE", - "_mtime_", - # PREFIX LOCAL - "EPREFIX", - ] - ) + self._aux_cache_keys = { + "BDEPEND", + "BUILD_ID", + "BUILD_TIME", + "CHOST", + "DEFINED_PHASES", + "DEPEND", + "EAPI", + "IDEPEND", + "IUSE", + "KEYWORDS", + "LICENSE", + "MD5", + "PDEPEND", + "PROPERTIES", + "PROVIDES", + "RDEPEND", + "repository", + "REQUIRES", + "RESTRICT", + "SIZE", + "SLOT", + "USE", + "_mtime_", ++ # PREFIX LOCAL ++ "EPREFIX", + } self._aux_cache_slot_dict = slot_dict_class(self._aux_cache_keys) self._aux_cache = {} @@@ -474,150 -468,134 +470,140 @@@ class binarytree stacklevel=2, ) - if True: - self.pkgdir = normalize_path(pkgdir) - # NOTE: Event if binpkg-multi-instance is disabled, it's - # still possible to access a PKGDIR which uses the - # binpkg-multi-instance layout (or mixed layout). - self._multi_instance = "binpkg-multi-instance" in settings.features - if self._multi_instance: - self._allocate_filename = self._allocate_filename_multi - self.dbapi = bindbapi(self, settings=settings) - self.update_ents = self.dbapi.update_ents - self.move_slot_ent = self.dbapi.move_slot_ent - self.populated = 0 - self.tree = {} - self._binrepos_conf = None - self._remote_has_index = False - self._remotepkgs = None # remote metadata indexed by cpv - self._additional_pkgs = {} - self.invalids = [] - self.settings = settings - self._pkg_paths = {} - self._populating = False - self._all_directory = os.path.isdir(os.path.join(self.pkgdir, "All")) - self._pkgindex_version = 0 - self._pkgindex_hashes = ["MD5", "SHA1"] - self._pkgindex_file = os.path.join(self.pkgdir, "Packages") - self._pkgindex_keys = self.dbapi._aux_cache_keys.copy() - self._pkgindex_keys.update(["CPV", "SIZE"]) - self._pkgindex_aux_keys = [ - "BASE_URI", - "BDEPEND", - "BINPKG_FORMAT", - "BUILD_ID", - "BUILD_TIME", - "CHOST", - "DEFINED_PHASES", - "DEPEND", - "DESCRIPTION", - "EAPI", - "FETCHCOMMAND", - "IDEPEND", - "IUSE", - "KEYWORDS", - "LICENSE", - "PDEPEND", - "PKGINDEX_URI", - "PROPERTIES", - "PROVIDES", - "RDEPEND", - "repository", - "REQUIRES", - "RESTRICT", - "RESUMECOMMAND", - "SIZE", - "SLOT", - "USE", - # PREFIX LOCAL - "EPREFIX", - ] - self._pkgindex_aux_keys = list(self._pkgindex_aux_keys) - self._pkgindex_use_evaluated_keys = ( - "BDEPEND", - "DEPEND", - "IDEPEND", - "LICENSE", - "RDEPEND", - "PDEPEND", - "PROPERTIES", - "RESTRICT", - ) - self._pkgindex_header = None - self._pkgindex_header_keys = set( - [ - "ACCEPT_KEYWORDS", - "ACCEPT_LICENSE", - "ACCEPT_PROPERTIES", - "ACCEPT_RESTRICT", - "BINPKG_FORMAT", - "CBUILD", - "CONFIG_PROTECT", - "CONFIG_PROTECT_MASK", - "FEATURES", - "GENTOO_MIRRORS", - "INSTALL_MASK", - "IUSE_IMPLICIT", - "USE", - "USE_EXPAND", - "USE_EXPAND_HIDDEN", - "USE_EXPAND_IMPLICIT", - "USE_EXPAND_UNPREFIXED", - # PREFIX LOCAL - "EPREFIX", - ] - ) - self._pkgindex_default_pkg_data = { - "BDEPEND": "", - "BUILD_ID": "", - "BUILD_TIME": "", - "DEFINED_PHASES": "", - "DEPEND": "", - "EAPI": "0", - "IDEPEND": "", - "IUSE": "", - "KEYWORDS": "", - "LICENSE": "", - "PATH": "", - "PDEPEND": "", - "PROPERTIES": "", - "PROVIDES": "", - "RDEPEND": "", - "REQUIRES": "", - "RESTRICT": "", - "SLOT": "0", - "USE": "", - } - self._pkgindex_inherited_keys = ["BINPKG_FORMAT", "CHOST", - # PREFIX LOCAL - "EPREFIX", - "repository"] - - # Populate the header with appropriate defaults. - self._pkgindex_default_header_data = { - "BINPKG_FORMAT": self.settings.get( - "BINPKG_FORMAT", SUPPORTED_GENTOO_BINPKG_FORMATS[0] - ), - "CHOST": self.settings.get("CHOST", ""), - "repository": "", - } - - self._pkgindex_translated_keys = ( - ("DESCRIPTION", "DESC"), - ("_mtime_", "MTIME"), - ("repository", "REPO"), - ) + self.pkgdir = normalize_path(pkgdir) + # NOTE: Event if binpkg-multi-instance is disabled, it's + # still possible to access a PKGDIR which uses the + # binpkg-multi-instance layout (or mixed layout). + self._multi_instance = "binpkg-multi-instance" in settings.features + if self._multi_instance: + self._allocate_filename = self._allocate_filename_multi + self.dbapi = bindbapi(self, settings=settings) + self.update_ents = self.dbapi.update_ents + self.move_slot_ent = self.dbapi.move_slot_ent + self.populated = 0 + self.tree = {} + self._binrepos_conf = None + self._remote_has_index = False + self._remotepkgs = None # remote metadata indexed by cpv + self._additional_pkgs = {} + self.invalids = [] + self.settings = settings + self._pkg_paths = {} + self._populating = False + self._all_directory = os.path.isdir(os.path.join(self.pkgdir, "All")) + self._pkgindex_version = 0 + self._pkgindex_hashes = ["MD5", "SHA1"] + self._pkgindex_file = os.path.join(self.pkgdir, "Packages") + self._pkgindex_keys = self.dbapi._aux_cache_keys.copy() + self._pkgindex_keys.update(["CPV", "SIZE"]) + self._pkgindex_aux_keys = [ + "BASE_URI", + "BDEPEND", + "BUILD_ID", + "BUILD_TIME", + "CHOST", + "DEFINED_PHASES", + "DEPEND", + "DESCRIPTION", + "EAPI", + "FETCHCOMMAND", + "IDEPEND", + "IUSE", + "KEYWORDS", + "LICENSE", + "PDEPEND", + "PKGINDEX_URI", + "PROPERTIES", + "PROVIDES", + "RDEPEND", + "repository", + "REQUIRES", + "RESTRICT", + "RESUMECOMMAND", + "SIZE", + "SLOT", + "USE", ++ # PREFIX LOCAL ++ "EPREFIX", + ] + self._pkgindex_use_evaluated_keys = ( + "BDEPEND", + "DEPEND", + "IDEPEND", + "LICENSE", + "RDEPEND", + "PDEPEND", + "PROPERTIES", + "RESTRICT", + ) + self._pkgindex_header = None + self._pkgindex_header_keys = { + "ACCEPT_KEYWORDS", + "ACCEPT_LICENSE", + "ACCEPT_PROPERTIES", + "ACCEPT_RESTRICT", + "CBUILD", + "CONFIG_PROTECT", + "CONFIG_PROTECT_MASK", + "FEATURES", + "GENTOO_MIRRORS", + "INSTALL_MASK", + "IUSE_IMPLICIT", + "USE", + "USE_EXPAND", + "USE_EXPAND_HIDDEN", + "USE_EXPAND_IMPLICIT", + "USE_EXPAND_UNPREFIXED", ++ # PREFIX LOCAL ++ "EPREFIX", + } + self._pkgindex_default_pkg_data = { + "BDEPEND": "", + "BUILD_ID": "", + "BUILD_TIME": "", + "DEFINED_PHASES": "", + "DEPEND": "", + "EAPI": "0", + "IDEPEND": "", + "IUSE": "", + "KEYWORDS": "", + "LICENSE": "", + "PATH": "", + "PDEPEND": "", + "PROPERTIES": "", + "PROVIDES": "", + "RDEPEND": "", + "REQUIRES": "", + "RESTRICT": "", + "SLOT": "0", + "USE": "", + } + self._pkgindex_inherited_keys = ["CHOST", "repository"] ++ # PREFIX LOCAL ++ self._pkgindex_inherited_keys += ["EPREFIX"] + + # Populate the header with appropriate defaults. + self._pkgindex_default_header_data = { + "CHOST": self.settings.get("CHOST", ""), + "repository": "", + } + + self._pkgindex_translated_keys = ( + ("DESCRIPTION", "DESC"), + ("_mtime_", "MTIME"), + ("repository", "REPO"), + ) - self._pkgindex_allowed_pkg_keys = set( - chain( - self._pkgindex_keys, - self._pkgindex_aux_keys, - self._pkgindex_hashes, - self._pkgindex_default_pkg_data, - self._pkgindex_inherited_keys, - chain(*self._pkgindex_translated_keys), - ) + self._pkgindex_allowed_pkg_keys = set( + chain( + self._pkgindex_keys, + self._pkgindex_aux_keys, + self._pkgindex_hashes, + self._pkgindex_default_pkg_data, + self._pkgindex_inherited_keys, + chain(*self._pkgindex_translated_keys), ) + ) @property def root(self): diff --cc lib/portage/package/ebuild/_config/special_env_vars.py index d974325e0,beb411188..b41c952e2 --- a/lib/portage/package/ebuild/_config/special_env_vars.py +++ b/lib/portage/package/ebuild/_config/special_env_vars.py @@@ -82,174 -80,167 +80,172 @@@ env_blacklist = frozenset # important to set our special BASH_ENV variable in the ebuild # environment in order to prevent sandbox from sourcing /etc/profile # in it's bashrc (causing major leakage). - environ_whitelist += [ - "ACCEPT_LICENSE", - "BASH_ENV", - "BASH_FUNC____in_portage_iuse%%", - "BINPKG_FORMAT", - "BROOT", - "BUILD_PREFIX", - "COLUMNS", - "D", - "DISTDIR", - "DOC_SYMLINKS_DIR", - "EAPI", - "EBUILD", - "EBUILD_FORCE_TEST", - "EBUILD_PHASE", - "EBUILD_PHASE_FUNC", - "ECLASSDIR", - "ECLASS_DEPTH", - "ED", - "EMERGE_FROM", - "ENV_UNSET", - "EPREFIX", - "EROOT", - "ESYSROOT", - "FEATURES", - "FILESDIR", - "HOME", - "MERGE_TYPE", - "NOCOLOR", - "PATH", - "PKGDIR", - "PKGUSE", - "PKG_LOGDIR", - "PKG_TMPDIR", - "PORTAGE_ACTUAL_DISTDIR", - "PORTAGE_ARCHLIST", - "PORTAGE_BASHRC_FILES", - "PORTAGE_BASHRC", - "PM_EBUILD_HOOK_DIR", - "PORTAGE_BINPKG_FILE", - "PORTAGE_BINPKG_TAR_OPTS", - "PORTAGE_BINPKG_TMPFILE", - "PORTAGE_BIN_PATH", - "PORTAGE_BUILDDIR", - "PORTAGE_BUILD_GROUP", - "PORTAGE_BUILD_USER", - "PORTAGE_BUNZIP2_COMMAND", - "PORTAGE_BZIP2_COMMAND", - "PORTAGE_COLORMAP", - "PORTAGE_COMPRESS", - "PORTAGE_COMPRESSION_COMMAND", - "PORTAGE_COMPRESS_EXCLUDE_SUFFIXES", - "PORTAGE_CONFIGROOT", - "PORTAGE_DEBUG", - "PORTAGE_DEPCACHEDIR", - "PORTAGE_DOHTML_UNWARNED_SKIPPED_EXTENSIONS", - "PORTAGE_DOHTML_UNWARNED_SKIPPED_FILES", - "PORTAGE_DOHTML_WARN_ON_SKIPPED_FILES", - "PORTAGE_EBUILD_EXIT_FILE", - "PORTAGE_FEATURES", - "PORTAGE_GID", - "PORTAGE_GRPNAME", - "PORTAGE_INTERNAL_CALLER", - "PORTAGE_INST_GID", - "PORTAGE_INST_UID", - "PORTAGE_IPC_DAEMON", - "PORTAGE_IUSE", - "PORTAGE_ECLASS_LOCATIONS", - "PORTAGE_LOG_FILE", - "PORTAGE_OVERRIDE_EPREFIX", - "PORTAGE_PIPE_FD", - "PORTAGE_PROPERTIES", - "PORTAGE_PYM_PATH", - "PORTAGE_PYTHON", - "PORTAGE_PYTHONPATH", - "PORTAGE_QUIET", - "PORTAGE_REPO_NAME", - "PORTAGE_REPOSITORIES", - "PORTAGE_RESTRICT", - "PORTAGE_SIGPIPE_STATUS", - "PORTAGE_SOCKS5_PROXY", - "PORTAGE_TMPDIR", - "PORTAGE_UPDATE_ENV", - "PORTAGE_USERNAME", - "PORTAGE_VERBOSE", - "PORTAGE_WORKDIR_MODE", - "PORTAGE_XATTR_EXCLUDE", - "PORTDIR", - "PORTDIR_OVERLAY", - "PREROOTPATH", - "PYTHONDONTWRITEBYTECODE", - "REPLACING_VERSIONS", - "REPLACED_BY_VERSION", - "ROOT", - "ROOTPATH", - "SANDBOX_LOG", - "SYSROOT", - "T", - "TMP", - "TMPDIR", - "USE_EXPAND", - "USE_ORDER", - "WORKDIR", - "XARGS", - "__PORTAGE_TEST_HARDLINK_LOCKS", - # BEGIN PREFIX LOCAL - "EXTRA_PATH", - "PORTAGE_GROUP", - "PORTAGE_USER", - # END PREFIX LOCAL - ] - - # user config variables - environ_whitelist += ["DOC_SYMLINKS_DIR", "INSTALL_MASK", "PKG_INSTALL_MASK"] - - environ_whitelist += ["A", "AA", "CATEGORY", "P", "PF", "PN", "PR", "PV", "PVR"] - - # misc variables inherited from the calling environment - environ_whitelist += [ - "COLORTERM", - "DISPLAY", - "EDITOR", - "LESS", - "LESSOPEN", - "LOGNAME", - "LS_COLORS", - "PAGER", - "TERM", - "TERMCAP", - "USER", - "ftp_proxy", - "http_proxy", - "no_proxy", - ] - - # tempdir settings - environ_whitelist += [ - "TMPDIR", - "TEMP", - "TMP", - ] - - # localization settings - environ_whitelist += [ - "LANG", - "LC_COLLATE", - "LC_CTYPE", - "LC_MESSAGES", - "LC_MONETARY", - "LC_NUMERIC", - "LC_TIME", - "LC_PAPER", - "LC_ALL", - ] - - # other variables inherited from the calling environment - environ_whitelist += [ - "CVS_RSH", - "ECHANGELOG_USER", - "GPG_AGENT_INFO", - "SSH_AGENT_PID", - "SSH_AUTH_SOCK", - "STY", - "WINDOW", - "XAUTHORITY", - ] - - environ_whitelist = frozenset(environ_whitelist) + environ_whitelist = frozenset( + ( + "A", + "AA", + "ACCEPT_LICENSE", + "BASH_ENV", + "BASH_FUNC____in_portage_iuse%%", + "BINPKG_FORMAT", + "BROOT", + "BUILD_ID", + "BUILD_PREFIX", + "CATEGORY", + "COLUMNS", + "D", + "DISTDIR", + "DOC_SYMLINKS_DIR", + "EAPI", + "EBUILD", + "EBUILD_FORCE_TEST", + "EBUILD_PHASE", + "EBUILD_PHASE_FUNC", + "ECLASSDIR", + "ECLASS_DEPTH", + "ED", + "EMERGE_FROM", + "ENV_UNSET", + "EPREFIX", + "EROOT", + "ESYSROOT", + "FEATURES", + "FILESDIR", + "HOME", + "MERGE_TYPE", + "NOCOLOR", + "NO_COLOR", + "P", + "PATH", + "PF", + "PKGDIR", + "PKGUSE", + "PKG_LOGDIR", + "PKG_TMPDIR", + "PM_EBUILD_HOOK_DIR", + "PN", + "PORTAGE_ACTUAL_DISTDIR", + "PORTAGE_ARCHLIST", + "PORTAGE_BASHRC_FILES", + "PORTAGE_BASHRC", + "PORTAGE_BINPKG_FILE", + "PORTAGE_BINPKG_TAR_OPTS", + "PORTAGE_BINPKG_TMPFILE", + "PORTAGE_BIN_PATH", + "PORTAGE_BUILDDIR", + "PORTAGE_BUILD_GROUP", + "PORTAGE_BUILD_USER", + "PORTAGE_BUNZIP2_COMMAND", + "PORTAGE_BZIP2_COMMAND", + "PORTAGE_COLORMAP", + "PORTAGE_COMPRESS", + "PORTAGE_COMPRESSION_COMMAND", + "PORTAGE_COMPRESS_EXCLUDE_SUFFIXES", + "PORTAGE_CONFIGROOT", + "PORTAGE_DEBUG", + "PORTAGE_DEPCACHEDIR", + "PORTAGE_DOHTML_UNWARNED_SKIPPED_EXTENSIONS", + "PORTAGE_DOHTML_UNWARNED_SKIPPED_FILES", + "PORTAGE_DOHTML_WARN_ON_SKIPPED_FILES", + "PORTAGE_EBUILD_EXIT_FILE", + "PORTAGE_FEATURES", + "PORTAGE_GID", + "PORTAGE_GRPNAME", + "PORTAGE_INTERNAL_CALLER", + "PORTAGE_INST_GID", + "PORTAGE_INST_UID", + "PORTAGE_IPC_DAEMON", + "PORTAGE_IUSE", + "PORTAGE_ECLASS_LOCATIONS", + "PORTAGE_LOG_FILE", + "PORTAGE_OVERRIDE_EPREFIX", + "PORTAGE_PIPE_FD", + "PORTAGE_PROPERTIES", + "PORTAGE_PYM_PATH", + "PORTAGE_PYTHON", + "PORTAGE_PYTHONPATH", + "PORTAGE_QUIET", + "PORTAGE_REPO_NAME", + "PORTAGE_REPOSITORIES", + "PORTAGE_RESTRICT", + "PORTAGE_SIGPIPE_STATUS", + "PORTAGE_SOCKS5_PROXY", + "PORTAGE_TMPDIR", + "PORTAGE_UPDATE_ENV", + "PORTAGE_USERNAME", + "PORTAGE_VERBOSE", + "PORTAGE_WORKDIR_MODE", + "PORTAGE_XATTR_EXCLUDE", + "PORTDIR", + "PORTDIR_OVERLAY", + "PR", + "PREROOTPATH", + "PV", + "PVR", + "PYTHONDONTWRITEBYTECODE", + "REPLACING_VERSIONS", + "REPLACED_BY_VERSION", + "ROOT", + "ROOTPATH", + "SANDBOX_LOG", + "SYSROOT", + "T", + "TMP", + "TMPDIR", + "USE_EXPAND", + "USE_ORDER", + "WORKDIR", + "XARGS", + "__PORTAGE_TEST_HARDLINK_LOCKS", + # user config variables + "DOC_SYMLINKS_DIR", + "INSTALL_MASK", + "PKG_INSTALL_MASK", + # misc variables inherited from the calling environment + "COLORTERM", + "DISPLAY", + "EDITOR", + "LESS", + "LESSOPEN", + "LOGNAME", + "LS_COLORS", + "PAGER", + "TERM", + "TERMCAP", + "USER", + "ftp_proxy", + "http_proxy", + "no_proxy", + # tempdir settings + "TMPDIR", + "TEMP", + "TMP", + # localization settings + "LANG", + "LC_COLLATE", + "LC_CTYPE", + "LC_MESSAGES", + "LC_MONETARY", + "LC_NUMERIC", + "LC_TIME", + "LC_PAPER", + "LC_ALL", + # other variables inherited from the calling environment + "CVS_RSH", + "ECHANGELOG_USER", + "GPG_AGENT_INFO", + "SSH_AGENT_PID", + "SSH_AUTH_SOCK", + "STY", + "WINDOW", + "XAUTHORITY", ++ # BEGIN PREFIX LOCAL ++ "EXTRA_PATH", ++ "PORTAGE_GROUP", ++ "PORTAGE_USER", ++ # END PREFIX LOCAL + ) + ) environ_whitelist_re = re.compile(r"^(CCACHE_|DISTCC_).*") @@@ -258,116 -249,91 +254,104 @@@ # Exclude anything that could be extremely long here (like SRC_URI) # since that could cause execve() calls to fail with E2BIG errors. For # example, see bug #262647. - environ_filter += [ - "DEPEND", - "RDEPEND", - "PDEPEND", - "SRC_URI", - "BDEPEND", - "IDEPEND", - ] - - # misc variables inherited from the calling environment - environ_filter += [ - "INFOPATH", - "MANPATH", - "USER", - # BEGIN PREFIX LOCAL - "HOST", - "GROUP", - "LOGNAME", - "MAIL", - "REMOTEHOST", - "SECURITYSESSIONID", - "TERMINFO", - "TERM_PROGRAM", - "TERM_PROGRAM_VERSION", - "VENDOR", - "__CF_USER_TEXT_ENCODING", - # END PREFIX LOCAL - ] - - # variables that break bash - environ_filter += [ - "HISTFILE", - "POSIXLY_CORRECT", - ] - - # portage config variables and variables set directly by portage - environ_filter += [ - "ACCEPT_CHOSTS", - "ACCEPT_KEYWORDS", - "ACCEPT_PROPERTIES", - "ACCEPT_RESTRICT", - "AUTOCLEAN", - "BINPKG_COMPRESS", - "BINPKG_COMPRESS_FLAGS", - "CLEAN_DELAY", - "COLLISION_IGNORE", - "CONFIG_PROTECT", - "CONFIG_PROTECT_MASK", - "EGENCACHE_DEFAULT_OPTS", - "EMERGE_DEFAULT_OPTS", - "EMERGE_LOG_DIR", - "EMERGE_WARNING_DELAY", - "FETCHCOMMAND", - "FETCHCOMMAND_FTP", - "FETCHCOMMAND_HTTP", - "FETCHCOMMAND_HTTPS", - "FETCHCOMMAND_RSYNC", - "FETCHCOMMAND_SFTP", - "GENTOO_MIRRORS", - "NOCONFMEM", - "O", - "PORTAGE_BACKGROUND", - "PORTAGE_BACKGROUND_UNMERGE", - "PORTAGE_BINHOST", - "PORTAGE_BINPKG_FORMAT", - "PORTAGE_BUILDDIR_LOCKED", - "PORTAGE_CHECKSUM_FILTER", - "PORTAGE_ELOG_CLASSES", - "PORTAGE_ELOG_MAILFROM", - "PORTAGE_ELOG_MAILSUBJECT", - "PORTAGE_ELOG_MAILURI", - "PORTAGE_ELOG_SYSTEM", - "PORTAGE_FETCH_CHECKSUM_TRY_MIRRORS", - "PORTAGE_FETCH_RESUME_MIN_SIZE", - "PORTAGE_GPG_DIR", - "PORTAGE_GPG_KEY", - "PORTAGE_GPG_SIGNING_COMMAND", - "PORTAGE_IONICE_COMMAND", - "PORTAGE_PACKAGE_EMPTY_ABORT", - "PORTAGE_REPO_DUPLICATE_WARN", - "PORTAGE_RO_DISTDIRS", - "PORTAGE_RSYNC_EXTRA_OPTS", - "PORTAGE_RSYNC_OPTS", - "PORTAGE_RSYNC_RETRIES", - "PORTAGE_SSH_OPTS", - "PORTAGE_SYNC_STALE", - "PORTAGE_USE", - "PORTAGE_LOG_FILTER_FILE_CMD", - "PORTAGE_LOGDIR", - "PORTAGE_LOGDIR_CLEAN", - "QUICKPKG_DEFAULT_OPTS", - "REPOMAN_DEFAULT_OPTS", - "RESUMECOMMAND", - "RESUMECOMMAND_FTP", - "RESUMECOMMAND_HTTP", - "RESUMECOMMAND_HTTPS", - "RESUMECOMMAND_RSYNC", - "RESUMECOMMAND_SFTP", - "UNINSTALL_IGNORE", - "USE_EXPAND_HIDDEN", - "USE_ORDER", - "__PORTAGE_HELPER", - ] - - # No longer supported variables - environ_filter += ["SYNC"] - - environ_filter = frozenset(environ_filter) + environ_filter = frozenset( + ( + "DEPEND", + "RDEPEND", + "PDEPEND", + "SRC_URI", + "BDEPEND", + "IDEPEND", + # misc variables inherited from the calling environment + "INFOPATH", + "MANPATH", + "USER", ++ # BEGIN PREFIX LOCAL ++ "HOST", ++ "GROUP", ++ "LOGNAME", ++ "MAIL", ++ "REMOTEHOST", ++ "SECURITYSESSIONID", ++ "TERMINFO", ++ "TERM_PROGRAM", ++ "TERM_PROGRAM_VERSION", ++ "VENDOR", ++ "__CF_USER_TEXT_ENCODING", ++ # END PREFIX LOCAL + # variables that break bash + "HISTFILE", + "POSIXLY_CORRECT", + # portage config variables and variables set directly by portage + "ACCEPT_CHOSTS", + "ACCEPT_KEYWORDS", + "ACCEPT_PROPERTIES", + "ACCEPT_RESTRICT", + "AUTOCLEAN", + "BINPKG_COMPRESS", + "BINPKG_COMPRESS_FLAGS", + "CLEAN_DELAY", + "COLLISION_IGNORE", + "CONFIG_PROTECT", + "CONFIG_PROTECT_MASK", + "EGENCACHE_DEFAULT_OPTS", + "EMERGE_DEFAULT_OPTS", + "EMERGE_LOG_DIR", + "EMERGE_WARNING_DELAY", + "FETCHCOMMAND", + "FETCHCOMMAND_FTP", + "FETCHCOMMAND_HTTP", + "FETCHCOMMAND_HTTPS", + "FETCHCOMMAND_RSYNC", + "FETCHCOMMAND_SFTP", + "GENTOO_MIRRORS", + "NOCONFMEM", + "O", + "PORTAGE_BACKGROUND", + "PORTAGE_BACKGROUND_UNMERGE", + "PORTAGE_BINHOST", + "PORTAGE_BINPKG_FORMAT", + "PORTAGE_BUILDDIR_LOCKED", + "PORTAGE_CHECKSUM_FILTER", + "PORTAGE_ELOG_CLASSES", + "PORTAGE_ELOG_MAILFROM", + "PORTAGE_ELOG_MAILSUBJECT", + "PORTAGE_ELOG_MAILURI", + "PORTAGE_ELOG_SYSTEM", + "PORTAGE_FETCH_CHECKSUM_TRY_MIRRORS", + "PORTAGE_FETCH_RESUME_MIN_SIZE", + "PORTAGE_GPG_DIR", + "PORTAGE_GPG_KEY", + "PORTAGE_GPG_SIGNING_COMMAND", + "PORTAGE_IONICE_COMMAND", + "PORTAGE_PACKAGE_EMPTY_ABORT", + "PORTAGE_REPO_DUPLICATE_WARN", + "PORTAGE_RO_DISTDIRS", + "PORTAGE_RSYNC_EXTRA_OPTS", + "PORTAGE_RSYNC_OPTS", + "PORTAGE_RSYNC_RETRIES", + "PORTAGE_SSH_OPTS", + "PORTAGE_SYNC_STALE", + "PORTAGE_USE", + "PORTAGE_LOG_FILTER_FILE_CMD", + "PORTAGE_LOGDIR", + "PORTAGE_LOGDIR_CLEAN", + "QUICKPKG_DEFAULT_OPTS", + "REPOMAN_DEFAULT_OPTS", + "RESUMECOMMAND", + "RESUMECOMMAND_FTP", + "RESUMECOMMAND_HTTP", + "RESUMECOMMAND_HTTPS", + "RESUMECOMMAND_RSYNC", + "RESUMECOMMAND_SFTP", + "UNINSTALL_IGNORE", + "USE_EXPAND_HIDDEN", + "USE_ORDER", + "__PORTAGE_HELPER", + # No longer supported variables + "SYNC", + ) + ) # Variables that are not allowed to have per-repo or per-package # settings. diff --cc lib/portage/package/ebuild/doebuild.py index e9d7a858f,8b65a7862..48e9c9896 --- a/lib/portage/package/ebuild/doebuild.py +++ b/lib/portage/package/ebuild/doebuild.py @@@ -324,30 -305,20 +311,25 @@@ def _doebuild_path(settings, eapi=None) for x in portage_bin_path: path.append(os.path.join(x, "ebuild-helpers")) - path.extend(prerootpath) - - for prefix in prefixes: - prefix = prefix if prefix else "/" - for x in ( - "usr/local/sbin", - "usr/local/bin", - "usr/sbin", - "usr/bin", - "sbin", - "bin", - ): - # Respect order defined in ROOTPATH - x_abs = os.path.join(prefix, x) - if x_abs not in rootpath_set: - path.append(x_abs) - path.extend(rootpath) + # If PATH is set in env.d, ignore PATH from the calling environment. + # This allows packages to update our PATH as they get installed. + if "PATH" in settings.configdict["env.d"]: + settings.configdict["env"].pop("PATH", None) + + if "PATH" in settings: + pathset = set(path) + for p in settings["PATH"].split(":"): + # Avoid duplicate entries. + if p not in pathset: + path.append(p) + pathset.add(p) + # BEGIN PREFIX LOCAL: append EXTRA_PATH from make.globals + extrapath = [x for x in settings.get("EXTRA_PATH", "").split(":") if x] + path.extend(extrapath) + # END PREFIX LOCAL + settings["PATH"] = ":".join(path) diff --cc lib/portage/tests/runTests.py index da6d83e85,bf4c2a7c5..17c244dbe mode 100755,100644..100644 --- a/lib/portage/tests/runTests.py +++ b/lib/portage/tests/runTests.py diff --cc lib/portage/util/__init__.py index 6855a87f1,1f8c9e94f..0be05ab03 --- a/lib/portage/util/__init__.py +++ b/lib/portage/util/__init__.py @@@ -51,8 -72,9 +72,11 @@@ import strin import sys import traceback import glob + from typing import Optional, TextIO import portage ++# PREFIX LOCAL ++from portage.const import EPREFIX portage.proxy.lazyimport.lazyimport( globals(), @@@ -2015,16 -2007,19 +2009,25 @@@ def getlibpaths(root, env=None) """ Return a list of paths that are used for library lookups """ if env is None: env = os.environ + # BEGIN PREFIX LOCAL: + # For Darwin, match LD_LIBRARY_PATH with DYLD_LIBRARY_PATH. + # We don't need any host OS lib paths in Prefix, so just going with + # the prefixed one is fine. # the following is based on the information from ld.so(8) rval = env.get("LD_LIBRARY_PATH", "").split(":") - rval.extend(read_ld_so_conf(os.path.join(root, "etc", "ld.so.conf"))) - rval.append("/usr/lib") - rval.append("/lib") + rval.extend(env.get("DYLD_LIBRARY_PATH", "").split(":")) + rval.extend(read_ld_so_conf(os.path.join(root, EPREFIX, "etc", "ld.so.conf"))) + rval.append(f"{EPREFIX}/usr/lib") + rval.append(f"{EPREFIX}/lib") + # END PREFIX LOCAL return [normalize_path(x) for x in rval if x] + + + def no_color(settings: Optional[dict]) -> bool: + # In several years (2026+), we can cleanup NOCOLOR support, and just support NO_COLOR. + has_color: str = settings.get("NO_COLOR") + nocolor: str = settings.get("NOCOLOR", "false").lower() + if has_color is None: + return nocolor in ("yes", "true") + return bool(has_color) diff --cc lib/portage/util/_info_files.py index 5d4aff1d7,45d674b9b..a5b2b30b4 --- a/lib/portage/util/_info_files.py +++ b/lib/portage/util/_info_files.py @@@ -14,9 -12,7 +14,8 @@@ from portage.const import EPREFI def chk_updated_info_files(root, infodirs, prev_mtimes): - - if os.path.exists("/usr/bin/install-info"): + # PREFIX LOCAL + if os.path.exists(EPREFIX + "/usr/bin/install-info"): out = portage.output.EOutput() regen_infodirs = [] for z in infodirs: @@@ -80,9 -75,8 +79,9 @@@ try: proc = subprocess.Popen( [ - "/usr/bin/install-info", + # PREFIX LOCAL - "%s/usr/bin/install-info", EPREFIX, - "--dir-file=%s" % os.path.join(inforoot, "dir"), ++ f"{EPREFIX}/usr/bin/install-info", + f"--dir-file={os.path.join(inforoot, 'dir')}", os.path.join(inforoot, x), ], env=dict(os.environ, LANG="C", LANGUAGE="C"),