Compare commits

...

10 Commits

Author SHA1 Message Date
openeuler-ci-bot
075c5f4247
!263 [sync] PR-261: dnf-automatic更新安全包和dnf tool更新行为不同
From: @openeuler-sync-bot 
Reviewed-by: @t_feng 
Signed-off-by: @t_feng
2024-12-20 03:21:18 +00:00
majianhan
1d9d1b7694 Fix dnf-automatic service to apply security updates the same way as dnf tool
(cherry picked from commit 4192f3883cd99884699d8a31ab9ba5ab0db0f3fe)
2024-12-09 17:37:29 +08:00
openeuler-ci-bot
2224f19500
!249 Allow local downloads to same downloaddir
From: @zhangzikang1992 
Reviewed-by: @t_feng 
Signed-off-by: @t_feng
2024-09-20 08:29:39 +00:00
zhangzikang1992
120d1ce549 Allow local downloads to same downloaddir 2024-09-09 15:21:09 +08:00
openeuler-ci-bot
c7a2af3907
!244 [sync] PR-241: Drop wrong obsolete tag
From: @openeuler-sync-bot 
Reviewed-by: @anonymous_z 
Signed-off-by: @anonymous_z
2024-08-31 08:42:28 +00:00
Funda Wang
ab5da36446 Drop wrong obsolete tag
(cherry picked from commit 6a01ac7f19f1ac27826af3761dbb9a44cdd027a6)
2024-08-16 15:54:30 +08:00
openeuler-ci-bot
b5ea1fc594
!232 [sync] PR-231: dnf:Limit queries to nevra forms when provided by command and Update the man page entry for the countme option
From: @openeuler-sync-bot 
Reviewed-by: @t_feng 
Signed-off-by: @t_feng
2024-07-25 11:27:56 +00:00
LuWu
a16595aa5b [Backport]dnf:Limit queries to nevra forms when provided by command and Update the man page entry for the countme option
Reference:0a11bd268e
c640ec0ef6
a8c77bb0d8
Conflict:no
(cherry picked from commit b512eca8f5c9b1d6242b409a7c475f5cd0c3a022)
2024-07-25 17:23:31 +08:00
openeuler-ci-bot
916ff75f16
!223 [sync] PR-222: dnf:Remove --duplicates and --oldinstallonly exit with 0 when nothing to remove and Add all candidates for reinstall to solver
From: @openeuler-sync-bot 
Reviewed-by: @anonymous_z 
Signed-off-by: @anonymous_z
2024-06-17 11:37:25 +00:00
hanhuihui
bed55ca098 dnf:Remove --duplicates and --oldinstallonly exit with 0 when nothing to remove and Add all candidates for reinstall to solver
(cherry picked from commit d2a54403c0a6008b66d50d4581df70253573f905)
2024-06-17 09:38:23 +08:00
9 changed files with 482 additions and 3 deletions

View File

