148 lines
6.1 KiB
Diff
148 lines
6.1 KiB
Diff
From 86120acbadab9347d53e93876906b0acdba92666 Mon Sep 17 00:00:00 2001
|
|
From: Evan Goode <mail@evangoo.de>
|
|
Date: Mon, 3 Feb 2025 20:31:12 +0000
|
|
Subject: [PATCH 2/5] C API: Detect releasever_major, releasever_minor from
|
|
provides
|
|
|
|
releasever_major and releasever_minor can now be overridden by 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.
|
|
|
|
Introduces dnf_context_set_release_ver_major and
|
|
dnf_context_set_release_ver_minor.
|
|
---
|
|
libdnf/dnf-context.cpp | 65 ++++++++++++++++++++++++++++++++++++++++--
|
|
libdnf/dnf-context.h | 4 +++
|
|
2 files changed, 66 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/libdnf/dnf-context.cpp b/libdnf/dnf-context.cpp
|
|
index 1ec782d0..44d26ad1 100644
|
|
--- a/libdnf/dnf-context.cpp
|
|
+++ b/libdnf/dnf-context.cpp
|
|
@@ -85,6 +85,8 @@
|
|
#define MAX_NATIVE_ARCHES 12
|
|
|
|
#define RELEASEVER_PROV "system-release(releasever)"
|
|
+#define RELEASEVER_MAJOR_PROV "system-release(releasever_major)"
|
|
+#define RELEASEVER_MINOR_PROV "system-release(releasever_minor)"
|
|
|
|
/* data taken from https://github.com/rpm-software-management/dnf/blob/master/dnf/arch.py */
|
|
static const struct {
|
|
@@ -142,6 +144,8 @@ typedef struct
|
|
gchar **installonlypkgs;
|
|
gchar *base_arch;
|
|
gchar *release_ver;
|
|
+ gchar *release_ver_major;
|
|
+ gchar *release_ver_minor;
|
|
gchar *platform_module;
|
|
gchar *cache_dir;
|
|
gchar *solv_dir;
|
|
@@ -1271,7 +1275,9 @@ dnf_context_set_vars_dir(DnfContext *context, const gchar * const *vars_dir)
|
|
* @context: a #DnfContext instance.
|
|
* @release_ver: the release version, e.g. "20"
|
|
*
|
|
- * Sets the release version.
|
|
+ * Sets the release version. Sets the major and minor release version by splitting `release_ver` on
|
|
+ * the first ".". The derived major and minor versions can later be overridden by calling
|
|
+ *`dnf_context_set_release_ver_major` and `dnf_context_set_release_ver_minor`, respectively.
|
|
*
|
|
* Since: 0.1.0
|
|
**/
|
|
@@ -1281,6 +1287,46 @@ dnf_context_set_release_ver(DnfContext *context, const gchar *release_ver)
|
|
DnfContextPrivate *priv = GET_PRIVATE(context);
|
|
g_free(priv->release_ver);
|
|
priv->release_ver = g_strdup(release_ver);
|
|
+
|
|
+ g_free(priv->release_ver_major);
|
|
+ g_free(priv->release_ver_minor);
|
|
+ dnf_split_releasever(release_ver, &priv->release_ver_major, &priv->release_ver_minor);
|
|
+}
|
|
+
|
|
+/**
|
|
+ * dnf_context_set_release_ver_major:
|
|
+ * @context: a #DnfContext instance.
|
|
+ * @release_ver_major: the release major version, e.g. "10"
|
|
+ *
|
|
+ * Sets the release major version, which is usually derived by splitting releasever on the first
|
|
+ * ".". This setter does not update the value of $releasever.
|
|
+ *
|
|
+ * Since: 0.74.0
|
|
+ **/
|
|
+void
|
|
+dnf_context_set_release_ver_major(DnfContext *context, const gchar *release_ver_major)
|
|
+{
|
|
+ DnfContextPrivate *priv = GET_PRIVATE(context);
|
|
+ g_free(priv->release_ver_major);
|
|
+ priv->release_ver_major = g_strdup(release_ver_major);
|
|
+}
|
|
+
|
|
+/**
|
|
+ * dnf_context_set_release_ver_minor:
|
|
+ * @context: a #DnfContext instance.
|
|
+ * @release_ver_minor: the release minor version, e.g. "1"
|
|
+ *
|
|
+ * Sets the release minor version, which is usually derived by splitting releasever on the first
|
|
+ * ".". This setter does not update the value of $releasever.
|
|
+ *
|
|
+ * Since: 0.74.0
|
|
+ **/
|
|
+void
|
|
+dnf_context_set_release_ver_minor(DnfContext *context, const gchar *release_ver_minor)
|
|
+{
|
|
+ DnfContextPrivate *priv = GET_PRIVATE(context);
|
|
+ g_free(priv->release_ver_minor);
|
|
+ priv->release_ver_minor = g_strdup(release_ver_minor);
|
|
}
|
|
|
|
/**
|
|
@@ -1660,13 +1706,26 @@ dnf_context_set_os_release(DnfContext *context, GError **error) try
|
|
Header hdr;
|
|
while ((hdr = rpmdbNextIterator (mi)) != NULL) {
|
|
const char *v = headerGetString (hdr, RPMTAG_VERSION);
|
|
+ const char *v_major = nullptr;
|
|
+ const char *v_minor = nullptr;
|
|
rpmds ds = rpmdsNew (hdr, RPMTAG_PROVIDENAME, 0);
|
|
while (rpmdsNext (ds) >= 0) {
|
|
- if (strcmp (rpmdsN (ds), RELEASEVER_PROV) == 0 && rpmdsFlags (ds) == RPMSENSE_EQUAL)
|
|
+ if (strcmp (rpmdsN (ds), RELEASEVER_PROV) == 0 && rpmdsFlags (ds) == RPMSENSE_EQUAL) {
|
|
v = rpmdsEVR (ds);
|
|
+ } else if (strcmp (rpmdsN (ds), RELEASEVER_MAJOR_PROV) == 0 && rpmdsFlags (ds) == RPMSENSE_EQUAL) {
|
|
+ v_major = rpmdsEVR(ds);
|
|
+ } else if (strcmp (rpmdsN (ds), RELEASEVER_MINOR_PROV) == 0 && rpmdsFlags (ds) == RPMSENSE_EQUAL) {
|
|
+ v_minor = rpmdsEVR(ds);
|
|
+ }
|
|
}
|
|
found_in_rpmdb = TRUE;
|
|
- dnf_context_set_release_ver (context, v);
|
|
+ dnf_context_set_release_ver(context, v);
|
|
+ if (v_major != nullptr) {
|
|
+ dnf_context_set_release_ver_major(context, v_major);
|
|
+ }
|
|
+ if (v_minor != nullptr) {
|
|
+ dnf_context_set_release_ver_minor(context, v_minor);
|
|
+ }
|
|
rpmdsFree (ds);
|
|
break;
|
|
}
|
|
diff --git a/libdnf/dnf-context.h b/libdnf/dnf-context.h
|
|
index cb00a29b..4d8481b2 100644
|
|
--- a/libdnf/dnf-context.h
|
|
+++ b/libdnf/dnf-context.h
|
|
@@ -164,6 +164,10 @@ void dnf_context_set_vars_dir (DnfContext *context
|
|
const gchar * const *vars_dir);
|
|
void dnf_context_set_release_ver (DnfContext *context,
|
|
const gchar *release_ver);
|
|
+void dnf_context_set_release_ver_major (DnfContext *context,
|
|
+ const gchar *release_ver_major);
|
|
+void dnf_context_set_release_ver_minor (DnfContext *context,
|
|
+ const gchar *release_ver_minor);
|
|
void dnf_context_set_platform_module (DnfContext *context,
|
|
const gchar *platform_module);
|
|
void dnf_context_set_cache_dir (DnfContext *context,
|
|
--
|
|
2.48.1
|
|
|