83 lines
3.5 KiB
Diff
83 lines
3.5 KiB
Diff
From a93e9843cf224aecf7adcbf1b7eb9efd9014ec28 Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?Petr=20P=C3=ADsa=C5=99?= <ppisar@redhat.com>
|
|
Date: Mon, 28 Jul 2025 17:25:09 +0200
|
|
Subject: [PATCH] automatic: Fix detecting releasever_minor
|
|
|
|
When running dnf-automatic in RHEL 10.0 where releasever_minor should
|
|
default to "0", releasever_minor variable was incorrectly detected as
|
|
undefined. That led to expanding a metalink for an EPEL repository to
|
|
a wrong URL.
|
|
|
|
The cause was a bad logic in updating the release, releasever_major,
|
|
and releasever_minor triplet in dnf.cli.cli.Cli._read_conf_file():
|
|
Setting release invalidates releasever_major and releasever_minor. At
|
|
the same time for backward compatibilty detected release only contains
|
|
the major number.
|
|
|
|
This bug did not manifest in "dnf upgrade" command because "dnf"
|
|
program does not explicitly construct dnf.Base() before calling
|
|
_read_conf_file(). That is dnf-automtic first detected releasever=10
|
|
and releasever_minor=0 when calling _setup_default_conf() via
|
|
dnf.Base(). But then _read_conf_file() called by dnf-automatic set
|
|
releasever again to 10, that rewrote releasever_minor to None and
|
|
then _read_conf_file() set releasever_minor to releasever_minor, i.e
|
|
to None.
|
|
|
|
This patch does not change the code flow to minimize regressions.
|
|
Instead it saves the original releasever_minor value to be able to
|
|
default to it again.
|
|
|
|
Resolve: #2259
|
|
---
|
|
dnf/cli/cli.py | 8 ++++++--
|
|
tests/test_config.py | 12 ++++++++++++
|
|
2 files changed, 18 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/dnf/cli/cli.py b/dnf/cli/cli.py
|
|
index 7aa7b04410..e0d88cac38 100644
|
|
--- a/dnf/cli/cli.py
|
|
+++ b/dnf/cli/cli.py
|
|
@@ -1018,9 +1018,13 @@ def or_else(*args):
|
|
if arg is not None:
|
|
return arg
|
|
return None
|
|
+ # Setting conf.releasever rewrites conf.releasever_major and
|
|
+ # conf.releasever_minor. Copy them for later use.
|
|
+ old_releasever_major = conf.releasever_major
|
|
+ old_releasever_minor = conf.releasever_minor
|
|
conf.releasever = or_else(releasever, conf.releasever)
|
|
- conf.releasever_major = or_else(releasever_major, det_major, conf.releasever_major)
|
|
- conf.releasever_minor = or_else(releasever_minor, det_minor, conf.releasever_minor)
|
|
+ conf.releasever_major = or_else(releasever_major, det_major, old_releasever_major)
|
|
+ conf.releasever_minor = or_else(releasever_minor, det_minor, old_releasever_minor)
|
|
|
|
if conf.releasever is None:
|
|
logger.warning(_("Unable to detect release version (use '--releasever' to specify "
|
|
diff --git a/tests/test_config.py b/tests/test_config.py
|
|
index 69ba988c41..9445ea29be 100644
|
|
--- a/tests/test_config.py
|
|
+++ b/tests/test_config.py
|
|
@@ -21,6 +21,7 @@
|
|
|
|
import argparse
|
|
|
|
+import dnf
|
|
import dnf.conf
|
|
import dnf.conf.read
|
|
import dnf.exceptions
|
|
@@ -164,3 +165,14 @@ def test_releasever_major_minor(self):
|
|
self.assertEqual(conf.releasever, '1.2')
|
|
self.assertEqual(conf.releasever_major, '3')
|
|
self.assertEqual(conf.releasever_minor, '4')
|
|
+
|
|
+ def test__read_conf_file_preserves_autodetected_releasever_major_minor(self):
|
|
+ base = dnf.Base()
|
|
+ base.conf.releasever = '1' # Do not set to '1.2', autodetection pretends '1'
|
|
+ base.conf.releasever_major = '1'
|
|
+ base.conf.releasever_minor = '2'
|
|
+ cli = dnf.cli.Cli(base)
|
|
+ cli._read_conf_file()
|
|
+ self.assertEqual(base.conf.releasever, '1')
|
|
+ self.assertEqual(base.conf.releasever_major, '1')
|
|
+ self.assertEqual(base.conf.releasever_minor, '2')
|