]> git.ipfire.org Git - pakfire.git/commitdiff
Add command for reverse dependency resolution
authorMichael Tremer <michael.tremer@ipfire.org>
Wed, 30 Jun 2021 14:59:40 +0000 (14:59 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Wed, 30 Jun 2021 14:59:40 +0000 (14:59 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/_pakfire/pakfire.c
src/libpakfire/include/pakfire/pakfire.h
src/libpakfire/libpakfire.sym
src/libpakfire/pakfire.c
src/pakfire/cli.py
src/scripts/pakfire-builder.in

index 40c389870b39028041e03d006671cd5ee4765431..363aff7f4091928b6680cfc864870ca2b6feb0a9 100644 (file)
@@ -472,6 +472,20 @@ static PyObject* Pakfire_whatprovides(PakfireObject* self, PyObject* args, PyObj
        return obj;
 }
 
+static PyObject* Pakfire_whatrequires(PakfireObject* self, PyObject* args) {
+       const char* requires = NULL;
+
+       if (!PyArg_ParseTuple(args, "s", &requires))
+               return NULL;
+
+       struct pakfire_packagelist* list = pakfire_whatrequires(self->pakfire, requires, 0);
+
+       PyObject* obj = PyList_FromPackageList(list);
+       pakfire_packagelist_unref(list);
+
+       return obj;
+}
+
 static PyObject* Pakfire_search(PakfireObject* self, PyObject* args) {
        const char* what;
 
@@ -1018,6 +1032,12 @@ static struct PyMethodDef Pakfire_methods[] = {
                METH_VARARGS|METH_KEYWORDS,
                NULL
        },
+       {
+               "whatrequires",
+               (PyCFunction)Pakfire_whatrequires,
+               METH_VARARGS,
+               NULL
+       },
        { NULL },
 };
 
index 8bff002478e0f24665baad2a87d1bafc2ed2575f..e066e052f21d9ead9f077d747fbf85044d4be198 100644 (file)
@@ -63,6 +63,7 @@ struct pakfire_repolist* pakfire_get_repos(Pakfire pakfire);
 PakfireRepo pakfire_get_repo(Pakfire pakfire, const char* name);
 
 struct pakfire_packagelist* pakfire_whatprovides(Pakfire pakfire, const char* provides, int flags);
+struct pakfire_packagelist* pakfire_whatrequires(Pakfire pakfire, const char* what, int flags);
 struct pakfire_packagelist* pakfire_search(Pakfire pakfire, const char* what, int flags);
 
 // Logging
index 5ed69f299ce9b162945b1ee4c5f8a78239945a1f..4387cb3bab6e1aca784fe1e6ef8c21cb754dd488 100644 (file)
@@ -44,6 +44,7 @@ global:
        pakfire_update;
        pakfire_version_compare;
        pakfire_whatprovides;
+       pakfire_whatrequires;
 
        # arch
        pakfire_arch_native;
index d89981cb2cae5b07368a9a8833abedcb14f837f9..ea6c4d9d84020eba0333ac17a26679547aa7816c 100644 (file)
@@ -1374,6 +1374,42 @@ PAKFIRE_EXPORT struct pakfire_packagelist* pakfire_whatprovides(Pakfire pakfire,
        }
 }
 
+PAKFIRE_EXPORT struct pakfire_packagelist* pakfire_whatrequires(Pakfire pakfire, const char* what, int flags) {
+       // Refresh repositories
+       int r = pakfire_refresh(pakfire, 0);
+       if (r)
+               return NULL;
+
+       // Get the pool ready
+       pakfire_pool_apply_changes(pakfire);
+
+       // Translate dependency to ID
+       Id dep = pakfire_parse_dep(pakfire, what);
+       if (!dep) {
+               errno = EINVAL;
+               return NULL;
+       }
+
+       Queue matches;
+       queue_init(&matches);
+
+       // Search for anything that matches
+       pool_whatmatchesdep(pakfire->pool, SOLVABLE_REQUIRES, dep, &matches, 0);
+
+       // Create a packagelist
+       struct pakfire_packagelist* list = pakfire_packagelist_from_queue(pakfire, &matches);
+
+       // Cleanup
+       queue_free(&matches);
+
+       // Sort the list
+       if (list) {
+               pakfire_packagelist_sort(list);
+       }
+
+       return list;
+}
+
 PAKFIRE_EXPORT struct pakfire_packagelist* pakfire_search(Pakfire pakfire, const char* what, int flags) {
        // Refresh repositories
        int r = pakfire_refresh(pakfire, 0);
index 8d196bab5a01b7f7497fb56e531530d04eea1c7e..a7ca304520fc425a9928cfe9c2efcbbedd0d35a5 100644 (file)
@@ -93,6 +93,13 @@ class Cli(object):
                provides.add_argument("pattern", nargs="+", help=_("File or feature to search for"))
                provides.set_defaults(func=self.handle_provides)
 
+               # requires
+               requires = subparsers.add_parser("requires",
+                       help=_("Get a list of packages that require this dependency"))
+               requires.add_argument("pattern", required=True,
+                       help=_("File or feature to search for"))
+               requires.set_defaults(func=self.handle_requires)
+
                # reinstall
                reinstall = subparsers.add_parser("reinstall",
                        help=_("Reinstall one or more packages"))
@@ -283,6 +290,11 @@ class Cli(object):
                        s = pkg.dump(long=long)
                        print(s)
 
+       def handle_requires(self, ns):
+               for pkg in self.pakfire(ns).whatrequires(ns.pattern):
+                       s = pkg.dump(long=True)
+                       print(s)
+
        def handle_repolist(self, ns):
                p = self.pakfire(ns)
 
index b3a27a871b6254262ec1d0d74f6bf98231275fdb..e2324f5fd407f1d98a8ed0d4c6168a0e9ba4fed3 100644 (file)
@@ -103,6 +103,13 @@ class Cli(object):
                        help=_("File or feature to search for"))
                #provides.set_defaults(func=self._provides)
 
+               # requires
+               requires = subparsers.add_parser("requires",
+                       help=_("Get a list of packages that require a given file or feature"))
+               requires.add_argument("pattern", required=True,
+                       help=_("File or feature to search for"))
+               requires.set_defaults(func=self._requires)
+
                # repolist
                repolist = subparsers.add_parser("repolist",
                        help=_("List all currently enabled repositories"))
@@ -215,6 +222,11 @@ class Cli(object):
                        s = pkg.dump(long=True, filelist=ns.filelist)
                        print(s)
 
+       def _requires(self, ns):
+               for pkg in self.pakfire(ns).whatrequires(ns.pattern):
+                       s = pkg.dump(long=True)
+                       print(s)
+
        def _repolist(self, ns):
                """
                        List all repositories