From eb81391e0391285072503ad315501a9159c5e4b6 Mon Sep 17 00:00:00 2001 From: CentOS Sources Date: Mar 28 2023 08:32:47 +0000 Subject: import dnf-4.7.0-15.el8 --- diff --git a/SOURCES/0027-Don-t-include-resolved-advisories-for-obsoletes-with.patch b/SOURCES/0027-Don-t-include-resolved-advisories-for-obsoletes-with.patch new file mode 100644 index 0000000..a0d20ce --- /dev/null +++ b/SOURCES/0027-Don-t-include-resolved-advisories-for-obsoletes-with.patch @@ -0,0 +1,47 @@ +From 66a37245e82c60b972ee35879f9c29c27466a27b Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= +Date: Mon, 25 Jul 2022 12:44:17 +0200 +Subject: [PATCH] Don't include resolved advisories for obsoletes with sec. + filters (RhBug:2101421) + +This makes the obsoletes security filters consistent with upgrade +security filters. + +This API is used from check-update and from Info and List commands. +- For check-update we don't want to include resolved advisories to have + identical result to the actual update. That is bz2101421 use case. +- For Info and List commands the --obsoletes switch: "List packages + installed on the system that are obsoleted by packages in any known + repository." Given this specification in makes sense not to + consider resolved advisories when we also use security filters. + +There is still a general case when someone uses the API or any potential +future use and I think it is best to have the behavior unified for +"upgrades" and "obsoletes". + += changelog = +msg: Don't include resolved advisories for obsoletes filtering with security filters +type: bugfix +resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2101421 + +Tests: https://github.com/rpm-software-management/ci-dnf-stack/pull/1134 +--- + dnf/base.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/dnf/base.py b/dnf/base.py +index e606d9fa..e623d98e 100644 +--- a/dnf/base.py ++++ b/dnf/base.py +@@ -1565,7 +1565,7 @@ class Base(object): + obsoletes = query_for_repo( + self.sack.query()).filter(obsoletes_by_priority=inst) + # reduce a query to security upgrades if they are specified +- obsoletes = self._merge_update_filters(obsoletes, warning=False) ++ obsoletes = self._merge_update_filters(obsoletes, warning=False, upgrade=True) + obsoletesTuples = [] + for new in obsoletes: + obsoleted_reldeps = new.obsoletes +-- +2.37.1 + diff --git a/SOURCES/0028-Set-default-value-for-variable-to-prevent-crash-RhBu.patch b/SOURCES/0028-Set-default-value-for-variable-to-prevent-crash-RhBu.patch new file mode 100644 index 0000000..d5e8b5a --- /dev/null +++ b/SOURCES/0028-Set-default-value-for-variable-to-prevent-crash-RhBu.patch @@ -0,0 +1,35 @@ +From 553a2c585db50599d5028ea6bb6462281bb88d02 Mon Sep 17 00:00:00 2001 +From: Jaroslav Mracek +Date: Mon, 11 Jul 2022 12:27:14 +0200 +Subject: [PATCH] Set default value for variable to prevent crash + (RhBug:2091636) + +It ensure that read of file ended successfully. + +https://bugzilla.redhat.com/show_bug.cgi?id=2091636 +--- + dnf/conf/substitutions.py | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/dnf/conf/substitutions.py b/dnf/conf/substitutions.py +index 703e4a4f..1281bdf0 100644 +--- a/dnf/conf/substitutions.py ++++ b/dnf/conf/substitutions.py +@@ -53,6 +53,7 @@ class Substitutions(dict): + continue + for fsvar in fsvars: + filepath = os.path.join(dir_fsvars, fsvar) ++ val = None + if os.path.isfile(filepath): + try: + with open(filepath) as fp: +@@ -61,4 +62,5 @@ class Substitutions(dict): + val = val[:-1] + except (OSError, IOError): + continue +- self[fsvar] = val ++ if val is not None: ++ self[fsvar] = val +-- +2.37.1 + diff --git a/SOURCES/0029-Add-doc-related-to-destdir-and-downloadonly-options-.patch b/SOURCES/0029-Add-doc-related-to-destdir-and-downloadonly-options-.patch new file mode 100644 index 0000000..0d582cc --- /dev/null +++ b/SOURCES/0029-Add-doc-related-to-destdir-and-downloadonly-options-.patch @@ -0,0 +1,31 @@ +From 96a5bd61ab3b35f00f0b52bcd6428c7aea7d1ca5 Mon Sep 17 00:00:00 2001 +From: Jan Kolarik +Date: Wed, 7 Sep 2022 14:27:07 +0200 +Subject: [PATCH] Add doc related to --destdir and --downloadonly options + (RhBug:2100811) + += changelog = +type: bugfix +resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2100811 +--- + doc/command_ref.rst | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/doc/command_ref.rst b/doc/command_ref.rst +index 42aec72c..7a02448c 100644 +--- a/doc/command_ref.rst ++++ b/doc/command_ref.rst +@@ -190,6 +190,10 @@ Options + ``--downloadonly`` + Download the resolved package set without performing any rpm transaction (install/upgrade/erase). + ++ Packages are removed after the next successful transaction. This applies also when used together ++ with ``--destdir`` option as the directory is considered as a part of the DNF cache. To persist ++ the packages, use the ``download`` command instead. ++ + ``-e , --errorlevel=`` + Error output level. This is an integer value between 0 (no error output) and + 10 (shows all error messages), default is 3. Deprecated, use ``-v`` instead. +-- +2.37.1 + diff --git a/SOURCES/0030-Expose-plugin-unload-method-to-API-RhBug-2047251.patch b/SOURCES/0030-Expose-plugin-unload-method-to-API-RhBug-2047251.patch new file mode 100644 index 0000000..8742fb0 --- /dev/null +++ b/SOURCES/0030-Expose-plugin-unload-method-to-API-RhBug-2047251.patch @@ -0,0 +1,79 @@ +From aa724a639a641943ecf39038fd694abc2037e66d Mon Sep 17 00:00:00 2001 +From: Jan Kolarik +Date: Mon, 22 Aug 2022 10:38:30 +0200 +Subject: [PATCH] Expose plugin unload method to API (RhBug:2047251) + += changelog = +type: bugfix +resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2047251 +--- + dnf/base.py | 5 +++++ + dnf/plugin.py | 1 + + doc/api_base.rst | 4 ++++ + tests/api/test_dnf_base.py | 7 +++++++ + 4 files changed, 17 insertions(+) + +diff --git a/dnf/base.py b/dnf/base.py +index e623d98e..4ddfae15 100644 +--- a/dnf/base.py ++++ b/dnf/base.py +@@ -316,6 +316,11 @@ class Base(object): + """Run plugins configure() method.""" + self._plugins._run_config() + ++ def unload_plugins(self): ++ # :api ++ """Run plugins unload() method.""" ++ self._plugins._unload() ++ + def update_cache(self, timer=False): + # :api + +diff --git a/dnf/plugin.py b/dnf/plugin.py +index 06066e79..87c1f08f 100644 +--- a/dnf/plugin.py ++++ b/dnf/plugin.py +@@ -164,6 +164,7 @@ class Plugins(object): + self._caller('transaction') + + def _unload(self): ++ logger.debug(_('Plugins were unloaded')) + del sys.modules[DYNAMIC_PACKAGE] + + def unload_removed_plugins(self, transaction): +diff --git a/doc/api_base.rst b/doc/api_base.rst +index 03396b69..35cbeef5 100644 +--- a/doc/api_base.rst ++++ b/doc/api_base.rst +@@ -97,6 +97,10 @@ + + Configure plugins by running their configure() method. + ++ .. method:: unload_plugins() ++ ++ Unload all plugins. ++ + .. method:: fill_sack([load_system_repo=True, load_available_repos=True]) + + Setup the package sack. If `load_system_repo` is ``True``, load information about packages in the local RPMDB into the sack. Else no package is considered installed during dependency solving. If `load_available_repos` is ``True``, load information about packages from the available repositories into the sack. +diff --git a/tests/api/test_dnf_base.py b/tests/api/test_dnf_base.py +index 33598189..e84e272b 100644 +--- a/tests/api/test_dnf_base.py ++++ b/tests/api/test_dnf_base.py +@@ -95,6 +95,13 @@ class DnfBaseApiTest(TestCase): + + self.base.configure_plugins() + ++ def test_unload_plugins(self): ++ # Base.unload_plugins() ++ self.assertHasAttr(self.base, "unload_plugins") ++ ++ self.base.init_plugins() ++ self.base.unload_plugins() ++ + def test_update_cache(self): + # Base.update_cache(self, timer=False) + self.assertHasAttr(self.base, "update_cache") +-- +2.37.1 + diff --git a/SOURCES/0031-Add-support-for-group-upgrade-rollback-RhBug-2016070.patch b/SOURCES/0031-Add-support-for-group-upgrade-rollback-RhBug-2016070.patch new file mode 100644 index 0000000..d5eb6f3 --- /dev/null +++ b/SOURCES/0031-Add-support-for-group-upgrade-rollback-RhBug-2016070.patch @@ -0,0 +1,105 @@ +From 7ba2cd6a86945e0ec6f9ed866e2ef6b6759ee092 Mon Sep 17 00:00:00 2001 +From: Jan Kolarik +Date: Thu, 25 Aug 2022 08:06:34 +0200 +Subject: [PATCH] Add support for group upgrade rollback (RhBug:2016070) + += changelog = +type: bugfix +resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2016070 +--- + dnf/db/group.py | 8 +++++++- + dnf/transaction_sr.py | 24 ++++++++++++++++++++++++ + 2 files changed, 31 insertions(+), 1 deletion(-) + +diff --git a/dnf/db/group.py b/dnf/db/group.py +index 4dc8cb06..312e3b98 100644 +--- a/dnf/db/group.py ++++ b/dnf/db/group.py +@@ -34,14 +34,16 @@ class PersistorBase(object): + self._installed = {} + self._removed = {} + self._upgraded = {} ++ self._downgraded = {} + + def __len__(self): +- return len(self._installed) + len(self._removed) + len(self._upgraded) ++ return len(self._installed) + len(self._removed) + len(self._upgraded) + len(self._downgraded) + + def clean(self): + self._installed = {} + self._removed = {} + self._upgraded = {} ++ self._downgraded = {} + + def _get_obj_id(self, obj): + raise NotImplementedError +@@ -62,6 +64,10 @@ class PersistorBase(object): + self._upgraded[self._get_obj_id(obj)] = obj + self._add_to_history(obj, libdnf.transaction.TransactionItemAction_UPGRADE) + ++ def downgrade(self, obj): ++ self._downgraded[self._get_obj_id(obj)] = obj ++ self._add_to_history(obj, libdnf.transaction.TransactionItemAction_DOWNGRADE) ++ + def new(self, obj_id, name, translated_name, pkg_types): + raise NotImplementedError + +diff --git a/dnf/transaction_sr.py b/dnf/transaction_sr.py +index dae8d300..5d403a3e 100644 +--- a/dnf/transaction_sr.py ++++ b/dnf/transaction_sr.py +@@ -416,6 +416,16 @@ class TransactionReplay(object): + if swdb_group is not None: + self._base.history.group.upgrade(swdb_group) + ++ def _swdb_group_downgrade(self, group_id, pkg_types, pkgs): ++ if not self._base.history.group.get(group_id): ++ self._raise_or_warn(self._ignore_installed, _("Group id '%s' is not installed.") % group_id) ++ return ++ ++ swdb_group = self._create_swdb_group(group_id, pkg_types, pkgs) ++ ++ if swdb_group is not None: ++ self._base.history.group.downgrade(swdb_group) ++ + def _swdb_group_remove(self, group_id, pkg_types, pkgs): + if not self._base.history.group.get(group_id): + self._raise_or_warn(self._ignore_installed, _("Group id '%s' is not installed.") % group_id) +@@ -482,6 +492,16 @@ class TransactionReplay(object): + if swdb_env is not None: + self._base.history.env.upgrade(swdb_env) + ++ def _swdb_environment_downgrade(self, env_id, pkg_types, groups): ++ if not self._base.history.env.get(env_id): ++ self._raise_or_warn(self._ignore_installed, _("Environment id '%s' is not installed.") % env_id) ++ return ++ ++ swdb_env = self._create_swdb_environment(env_id, pkg_types, groups) ++ ++ if swdb_env is not None: ++ self._base.history.env.downgrade(swdb_env) ++ + def _swdb_environment_remove(self, env_id, pkg_types, groups): + if not self._base.history.env.get(env_id): + self._raise_or_warn(self._ignore_installed, _("Environment id '%s' is not installed.") % env_id) +@@ -535,6 +555,8 @@ class TransactionReplay(object): + self._swdb_group_install(group_id, pkg_types, group_data["packages"]) + elif action == "Upgrade": + self._swdb_group_upgrade(group_id, pkg_types, group_data["packages"]) ++ elif action == "Downgraded": ++ self._swdb_group_downgrade(group_id, pkg_types, group_data["packages"]) + elif action == "Removed": + self._swdb_group_remove(group_id, pkg_types, group_data["packages"]) + else: +@@ -564,6 +586,8 @@ class TransactionReplay(object): + self._swdb_environment_install(env_id, pkg_types, env_data["groups"]) + elif action == "Upgrade": + self._swdb_environment_upgrade(env_id, pkg_types, env_data["groups"]) ++ elif action == "Downgraded": ++ self._swdb_environment_downgrade(env_id, pkg_types, env_data["groups"]) + elif action == "Removed": + self._swdb_environment_remove(env_id, pkg_types, env_data["groups"]) + else: +-- +2.37.1 + diff --git a/SOURCES/0032-Fix-upgrade-from-file-to-noarch-pkg-RhBug-2006018.patch b/SOURCES/0032-Fix-upgrade-from-file-to-noarch-pkg-RhBug-2006018.patch new file mode 100644 index 0000000..2f37124 --- /dev/null +++ b/SOURCES/0032-Fix-upgrade-from-file-to-noarch-pkg-RhBug-2006018.patch @@ -0,0 +1,34 @@ +From 46562dc76e50d86eed99a102af74a1187a4303e4 Mon Sep 17 00:00:00 2001 +From: Nicola Sella +Date: Thu, 11 Aug 2022 13:56:11 +0200 +Subject: [PATCH] Fix upgrade from file to noarch pkg (RhBug:2006018) + += changelog = +msg: Fix upgrade pkg from file when installed pkg is noarch and upgrades +to a different arch +type: bugfix +resolves: https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=2006018 +--- + dnf/base.py | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +diff --git a/dnf/base.py b/dnf/base.py +index 4ddfae15..aba411ea 100644 +--- a/dnf/base.py ++++ b/dnf/base.py +@@ -2109,7 +2109,11 @@ class Base(object): + sltr.set(pkg=[pkg]) + self._goal.upgrade(select=sltr) + return 1 +- q = installed.filter(name=pkg.name, arch=[pkg.arch, "noarch"]) ++ # do not filter by arch if the package is noarch ++ if pkg.arch == "noarch": ++ q = installed.filter(name=pkg.name) ++ else: ++ q = installed.filter(name=pkg.name, arch=[pkg.arch, "noarch"]) + if not q: + msg = _("Package %s not installed, cannot update it.") + logger.warning(msg, pkg.name) +-- +2.37.1 + diff --git a/SOURCES/0033-Allow-passing-plugin-parameters-with-dashes-in-names.patch b/SOURCES/0033-Allow-passing-plugin-parameters-with-dashes-in-names.patch new file mode 100644 index 0000000..be3fc55 --- /dev/null +++ b/SOURCES/0033-Allow-passing-plugin-parameters-with-dashes-in-names.patch @@ -0,0 +1,62 @@ +From 7a265cf17fe3531e45dde8ae622c496bef1e17ae Mon Sep 17 00:00:00 2001 +From: Jan Kolarik +Date: Wed, 10 Aug 2022 16:24:08 +0200 +Subject: [PATCH] Allow passing plugin parameters with dashes in names + (RhBug:1980712) + += changelog = +type: bugfix +resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1980712 +--- + dnf/plugin.py | 20 +++++++++++++++++--- + 1 file changed, 17 insertions(+), 3 deletions(-) + +diff --git a/dnf/plugin.py b/dnf/plugin.py +index 87c1f08f..b083727d 100644 +--- a/dnf/plugin.py ++++ b/dnf/plugin.py +@@ -225,17 +225,17 @@ def _get_plugins_files(paths, disable_plugins, enable_plugins): + matched = True + enable_pattern_tested = False + for pattern_skip in disable_plugins: +- if fnmatch.fnmatch(plugin_name, pattern_skip): ++ if _plugin_name_matches_pattern(plugin_name, pattern_skip): + pattern_disable_found.add(pattern_skip) + matched = False + for pattern_enable in enable_plugins: +- if fnmatch.fnmatch(plugin_name, pattern_enable): ++ if _plugin_name_matches_pattern(plugin_name, pattern_enable): + matched = True + pattern_enable_found.add(pattern_enable) + enable_pattern_tested = True + if not enable_pattern_tested: + for pattern_enable in enable_plugins: +- if fnmatch.fnmatch(plugin_name, pattern_enable): ++ if _plugin_name_matches_pattern(plugin_name, pattern_enable): + pattern_enable_found.add(pattern_enable) + if matched: + plugins.append(fn) +@@ -250,6 +250,20 @@ def _get_plugins_files(paths, disable_plugins, enable_plugins): + return plugins + + ++def _plugin_name_matches_pattern(plugin_name, pattern): ++ """ ++ Checks plugin name matches the pattern. ++ ++ The alternative plugin name using dashes instead of underscores is tried ++ in case of original name is not matched. ++ ++ (see https://bugzilla.redhat.com/show_bug.cgi?id=1980712) ++ """ ++ ++ try_names = set((plugin_name, plugin_name.replace('_', '-'))) ++ return any(fnmatch.fnmatch(name, pattern) for name in try_names) ++ ++ + def register_command(command_class): + # :api + """A class decorator for automatic command registration.""" +-- +2.37.1 + diff --git a/SOURCES/0034-Fix-plugins-unit-tests-unload-plugins-upon-their-del.patch b/SOURCES/0034-Fix-plugins-unit-tests-unload-plugins-upon-their-del.patch new file mode 100644 index 0000000..040c3d2 --- /dev/null +++ b/SOURCES/0034-Fix-plugins-unit-tests-unload-plugins-upon-their-del.patch @@ -0,0 +1,97 @@ +From 9700b8fabd102fcf289281c3c04238da90d7b28e Mon Sep 17 00:00:00 2001 +From: Jan Kolarik +Date: Tue, 13 Sep 2022 14:35:10 +0200 +Subject: [PATCH] Fix plugins unit tests + unload plugins upon their deletion + +=changelog= +type: bugfix +resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2134309 +--- + dnf/plugin.py | 8 ++++++-- + tests/api/test_dnf_base.py | 24 +++++++++++++++++++----- + 2 files changed, 25 insertions(+), 7 deletions(-) + +diff --git a/dnf/plugin.py b/dnf/plugin.py +index b083727d..d2f46ce3 100644 +--- a/dnf/plugin.py ++++ b/dnf/plugin.py +@@ -98,6 +98,9 @@ class Plugins(object): + self.plugin_cls = [] + self.plugins = [] + ++ def __del__(self): ++ self._unload() ++ + def _caller(self, method): + for plugin in self.plugins: + try: +@@ -164,8 +167,9 @@ class Plugins(object): + self._caller('transaction') + + def _unload(self): +- logger.debug(_('Plugins were unloaded')) +- del sys.modules[DYNAMIC_PACKAGE] ++ if DYNAMIC_PACKAGE in sys.modules: ++ logger.log(dnf.logging.DDEBUG, 'Plugins were unloaded.') ++ del sys.modules[DYNAMIC_PACKAGE] + + def unload_removed_plugins(self, transaction): + """ +diff --git a/tests/api/test_dnf_base.py b/tests/api/test_dnf_base.py +index e84e272b..19754b07 100644 +--- a/tests/api/test_dnf_base.py ++++ b/tests/api/test_dnf_base.py +@@ -7,10 +7,23 @@ from __future__ import unicode_literals + import dnf + import dnf.conf + ++import tests.support ++ + from .common import TestCase + from .common import TOUR_4_4 + + ++def conf_with_empty_plugins(): ++ """ ++ Use empty configuration to avoid importing plugins from default paths ++ which would lead to crash of other tests. ++ """ ++ conf = tests.support.FakeConf() ++ conf.plugins = True ++ conf.pluginpath = [] ++ return conf ++ ++ + class DnfBaseApiTest(TestCase): + def setUp(self): + self.base = dnf.Base(dnf.conf.Conf()) +@@ -75,13 +88,12 @@ class DnfBaseApiTest(TestCase): + self.assertHasType(self.base.transaction, dnf.db.group.RPMTransaction) + + def test_init_plugins(self): +- # Base.init_plugins(disabled_glob=(), enable_plugins=(), cli=None) ++ # Base.init_plugins() + self.assertHasAttr(self.base, "init_plugins") + +- # disable plugins to avoid calling dnf.plugin.Plugins._load() multiple times +- # which causes the tests to crash +- self.base.conf.plugins = False +- self.base.init_plugins(disabled_glob=(), enable_plugins=(), cli=None) ++ self.base._conf = conf_with_empty_plugins() ++ ++ self.base.init_plugins() + + def test_pre_configure_plugins(self): + # Base.pre_configure_plugins() +@@ -99,6 +111,8 @@ class DnfBaseApiTest(TestCase): + # Base.unload_plugins() + self.assertHasAttr(self.base, "unload_plugins") + ++ self.base._conf = conf_with_empty_plugins() ++ + self.base.init_plugins() + self.base.unload_plugins() + +-- +2.37.3 + diff --git a/SOURCES/0035-Move-system-upgrade-plugin-to-core-RhBug-2054235.patch b/SOURCES/0035-Move-system-upgrade-plugin-to-core-RhBug-2054235.patch new file mode 100644 index 0000000..0fdb121 --- /dev/null +++ b/SOURCES/0035-Move-system-upgrade-plugin-to-core-RhBug-2054235.patch @@ -0,0 +1,31 @@ +From c9251d182be0bfa66345220cffe0842b44a061a8 Mon Sep 17 00:00:00 2001 +From: Jan Kolarik +Date: Wed, 31 Aug 2022 07:49:39 +0200 +Subject: [PATCH] Move system-upgrade plugin to core (RhBug:2054235) + +Just doc fix. + += changelog = +type: bugfix +resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2054235 +--- + doc/command_ref.rst | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/doc/command_ref.rst b/doc/command_ref.rst +index 7a02448c..bee6a109 100644 +--- a/doc/command_ref.rst ++++ b/doc/command_ref.rst +@@ -182,8 +182,7 @@ Options + ``--downloaddir=, --destdir=`` + Redirect downloaded packages to provided directory. The option has to be used together with the \-\ + :ref:`-downloadonly ` command line option, with the +- ``download``, ``modulesync`` or ``reposync`` commands (dnf-plugins-core) or with the ``system-upgrade`` command +- (dnf-plugins-extras). ++ ``download``, ``modulesync``, ``reposync`` or ``system-upgrade`` commands (dnf-plugins-core). + + .. _downloadonly-label: + +-- +2.37.3 + diff --git a/SOURCES/0036-Add-support-for-rollback-of-group-upgrade-rollback-R.patch b/SOURCES/0036-Add-support-for-rollback-of-group-upgrade-rollback-R.patch new file mode 100644 index 0000000..f8a1d4d --- /dev/null +++ b/SOURCES/0036-Add-support-for-rollback-of-group-upgrade-rollback-R.patch @@ -0,0 +1,58 @@ +From a32b2f7d596247124ad6ff5ab71bc83bf78f0518 Mon Sep 17 00:00:00 2001 +From: Jan Kolarik +Date: Tue, 13 Sep 2022 13:55:35 +0200 +Subject: [PATCH] Add support for rollback of group upgrade rollback + (RhBug:2016070) + += changelog = +type: bugfix +resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2016070 +--- + dnf/transaction_sr.py | 20 ++++++++++++-------- + 1 file changed, 12 insertions(+), 8 deletions(-) + +diff --git a/dnf/transaction_sr.py b/dnf/transaction_sr.py +index 5d403a3e..b389f152 100644 +--- a/dnf/transaction_sr.py ++++ b/dnf/transaction_sr.py +@@ -553,12 +553,14 @@ class TransactionReplay(object): + + if action == "Install": + self._swdb_group_install(group_id, pkg_types, group_data["packages"]) +- elif action == "Upgrade": +- self._swdb_group_upgrade(group_id, pkg_types, group_data["packages"]) +- elif action == "Downgraded": +- self._swdb_group_downgrade(group_id, pkg_types, group_data["packages"]) + elif action == "Removed": + self._swdb_group_remove(group_id, pkg_types, group_data["packages"]) ++ # Groups are not versioned, but a reverse transaction could be applied, ++ # therefore we treat both actions the same way ++ elif action == "Upgrade" or action == "Upgraded": ++ self._swdb_group_upgrade(group_id, pkg_types, group_data["packages"]) ++ elif action == "Downgrade" or action == "Downgraded": ++ self._swdb_group_downgrade(group_id, pkg_types, group_data["packages"]) + else: + errors.append(TransactionError( + _('Unexpected value of group action "{action}" for group "{group}".') +@@ -584,12 +586,14 @@ class TransactionReplay(object): + + if action == "Install": + self._swdb_environment_install(env_id, pkg_types, env_data["groups"]) +- elif action == "Upgrade": +- self._swdb_environment_upgrade(env_id, pkg_types, env_data["groups"]) +- elif action == "Downgraded": +- self._swdb_environment_downgrade(env_id, pkg_types, env_data["groups"]) + elif action == "Removed": + self._swdb_environment_remove(env_id, pkg_types, env_data["groups"]) ++ # Environments are not versioned, but a reverse transaction could be applied, ++ # therefore we treat both actions the same way ++ elif action == "Upgrade" or action == "Upgraded": ++ self._swdb_environment_upgrade(env_id, pkg_types, env_data["groups"]) ++ elif action == "Downgrade" or action == "Downgraded": ++ self._swdb_environment_downgrade(env_id, pkg_types, env_data["groups"]) + else: + errors.append(TransactionError( + _('Unexpected value of environment action "{action}" for environment "{env}".') +-- +2.37.3 + diff --git a/SOURCES/0037-Document-changes-to-offline-upgrade-command.patch b/SOURCES/0037-Document-changes-to-offline-upgrade-command.patch new file mode 100644 index 0000000..80ff1ad --- /dev/null +++ b/SOURCES/0037-Document-changes-to-offline-upgrade-command.patch @@ -0,0 +1,95 @@ +From 97fe94c94f030f5596a3a3ac52748bdd7544ad52 Mon Sep 17 00:00:00 2001 +From: Jan Kolarik +Date: Tue, 1 Nov 2022 09:15:08 +0000 +Subject: [PATCH] Document changes to offline-upgrade command (RhBug:1939975) + +A support for security filters was added to the offline-upgrade command. This commit adds the documentation into the man pages. + += changelog = +type: bugfix +resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1939975 +--- + doc/command_ref.rst | 28 ++++++++++++++-------------- + 1 file changed, 14 insertions(+), 14 deletions(-) + +diff --git a/doc/command_ref.rst b/doc/command_ref.rst +index bee6a109..7279b3a4 100644 +--- a/doc/command_ref.rst ++++ b/doc/command_ref.rst +@@ -113,7 +113,7 @@ Options + + ``--advisory=, --advisories=`` + Include packages corresponding to the advisory ID, Eg. FEDORA-2201-123. +- Applicable for the install, repoquery, updateinfo and upgrade commands. ++ Applicable for the ``install``, ``repoquery``, ``updateinfo``, ``upgrade`` and ``offline-upgrade`` (dnf-plugins-core) commands. + + ``--allowerasing`` + Allow erasing of installed packages to resolve dependencies. This option could be used as an alternative to the ``yum swap`` command where packages to remove are not explicitly defined. +@@ -125,12 +125,12 @@ Options + Try the best available package versions in transactions. Specifically during :ref:`dnf upgrade `, which by default skips over updates that can not be installed for dependency reasons, the switch forces DNF to only consider the latest packages. When running into packages with broken dependencies, DNF will fail giving a reason why the latest version can not be installed. + + ``--bugfix`` +- Include packages that fix a bugfix issue. Applicable for the install, repoquery, updateinfo and +- upgrade commands. ++ Include packages that fix a bugfix issue. ++ Applicable for the ``install``, ``repoquery``, ``updateinfo``, ``upgrade`` and ``offline-upgrade`` (dnf-plugins-core) commands. + + ``--bz=, --bzs=`` +- Include packages that fix a Bugzilla ID, Eg. 123123. Applicable for the install, repoquery, +- updateinfo and upgrade commands. ++ Include packages that fix a Bugzilla ID, Eg. 123123. ++ Applicable for the ``install``, ``repoquery``, ``updateinfo``, ``upgrade`` and ``offline-upgrade`` (dnf-plugins-core) commands. + + ``-C, --cacheonly`` + Run entirely from system cache, don't update the cache and use it even in case it is expired. +@@ -148,8 +148,8 @@ Options + + ``--cve=, --cves=`` + Include packages that fix a CVE (Common Vulnerabilities and Exposures) ID +- (http://cve.mitre.org/about/), Eg. CVE-2201-0123. Applicable for the install, repoquery, updateinfo, +- and upgrade commands. ++ (http://cve.mitre.org/about/), Eg. CVE-2201-0123. ++ Applicable for the ``install``, ``repoquery``, ``updateinfo``, ``upgrade`` and ``offline-upgrade`` (dnf-plugins-core) commands. + + ``-d , --debuglevel=`` + Debugging output level. This is an integer value between 0 (no additional information strings) and 10 (shows all debugging information, even that not understandable to the user), default is 2. Deprecated, use ``-v`` instead. +@@ -208,8 +208,8 @@ Options + Enable additional repositories by an id or a glob. + + ``--enhancement`` +- Include enhancement relevant packages. Applicable for the install, repoquery, updateinfo and +- upgrade commands. ++ Include enhancement relevant packages. ++ Applicable for the ``install``, ``repoquery``, ``updateinfo``, ``upgrade`` and ``offline-upgrade`` (dnf-plugins-core) commands. + + .. _exclude_option-label: + +@@ -280,8 +280,8 @@ Options + ``--setopt`` using configuration from ``/path/dnf.conf``. + + ``--newpackage`` +- Include newpackage relevant packages. Applicable for the install, repoquery, updateinfo and +- upgrade commands. ++ Include newpackage relevant packages. ++ Applicable for the ``install``, ``repoquery``, ``updateinfo``, ``upgrade`` and ``offline-upgrade`` (dnf-plugins-core) commands. + + ``--noautoremove`` + Disable removal of dependencies that are no longer used. It sets +@@ -353,11 +353,11 @@ Options + + ``--sec-severity=, --secseverity=`` + Includes packages that provide a fix for an issue of the specified severity. +- Applicable for the install, repoquery, updateinfo and upgrade commands. ++ Applicable for the ``install``, ``repoquery``, ``updateinfo``, ``upgrade`` and ``offline-upgrade`` (dnf-plugins-core) commands. + + ``--security`` +- Includes packages that provide a fix for a security issue. Applicable for the +- upgrade command. ++ Includes packages that provide a fix for a security issue. ++ Applicable for the ``install``, ``repoquery``, ``updateinfo``, ``upgrade`` and ``offline-upgrade`` (dnf-plugins-core) commands. + + .. _setopt_option-label: + +-- +2.38.1 + diff --git a/SOURCES/0038-Better-explain-traceback-of-rpm.error-with-dnf.patch b/SOURCES/0038-Better-explain-traceback-of-rpm.error-with-dnf.patch new file mode 100644 index 0000000..2282e18 --- /dev/null +++ b/SOURCES/0038-Better-explain-traceback-of-rpm.error-with-dnf.patch @@ -0,0 +1,114 @@ +From f1fbef17862e033bf9518bd318339b405f2664dd Mon Sep 17 00:00:00 2001 +From: Nicola Sella +Date: Mon, 22 Mar 2021 17:37:51 +0100 +Subject: [PATCH 1/2] Better explain traceback of rpm.error with dnf + +=changelog= +msg: Add dnf.error message to explain rpm.error traceback when package not found after resolving a transaction +type: bugfix +resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1815327 +resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1887293 +resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1909845 +--- + dnf/db/group.py | 78 ++++++++++++++++++++++++++----------------------- + 1 file changed, 41 insertions(+), 37 deletions(-) + +diff --git a/dnf/db/group.py b/dnf/db/group.py +index 312e3b98..3a17019a 100644 +--- a/dnf/db/group.py ++++ b/dnf/db/group.py +@@ -26,6 +26,7 @@ import dnf.exceptions + from dnf.i18n import _ + from dnf.util import logger + ++import rpm + + class PersistorBase(object): + def __init__(self, history): +@@ -316,43 +317,46 @@ class RPMTransaction(object): + modular_problems = 0 + + for tsi in self: +- if tsi.action == libdnf.transaction.TransactionItemAction_DOWNGRADE: +- hdr = tsi.pkg._header +- modular_problems += self._test_fail_safe(hdr, tsi.pkg) +- ts.addInstall(hdr, tsi, 'u') +- elif tsi.action == libdnf.transaction.TransactionItemAction_DOWNGRADED: +- ts.addErase(tsi.pkg.idx) +- elif tsi.action == libdnf.transaction.TransactionItemAction_INSTALL: +- hdr = tsi.pkg._header +- modular_problems += self._test_fail_safe(hdr, tsi.pkg) +- ts.addInstall(hdr, tsi, 'i') +- elif tsi.action == libdnf.transaction.TransactionItemAction_OBSOLETE: +- hdr = tsi.pkg._header +- modular_problems += self._test_fail_safe(hdr, tsi.pkg) +- ts.addInstall(hdr, tsi, 'u') +- elif tsi.action == libdnf.transaction.TransactionItemAction_OBSOLETED: +- ts.addErase(tsi.pkg.idx) +- elif tsi.action == libdnf.transaction.TransactionItemAction_REINSTALL: +- # note: in rpm 4.12 there should not be set +- # rpm.RPMPROB_FILTER_REPLACEPKG to work +- hdr = tsi.pkg._header +- modular_problems += self._test_fail_safe(hdr, tsi.pkg) +- ts.addReinstall(hdr, tsi) +- elif tsi.action == libdnf.transaction.TransactionItemAction_REINSTALLED: +- # Required when multiple packages with the same NEVRA marked as installed +- ts.addErase(tsi.pkg.idx) +- elif tsi.action == libdnf.transaction.TransactionItemAction_REMOVE: +- ts.addErase(tsi.pkg.idx) +- elif tsi.action == libdnf.transaction.TransactionItemAction_UPGRADE: +- hdr = tsi.pkg._header +- modular_problems += self._test_fail_safe(hdr, tsi.pkg) +- ts.addInstall(hdr, tsi, 'u') +- elif tsi.action == libdnf.transaction.TransactionItemAction_UPGRADED: +- ts.addErase(tsi.pkg.idx) +- elif tsi.action == libdnf.transaction.TransactionItemAction_REASON_CHANGE: +- pass +- else: +- raise RuntimeError("TransactionItemAction not handled: %s" % tsi.action) ++ try: ++ if tsi.action == libdnf.transaction.TransactionItemAction_DOWNGRADE: ++ hdr = tsi.pkg._header ++ modular_problems += self._test_fail_safe(hdr, tsi.pkg) ++ ts.addInstall(hdr, tsi, 'u') ++ elif tsi.action == libdnf.transaction.TransactionItemAction_DOWNGRADED: ++ ts.addErase(tsi.pkg.idx) ++ elif tsi.action == libdnf.transaction.TransactionItemAction_INSTALL: ++ hdr = tsi.pkg._header ++ modular_problems += self._test_fail_safe(hdr, tsi.pkg) ++ ts.addInstall(hdr, tsi, 'i') ++ elif tsi.action == libdnf.transaction.TransactionItemAction_OBSOLETE: ++ hdr = tsi.pkg._header ++ modular_problems += self._test_fail_safe(hdr, tsi.pkg) ++ ts.addInstall(hdr, tsi, 'u') ++ elif tsi.action == libdnf.transaction.TransactionItemAction_OBSOLETED: ++ ts.addErase(tsi.pkg.idx) ++ elif tsi.action == libdnf.transaction.TransactionItemAction_REINSTALL: ++ # note: in rpm 4.12 there should not be set ++ # rpm.RPMPROB_FILTER_REPLACEPKG to work ++ hdr = tsi.pkg._header ++ modular_problems += self._test_fail_safe(hdr, tsi.pkg) ++ ts.addReinstall(hdr, tsi) ++ elif tsi.action == libdnf.transaction.TransactionItemAction_REINSTALLED: ++ # Required when multiple packages with the same NEVRA marked as installed ++ ts.addErase(tsi.pkg.idx) ++ elif tsi.action == libdnf.transaction.TransactionItemAction_REMOVE: ++ ts.addErase(tsi.pkg.idx) ++ elif tsi.action == libdnf.transaction.TransactionItemAction_UPGRADE: ++ hdr = tsi.pkg._header ++ modular_problems += self._test_fail_safe(hdr, tsi.pkg) ++ ts.addInstall(hdr, tsi, 'u') ++ elif tsi.action == libdnf.transaction.TransactionItemAction_UPGRADED: ++ ts.addErase(tsi.pkg.idx) ++ elif tsi.action == libdnf.transaction.TransactionItemAction_REASON_CHANGE: ++ pass ++ else: ++ raise RuntimeError("TransactionItemAction not handled: %s" % tsi.action) ++ except rpm.error as e: ++ raise dnf.exceptions.Error(_("An rpm exception occurred: %s" % e)) + if modular_problems: + raise dnf.exceptions.Error(_("No available modular metadata for modular package")) + +-- +2.39.0 + diff --git a/SOURCES/0039-Ignore-processing-variable-files-with-unsupported-en.patch b/SOURCES/0039-Ignore-processing-variable-files-with-unsupported-en.patch new file mode 100644 index 0000000..ef476b6 --- /dev/null +++ b/SOURCES/0039-Ignore-processing-variable-files-with-unsupported-en.patch @@ -0,0 +1,50 @@ +From 23742561dcb168604d9668815a8c1ebbdf516d39 Mon Sep 17 00:00:00 2001 +From: Jan Kolarik +Date: Wed, 23 Nov 2022 08:44:41 +0000 +Subject: [PATCH 2/2] Ignore processing variable files with unsupported + encoding (RhBug:2141215) + +This issue could be seen for example when there are some temporary files stored by text editors in the `/etc/dnf/vars` folder. These files could be in the binary format and causes `UnicodeDecodeError` exception to be thrown during processing of the var files. + += changelog = +type: bugfix +resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2141215 +--- + dnf/conf/substitutions.py | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +diff --git a/dnf/conf/substitutions.py b/dnf/conf/substitutions.py +index 1281bdf0..4d0f0d55 100644 +--- a/dnf/conf/substitutions.py ++++ b/dnf/conf/substitutions.py +@@ -18,13 +18,15 @@ + # Red Hat, Inc. + # + ++import logging + import os + import re + +-import dnf +-import dnf.exceptions ++from dnf.i18n import _ + + ENVIRONMENT_VARS_RE = re.compile(r'^DNF_VAR_[A-Za-z0-9_]+$') ++logger = logging.getLogger('dnf') ++ + + class Substitutions(dict): + # :api +@@ -60,7 +62,8 @@ class Substitutions(dict): + val = fp.readline() + if val and val[-1] == '\n': + val = val[:-1] +- except (OSError, IOError): ++ except (OSError, IOError, UnicodeDecodeError) as e: ++ logger.warning(_("Error when parsing a variable from file '{0}': {1}").format(filepath, e)) + continue + if val is not None: + self[fsvar] = val +-- +2.39.0 + diff --git a/SPECS/dnf.spec b/SPECS/dnf.spec index 421b865..d689823 100644 --- a/SPECS/dnf.spec +++ b/SPECS/dnf.spec @@ -66,7 +66,7 @@ It supports RPMs, modules and comps groups & environments. Name: dnf Version: 4.7.0 -Release: 11%{?dist} +Release: 15%{?dist} Summary: %{pkg_summary} # For a breakdown of the licensing, see PACKAGE-LICENSING License: GPLv2+ @@ -102,6 +102,21 @@ Patch0023: 0023-Base.reset-plug-temporary-leak-of-libsolv-s-page-fil.patch Patch0024: 0024-doc-Describe-how-gpg-keys-are-stored-for-repo_ggpche.patch Patch0025: 0025-Add-only-relevant-pkgs-to-upgrade-transaction-RhBug-.patch Patch0026: 0026-Use-installed_all-because-installed_query-is-filtere.patch +Patch0027: 0027-Don-t-include-resolved-advisories-for-obsoletes-with.patch +Patch0028: 0028-Set-default-value-for-variable-to-prevent-crash-RhBu.patch +Patch0029: 0029-Add-doc-related-to-destdir-and-downloadonly-options-.patch +Patch0030: 0030-Expose-plugin-unload-method-to-API-RhBug-2047251.patch +Patch0031: 0031-Add-support-for-group-upgrade-rollback-RhBug-2016070.patch +Patch0032: 0032-Fix-upgrade-from-file-to-noarch-pkg-RhBug-2006018.patch +Patch0033: 0033-Allow-passing-plugin-parameters-with-dashes-in-names.patch +Patch0034: 0034-Fix-plugins-unit-tests-unload-plugins-upon-their-del.patch +Patch0035: 0035-Move-system-upgrade-plugin-to-core-RhBug-2054235.patch +Patch0036: 0036-Add-support-for-rollback-of-group-upgrade-rollback-R.patch +Patch0037: 0037-Document-changes-to-offline-upgrade-command.patch +Patch0038: 0038-Better-explain-traceback-of-rpm.error-with-dnf.patch +Patch0039: 0039-Ignore-processing-variable-files-with-unsupported-en.patch + + BuildArch: noarch BuildRequires: cmake @@ -401,6 +416,27 @@ popd %{python3_sitelib}/%{name}/automatic/ %changelog +* Thu Jan 05 2023 Nicola Sella - 4.7.0-15 +- Ignore processing variable files with unsupported encoding (RhBug:2141215) +- Better explain traceback of rpm.error with dnf + +* Wed Nov 30 2022 Nicola Sella - 4.7.0-14 +- Document changes to offline-upgrade command (RhBug:1939975,2139324) + +* Wed Oct 26 2022 Nicola Sella - 4.7.0-13 +- Add support for rollback of group upgrade rollback (RhBug:2016070) +- Move system-upgrade plugin to core (RhBug:2054235) +- Fix plugins unit tests + unload plugins upon their deletion (RhBug:2134309) + +* Tue Sep 13 2022 Lukas Hrazky - 4.7.0-12 +- Allow passing plugin parameters with dashes in names (RhBug:1980712) +- Fix upgrade from file to noarch pkg (RhBug:2006018) +- Add support for group upgrade rollback (RhBug:2016070) +- Expose plugin unload method to API (RhBug:2047251) +- Add doc related to --destdir and --downloadonly options (RhBug:2100811) +- Set default value for variable to prevent crash (RhBug:2091636) +- Don't include resolved advisories for obsoletes with sec. filters (RhBug:2101421) + * Tue Jul 19 2022 Lukas Hrazky - 4.7.0-11 - [doc] Describe how gpg keys are stored for `repo_ggpcheck` - Add only relevant pkgs to upgrade transaction (RhBug:2097757)