@ -0,0 +1,73 @@
From 96f8d79c37e119ff56f730797865121b63241a6b Mon Sep 17 00:00:00 2001
From: Jaroslav Mracek <jmracek@redhat.com>
Date: Thu, 15 Feb 2024 11:28:59 +0100
Subject: [PATCH] Add all candidates for reinstall to solver
Resolves: https://issues.redhat.com/browse/RHEL-25005
Conflict:NA
Reference:https://github.com/rpm-software-management/dnf/commit/96f8d79c37e119ff56f730797865121b63241a6b
---
dnf/base.py | 9 ++++++---
dnf/query.py | 5 ++++-
tests/test_queries.py | 7 ++++++-
3 files changed, 16 insertions(+), 5 deletions(-)
diff --git a/dnf/base.py b/dnf/base.py
index 9b59b9d7e5..552d53f4c7 100644
--- a/dnf/base.py
+++ b/dnf/base.py
@@ -2336,19 +2336,22 @@ def reinstall(self, pkg_spec, old_reponame=None, new_reponame=None,
if not installed_pkgs:
raise dnf.exceptions.PackagesNotInstalledError(
- 'no package matched', pkg_spec, available_nevra2pkg.values())
+ 'no package matched', pkg_spec, available_q.run())
cnt = 0
clean_deps = self.conf.clean_requirements_on_remove
+ strict = self.conf.strict
for installed_pkg in installed_pkgs:
try:
- available_pkg = available_nevra2pkg[ucd(installed_pkg)]
+ available_pkgs = available_nevra2pkg[ucd(installed_pkg)]
except KeyError:
if not remove_na:
continue
self._goal.erase(installed_pkg, clean_deps=clean_deps)
else:
- self._goal.install(available_pkg)
+ sltr = dnf.selector.Selector(self.sack)
+ sltr.set(pkg=available_pkgs)
+ self._goal.install(select=sltr, optional=(not strict))
cnt += 1
if cnt == 0:
diff --git a/dnf/query.py b/dnf/query.py
index ab4139bf9a..02e631a6ec 100644
--- a/dnf/query.py
+++ b/dnf/query.py
@@ -43,4 +43,7 @@ def _by_provides(sack, patterns, ignore_case=False, get_query=False):
return q.run()
def _per_nevra_dict(pkg_list):
- return {ucd(pkg):pkg for pkg in pkg_list}
+ nevra_dic = {}
+ for pkg in pkg_list:
+ nevra_dic.setdefault(ucd(pkg), []).append(pkg)
+ return nevra_dic
diff --git a/tests/test_queries.py b/tests/test_queries.py
index cdcb7ca453..e025300879 100644
--- a/tests/test_queries.py
+++ b/tests/test_queries.py
@@ -128,4 +128,9 @@ def test_per_nevra_dict(self):
dct = dnf.query._per_nevra_dict(pkgs)
self.assertCountEqual(dct.keys(),
["lotus-3-16.x86_64", "lotus-3-16.i686"])
- self.assertCountEqual(dct.values(), pkgs)
+ test_list = []
+ for list_items in dct.values():
+ for item in list_items:
+ test_list.append(item)
+
+ self.assertCountEqual(test_list, pkgs)

View File

@ -0,0 +1,33 @@
From dee3952a8c19d733b7c5b1d854b1ccde947d770d Mon Sep 17 00:00:00 2001
From: Nic <138107617+nicbadiu@users.noreply.github.com>
Date: Fri, 28 Jun 2024 12:56:34 +0300
Subject: [PATCH] Allow local downloads to same `downloaddir`
Currently when `dnf download --downloaddir <dir> <package>` sources`<package>` from `<dir>` it triggers a `shutil.SameFileError` exception and aborts the entire download process.
This goes against the current flow which marks locally present RPMs that match a remote RPM as `[SKIPPED] <package>.rpm: Already downloaded`.
This change allows downloads of locally sourced packages to the same file, treating it as a no-op.
---
dnf/base.py | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/dnf/base.py b/dnf/base.py
index dac3cefd..c1affc8c 100644
--- a/dnf/base.py
+++ b/dnf/base.py
@@ -1320,7 +1320,10 @@ class Base(object):
pkg.location.lstrip("/"))
else:
location = os.path.join(pkg.repo.pkgdir, pkg.location.lstrip("/"))
- shutil.copy(location, self.conf.destdir)
+ try:
+ shutil.copy(location, self.conf.destdir)
+ except shutil.SameFileError:
+ pass
def add_remote_rpms(self, path_list, strict=True, progress=None):
# :api
--
2.27.0

View File

