Override releasever_{major,minor} with system-release provides
Resolves: RHEL-68034
This commit is contained in:
parent
7e6ee04c1e
commit
4f0c53e254
162
0018-Derive-releasever_-major-minor-in-conf-not-substitut.patch
Normal file
162
0018-Derive-releasever_-major-minor-in-conf-not-substitut.patch
Normal file
@ -0,0 +1,162 @@
|
||||
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
|
||||
|
179
0019-Override-releasever_-major-minor-with-provides.patch
Normal file
179
0019-Override-releasever_-major-minor-with-provides.patch
Normal file
@ -0,0 +1,179 @@
|
||||
From 66fb0b5ec8ea3d3165e6b2f38e1a01f692d1ec93 Mon Sep 17 00:00:00 2001
|
||||
From: Evan Goode <mail@evangoo.de>
|
||||
Date: Tue, 21 Jan 2025 19:16:13 +0000
|
||||
Subject: [PATCH] Override releasever_{major,minor} with provides
|
||||
|
||||
Upstream commit: 75e3ff0c43a5d605aa43d6ddc2d9e2ef89942999
|
||||
|
||||
The releasever_major and releasever_minor substitution variables are
|
||||
usually derived by splitting releasever on the first `.`. However, to
|
||||
support EPEL 10 [1], we would like a way for distributions to override these
|
||||
values. Specifically, we would like RHEL 10 to have a releasever of `10`
|
||||
with a releasever_major of `10` and a releasever_minor of `0` (later
|
||||
incrementing to `1`, `2`, to correspond with the RHEL minor version).
|
||||
|
||||
This commit adds a new API function, `detect_releasevers`, which derives
|
||||
releasever, releasever_major, and releasever_minor from virtual provides
|
||||
on the system-release package (any of `DISTROVERPKG`). The detection of
|
||||
releasever is unchanged. releasever_major and releasever_minor are
|
||||
specified by the versions of the `system-release-major` and
|
||||
`system-release-minor` provides, respectively.
|
||||
|
||||
If the user specifies a `--releasever=X.Y` on the command line, the
|
||||
distribution settings for releasever, releasever_major, and releasever_minor
|
||||
will all be overridden: releasever will be set to X.Y, releasever_major will be
|
||||
set to X, and releasever_minor will be set to Y, same as before. If a user
|
||||
wants to specify a custom releasever_major and releasever_minor, they have to
|
||||
set all three with `--setopt=releasever=X --setopt=releasever_major=Y
|
||||
--setopt=releasever_minor=z`, taking care to put `releasever_major` and
|
||||
`releasever_minor` after `releasever` so they are not overridden.
|
||||
|
||||
[1] https://issues.redhat.com/browse/RHEL-68034
|
||||
---
|
||||
dnf/base.py | 10 ++++++++--
|
||||
dnf/cli/cli.py | 11 +++++++++--
|
||||
dnf/const.py.in | 2 ++
|
||||
dnf/rpm/__init__.py | 43 +++++++++++++++++++++++++++++++++++++++----
|
||||
4 files changed, 58 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/dnf/base.py b/dnf/base.py
|
||||
index dac3cefd..c4a4f854 100644
|
||||
--- a/dnf/base.py
|
||||
+++ b/dnf/base.py
|
||||
@@ -157,8 +157,14 @@ class Base(object):
|
||||
conf = dnf.conf.Conf()
|
||||
subst = conf.substitutions
|
||||
if 'releasever' not in subst:
|
||||
- subst['releasever'] = \
|
||||
- dnf.rpm.detect_releasever(conf.installroot)
|
||||
+ releasever, major, minor = \
|
||||
+ dnf.rpm.detect_releasevers(conf.installroot)
|
||||
+ subst['releasever'] = releasever
|
||||
+ if major is not None:
|
||||
+ subst['releasever_major'] = major
|
||||
+ if minor is not None:
|
||||
+ subst['releasever_minor'] = minor
|
||||
+
|
||||
return conf
|
||||
|
||||
def _setup_modular_excludes(self):
|
||||
diff --git a/dnf/cli/cli.py b/dnf/cli/cli.py
|
||||
index e2700c09..118ce4e7 100644
|
||||
--- a/dnf/cli/cli.py
|
||||
+++ b/dnf/cli/cli.py
|
||||
@@ -971,13 +971,20 @@ class Cli(object):
|
||||
from_root = "/"
|
||||
subst = conf.substitutions
|
||||
subst.update_from_etc(from_root, varsdir=conf._get_value('varsdir'))
|
||||
+
|
||||
# cachedir, logs, releasever, and gpgkey are taken from or stored in installroot
|
||||
+ major = None
|
||||
+ minor = None
|
||||
if releasever is None and conf.releasever is None:
|
||||
- releasever = dnf.rpm.detect_releasever(conf.installroot)
|
||||
+ releasever, major, minor = dnf.rpm.detect_releasevers(conf.installroot)
|
||||
elif releasever == '/':
|
||||
- releasever = dnf.rpm.detect_releasever(releasever)
|
||||
+ releasever, major, minor = dnf.rpm.detect_releasevers(releasever)
|
||||
if releasever is not None:
|
||||
conf.releasever = releasever
|
||||
+ if major is not None:
|
||||
+ conf.releasever_major = major
|
||||
+ if minor is not None:
|
||||
+ conf.releasever_minor = minor
|
||||
if conf.releasever is None:
|
||||
logger.warning(_("Unable to detect release version (use '--releasever' to specify "
|
||||
"release version)"))
|
||||
diff --git a/dnf/const.py.in b/dnf/const.py.in
|
||||
index bcadc804..07aab7a4 100644
|
||||
--- a/dnf/const.py.in
|
||||
+++ b/dnf/const.py.in
|
||||
@@ -25,6 +25,8 @@ CONF_AUTOMATIC_FILENAME='/etc/dnf/automatic.conf'
|
||||
DISTROVERPKG=('system-release(releasever)', 'system-release',
|
||||
'distribution-release(releasever)', 'distribution-release',
|
||||
'redhat-release', 'suse-release')
|
||||
+DISTROVER_MAJOR_PKG='system-release(releasever_major)'
|
||||
+DISTROVER_MINOR_PKG='system-release(releasever_minor)'
|
||||
GROUP_PACKAGE_TYPES = ('mandatory', 'default', 'conditional') # :api
|
||||
INSTALLONLYPKGS=['kernel', 'kernel-PAE',
|
||||
'installonlypkg(kernel)',
|
||||
diff --git a/dnf/rpm/__init__.py b/dnf/rpm/__init__.py
|
||||
index 12efca7f..d4be4d03 100644
|
||||
--- a/dnf/rpm/__init__.py
|
||||
+++ b/dnf/rpm/__init__.py
|
||||
@@ -26,12 +26,21 @@ import dnf.exceptions
|
||||
import rpm # used by ansible (dnf.rpm.rpm.labelCompare in lib/ansible/modules/packaging/os/dnf.py)
|
||||
|
||||
|
||||
-def detect_releasever(installroot):
|
||||
+def detect_releasevers(installroot):
|
||||
# :api
|
||||
- """Calculate the release version for the system."""
|
||||
+ """Calculate the release version for the system, including releasever_major
|
||||
+ and releasever_minor if they are overriden by the system-release-major or
|
||||
+ system-release-minor provides."""
|
||||
|
||||
ts = transaction.initReadOnlyTransaction(root=installroot)
|
||||
ts.pushVSFlags(~(rpm._RPMVSF_NOSIGNATURES | rpm._RPMVSF_NODIGESTS))
|
||||
+
|
||||
+ distrover_major_pkg = dnf.const.DISTROVER_MAJOR_PKG
|
||||
+ distrover_minor_pkg = dnf.const.DISTROVER_MINOR_PKG
|
||||
+ if dnf.pycomp.PY3:
|
||||
+ distrover_major_pkg = bytes(distrover_major_pkg, 'utf-8')
|
||||
+ distrover_minor_pkg = bytes(distrover_minor_pkg, 'utf-8')
|
||||
+
|
||||
for distroverpkg in dnf.const.DISTROVERPKG:
|
||||
if dnf.pycomp.PY3:
|
||||
distroverpkg = bytes(distroverpkg, 'utf-8')
|
||||
@@ -47,6 +56,8 @@ def detect_releasever(installroot):
|
||||
msg = 'Error: rpmdb failed to list provides. Try: rpm --rebuilddb'
|
||||
raise dnf.exceptions.Error(msg)
|
||||
releasever = hdr['version']
|
||||
+ releasever_major = None
|
||||
+ releasever_minor = None
|
||||
try:
|
||||
try:
|
||||
# header returns bytes -> look for bytes
|
||||
@@ -61,13 +72,37 @@ def detect_releasever(installroot):
|
||||
if hdr['name'] not in (distroverpkg, distroverpkg.decode("utf8")):
|
||||
# override the package version
|
||||
releasever = ver
|
||||
+
|
||||
+ for provide, flag, ver in zip(
|
||||
+ hdr[rpm.RPMTAG_PROVIDENAME],
|
||||
+ hdr[rpm.RPMTAG_PROVIDEFLAGS],
|
||||
+ hdr[rpm.RPMTAG_PROVIDEVERSION]):
|
||||
+ if isinstance(provide, str):
|
||||
+ provide = bytes(provide, "utf-8")
|
||||
+ if provide == distrover_major_pkg and flag == rpm.RPMSENSE_EQUAL and ver:
|
||||
+ releasever_major = ver
|
||||
+ if provide == distrover_minor_pkg and flag == rpm.RPMSENSE_EQUAL and ver:
|
||||
+ releasever_minor = ver
|
||||
+
|
||||
except (ValueError, KeyError, IndexError):
|
||||
pass
|
||||
|
||||
if is_py3bytes(releasever):
|
||||
releasever = str(releasever, "utf-8")
|
||||
- return releasever
|
||||
- return None
|
||||
+ if is_py3bytes(releasever_major):
|
||||
+ releasever_major = str(releasever_major, "utf-8")
|
||||
+ if is_py3bytes(releasever_minor):
|
||||
+ releasever_minor = str(releasever_minor, "utf-8")
|
||||
+ return releasever, releasever_major, releasever_minor
|
||||
+ return (None, None, None)
|
||||
+
|
||||
+
|
||||
+def detect_releasever(installroot):
|
||||
+ # :api
|
||||
+ """Calculate the release version for the system."""
|
||||
+
|
||||
+ releasever, _, _ = detect_releasevers(installroot)
|
||||
+ return releasever
|
||||
|
||||
|
||||
def _header(path):
|
||||
--
|
||||
2.48.1
|
||||
|
124
0020-Add-releasever-major-and-releasever-minor-options.patch
Normal file
124
0020-Add-releasever-major-and-releasever-minor-options.patch
Normal file
@ -0,0 +1,124 @@
|
||||
From 310def9d6995728d6bcaa7bc8bb5f311bcd64ca3 Mon Sep 17 00:00:00 2001
|
||||
From: Evan Goode <mail@evangoo.de>
|
||||
Date: Fri, 24 Jan 2025 22:50:22 +0000
|
||||
Subject: [PATCH] Add --releasever-major and --releasever-minor options
|
||||
|
||||
Upstream commit: 017bbab0a253d84978f645cd358cdeb63e9ecb18
|
||||
|
||||
Allows the user to override the $releasever_major and $releasever_minor
|
||||
variables on the command line, like --releasever.
|
||||
---
|
||||
dnf/cli/cli.py | 29 +++++++++++++++++------------
|
||||
dnf/cli/option_parser.py | 6 ++++++
|
||||
doc/command_ref.rst | 8 ++++++++
|
||||
doc/conf_ref.rst | 2 ++
|
||||
4 files changed, 33 insertions(+), 12 deletions(-)
|
||||
|
||||
diff --git a/dnf/cli/cli.py b/dnf/cli/cli.py
|
||||
index 118ce4e7..0be9559d 100644
|
||||
--- a/dnf/cli/cli.py
|
||||
+++ b/dnf/cli/cli.py
|
||||
@@ -836,7 +836,7 @@ class Cli(object):
|
||||
dnf.conf.PRIO_DEFAULT)
|
||||
self.demands.cacheonly = True
|
||||
self.base.conf._configure_from_options(opts)
|
||||
- self._read_conf_file(opts.releasever)
|
||||
+ self._read_conf_file(opts.releasever, opts.releasever_major, opts.releasever_minor)
|
||||
if 'arch' in opts:
|
||||
self.base.conf.arch = opts.arch
|
||||
self.base.conf._adjust_conf_options()
|
||||
@@ -945,7 +945,7 @@ class Cli(object):
|
||||
)
|
||||
)
|
||||
|
||||
- def _read_conf_file(self, releasever=None):
|
||||
+ def _read_conf_file(self, releasever=None, releasever_major=None, releasever_minor=None):
|
||||
timer = dnf.logging.Timer('config')
|
||||
conf = self.base.conf
|
||||
|
||||
@@ -973,18 +973,23 @@ class Cli(object):
|
||||
subst.update_from_etc(from_root, varsdir=conf._get_value('varsdir'))
|
||||
|
||||
# cachedir, logs, releasever, and gpgkey are taken from or stored in installroot
|
||||
- major = None
|
||||
- minor = None
|
||||
+
|
||||
+ det_major = None
|
||||
+ det_minor = None
|
||||
if releasever is None and conf.releasever is None:
|
||||
- releasever, major, minor = dnf.rpm.detect_releasevers(conf.installroot)
|
||||
+ releasever, det_major, det_minor = dnf.rpm.detect_releasevers(conf.installroot)
|
||||
elif releasever == '/':
|
||||
- releasever, major, minor = dnf.rpm.detect_releasevers(releasever)
|
||||
- if releasever is not None:
|
||||
- conf.releasever = releasever
|
||||
- if major is not None:
|
||||
- conf.releasever_major = major
|
||||
- if minor is not None:
|
||||
- conf.releasever_minor = minor
|
||||
+ releasever, det_major, det_minor = dnf.rpm.detect_releasevers(releasever)
|
||||
+
|
||||
+ def or_else(*args):
|
||||
+ for arg in args:
|
||||
+ if arg is not None:
|
||||
+ return arg
|
||||
+ return None
|
||||
+ 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)
|
||||
+
|
||||
if conf.releasever is None:
|
||||
logger.warning(_("Unable to detect release version (use '--releasever' to specify "
|
||||
"release version)"))
|
||||
diff --git a/dnf/cli/option_parser.py b/dnf/cli/option_parser.py
|
||||
index ec4696fd..fba37614 100644
|
||||
--- a/dnf/cli/option_parser.py
|
||||
+++ b/dnf/cli/option_parser.py
|
||||
@@ -199,6 +199,12 @@ class OptionParser(argparse.ArgumentParser):
|
||||
general_grp.add_argument("--releasever", default=None,
|
||||
help=_("override the value of $releasever"
|
||||
" in config and repo files"))
|
||||
+ general_grp.add_argument("--releasever-major", default=None,
|
||||
+ help=_("override the value of $releasever_major"
|
||||
+ " in config and repo files"))
|
||||
+ general_grp.add_argument("--releasever-minor", default=None,
|
||||
+ help=_("override the value of $releasever_minor"
|
||||
+ " in config and repo files"))
|
||||
general_grp.add_argument("--setopt", dest="setopts", default=[],
|
||||
action=self._SetoptsCallback,
|
||||
help=_("set arbitrary config and repo options"))
|
||||
diff --git a/doc/command_ref.rst b/doc/command_ref.rst
|
||||
index 2337a2e2..9ffd4c1c 100644
|
||||
--- a/doc/command_ref.rst
|
||||
+++ b/doc/command_ref.rst
|
||||
@@ -334,6 +334,14 @@ Options
|
||||
Configure DNF as if the distribution release was ``<release>``. This can
|
||||
affect cache paths, values in configuration files and mirrorlist URLs.
|
||||
|
||||
+``--releasever_major=<major version>``
|
||||
+ Override the releasever_major variable, which is usually automatically
|
||||
+ detected or taken from the part of ``$releasever`` before the first ``.``.
|
||||
+
|
||||
+``--releasever_minor=<minor version>``
|
||||
+ Override the releasever_minor variable, which is usually automatically
|
||||
+ detected or taken from the part of ``$releasever`` after the first ``.``.
|
||||
+
|
||||
.. _repofrompath_options-label:
|
||||
|
||||
|
||||
diff --git a/doc/conf_ref.rst b/doc/conf_ref.rst
|
||||
index d4e4a277..441aa77b 100644
|
||||
--- a/doc/conf_ref.rst
|
||||
+++ b/doc/conf_ref.rst
|
||||
@@ -503,6 +503,8 @@ configuration file by your distribution to override the DNF defaults.
|
||||
|
||||
The ``$releasever_major`` and ``$releasever_minor`` variables will be automatically derived from ``$releasever`` by splitting it on the first ``.``. For example, if ``$releasever`` is set to ``1.23``, then ``$releasever_major`` will be ``1`` and ``$releasever_minor`` will be ``23``.
|
||||
|
||||
+ ``$releasever_major`` and ``$releasever_minor`` can also be set by the distribution.
|
||||
+
|
||||
See also :ref:`repo variables <repo-variables-label>`.
|
||||
|
||||
.. _reposdir-label:
|
||||
--
|
||||
2.48.1
|
||||
|
@ -0,0 +1,57 @@
|
||||
From ce877f038577a0080ca9e8f69a7fe28047e829ad Mon Sep 17 00:00:00 2001
|
||||
From: Evan Goode <mail@evangoo.de>
|
||||
Date: Mon, 27 Jan 2025 18:49:11 +0000
|
||||
Subject: [PATCH] doc: Document detect_releasevers and update example
|
||||
|
||||
Upstream commit: 593ab0c377cdca78895628c9f7a4676ca220215c
|
||||
|
||||
Adds dnf.rpm.detect_releasevers to the API docs and mention it is
|
||||
now preferred over dnf.rpm.detect_releasever.
|
||||
|
||||
Updates examples/install_extension.py to use detect_releasevers and set
|
||||
the releasever_major and releasever_minor substitution variables.
|
||||
---
|
||||
doc/api_rpm.rst | 8 ++++++++
|
||||
doc/examples/install_extension.py | 6 +++++-
|
||||
2 files changed, 13 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/doc/api_rpm.rst b/doc/api_rpm.rst
|
||||
index c59ed67d..562be41a 100644
|
||||
--- a/doc/api_rpm.rst
|
||||
+++ b/doc/api_rpm.rst
|
||||
@@ -27,6 +27,14 @@
|
||||
|
||||
Returns ``None`` if the information can not be determined (perhaps because the tree has no RPMDB).
|
||||
|
||||
+.. function:: detect_releasevers(installroot)
|
||||
+
|
||||
+ Returns a tuple of the release name, overridden major release, and overridden minor release of the distribution of the tree rooted at `installroot`. The function uses information from RPMDB found under the tree. The major and minor release versions are usually derived from the release version by splitting it on the first ``.``, but distributions can override the derived major and minor versions. It's preferred to use ``detect_releasevers`` over ``detect_releasever``; if you use the latter, you will not be aware of distribution overrides for the major and minor release versions.
|
||||
+
|
||||
+ Returns ``(None, None, None)`` if the information can not be determined (perhaps because the tree has no RPMDB).
|
||||
+
|
||||
+ If the distribution does not override the release major version, then the second item of the returned tuple will be ``None``. Likewise, if the release minor version is not overridden, the third return value will be ``None``.
|
||||
+
|
||||
.. function:: basearch(arch)
|
||||
|
||||
Return base architecture of the processor based on `arch` type given. E.g. when `arch` i686 is given then the returned value will be i386.
|
||||
diff --git a/doc/examples/install_extension.py b/doc/examples/install_extension.py
|
||||
index dbd3b890..b1540e12 100644
|
||||
--- a/doc/examples/install_extension.py
|
||||
+++ b/doc/examples/install_extension.py
|
||||
@@ -32,8 +32,12 @@ if __name__ == '__main__':
|
||||
|
||||
with dnf.Base() as base:
|
||||
# Substitutions are needed for correct interpretation of repo files.
|
||||
- RELEASEVER = dnf.rpm.detect_releasever(base.conf.installroot)
|
||||
+ RELEASEVER, MAJOR, MINOR = dnf.rpm.detect_releasever(base.conf.installroot)
|
||||
base.conf.substitutions['releasever'] = RELEASEVER
|
||||
+ if MAJOR is not None:
|
||||
+ base.conf.substitutions['releasever_major'] = MAJOR
|
||||
+ if MINOR is not None:
|
||||
+ base.conf.substitutions['releasever_minor'] = MINOR
|
||||
# Repositories are needed if we want to install anything.
|
||||
base.read_all_repos()
|
||||
# A sack is required by marking methods and dependency resolving.
|
||||
--
|
||||
2.48.1
|
||||
|
129
0022-tests-Patch-detect_releasevers-not-detect_releasever.patch
Normal file
129
0022-tests-Patch-detect_releasevers-not-detect_releasever.patch
Normal file
@ -0,0 +1,129 @@
|
||||
From 71fda4446391fc17e121d4c8c5eea70c981a2f0f Mon Sep 17 00:00:00 2001
|
||||
From: Evan Goode <mail@evangoo.de>
|
||||
Date: Mon, 27 Jan 2025 19:20:14 +0000
|
||||
Subject: [PATCH] tests: Patch detect_releasevers, not detect_releasever
|
||||
|
||||
Upstream commit: ba5ddbddf1ffb983fe9dc1a329e22eacd2ef35f7
|
||||
---
|
||||
tests/api/test_dnf_rpm.py | 4 ++++
|
||||
tests/cli/commands/test_clean.py | 2 +-
|
||||
tests/support.py | 2 +-
|
||||
tests/test_base.py | 4 ++--
|
||||
tests/test_cli.py | 10 +++++-----
|
||||
5 files changed, 13 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/tests/api/test_dnf_rpm.py b/tests/api/test_dnf_rpm.py
|
||||
index e6d8de84..fb606ffc 100644
|
||||
--- a/tests/api/test_dnf_rpm.py
|
||||
+++ b/tests/api/test_dnf_rpm.py
|
||||
@@ -14,6 +14,10 @@ class DnfRpmApiTest(TestCase):
|
||||
# dnf.rpm.detect_releasever
|
||||
self.assertHasAttr(dnf.rpm, "detect_releasever")
|
||||
|
||||
+ def test_detect_releasevers(self):
|
||||
+ # dnf.rpm.detect_releasevers
|
||||
+ self.assertHasAttr(dnf.rpm, "detect_releasevers")
|
||||
+
|
||||
def test_basearch(self):
|
||||
# dnf.rpm.basearch
|
||||
self.assertHasAttr(dnf.rpm, "basearch")
|
||||
diff --git a/tests/cli/commands/test_clean.py b/tests/cli/commands/test_clean.py
|
||||
index cc0a5df3..c77cb3ef 100644
|
||||
--- a/tests/cli/commands/test_clean.py
|
||||
+++ b/tests/cli/commands/test_clean.py
|
||||
@@ -31,7 +31,7 @@ from tests.support import mock
|
||||
'''
|
||||
def _run(cli, args):
|
||||
with mock.patch('sys.stdout', new_callable=StringIO), \
|
||||
- mock.patch('dnf.rpm.detect_releasever', return_value=69):
|
||||
+ mock.patch('dnf.rpm.detect_releasevers', return_value=(69, None, None)):
|
||||
cli.configure(['clean', '--config', '/dev/null'] + args)
|
||||
cli.run()
|
||||
|
||||
diff --git a/tests/support.py b/tests/support.py
|
||||
index e50684ef..d03683ed 100644
|
||||
--- a/tests/support.py
|
||||
+++ b/tests/support.py
|
||||
@@ -177,7 +177,7 @@ def command_run(cmd, args):
|
||||
|
||||
class Base(dnf.Base):
|
||||
def __init__(self, *args, **kwargs):
|
||||
- with mock.patch('dnf.rpm.detect_releasever', return_value=69):
|
||||
+ with mock.patch('dnf.rpm.detect_releasevers', return_value=(69, None, None)):
|
||||
super(Base, self).__init__(*args, **kwargs)
|
||||
|
||||
# mock objects
|
||||
diff --git a/tests/test_base.py b/tests/test_base.py
|
||||
index ad3ef675..9e0a656d 100644
|
||||
--- a/tests/test_base.py
|
||||
+++ b/tests/test_base.py
|
||||
@@ -57,7 +57,7 @@ class BaseTest(tests.support.TestCase):
|
||||
self.assertIsNotNone(base)
|
||||
base.close()
|
||||
|
||||
- @mock.patch('dnf.rpm.detect_releasever', lambda x: 'x')
|
||||
+ @mock.patch('dnf.rpm.detect_releasevers', lambda x: ('x', None, None))
|
||||
@mock.patch('dnf.util.am_i_root', lambda: True)
|
||||
def test_default_config_root(self):
|
||||
base = dnf.Base()
|
||||
@@ -67,7 +67,7 @@ class BaseTest(tests.support.TestCase):
|
||||
self.assertIsNotNone(reg.match(base.conf.cachedir))
|
||||
base.close()
|
||||
|
||||
- @mock.patch('dnf.rpm.detect_releasever', lambda x: 'x')
|
||||
+ @mock.patch('dnf.rpm.detect_releasevers', lambda x: ('x', None, None))
|
||||
@mock.patch('dnf.util.am_i_root', lambda: False)
|
||||
def test_default_config_user(self):
|
||||
base = dnf.Base()
|
||||
diff --git a/tests/test_cli.py b/tests/test_cli.py
|
||||
index 9c130c36..573d4ae2 100644
|
||||
--- a/tests/test_cli.py
|
||||
+++ b/tests/test_cli.py
|
||||
@@ -191,7 +191,7 @@ class ConfigureTest(tests.support.DnfBaseTestCase):
|
||||
# call setUp() once again *after* am_i_root() is mocked so the cachedir is set as expected
|
||||
self.setUp()
|
||||
self.base._conf.installroot = self._installroot
|
||||
- with mock.patch('dnf.rpm.detect_releasever', return_value=69):
|
||||
+ with mock.patch('dnf.rpm.detect_releasevers', return_value=(69, None, None)):
|
||||
self.cli.configure(['update', '-c', self.conffile])
|
||||
reg = re.compile('^' + self._installroot + '/var/tmp/dnf-[.a-zA-Z0-9_-]+$')
|
||||
self.assertIsNotNone(reg.match(self.base.conf.cachedir))
|
||||
@@ -203,7 +203,7 @@ class ConfigureTest(tests.support.DnfBaseTestCase):
|
||||
def test_configure_root(self):
|
||||
""" Test Cli.configure as root."""
|
||||
self.base._conf = dnf.conf.Conf()
|
||||
- with mock.patch('dnf.rpm.detect_releasever', return_value=69):
|
||||
+ with mock.patch('dnf.rpm.detect_releasevers', return_value=(69, None, None)):
|
||||
self.cli.configure(['update', '--nogpgcheck', '-c', self.conffile])
|
||||
reg = re.compile('^/var/cache/dnf$')
|
||||
self.assertIsNotNone(reg.match(self.base.conf.system_cachedir))
|
||||
@@ -213,7 +213,7 @@ class ConfigureTest(tests.support.DnfBaseTestCase):
|
||||
|
||||
def test_configure_verbose(self):
|
||||
self.base._conf.installroot = self._installroot
|
||||
- with mock.patch('dnf.rpm.detect_releasever', return_value=69):
|
||||
+ with mock.patch('dnf.rpm.detect_releasevers', return_value=(69, None, None)):
|
||||
self.cli.configure(['-v', 'update', '-c', self.conffile])
|
||||
parser = argparse.ArgumentParser()
|
||||
expected = "%s -v update -c %s " % (parser.prog, self.conffile)
|
||||
@@ -225,7 +225,7 @@ class ConfigureTest(tests.support.DnfBaseTestCase):
|
||||
@mock.patch('os.path.exists', return_value=True)
|
||||
def test_conf_exists_in_installroot(self, ospathexists):
|
||||
with mock.patch('logging.Logger.warning'), \
|
||||
- mock.patch('dnf.rpm.detect_releasever', return_value=69):
|
||||
+ mock.patch('dnf.rpm.detect_releasevers', return_value=(69, None, None)):
|
||||
self.cli.configure(['--installroot', '/roots/dnf', 'update'])
|
||||
self.assertEqual(self.base.conf.config_file_path, '/roots/dnf/etc/dnf/dnf.conf')
|
||||
self.assertEqual(self.base.conf.installroot, '/roots/dnf')
|
||||
@@ -233,7 +233,7 @@ class ConfigureTest(tests.support.DnfBaseTestCase):
|
||||
@mock.patch('dnf.cli.cli.Cli._parse_commands', new=mock.MagicMock)
|
||||
@mock.patch('os.path.exists', return_value=False)
|
||||
def test_conf_notexists_in_installroot(self, ospathexists):
|
||||
- with mock.patch('dnf.rpm.detect_releasever', return_value=69):
|
||||
+ with mock.patch('dnf.rpm.detect_releasevers', return_value=(69, None, None)):
|
||||
self.cli.configure(['--installroot', '/roots/dnf', 'update'])
|
||||
self.assertEqual(self.base.conf.config_file_path, '/etc/dnf/dnf.conf')
|
||||
self.assertEqual(self.base.conf.installroot, '/roots/dnf')
|
||||
--
|
||||
2.48.1
|
||||
|
@ -0,0 +1,97 @@
|
||||
From 0d750818c8aa92fd08dd5179839f5734a1b1be96 Mon Sep 17 00:00:00 2001
|
||||
From: Evan Goode <mail@evangoo.de>
|
||||
Date: Tue, 4 Feb 2025 23:01:43 +0000
|
||||
Subject: [PATCH] Document how --releasever, --releasever_{major,minor} affect
|
||||
each other
|
||||
|
||||
Upstream commit: e931960d26a0782a23e8d89a6a662ee2442153fc
|
||||
---
|
||||
dnf/conf/config.py | 16 ++++++++++++++++
|
||||
doc/command_ref.rst | 2 ++
|
||||
tests/test_config.py | 3 +++
|
||||
3 files changed, 21 insertions(+)
|
||||
|
||||
diff --git a/dnf/conf/config.py b/dnf/conf/config.py
|
||||
index 6cf28724..7e5e8a38 100644
|
||||
--- a/dnf/conf/config.py
|
||||
+++ b/dnf/conf/config.py
|
||||
@@ -425,6 +425,12 @@ class MainConf(BaseConfig):
|
||||
@releasever.setter
|
||||
def releasever(self, val):
|
||||
# :api
|
||||
+ """
|
||||
+ Sets the releasever variable and sets releasever_major and
|
||||
+ releasever_minor accordingly. releasever_major is set to the part of
|
||||
+ $releasever before the first ".". releasever_minor is set to the part
|
||||
+ after the first ".".
|
||||
+ """
|
||||
if val is None:
|
||||
self.substitutions.pop('releasever', None)
|
||||
return
|
||||
@@ -438,6 +444,11 @@ class MainConf(BaseConfig):
|
||||
@releasever_major.setter
|
||||
def releasever_major(self, val):
|
||||
# :api
|
||||
+ """
|
||||
+ Override the releasever_major variable, which is usually derived from
|
||||
+ the releasever variable. This setter does not update the value of
|
||||
+ $releasever.
|
||||
+ """
|
||||
if val is None:
|
||||
self.substitutions.pop('releasever_major', None)
|
||||
return
|
||||
@@ -446,6 +457,11 @@ class MainConf(BaseConfig):
|
||||
@property
|
||||
def releasever_minor(self):
|
||||
# :api
|
||||
+ """
|
||||
+ Override the releasever_minor variable, which is usually derived from
|
||||
+ the releasever variable. This setter does not update the value of
|
||||
+ $releasever.
|
||||
+ """
|
||||
return self.substitutions.get('releasever_minor')
|
||||
|
||||
@releasever_minor.setter
|
||||
diff --git a/doc/command_ref.rst b/doc/command_ref.rst
|
||||
index 9ffd4c1c..f7b8e22c 100644
|
||||
--- a/doc/command_ref.rst
|
||||
+++ b/doc/command_ref.rst
|
||||
@@ -337,10 +337,12 @@ Options
|
||||
``--releasever_major=<major version>``
|
||||
Override the releasever_major variable, which is usually automatically
|
||||
detected or taken from the part of ``$releasever`` before the first ``.``.
|
||||
+ This option does not affect the ``$releasever`` variable.
|
||||
|
||||
``--releasever_minor=<minor version>``
|
||||
Override the releasever_minor variable, which is usually automatically
|
||||
detected or taken from the part of ``$releasever`` after the first ``.``.
|
||||
+ This option does not affect the ``$releasever`` variable.
|
||||
|
||||
.. _repofrompath_options-label:
|
||||
|
||||
diff --git a/tests/test_config.py b/tests/test_config.py
|
||||
index 16bdcccb..69ba988c 100644
|
||||
--- a/tests/test_config.py
|
||||
+++ b/tests/test_config.py
|
||||
@@ -149,15 +149,18 @@ class ConfTest(tests.support.TestCase):
|
||||
def test_releasever_major_minor(self):
|
||||
conf = Conf()
|
||||
conf.releasever = '1.2'
|
||||
+ self.assertEqual(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, '1.2')
|
||||
self.assertEqual(conf.releasever_major, '3')
|
||||
self.assertEqual(conf.releasever_minor, '2')
|
||||
|
||||
# override releasever_minor
|
||||
conf.releasever_minor = '4'
|
||||
+ self.assertEqual(conf.releasever, '1.2')
|
||||
self.assertEqual(conf.releasever_major, '3')
|
||||
self.assertEqual(conf.releasever_minor, '4')
|
||||
--
|
||||
2.48.1
|
||||
|
13
dnf.spec
13
dnf.spec
@ -24,7 +24,7 @@
|
||||
%endif
|
||||
|
||||
%if 0%{?rhel} == 10
|
||||
%global hawkey_version 0.73.1-7
|
||||
%global hawkey_version 0.73.1-8
|
||||
%endif
|
||||
|
||||
# override dependencies for fedora 26
|
||||
@ -72,7 +72,7 @@ It supports RPMs, modules and comps groups & environments.
|
||||
|
||||
Name: dnf
|
||||
Version: 4.20.0
|
||||
Release: 11%{?dist}
|
||||
Release: 12%{?dist}
|
||||
Summary: %{pkg_summary}
|
||||
# For a breakdown of the licensing, see PACKAGE-LICENSING
|
||||
License: GPL-2.0-or-later AND GPL-1.0-only
|
||||
@ -95,6 +95,12 @@ Patch14: 0014-bootc-Use-ostree-GObject-API-to-get-deployment-statu.patch
|
||||
Patch15: 0015-bootc-Re-locking-use-ostree-admin-unlock-transient.patch
|
||||
Patch16: 0016-spec-Add-dnf-bootc-subpackage.patch
|
||||
Patch17: 0017-Require-libdnf-0.74.0-with-persistence-option.patch
|
||||
Patch18: 0018-Derive-releasever_-major-minor-in-conf-not-substitut.patch
|
||||
Patch19: 0019-Override-releasever_-major-minor-with-provides.patch
|
||||
Patch20: 0020-Add-releasever-major-and-releasever-minor-options.patch
|
||||
Patch21: 0021-doc-Document-detect_releasevers-and-update-example.patch
|
||||
Patch22: 0022-tests-Patch-detect_releasevers-not-detect_releasever.patch
|
||||
Patch23: 0023-Document-how-releasever-releasever_-major-minor-affe.patch
|
||||
|
||||
BuildArch: noarch
|
||||
BuildRequires: cmake
|
||||
@ -450,6 +456,9 @@ popd
|
||||
# bootc subpackage does not include any files
|
||||
|
||||
%changelog
|
||||
* Fri Feb 07 2025 Carl George <carl@redhat.com> - 4.20.0-12
|
||||
- Override releasever_{major,minor} with system-release provides (RHEL-68034)
|
||||
|
||||
* Thu Feb 06 2025 Petr Pisar <ppisar@redhat.com> - 4.20.0-11
|
||||
- Add support for transient transactions (RHEL-76849)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user