From: Michael Tremer Date: Thu, 6 Feb 2025 22:28:21 +0000 (+0000) Subject: package: Let reverse requires create its own package list X-Git-Tag: 0.9.30~103 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=26c0d0096508618003fc7bec37fb22a8ccac7c94;p=pakfire.git package: Let reverse requires create its own package list Signed-off-by: Michael Tremer --- diff --git a/src/pakfire/package.c b/src/pakfire/package.c index 54d9c46d..62568737 100644 --- a/src/pakfire/package.c +++ b/src/pakfire/package.c @@ -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; diff --git a/src/pakfire/package.h b/src/pakfire/package.h index b97aa1db..1bff6e39 100644 --- a/src/pakfire/package.h +++ b/src/pakfire/package.h @@ -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); diff --git a/src/pakfire/packagelist.c b/src/pakfire/packagelist.c index 242d4a5c..6d2d7426 100644 --- a/src/pakfire/packagelist.c +++ b/src/pakfire/packagelist.c @@ -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; diff --git a/src/pakfire/packagelist.h b/src/pakfire/packagelist.h index 962cb565..a4e003b0 100644 --- a/src/pakfire/packagelist.h +++ b/src/pakfire/packagelist.h @@ -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); diff --git a/src/pakfire/pakfire.c b/src/pakfire/pakfire.c index 046e23ce..fdbc65c2 100644 --- a/src/pakfire/pakfire.c +++ b/src/pakfire/pakfire.c @@ -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, diff --git a/src/python/package.c b/src/python/package.c index 6e262b69..afa7adaa 100644 --- a/src/python/package.c +++ b/src/python/package.c @@ -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);