]> git.ipfire.org Git - pakfire.git/commitdiff
package: Let reverse requires create its own package list
authorMichael Tremer <michael.tremer@ipfire.org>
Thu, 6 Feb 2025 22:28:21 +0000 (22:28 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Thu, 6 Feb 2025 22:28:21 +0000 (22:28 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/pakfire/package.c
src/pakfire/package.h
src/pakfire/packagelist.c
src/pakfire/packagelist.h
src/pakfire/pakfire.c
src/python/package.c

index 54d9c46df1f2c491e8dc8456080a52fc292360d1..6256873771e29993e1dd4b7bd793d40cd3138d46 100644 (file)
@@ -1683,10 +1683,19 @@ int pakfire_package_add_dep(struct pakfire_package* pkg,
 }
 
 int pakfire_package_get_reverse_requires(struct pakfire_package* pkg,
-               struct pakfire_packagelist* list) {
+               struct pakfire_packagelist** ret) {
+       struct pakfire_packagelist* list = NULL;
        Queue matches;
+       int r;
+
+       // Initialize the queue
        queue_init(&matches);
 
+       // Create a new package list
+       r = pakfire_packagelist_create(&list, pkg->ctx);
+       if (r < 0)
+               goto ERROR;
+
        // Get the pool ready
        pakfire_pool_internalize(pkg->pakfire);
 
@@ -1696,11 +1705,16 @@ int pakfire_package_get_reverse_requires(struct pakfire_package* pkg,
        pool_whatmatchessolvable(pool, SOLVABLE_REQUIRES, pkg->id, &matches, 0);
 
        // Import the result to the package list
-       int r = pakfire_packagelist_import_solvables(list, pkg->pakfire, &matches);
-       if (r)
+       r = pakfire_packagelist_import_solvables(list, pkg->pakfire, &matches);
+       if (r < 0)
                goto ERROR;
 
+       // Return the list
+       *ret = pakfire_packagelist_ref(list);
+
 ERROR:
+       if (list)
+               pakfire_packagelist_unref(list);
        queue_free(&matches);
 
        return r;
index b97aa1db4a968ebaa0356845322866ef38871b87..1bff6e399c9a35a96640bb12bf80554adde40bcc 100644 (file)
@@ -139,7 +139,7 @@ int pakfire_package_set_checksum(struct pakfire_package* pkg,
 size_t pakfire_package_get_size(struct pakfire_package* pkg);
 
 int pakfire_package_get_reverse_requires(struct pakfire_package* pkg,
-       struct pakfire_packagelist* list);
+       struct pakfire_packagelist** list);
 
 struct pakfire_repo* pakfire_package_get_repo(struct pakfire_package* pkg);
 
index 242d4a5c96780da4d449ffb99657d108fa64c0da..6d2d742624db7ee5ac8fcfd9e1d98eba1135131a 100644 (file)
@@ -160,6 +160,19 @@ int pakfire_packagelist_add(struct pakfire_packagelist* self, struct pakfire_pac
        return 0;
 }
 
+int pakfire_packagelist_add_list(struct pakfire_packagelist* self, struct pakfire_packagelist* other) {
+       int r;
+
+       // Add all packages from the other list
+       for (unsigned int i = 0; i < other->num_packages; i++) {
+               r = pakfire_packagelist_add(self, other->packages[i]);
+               if (r < 0)
+                       return r;
+       }
+
+       return 0;
+}
+
 int pakfire_packagelist_walk(struct pakfire_packagelist* self,
                pakfire_packagelist_walk_callback callback, void* data, int flags) {
        int kept_going = 0;
index 962cb565d8d0565c3a38bb3462b1ef0592fdd003..a4e003b08dcb470ec7653a4781189aa662e9218b 100644 (file)
@@ -37,6 +37,7 @@ size_t pakfire_packagelist_length(struct pakfire_packagelist* list);
 struct pakfire_package* pakfire_packagelist_get(struct pakfire_packagelist* list, unsigned int index);
 
 int pakfire_packagelist_add(struct pakfire_packagelist* list, struct pakfire_package* pkg);
+int pakfire_packagelist_add_list(struct pakfire_packagelist* self, struct pakfire_packagelist* other);
 
 typedef int (*pakfire_packagelist_walk_callback)
        (struct pakfire_ctx* ctx, struct pakfire_package* pkg, void* p);
index 046e23ced524f822a3a1b5f4b957c3d252bb3ab5..fdbc65c205c795b3fade112033de588e2ecf4729 100644 (file)
@@ -1602,9 +1602,25 @@ int pakfire_whatprovides(struct pakfire* pakfire, const char* what, int flags,
 }
 
 static int __pakfire_whatrequires(struct pakfire_ctx* ctx, struct pakfire_package* pkg, void* data) {
-       struct pakfire_packagelist* list = (struct pakfire_packagelist*)data;
+       struct pakfire_packagelist* reverse = NULL;
+       struct pakfire_packagelist* list = data;
+       int r;
+
+       // Fetch all elements
+       r = pakfire_package_get_reverse_requires(pkg, &reverse);
+       if (r < 0)
+               goto ERROR;
+
+       // Merge them into the result list
+       r = pakfire_packagelist_add_list(list, reverse);
+       if (r < 0)
+               goto ERROR;
 
-       return pakfire_package_get_reverse_requires(pkg, list);
+ERROR:
+       if (reverse)
+               pakfire_packagelist_unref(reverse);
+
+       return r;
 }
 
 int pakfire_whatrequires(struct pakfire* pakfire, const char* what, int flags,
index 6e262b69a9e675a004be9d56977be774cca0a79e..afa7adaa21bd866769411592278d6a955017a12b 100644 (file)
@@ -408,16 +408,8 @@ static PyObject* Package_get_reverse_requires(PackageObject* self) {
        PyObject* ret = NULL;
        int r;
 
-       // Create a new packagelist
-       r = pakfire_packagelist_create(&list, self->ctx);
-       if (r < 0) {
-               errno = -r;
-               PyErr_SetFromErrno(PyExc_OSError);
-               goto ERROR;
-       }
-
        // Search for all reverse requires
-       r = pakfire_package_get_reverse_requires(self->package, list);
+       r = pakfire_package_get_reverse_requires(self->package, &list);
        if (r < 0) {
                errno = -r;
                PyErr_SetFromErrno(PyExc_OSError);