commit: 2047e3e9e5676fd02d97a724dbb986e268366930 Author: Sam James <sam <AT> gentoo <DOT> org> AuthorDate: Mon Feb 16 05:29:10 2026 +0000 Commit: Sam James <sam <AT> gentoo <DOT> org> CommitDate: Mon Feb 16 06:01:34 2026 +0000 URL: https://gitweb.gentoo.org/proj/portage.git/commit/?id=2047e3e9
emaint: sync: prepare _check_updates for multiple packages _check_updates currently warns if there's an update for Portage available after syncing. Prepare it for multiple package support. While here, add a docstring and return earlier if --quiet. Bug: https://bugs.gentoo.org/968578 Signed-off-by: Sam James <sam <AT> gentoo.org> lib/portage/emaint/modules/sync/sync.py | 119 +++++++++++++++++--------------- 1 file changed, 65 insertions(+), 54 deletions(-) diff --git a/lib/portage/emaint/modules/sync/sync.py b/lib/portage/emaint/modules/sync/sync.py index b86f88e29b..787d66cec3 100644 --- a/lib/portage/emaint/modules/sync/sync.py +++ b/lib/portage/emaint/modules/sync/sync.py @@ -286,73 +286,84 @@ class SyncRepos: self._reload_config() def _check_updates(self): - from _emerge.chk_updated_cfg_files import chk_updated_cfg_files + """ + After syncing, notify the user if any important packages + have updates available that should be installed first before + anything else. - best_portage_pv = self.emerge_config.target_config.trees["porttree"].dbapi.xmatch( - "bestmatch-visible", portage.const.PORTAGE_PACKAGE_ATOM - ) - installed_portage_pv = portage.best( - self.emerge_config.target_config.trees["vartree"].dbapi.match( - portage.const.PORTAGE_PACKAGE_ATOM - ) - ) - try: - old_use = ( - self.emerge_config.target_config.trees["vartree"] - .dbapi.aux_get(installed_portage_pv, ["USE"])[0] - .split() - ) - except KeyError: - old_use = () + Portage always includes itself in this list to check. + """ + from _emerge.chk_updated_cfg_files import chk_updated_cfg_files chk_updated_cfg_files( self.emerge_config.target_config.root, self.emerge_config.target_config.settings.get("CONFIG_PROTECT", "").split(), ) + early_update_packages = { + "Portage": portage.const.PORTAGE_PACKAGE_ATOM, + } msgs = [] - if ( - not (best_portage_pv and installed_portage_pv) - or best_portage_pv == installed_portage_pv - or "--quiet" in self.emerge_config.opts - ): - return msgs - # Suggest to update to the latest available version of portage. - # Since changes to PYTHON_TARGETS cause complications, this message - # is suppressed if the new version has different PYTHON_TARGETS enabled - # than previous version. - portdb = self.emerge_config.target_config.trees["porttree"].dbapi - portdb.doebuild_settings.setcpv(best_portage_pv, mydb=portdb) - usemask = portdb.doebuild_settings.usemask - useforce = portdb.doebuild_settings.useforce - new_use = ( - frozenset(portdb.doebuild_settings["PORTAGE_USE"].split()) | useforce - ) - usemask - new_python_targets = frozenset( - x for x in new_use if x.startswith("python_targets_") - ) - old_python_targets = frozenset( - x for x in old_use if x.startswith("python_targets_") - ) + if "--quiet" in self.emerge_config.opts: + return msgs - if new_python_targets == old_python_targets: - msgs.append("") - msgs.append( - warn(" * ") - + bold("An update to portage is available.") - + " It is _highly_ recommended" + for early_name, early_pkg in early_update_packages.items(): + best_pv = self.emerge_config.target_config.trees["porttree"].dbapi.xmatch( + "bestmatch-visible", early_pkg ) - msgs.append( - warn(" * ") - + "that you update portage now, before any other packages are updated." + installed_pv = portage.best( + self.emerge_config.target_config.trees["vartree"].dbapi.match(early_pkg) ) - msgs.append("") - msgs.append( - warn(" * ") - + "To update portage, run 'emerge --oneshot sys-apps/portage' now." + + try: + old_use = ( + self.emerge_config.target_config.trees["vartree"] + .dbapi.aux_get(installed_pv, ["USE"])[0] + .split() + ) + except KeyError: + old_use = () + + if not (best_pv and installed_pv) or best_pv == installed_pv: + continue + + # Suggest to update to the latest available version of portage. + # Since changes to PYTHON_TARGETS cause complications, this message + # is suppressed if the new version has different PYTHON_TARGETS enabled + # than previous version. + portdb = self.emerge_config.target_config.trees["porttree"].dbapi + portdb.doebuild_settings.setcpv(best_pv, mydb=portdb) + usemask = portdb.doebuild_settings.usemask + useforce = portdb.doebuild_settings.useforce + new_use = ( + frozenset(portdb.doebuild_settings["PORTAGE_USE"].split()) | useforce + ) - usemask + new_python_targets = frozenset( + x for x in new_use if x.startswith("python_targets_") + ) + old_python_targets = frozenset( + x for x in old_use if x.startswith("python_targets_") ) - msgs.append("") + + if new_python_targets == old_python_targets: + msgs.append("") + msgs.append( + warn(" * ") + + bold(f"An update to {early_name} is available.") + + " It is _highly_ recommended" + ) + msgs.append( + warn(" * ") + + f"that you update {early_name} now, before any other packages are updated." + ) + msgs.append("") + msgs.append( + warn(" * ") + + f"To update {early_name}, run 'emerge --oneshot {early_pkg}' now." + ) + msgs.append("") + return msgs def _reload_config(self):
