From 39d1a3d31c4a3f8cc338de941c3231a996a64de7 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Thu, 8 Dec 2022 16:34:55 +0000 Subject: [PATCH] package: Use self-provides function from libsolv Signed-off-by: Michael Tremer --- src/libpakfire/package.c | 169 ++++++++++++++++++++------------------- 1 file changed, 85 insertions(+), 84 deletions(-) diff --git a/src/libpakfire/package.c b/src/libpakfire/package.c index bc1b0c61e..d7d85bb11 100644 --- a/src/libpakfire/package.c +++ b/src/libpakfire/package.c @@ -62,22 +62,93 @@ struct pakfire_package { char path[PATH_MAX]; }; -static int pakfire_package_add_self_provides(struct pakfire* pakfire, - struct pakfire_package* pkg, const char* name, const char* evr) { - char* buffer = NULL; +static Solvable* get_solvable(struct pakfire_package* pkg) { + Pool* pool = pakfire_get_solv_pool(pkg->pakfire); + + return pool_id2solvable(pool, pkg->id); +} + +static int pakfire_package_dep2id(const enum pakfire_package_key key, + Id* id, Id* marker) { + switch (key) { + case PAKFIRE_PKG_PROVIDES: + *id = SOLVABLE_PROVIDES; + *marker = -SOLVABLE_FILEMARKER; + break; + + case PAKFIRE_PKG_PREREQUIRES: + *id = SOLVABLE_REQUIRES; + *marker = SOLVABLE_PREREQMARKER; + break; + + case PAKFIRE_PKG_REQUIRES: + *id = SOLVABLE_REQUIRES; + *marker = -SOLVABLE_PREREQMARKER; + break; + + case PAKFIRE_PKG_CONFLICTS: + *id = SOLVABLE_CONFLICTS; + break; + + case PAKFIRE_PKG_OBSOLETES: + *id = SOLVABLE_OBSOLETES; + break; + + case PAKFIRE_PKG_RECOMMENDS: + *id = SOLVABLE_RECOMMENDS; + break; + + case PAKFIRE_PKG_SUGGESTS: + *id = SOLVABLE_SUGGESTS; + break; + + case PAKFIRE_PKG_SUPPLEMENTS: + *id = SOLVABLE_SUPPLEMENTS; + break; + + case PAKFIRE_PKG_ENHANCES: + *id = SOLVABLE_ENHANCES; + break; + + // This operation is not possible for any other types + default: + errno = EINVAL; + return 1; + } + + return 0; +} + +static int pakfire_package_add_depid(struct pakfire_package* pkg, + const enum pakfire_package_key key, Id dep) { + Solvable* s = get_solvable(pkg); int r; - // Format the relation - r = asprintf(&buffer, "%s = %s", name, evr); - if (r < 0) + Id id = ID_NULL; + Id marker = ID_NULL; + + // Translate the dependency type + r = pakfire_package_dep2id(key, &id, &marker); + if (r) return r; - // Add it to the package - r = pakfire_package_add_dep(pkg, PAKFIRE_PKG_PROVIDES, buffer); + // Append to the dependency array + solvable_add_deparray(s, id, dep, marker); - free(buffer); + return 0; +} - return r; +static int pakfire_package_add_self_provides(struct pakfire_package* pkg) { + // Fetch the solvable + Solvable* s = get_solvable(pkg); + if (!s) + return 1; + + // Get the self-provides ID + Id dep = solvable_selfprovidedep(s); + + // Add it to the package + return pakfire_package_add_depid(pkg, PAKFIRE_PKG_PROVIDES, dep); } int pakfire_package_create_from_solvable(struct pakfire_package** package, @@ -158,7 +229,7 @@ PAKFIRE_EXPORT int pakfire_package_create(struct pakfire_package** package, } // Add self-provides - r = pakfire_package_add_self_provides(pakfire, *package, name, evr); + r = pakfire_package_add_self_provides(*package); if (r) { ERROR(pakfire, "Could not create self-provides: %m\n"); goto ERROR; @@ -197,12 +268,6 @@ PAKFIRE_EXPORT struct pakfire* pakfire_package_get_pakfire(struct pakfire_packag return pakfire_ref(pkg->pakfire); } -static Solvable* get_solvable(struct pakfire_package* pkg) { - Pool* pool = pakfire_get_solv_pool(pkg->pakfire); - - return pool_id2solvable(pool, pkg->id); -} - PAKFIRE_EXPORT int pakfire_package_eq(struct pakfire_package* pkg1, struct pakfire_package* pkg2) { return pkg1->id == pkg2->id; } @@ -879,57 +944,6 @@ PAKFIRE_EXPORT size_t pakfire_package_get_size(struct pakfire_package* pkg) { // Dependencies -static int pakfire_package_dep2id(const enum pakfire_package_key key, - Id* id, Id* marker) { - switch (key) { - case PAKFIRE_PKG_PROVIDES: - *id = SOLVABLE_PROVIDES; - *marker = -SOLVABLE_FILEMARKER; - break; - - case PAKFIRE_PKG_PREREQUIRES: - *id = SOLVABLE_REQUIRES; - *marker = SOLVABLE_PREREQMARKER; - break; - - case PAKFIRE_PKG_REQUIRES: - *id = SOLVABLE_REQUIRES; - *marker = -SOLVABLE_PREREQMARKER; - break; - - case PAKFIRE_PKG_CONFLICTS: - *id = SOLVABLE_CONFLICTS; - break; - - case PAKFIRE_PKG_OBSOLETES: - *id = SOLVABLE_OBSOLETES; - break; - - case PAKFIRE_PKG_RECOMMENDS: - *id = SOLVABLE_RECOMMENDS; - break; - - case PAKFIRE_PKG_SUGGESTS: - *id = SOLVABLE_SUGGESTS; - break; - - case PAKFIRE_PKG_SUPPLEMENTS: - *id = SOLVABLE_SUPPLEMENTS; - break; - - case PAKFIRE_PKG_ENHANCES: - *id = SOLVABLE_ENHANCES; - break; - - // This operation is not possible for any other types - default: - errno = EINVAL; - return 1; - } - - return 0; -} - PAKFIRE_EXPORT char** pakfire_package_get_deps(struct pakfire_package* pkg, const enum pakfire_package_key key) { Solvable* s = get_solvable(pkg); @@ -986,27 +1000,14 @@ SUCCESS: int pakfire_package_add_dep(struct pakfire_package* pkg, const enum pakfire_package_key key, const char* dep) { - Solvable* s = get_solvable(pkg); - int r; - - Id id = ID_NULL; - Id marker = ID_NULL; - - r = pakfire_package_dep2id(key, &id, &marker); - if (r) - return r; - // Parse the dependency - Id depid = pakfire_str2dep(pkg->pakfire, dep); + Id id = pakfire_str2dep(pkg->pakfire, dep); // Silently ignore any invalid dependencies - if (!depid) + if (!id) return 0; - // Append to the dependency array - solvable_add_deparray(s, id, depid, marker); - - return 0; + return pakfire_package_add_depid(pkg, key, id); } PAKFIRE_EXPORT int pakfire_package_get_reverse_requires(struct pakfire_package* pkg, -- 2.39.5