From 86120acbadab9347d53e93876906b0acdba92666 Mon Sep 17 00:00:00 2001 From: Evan Goode 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