]> git.ipfire.org Git - people/ms/pakfire.git/commitdiff
CLI: requires: Search for all reverse dependencies
authorMichael Tremer <michael.tremer@ipfire.org>
Tue, 28 Feb 2023 16:59:23 +0000 (16:59 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Tue, 28 Feb 2023 16:59:23 +0000 (16:59 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/_pakfire/package.c
src/_pakfire/pakfire.c
src/libpakfire/include/pakfire/package.h
src/libpakfire/package.c
src/libpakfire/pakfire.c

index 68f3544da47ed0d3eb6626e84ae2b8db37cf93f4..460d02818e36381e514d8629edca2b35b4477db6 100644 (file)
@@ -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) {
index 556ce119831a0c720404484a080f8cb839a948c7..49222e63496171a23df09edb0d13ba2a07dc9e5b 100644 (file)
@@ -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;
index 993bf9dd3d1110ed49f3e4a08cc666d6fff5d641..73b9c80af7036fe77637553c77f446ac97e8d479 100644 (file)
@@ -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);
 
index c4dc0eb2ce2e5d187f2f6a042d38488c7ff57c57..619bedbb16996c80457d40802ca7cedc7a40794a 100644 (file)
@@ -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;
 
index 1e6f2bb59bd38e381583d147afca5c28562b16ae..b223565e7e0382b4cb1d7c82645d7f50c3f6ca3d 100644 (file)
@@ -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,