dnf/0018-Derive-releasever_-major-minor-in-conf-not-substitut.patch
2025-02-07 16:05:30 -06:00

163 lines
5.9 KiB
Diff

From ad24340a6ccf06a4c948824f394a0de5b6a7826d Mon Sep 17 00:00:00 2001
From: Evan Goode <mail@evangoo.de>
Date: Mon, 20 Jan 2025 21:36:18 +0000
Subject: [PATCH] Derive releasever_{major,minor} in conf, not substitutions
Upstream commit: 0e283fb3b0b06f1d31c6d3bd9c14c5fa89bf64a4
This allows setting a releasever_major or releasever_minor
independent of releasever, which is needed by EPEL.
Related: https://issues.redhat.com/browse/RHEL-68034
---
dnf/conf/config.py | 26 ++++++++++++++++++++++++++
dnf/conf/substitutions.py | 17 +++--------------
tests/conf/test_substitutions.py | 19 +++++++++----------
tests/test_config.py | 16 ++++++++++++++++
4 files changed, 54 insertions(+), 24 deletions(-)
diff --git a/dnf/conf/config.py b/dnf/conf/config.py
index 5210ffba..6cf28724 100644
--- a/dnf/conf/config.py
+++ b/dnf/conf/config.py
@@ -430,6 +430,32 @@ class MainConf(BaseConfig):
return
self.substitutions['releasever'] = str(val)
+ @property
+ def releasever_major(self):
+ # :api
+ return self.substitutions.get('releasever_major')
+
+ @releasever_major.setter
+ def releasever_major(self, val):
+ # :api
+ if val is None:
+ self.substitutions.pop('releasever_major', None)
+ return
+ self.substitutions['releasever_major'] = str(val)
+
+ @property
+ def releasever_minor(self):
+ # :api
+ return self.substitutions.get('releasever_minor')
+
+ @releasever_minor.setter
+ def releasever_minor(self, val):
+ # :api
+ if val is None:
+ self.substitutions.pop('releasever_minor', None)
+ return
+ self.substitutions['releasever_minor'] = str(val)
+
@property
def arch(self):
# :api
diff --git a/dnf/conf/substitutions.py b/dnf/conf/substitutions.py
index 5c736a8d..8582d5d8 100644
--- a/dnf/conf/substitutions.py
+++ b/dnf/conf/substitutions.py
@@ -22,11 +22,12 @@ import logging
import os
import re
+from libdnf.conf import ConfigParser
from dnf.i18n import _
from dnf.exceptions import ReadOnlyVariableError
ENVIRONMENT_VARS_RE = re.compile(r'^DNF_VAR_[A-Za-z0-9_]+$')
-READ_ONLY_VARIABLES = frozenset(("releasever_major", "releasever_minor"))
+READ_ONLY_VARIABLES = frozenset()
logger = logging.getLogger('dnf')
@@ -45,18 +46,6 @@ class Substitutions(dict):
elif key in numericvars:
self[key] = val
- @staticmethod
- def _split_releasever(releasever):
- # type: (str) -> tuple[str, str]
- pos = releasever.find(".")
- if pos == -1:
- releasever_major = releasever
- releasever_minor = ""
- else:
- releasever_major = releasever[:pos]
- releasever_minor = releasever[pos + 1:]
- return releasever_major, releasever_minor
-
def __setitem__(self, key, value):
if Substitutions.is_read_only(key):
raise ReadOnlyVariableError(f"Variable \"{key}\" is read-only", variable_name=key)
@@ -65,7 +54,7 @@ class Substitutions(dict):
setitem(key, value)
if key == "releasever" and value:
- releasever_major, releasever_minor = Substitutions._split_releasever(value)
+ releasever_major, releasever_minor = ConfigParser.splitReleasever(value)
setitem("releasever_major", releasever_major)
setitem("releasever_minor", releasever_minor)
diff --git a/tests/conf/test_substitutions.py b/tests/conf/test_substitutions.py
index d8ac3c20..78d3e727 100644
--- a/tests/conf/test_substitutions.py
+++ b/tests/conf/test_substitutions.py
@@ -56,16 +56,6 @@ class SubstitutionsFromEnvironmentTest(tests.support.TestCase):
self.assertEqual('opera', conf.substitutions['GENRE'])
-class SubstitutionsReadOnlyTest(tests.support.TestCase):
- def test_set_readonly(self):
- conf = dnf.conf.Conf()
- variable_name = "releasever_major"
- self.assertTrue(Substitutions.is_read_only(variable_name))
- with self.assertRaises(ReadOnlyVariableError) as cm:
- conf.substitutions["releasever_major"] = "1"
- self.assertEqual(cm.exception.variable_name, "releasever_major")
-
-
class SubstitutionsReleaseverTest(tests.support.TestCase):
def test_releasever_simple(self):
conf = dnf.conf.Conf()
@@ -84,3 +74,12 @@ class SubstitutionsReleaseverTest(tests.support.TestCase):
conf.substitutions["releasever"] = "1.23.45"
self.assertEqual(conf.substitutions["releasever_major"], "1")
self.assertEqual(conf.substitutions["releasever_minor"], "23.45")
+
+ def test_releasever_major_minor_overrides(self):
+ conf = dnf.conf.Conf()
+ conf.substitutions["releasever"] = "1.23"
+ conf.substitutions["releasever_major"] = "45"
+ conf.substitutions["releasever_minor"] = "67"
+ self.assertEqual(conf.substitutions["releasever"], "1.23")
+ self.assertEqual(conf.substitutions["releasever_major"], "45")
+ self.assertEqual(conf.substitutions["releasever_minor"], "67")
diff --git a/tests/test_config.py b/tests/test_config.py
index d8502670..16bdcccb 100644
--- a/tests/test_config.py
+++ b/tests/test_config.py
@@ -145,3 +145,19 @@ class ConfTest(tests.support.TestCase):
conf = Conf()
with self.assertRaises(dnf.exceptions.ConfigError):
conf.debuglevel = '11'
+
+ def test_releasever_major_minor(self):
+ conf = Conf()
+ conf.releasever = '1.2'
+ self.assertEqual(conf.releasever_major, '1')
+ self.assertEqual(conf.releasever_minor, '2')
+
+ # override releasever_major
+ conf.releasever_major = '3'
+ self.assertEqual(conf.releasever_major, '3')
+ self.assertEqual(conf.releasever_minor, '2')
+
+ # override releasever_minor
+ conf.releasever_minor = '4'
+ self.assertEqual(conf.releasever_major, '3')
+ self.assertEqual(conf.releasever_minor, '4')
--
2.48.1