]> git.ipfire.org Git - pakfire.git/commitdiff
package: Use self-provides function from libsolv
authorMichael Tremer <michael.tremer@ipfire.org>
Thu, 8 Dec 2022 16:34:55 +0000 (16:34 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Thu, 8 Dec 2022 16:34:55 +0000 (16:34 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/package.c

index bc1b0c61e1dc0bc0e83b4352a48f72644e14aa68..d7d85bb112d3db6b9036fa5674a361f113005ba7 100644 (file)
@@ -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,