From 03b6387dc18b2d6d3cba0740dd5a1cd350634801 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Fri, 21 Jul 2023 14:28:59 +0000 Subject: [PATCH] _pakfire: Add version_compare() that does not require Pakfire This is useful if we do not have a Pakfire instance at hand and will save us the overhead of creating one every time. Signed-off-by: Michael Tremer --- src/_pakfire/_pakfiremodule.c | 22 ++++++++++++++++++ src/libpakfire/dependencies.c | 23 +++++++++++++++++++ src/libpakfire/include/pakfire/dependencies.h | 2 ++ src/libpakfire/libpakfire.sym | 3 +++ 4 files changed, 50 insertions(+) diff --git a/src/_pakfire/_pakfiremodule.c b/src/_pakfire/_pakfiremodule.c index e4d5845bd..c0c0ce2a9 100644 --- a/src/_pakfire/_pakfiremodule.c +++ b/src/_pakfire/_pakfiremodule.c @@ -22,6 +22,7 @@ #include #include +#include #include #include "archive.h" @@ -92,9 +93,30 @@ ERROR: return NULL; } +static PyObject* _pakfire_version_compare(PyObject* self, PyObject* args) { + const char* evr1 = NULL; + const char* evr2 = NULL; + int r; + + if (!PyArg_ParseTuple(args, "ss", &evr1, &evr2)) + return NULL; + + // Compare versions + r = pakfire_static_version_compare(evr1, evr2); + + // Return the return code + return PyLong_FromLong(r); +} + static PyMethodDef pakfireModuleMethods[] = { {"native_arch", (PyCFunction)_pakfire_native_arch, METH_NOARGS, NULL }, {"supported_arches", (PyCFunction)_pakfire_supported_arches, METH_NOARGS, NULL }, + { + "version_compare", + (PyCFunction)_pakfire_version_compare, + METH_VARARGS, + NULL, + }, { NULL, NULL, 0, NULL } }; diff --git a/src/libpakfire/dependencies.c b/src/libpakfire/dependencies.c index 96350f631..d457e7d3d 100644 --- a/src/libpakfire/dependencies.c +++ b/src/libpakfire/dependencies.c @@ -23,12 +23,14 @@ #include #include +#include #include #include #include #include #include +#include #include #include @@ -59,6 +61,27 @@ static const struct pakfire_rich_operation { { NULL, 0 }, }; +static Pool* __pool = NULL; + +/* + This function can compare package versions without a Pakfire instance initialized. +*/ +PAKFIRE_EXPORT int pakfire_static_version_compare(const char* evr1, const char* evr2) { + // Initialize the pool (unless already done) + if (!__pool) { + __pool = pool_create(); + + if (!__pool) + return 0; + + // Set to RPM mode + pool_setdisttype(__pool, DISTTYPE_RPM); + } + + // Perform comparison + return pool_evrcmp_str(__pool, evr1, evr2, EVRCMP_COMPARE); +} + const char* pakfire_dep2str(struct pakfire* pakfire, Id id) { Pool* pool = pakfire_get_solv_pool(pakfire); if (!pool) diff --git a/src/libpakfire/include/pakfire/dependencies.h b/src/libpakfire/include/pakfire/dependencies.h index baa5e91d6..8dd58c339 100644 --- a/src/libpakfire/include/pakfire/dependencies.h +++ b/src/libpakfire/include/pakfire/dependencies.h @@ -21,6 +21,8 @@ #ifndef PAKFIRE_DEPENDENCIES_H #define PAKFIRE_DEPENDENCIES_H +int pakfire_static_version_compare(const char* evr1, const char* evr2); + #ifdef PAKFIRE_PRIVATE #include diff --git a/src/libpakfire/libpakfire.sym b/src/libpakfire/libpakfire.sym index eb16a54d2..6a75f063f 100644 --- a/src/libpakfire/libpakfire.sym +++ b/src/libpakfire/libpakfire.sym @@ -72,6 +72,9 @@ global: pakfire_build_unref; pakfire_shell; + # dependencies + pakfire_static_version_compare; + # digest pakfire_digest_get_by_name; pakfire_digest_name; -- 2.39.5