@ -0,0 +1,130 @@
From 0a11bd268ecfaa0bacf012f2ed2ee292700a02aa Mon Sep 17 00:00:00 2001
From: Jaroslav Mracek <jmracek@redhat.com>
Date: Wed, 22 May 2024 11:09:34 +0200
Subject: [PATCH] Limit queries to nevra forms when provided by command
Command `dnf install-n <provide>` does not install only according
to package mame but still search in provides. The patch limits
searrch only to NEVRA forms for install, remove, autoremove,
and repoquery commands.
Resolves partially: https://issues.redhat.com/browse/RHEL-5747
Conflict:NA
Reference:https://github.com/rpm-software-management/dnf/commit/0a11bd268ecfaa0bacf012f2ed2ee292700a02aa
---
dnf/base.py | 14 ++++++++++++--
dnf/cli/commands/repoquery.py | 5 +++--
doc/api_base.rst | 6 +++++-
doc/command_ref.rst | 7 +++++--
4 files changed, 25 insertions(+), 7 deletions(-)
diff --git a/dnf/base.py b/dnf/base.py
index a6b3574686..dac3cefd7a 100644
--- a/dnf/base.py
+++ b/dnf/base.py
@@ -2064,9 +2064,14 @@ def install_specs(self, install, exclude=None, reponame=None, strict=True, forms
def install(self, pkg_spec, reponame=None, strict=True, forms=None):
# :api
"""Mark package(s) given by pkg_spec and reponame for installation."""
+ kwargs = {'forms': forms, 'with_src': False}
+ if forms:
+ kwargs['with_nevra'] = True
+ kwargs['with_provides'] = False
+ kwargs['with_filenames'] = False
subj = dnf.subject.Subject(pkg_spec)
- solution = subj.get_best_solution(self.sack, forms=forms, with_src=False)
+ solution = subj.get_best_solution(self.sack, **kwargs)
if self.conf.multilib_policy == "all" or subj._is_arch_specified(solution):
q = solution['query']
@@ -2306,8 +2311,13 @@ def autoremove(self, forms=None, pkg_specs=None, grp_specs=None, filenames=None)
def remove(self, pkg_spec, reponame=None, forms=None):
# :api
"""Mark the specified package for removal."""
+ kwargs = {'forms': forms}
+ if forms:
+ kwargs['with_nevra'] = True
+ kwargs['with_provides'] = False
+ kwargs['with_filenames'] = False
- matches = dnf.subject.Subject(pkg_spec).get_best_query(self.sack, forms=forms)
+ matches = dnf.subject.Subject(pkg_spec).get_best_query(self.sack, **kwargs)
installed = [
pkg for pkg in matches.installed()
if reponame is None or
diff --git a/dnf/cli/commands/repoquery.py b/dnf/cli/commands/repoquery.py
index 83b52a8abe..41dd688eac 100644
--- a/dnf/cli/commands/repoquery.py
+++ b/dnf/cli/commands/repoquery.py
@@ -461,9 +461,10 @@ def run(self):
if self.opts.key:
remote_packages = self._add_add_remote_packages()
- kwark = {}
+ kwark = {'with_provides': False}
if self.opts.command in self.nevra_forms:
kwark["forms"] = [self.nevra_forms[self.opts.command]]
+ kwark['with_filenames'] = False
pkgs = []
query_results = q.filter(empty=True)
@@ -474,7 +475,7 @@ def run(self):
for key in self.opts.key:
query_results = query_results.union(
dnf.subject.Subject(key, ignore_case=True).get_best_query(
- self.base.sack, with_provides=False, query=q, **kwark))
+ self.base.sack, query=q, **kwark))
q = query_results
if self.opts.recent:
diff --git a/doc/api_base.rst b/doc/api_base.rst
index 389b28ec6f..95d2d57049 100644
--- a/doc/api_base.rst
+++ b/doc/api_base.rst
@@ -280,7 +280,11 @@
.. method:: install(pkg_spec, reponame=None, strict=True, forms=None)
Mark packages matching `pkg_spec` for installation.
- `reponame` can be a name of a repository or a list of repository names. If given, the selection of available packages is limited to packages from these repositories. If strict is set to False, the installation ignores packages with dependency solving problems. Parameter `forms` has the same meaning as in :meth:`dnf.subject.Subject.get_best_query`.
+ `reponame` can be a name of a repository or a list of repository names. If given, the selection of available
+ packages is limited to packages from these repositories. If strict is set to False, the installation ignores
+ packages with dependency solving problems. Parameter `forms` is list of pattern forms from `hawkey`_.
+ Leaving the parameter to ``None`` results in using a reasonable default list of forms. When forms is specified,
+ method will not match `pkg_spec` with provides and file provides.
.. method:: package_downgrade(pkg, strict=False)
diff --git a/doc/command_ref.rst b/doc/command_ref.rst
index 25431ca1c7..5fba2ebfa5 100644
--- a/doc/command_ref.rst
+++ b/doc/command_ref.rst
@@ -857,7 +857,8 @@ Install Command
are considered correct, the resulting package is picked simply by lexicographical order.
There are also a few specific install commands ``install-n``, ``install-na`` and
- ``install-nevra`` that allow the specification of an exact argument in the NEVRA format.
+ ``install-nevra`` that allow the specification of an exact argument in the NEVRA format. As a consequence, <spec>
+ will be not matched with provides and file provides.
See also :ref:`\configuration_files_replacement_policy-label`.
@@ -1191,7 +1192,8 @@ Remove Command
Removes old installonly packages, keeping only latest versions and version of running kernel.
There are also a few specific remove commands ``remove-n``, ``remove-na`` and ``remove-nevra``
- that allow the specification of an exact argument in the NEVRA format.
+ that allow the specification of an exact argument in the NEVRA format. As a consequence, <spec>
+ will be not matched with provides and file provides.
Remove Examples
---------------
@@ -1255,6 +1257,7 @@ Repoquery Command
There are also a few specific repoquery commands ``repoquery-n``, ``repoquery-na`` and ``repoquery-nevra``
that allow the specification of an exact argument in the NEVRA format (does not affect arguments of options like --whatprovides <arg>, ...).
+ As a consequence, <spec> will be not matched with file provides.
Select Options
--------------

