diff --git a/0027-Don-t-include-resolved-advisories-for-obsoletes-with.patch b/0027-Don-t-include-resolved-advisories-for-obsoletes-with.patch new file mode 100644 index 0000000..a0d20ce --- /dev/null +++ b/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/0028-Set-default-value-for-variable-to-prevent-crash-RhBu.patch b/0028-Set-default-value-for-variable-to-prevent-crash-RhBu.patch new file mode 100644 index 0000000..d5e8b5a --- /dev/null +++ b/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/0029-Add-doc-related-to-destdir-and-downloadonly-options-.patch b/0029-Add-doc-related-to-destdir-and-downloadonly-options-.patch new file mode 100644 index 0000000..0d582cc --- /dev/null +++ b/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/0030-Expose-plugin-unload-method-to-API-RhBug-2047251.patch b/0030-Expose-plugin-unload-method-to-API-RhBug-2047251.patch new file mode 100644 index 0000000..8742fb0 --- /dev/null +++ b/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/0031-Add-support-for-group-upgrade-rollback-RhBug-2016070.patch b/0031-Add-support-for-group-upgrade-rollback-RhBug-2016070.patch new file mode 100644 index 0000000..d5eb6f3 --- /dev/null +++ b/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/0032-Fix-upgrade-from-file-to-noarch-pkg-RhBug-2006018.patch b/0032-Fix-upgrade-from-file-to-noarch-pkg-RhBug-2006018.patch new file mode 100644 index 0000000..2f37124 --- /dev/null +++ b/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/0033-Allow-passing-plugin-parameters-with-dashes-in-names.patch b/0033-Allow-passing-plugin-parameters-with-dashes-in-names.patch new file mode 100644 index 0000000..be3fc55 --- /dev/null +++ b/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/0034-Fix-plugins-unit-tests-unload-plugins-upon-their-del.patch b/0034-Fix-plugins-unit-tests-unload-plugins-upon-their-del.patch new file mode 100644 index 0000000..040c3d2 --- /dev/null +++ b/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/0035-Move-system-upgrade-plugin-to-core-RhBug-2054235.patch b/0035-Move-system-upgrade-plugin-to-core-RhBug-2054235.patch new file mode 100644 index 0000000..0fdb121 --- /dev/null +++ b/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/0036-Add-support-for-rollback-of-group-upgrade-rollback-R.patch b/0036-Add-support-for-rollback-of-group-upgrade-rollback-R.patch new file mode 100644 index 0000000..f8a1d4d --- /dev/null +++ b/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/dnf.spec b/dnf.spec index 421b865..5006363 100644 --- a/dnf.spec +++ b/dnf.spec @@ -66,7 +66,7 @@ It supports RPMs, modules and comps groups & environments. Name: dnf Version: 4.7.0 -Release: 11%{?dist} +Release: 13%{?dist} Summary: %{pkg_summary} # For a breakdown of the licensing, see PACKAGE-LICENSING License: GPLv2+ @@ -102,6 +102,17 @@ 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 + BuildArch: noarch BuildRequires: cmake @@ -401,6 +412,20 @@ popd %{python3_sitelib}/%{name}/automatic/ %changelog +* 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)