From: Michael Tremer Date: Tue, 28 Feb 2023 16:59:23 +0000 (+0000) Subject: CLI: requires: Search for all reverse dependencies X-Git-Tag: 0.9.29~371 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4a25eca3a2e5828318a3392d0f06b1d739b4d37a;p=pakfire.git CLI: requires: Search for all reverse dependencies Signed-off-by: Michael Tremer --- diff --git a/src/_pakfire/package.c b/src/_pakfire/package.c index 68f3544da..460d02818 100644 --- a/src/_pakfire/package.c +++ b/src/_pakfire/package.c @@ -511,17 +511,34 @@ static PyObject* Package_get_suggests(PackageObject* self) { static PyObject* Package_get_reverse_requires(PackageObject* self) { struct pakfire_packagelist* list = NULL; + PyObject* ret = NULL; + int r; - int r = pakfire_package_get_reverse_requires(self->package, &list); + struct pakfire* pakfire = pakfire_package_get_pakfire(self->package); + + // Create a new packagelist + r = pakfire_packagelist_create(&list, pakfire); if (r) { PyErr_SetFromErrno(PyExc_OSError); - return NULL; + goto ERROR; + } + + // Search for all reverse requires + r = pakfire_package_get_reverse_requires(self->package, list); + if (r) { + PyErr_SetFromErrno(PyExc_OSError); + goto ERROR; } - PyObject* object = PyList_FromPackageList(list); - pakfire_packagelist_unref(list); + ret = PyList_FromPackageList(list); - return object; +ERROR: + if (list) + pakfire_packagelist_unref(list); + if (pakfire) + pakfire_unref(pakfire); + + return ret; } static PyObject* Package_get_filelist(PackageObject* self, PyObject* args) { diff --git a/src/_pakfire/pakfire.c b/src/_pakfire/pakfire.c index 556ce1198..49222e634 100644 --- a/src/_pakfire/pakfire.c +++ b/src/_pakfire/pakfire.c @@ -746,7 +746,7 @@ static PyObject* Pakfire_whatrequires(PakfireObject* self, PyObject* args) { goto ERROR; } - r = pakfire_whatprovides(self->pakfire, requires, 0, list); + r = pakfire_whatrequires(self->pakfire, requires, 0, list); if (r) { PyErr_SetFromErrno(PyExc_OSError); goto ERROR; diff --git a/src/libpakfire/include/pakfire/package.h b/src/libpakfire/include/pakfire/package.h index 993bf9dd3..73b9c80af 100644 --- a/src/libpakfire/include/pakfire/package.h +++ b/src/libpakfire/include/pakfire/package.h @@ -115,7 +115,7 @@ int pakfire_package_set_digest(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/libpakfire/package.c b/src/libpakfire/package.c index c4dc0eb2c..619bedbb1 100644 --- a/src/libpakfire/package.c +++ b/src/libpakfire/package.c @@ -1011,20 +1011,20 @@ int pakfire_package_add_dep(struct pakfire_package* pkg, } PAKFIRE_EXPORT int pakfire_package_get_reverse_requires(struct pakfire_package* pkg, - struct pakfire_packagelist** list) { + struct pakfire_packagelist* list) { Queue matches; queue_init(&matches); - // Reset pointer - *list = NULL; + // Get the pool ready + pakfire_pool_internalize(pkg->pakfire); Pool* pool = pakfire_get_solv_pool(pkg->pakfire); // Search for any matches pool_whatmatchessolvable(pool, SOLVABLE_REQUIRES, pkg->id, &matches, 0); - // Create a new package list - int r = pakfire_packagelist_create_from_queue(list, pkg->pakfire, &matches); + // Import the result to the package list + int r = pakfire_packagelist_import_solvables(list, &matches); if (r) goto ERROR; diff --git a/src/libpakfire/pakfire.c b/src/libpakfire/pakfire.c index 1e6f2bb59..b223565e7 100644 --- a/src/libpakfire/pakfire.c +++ b/src/libpakfire/pakfire.c @@ -1548,9 +1548,47 @@ PAKFIRE_EXPORT int pakfire_whatprovides(struct pakfire* pakfire, const char* wha return 0; } +static int __pakfire_whatrequires(struct pakfire* pakfire, struct pakfire_package* pkg, void* data) { + struct pakfire_packagelist* list = (struct pakfire_packagelist*)data; + + return pakfire_package_get_reverse_requires(pkg, list); +} + PAKFIRE_EXPORT int pakfire_whatrequires(struct pakfire* pakfire, const char* what, int flags, struct pakfire_packagelist* list) { - return pakfire_search_dep(pakfire, SOLVABLE_REQUIRES, what, flags, list); + struct pakfire_packagelist* packages = NULL; + int r; + + const Id keys[] = { + SOLVABLE_NAME, + ID_NULL, + }; + + // Create a new package list + r = pakfire_packagelist_create(&packages, pakfire); + if (r) + goto ERROR; + + // Find any packages that match the name + r = __pakfire_search(pakfire, packages, keys, what, SEARCH_STRING); + if (r) + goto ERROR; + + // Find everything for all packages + r = pakfire_packagelist_walk(packages, __pakfire_whatrequires, list); + if (r) + goto ERROR; + + // Append any simple dependencies + r = pakfire_search_dep(pakfire, SOLVABLE_REQUIRES, what, flags, list); + if (r) + goto ERROR; + +ERROR: + if (packages) + pakfire_packagelist_unref(packages); + + return r; } PAKFIRE_EXPORT int pakfire_search(struct pakfire* pakfire, const char* what, int flags,