View File

@ -0,0 +1,86 @@
From a8c77bb0d8fe58e48b3b22e21e2cd495d1d6ec15 Mon Sep 17 00:00:00 2001
From: Michal Domonkos <mdomonko@redhat.com>
Date: Wed, 8 May 2024 15:13:38 +0200
Subject: [PATCH] Update the man page entry for the countme option
Make it a bit more explanatory, format the age buckets as a table and
reflect the changes from the libdnf PR #1662.
Conflict:NA
Reference:https://github.com/rpm-software-management/dnf/commit/a8c77bb0d8fe58e48b3b22e21e2cd495d1d6ec15
---
doc/conf_ref.rst | 61 ++++++++++++++++++++++++++++++++++--------------
1 file changed, 44 insertions(+), 17 deletions(-)
diff --git a/doc/conf_ref.rst b/doc/conf_ref.rst
index 240b35f967..f52a4acd80 100644
--- a/doc/conf_ref.rst
+++ b/doc/conf_ref.rst
@@ -858,23 +858,50 @@ configuration.
``countme``
:ref:`boolean <boolean-label>`
- Determines whether a special flag should be added to a single, randomly
- chosen metalink/mirrorlist query each week.
- This allows the repository owner to estimate the number of systems
- consuming it, by counting such queries over a week's time, which is much
- more accurate than just counting unique IP addresses (which is subject to
- both overcounting and undercounting due to short DHCP leases and NAT,
- respectively).
-
- The flag is a simple "countme=N" parameter appended to the metalink and
- mirrorlist URL, where N is an integer representing the "longevity" bucket
- this system belongs to.
- The following 4 buckets are defined, based on how many full weeks have
- passed since the beginning of the week when this system was installed: 1 =
- first week, 2 = first month (2-4 weeks), 3 = six months (5-24 weeks) and 4
- = more than six months (> 24 weeks).
- This information is meant to help distinguish short-lived installs from
- long-term ones, and to gather other statistics about system lifecycle.
+ When enabled, one (and only one) HTTP GET request for the metalink file
+ will be selected at random every week to carry a special URL flag.
+
+ This flag allows the repository provider to estimate the number of systems
+ consuming the repository, by counting such requests over a week's time.
+ This method is more accurate than just counting unique IP addresses (which
+ is subject to both overcounting and undercounting due to short DHCP leases
+ and NAT, respectively).
+
+ This is *not* an out-of-band HTTP request made for this purpose alone.
+ Only requests initiated by DNF during normal operation, such as to check
+ for metadata updates, can get this flag.
+
+ The flag is a simple "countme=N" parameter appended to the metalink URL
+ where N is an integer representing the age "bucket" this system belongs to.
+ Four buckets are defined, based on how many full weeks have passed since
+ the installation of a system:
+
+ ====== ===============================
+ bucket system age
+ ====== ===============================
+ 1 first week
+ 2 first month (2 - 4 weeks)
+ 3 first 6 months (5 - 24 weeks)
+ 4 more than 6 months (> 24 weeks)
+ ====== ===============================
+
+ This number is meant to help distinguish short-lived (throwaway) machines
+ from long-term installs and get a better picture of how systems are used
+ over time.
+
+ To determine a system's installation time ("epoch"), the ``machine-id(5)``
+ file's modification time is used as the single source of truth. This file
+ is semantically tied to the system's lifetime as it's typically populated
+ at installation time or during the first boot by an installer tool or init
+ system (such as ``systemd(1)``), respectively, and remains unchanged.
+
+ If the file is empty or missing (such as in containers), the time of the
+ very first request made using the expanded metalink URL (i.e. with any
+ repository variables such as ``$releasever`` substituted) that carried the
+ flag is declared as the epoch.
+
+ If no metalink URL is defined for this repository but a mirrorlist URL is,
+ the latter is used for this purpose instead.
Default is False.

