]> git.ipfire.org Git - pakfire.git/commitdiff
package: Add function that returns all packages that depend on this one
authorMichael Tremer <michael.tremer@ipfire.org>
Wed, 30 Jun 2021 15:43:05 +0000 (15:43 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Wed, 30 Jun 2021 15:43:05 +0000 (15:43 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/_pakfire/package.c
src/libpakfire/include/pakfire/package.h
src/libpakfire/libpakfire.sym
src/libpakfire/package.c

index adb4746c090b190a5284f720ac854629ab105ead..d3ea4bef400cedfdea053d1b53be75d4e4df741b 100644 (file)
@@ -29,6 +29,7 @@
 #include "package.h"
 #include "pakfire.h"
 #include "repo.h"
+#include "util.h"
 
 PyObject* new_package(PyTypeObject* type, PakfirePackage pkg) {
        PackageObject* self = (PackageObject *)type->tp_alloc(type, 0);
@@ -507,6 +508,21 @@ static PyObject* Package_get_suggests(PackageObject* self) {
        return list;
 }
 
+static PyObject* Package_get_reverse_requires(PackageObject* self) {
+       struct pakfire_packagelist* list = NULL;
+
+       int r = pakfire_package_get_reverse_requires(self->package, &list);
+       if (r) {
+               PyErr_SetFromErrno(PyExc_OSError);
+               return NULL;
+       }
+
+       PyObject* object = PyList_FromPackageList(list);
+       pakfire_packagelist_unref(list);
+
+       return object;
+}
+
 static PyObject* Package_get_filelist(PackageObject* self, PyObject* args) {
        PyObject* list = PyList_New(0);
        if (list == NULL)
@@ -822,6 +838,13 @@ static struct PyGetSetDef Package_getsetters[] = {
                NULL,
                NULL
        },
+       {
+               "reverse_requires",
+               (getter)Package_get_reverse_requires,
+               NULL,
+               NULL,
+               NULL
+       },
 
        // Repository
        {
index 36304a2a5cb8b1932db075918a49df232f8d8038..8eaf12d3adf5b2c4993dbc76e0ef66e440a89331 100644 (file)
@@ -24,6 +24,7 @@
 #include <time.h>
 
 #include <pakfire/filelist.h>
+#include <pakfire/packagelist.h>
 #include <pakfire/types.h>
 
 PakfirePackage pakfire_package_create(Pakfire pakfire, PakfireRepo repo,
@@ -92,6 +93,9 @@ char** pakfire_package_get_suggests(PakfirePackage pkg);
 char** pakfire_package_get_supplements(PakfirePackage pkg);
 char** pakfire_package_get_enhances(PakfirePackage pkg);
 
+int pakfire_package_get_reverse_requires(PakfirePackage pkg,
+       struct pakfire_packagelist** list);
+
 PakfireRepo pakfire_package_get_repo(PakfirePackage pkg);
 
 char* pakfire_package_dump(PakfirePackage pkg, int flags);
index 9b1e426acfa6e09b5eb7f86091542c630ecf7e99..75b9d17ec82a237e5bb948e69d1cf8aec2510e21 100644 (file)
@@ -166,6 +166,7 @@ global:
        pakfire_package_get_recommends;
        pakfire_package_get_repo;
        pakfire_package_get_requires;
+       pakfire_package_get_reverse_requires;
        pakfire_package_get_size;
        pakfire_package_get_suggests;
        pakfire_package_get_summary;
index 30071f87b05ae15c664db053644ca2be611f6dc8..9a59731ced058a74dc8042dc6992d61756ab0cb6 100644 (file)
@@ -734,6 +734,30 @@ void pakfire_package_add_enhances(PakfirePackage pkg, const char* dep) {
        pakfire_package_add_dep(pkg, SOLVABLE_ENHANCES, dep, 0);
 }
 
+PAKFIRE_EXPORT int pakfire_package_get_reverse_requires(PakfirePackage pkg,
+               struct pakfire_packagelist** list) {
+       Queue matches;
+       queue_init(&matches);
+
+       // Reset pointer
+       *list = NULL;
+
+       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);
+       if (r)
+               goto ERROR;
+
+ERROR:
+       queue_free(&matches);
+
+       return r;
+}
+
 PAKFIRE_EXPORT PakfireRepo pakfire_package_get_repo(PakfirePackage pkg) {
        if (!pkg->repo) {
                Solvable* s = get_solvable(pkg);