View File

@ -0,0 +1,26 @@
From c640ec0ef6a6b38fdd549e4a18266e0f70749576 Mon Sep 17 00:00:00 2001
From: Jaroslav Mracek <jmracek@redhat.com>
Date: Thu, 23 May 2024 11:25:29 +0200
Subject: [PATCH] [doc] Remove provide of spec definition for repoquery command
Repoquery command never matched spec with provides.
Conflict:NA
Reference:https://github.com/rpm-software-management/dnf/commit/c640ec0ef6a6b38fdd549e4a18266e0f70749576
---
doc/command_ref.rst | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/doc/command_ref.rst b/doc/command_ref.rst
index 5fba2ebfa5..5684b06119 100644
--- a/doc/command_ref.rst
+++ b/doc/command_ref.rst
@@ -1266,7 +1266,7 @@ Together with ``<package-file-spec>``, control what packages are displayed in th
packages to those matching the specification. All packages are considered if no ``<package-file-spec>`` is specified.
``<package-file-spec>``
- Package specification in the NEVRA format (name[-[epoch:]version[-release]][.arch]), a package provide or a file provide. See :ref:`Specifying Packages
+ Package specification in the NEVRA format (name[-[epoch:]version[-release]][.arch]) or a file provide. See :ref:`Specifying Packages
<specifying_packages-label>`.
``-a``, ``--all``

View File

@ -0,0 +1,32 @@
From 720338fed8124b120b56cc99cc0b13dfe48ffe95 Mon Sep 17 00:00:00 2001
From: Pavla Kratochvilova <pkratoch@redhat.com>
Date: Fri, 5 Apr 2024 14:42:38 +0200
Subject: [PATCH] remove --duplicates: when no duplicates, exit with 0
(RHEL-6424)
If no duplicates are present, then the command succesfully removed all
duplicates and should exit with 0 and write the message to stdout
instead of stderr.
Resolves: https://issues.redhat.com/browse/RHEL-6424
Conflict:NA
Reference:https://github.com/rpm-software-management/dnf/commit/720338fed8124b120b56cc99cc0b13dfe48ffe95
---
dnf/cli/commands/remove.py | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/dnf/cli/commands/remove.py b/dnf/cli/commands/remove.py
index e455ba6e61..af9622fdef 100644
--- a/dnf/cli/commands/remove.py
+++ b/dnf/cli/commands/remove.py
@@ -92,7 +92,8 @@ def run(self):
instonly = self.base._get_installonly_query(q.installed())
dups = q.duplicated().difference(instonly)
if not dups:
- raise dnf.exceptions.Error(_('No duplicated packages found for removal.'))
+ logger.info(_('No duplicated packages found for removal.'))
+ return
for (name, arch), pkgs_list in dups._na_dict().items():
if len(pkgs_list) < 2:

View File

@ -0,0 +1,30 @@
From 87eb5a7a3561381b5ef5e70548f49288251300fc Mon Sep 17 00:00:00 2001
From: Pavla Kratochvilova <pkratoch@redhat.com>
Date: Fri, 5 Apr 2024 14:43:04 +0200
Subject: [PATCH] remove --oldinstallonly: when no old installonly packages,
exit with 0
If no old installonly packages are present, then the command succesfully
removed all of them and should exit with 0 and write the message to
stdout instead of stderr.
Conflict:NA
Reference:https://github.com/rpm-software-management/dnf/commit/87eb5a7a3561381b5ef5e70548f49288251300fc
---
dnf/cli/commands/remove.py | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/dnf/cli/commands/remove.py b/dnf/cli/commands/remove.py
index af9622fdef..32e78d6d4d 100644
--- a/dnf/cli/commands/remove.py
+++ b/dnf/cli/commands/remove.py
@@ -124,8 +124,7 @@ def run(self):
for pkg in instonly:
self.base.package_remove(pkg)
else:
- raise dnf.exceptions.Error(
- _('No old installonly packages found for removal.'))
+ logger.info(_('No old installonly packages found for removal.'))
return
# Remove groups.

View File

@ -0,0 +1,39 @@
From 5388d980c8137c3ee6924f145bd284169d838fad Mon Sep 17 00:00:00 2001
From: Evan Goode <mail@evangoo.de>
Date: Tue, 30 Jan 2024 21:36:46 +0000
Subject: [PATCH] automatic: Use add_security_filters, not_update_security_filters
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Upstream commit: 0b4b8cc8940a4073b33f1bb772651ae27e55f299
Resolves: https://issues.redhat.com/browse/RHEL-21874
It seems that these two approaches for selecting security updates
sometimes disagree. The regular `dnf update` command uses
base.add_security_filters to select security updates, so dnf-automatic
should do the same.
Signed-off-by: Petr Písař <ppisar@redhat.com>
---
dnf/automatic/main.py | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/dnf/automatic/main.py b/dnf/automatic/main.py
index f6f4049..caef627 100644
--- a/dnf/automatic/main.py
+++ b/dnf/automatic/main.py
@@ -375,8 +375,7 @@ def main(args):
def upgrade(base, upgrade_type):
if upgrade_type == 'security':
- base._update_security_filters.append(base.sack.query().upgrades().filterm(
- advisory_type='security'))
+ base.add_security_filters("gte", ("security",))
base.upgrade_all()
elif upgrade_type == 'default':
base.upgrade_all()
--
2.43.0

View File

@ -3,7 +3,7 @@
Name: dnf
Version: 4.16.2
Release: 3
Release: 8
Summary: A software package manager that manages packages on Linux distributions.
License: GPL-2.0-or-later AND GPL-1.0-only
URL: https://github.com/rpm-software-management/dnf
@ -25,6 +25,15 @@ Patch6001: 0001-Add-loongarch-architecture-support.patch
%endif
Patch6002: backport-Fix-bash-completion-due-to-sqlite-changes.patch
Patch6003: backport-remove-duplicates-when-no-duplicates-exit-with-0.patch
Patch6004: backport-remove-oldinstallonly-when-no-old-installonly-packages-exit-with-0.patch
Patch6005: backport-Add-all-candidates-for-reinstall-to-solver.patch
Patch6006: backport-Limit-queries-to-nevra-forms-when-provided-by-command.patch
Patch6007: backport-doc-Remove-provide-of-spec-definition-for-repoquery-command.patch
Patch6008: backport-Update-the-man-page-entry-for-the-countme-option.patch
Patch6009: backport-Allow-local-downloads-to-same-downloaddir.patch
Patch9001: bugfix-automatic-Use-add_security_filters-not-_update_secur.patch
BuildArch: noarch
BuildRequires: cmake gettext systemd bash-completion python3-sphinx
@ -71,14 +80,14 @@ Python 3 interface to DNF.
%package data
Summary: Common data and configuration files for DNF
Requires: libreport-filesystem
Obsoletes: %{name}-conf < %{version}-%{release} %{name} < %{version}-%{release}
Obsoletes: %{name}-conf < %{version}-%{release}
Provides: %{name}-conf = %{version}-%{release}
%description data
Common data and configuration files for DNF
%package automatic
Summary: %{pkg_summary} - automated upgrades
Summary: Package manager - automated upgrades
BuildRequires: systemd
Requires: python3-%{name} = %{version}-%{release}
%{?systemd_requires}
@ -252,6 +261,27 @@ popd
%{_mandir}/man8/%{name}-automatic.8*
%changelog
* Mon Nov 04 2024 majianhan <majianhan@kylinos.cn> - 4.16.2-8
- Type:bugfix
- ID:NA
- SUG:NA
- DESC: Fix dnf-automatic service to apply security updates the same way as dnf tool
* Mon Sep 9 2024 zhangzikang <zhangzikang@kylinos.cn> - 4.16.2-7
- Allow local downloads to same downloaddir
* Wed Aug 14 2024 Funda Wang <fundawang@yeah.net> - 4.16.2-6
- Drop wrong obsolete tag
* Thu Jul 25 2024 LuWu <2398491106@qq.com> - 4.16.2-5
- Limit queries to nevra forms when provided by command and Update the man page entry for the countme option
* Mon May 6 2024 hanhuihui <hanhuihui5@huawei.com> - 4.16.2-4
- Type:bugfix
- CVE:NA
- SUG:NA
- DESC:dnf:Remove --duplicates and --oldinstallonly exit with 0 when nothing to remove and Add all candidates for reinstall to solver
* Mon May 06 2024 huangwenhua <huangwenhua@kylinos.cn> - 4.16.2-3
- Type:bugfix
- CVE:NA