]> git.ipfire.org Git - pakfire.git/commitdiff
pakfire: Refactor whatprovides
authorMichael Tremer <michael.tremer@ipfire.org>
Wed, 30 Jun 2021 16:17:02 +0000 (16:17 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Wed, 30 Jun 2021 16:17:02 +0000 (16:17 +0000)
This can be implemented in the same way as whatrequires and therefore we
can share some code.

Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/_pakfire/pakfire.c
src/libpakfire/include/pakfire/pakfire.h
src/libpakfire/pakfire.c
src/pakfire/cli.py

index 4f0207ec36cbf9a5300aacede638e07428843425..9b64b23a63b93bc553042a8b3c5a33021dcf0933 100644 (file)
@@ -445,26 +445,18 @@ static PyObject* Pakfire_import_key(PakfireObject* self, PyObject* args) {
        return _import_keylist(self, keys);
 }
 
-static PyObject* Pakfire_whatprovides(PakfireObject* self, PyObject* args, PyObject* kwds) {
-       char* kwlist[] = {"provides", "glob", "icase", "name_only", NULL};
-
-       const char* provides;
-       int glob = 0;
-       int icase = 0;
-       int name_only = 0;
+static PyObject* Pakfire_whatprovides(PakfireObject* self, PyObject* args) {
+       const char* provides = NULL;
+       struct pakfire_packagelist* list = NULL;
 
-       if (!PyArg_ParseTupleAndKeywords(args, kwds, "s|iii", kwlist, &provides, &glob, &icase, &name_only))
+       if (!PyArg_ParseTuple(args, "s", &provides))
                return NULL;
 
-       int flags = 0;
-       if (glob)
-               flags |= PAKFIRE_GLOB;
-       if (icase)
-               flags |= PAKFIRE_ICASE;
-       if (name_only)
-               flags |= PAKFIRE_NAME_ONLY;
-
-       struct pakfire_packagelist* list = pakfire_whatprovides(self->pakfire, provides, flags);
+       int r = pakfire_whatprovides(self->pakfire, provides, 0, &list);
+       if (r) {
+               PyErr_SetFromErrno(PyExc_OSError);
+               return NULL;
+       }
 
        PyObject* obj = PyList_FromPackageList(list);
        pakfire_packagelist_unref(list);
@@ -1034,7 +1026,7 @@ static struct PyMethodDef Pakfire_methods[] = {
        {
                "whatprovides",
                (PyCFunction)Pakfire_whatprovides,
-               METH_VARARGS|METH_KEYWORDS,
+               METH_VARARGS,
                NULL
        },
        {
index 162d0055922ab3e67c9facea104a34f8e1460c37..788b8003bd90d8b8788cab2d5c72a01ba46cc719 100644 (file)
@@ -62,7 +62,8 @@ int pakfire_version_compare(Pakfire pakfire, const char* evr1, const char* evr2)
 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);
+int pakfire_whatprovides(Pakfire pakfire, const char* what, int flags,
+       struct pakfire_packagelist** list);
 int pakfire_whatrequires(Pakfire pakfire, const char* what, int flags,
        struct pakfire_packagelist** list);
 struct pakfire_packagelist* pakfire_search(Pakfire pakfire, const char* what, int flags);
index 31763e9c618193eadae9be9c76a072ffe0d9fb6b..d5fd69945c306c9a5b63dde2ffb43425d7b855b6 100644 (file)
@@ -1316,80 +1316,7 @@ static struct pakfire_packagelist* pakfire_pool_dataiterator(Pakfire pakfire, co
        return list;
 }
 
-static struct pakfire_packagelist* pakfire_search_name(Pakfire pakfire, const char* name, int flags) {
-       struct pakfire_packagelist* list = NULL;
-
-       if (!flags) {
-               int r = pakfire_packagelist_create(&list, pakfire);
-               if (r)
-                       return NULL;
-
-               pakfire_pool_apply_changes(pakfire);
-
-               Id id = pool_str2id(pakfire->pool, name, 0);
-               if (id == 0)
-                       return list;
-
-               Id p, pp;
-               Pool* pool = pakfire->pool;
-               FOR_PROVIDES(p, pp, id) {
-                       Solvable* s = pool_id2solvable(pakfire->pool, p);
-
-                       if (s->name == id) {
-                               struct pakfire_package* pkg = pakfire_package_create_from_solvable(pakfire, p);
-                               pakfire_packagelist_push_if_not_exists(list, pkg);
-                       }
-               }
-
-               return list;
-       }
-
-       return pakfire_pool_dataiterator(pakfire, name, SOLVABLE_NAME, flags);
-}
-
-static struct pakfire_packagelist* pakfire_search_provides(Pakfire pakfire, const char* provides, int flags) {
-       struct pakfire_packagelist* list = NULL;
-
-       if (!flags) {
-               int r = pakfire_packagelist_create(&list, pakfire);
-               if (r)
-                       return NULL;
-
-               pakfire_pool_apply_changes(pakfire);
-
-               Id id = pool_str2id(pakfire->pool, provides, 0);
-               if (id == 0)
-                       return list;
-
-               Id p, pp;
-               Pool* pool = pakfire->pool;
-               FOR_PROVIDES(p, pp, id) {
-                       struct pakfire_package* pkg = pakfire_package_create_from_solvable(pakfire, p);
-                       pakfire_packagelist_push_if_not_exists(list, pkg);
-               }
-
-               return list;
-       }
-
-       return pakfire_pool_dataiterator(pakfire, provides, SOLVABLE_PROVIDES, flags);
-}
-
-PAKFIRE_EXPORT struct pakfire_packagelist* pakfire_whatprovides(Pakfire pakfire, const char* what, int flags) {
-       // Refresh repositories
-       int r = pakfire_refresh(pakfire, 0);
-       if (r)
-               return NULL;
-
-       if (flags & PAKFIRE_NAME_ONLY) {
-               flags &= ~PAKFIRE_NAME_ONLY;
-
-               return pakfire_search_name(pakfire, what, flags);
-       } else {
-               return pakfire_search_provides(pakfire, what, flags);
-       }
-}
-
-PAKFIRE_EXPORT int pakfire_whatrequires(Pakfire pakfire, const char* what, int flags,
+static int pakfire_search_dep(Pakfire pakfire, Id type, const char* what, int flags,
                struct pakfire_packagelist** list) {
        // Refresh repositories
        int r = pakfire_refresh(pakfire, 0);
@@ -1413,7 +1340,7 @@ PAKFIRE_EXPORT int pakfire_whatrequires(Pakfire pakfire, const char* what, int f
        queue_init(&matches);
 
        // Search for anything that matches
-       pool_whatmatchesdep(pakfire->pool, SOLVABLE_REQUIRES, dep, &matches, 0);
+       pool_whatmatchesdep(pakfire->pool, type, dep, &matches, 0);
 
        // Create a packagelist
        r = pakfire_packagelist_create_from_queue(list, pakfire, &matches);
@@ -1429,6 +1356,16 @@ ERROR:
        return r;
 }
 
+PAKFIRE_EXPORT int pakfire_whatprovides(Pakfire pakfire, const char* what, int flags,
+               struct pakfire_packagelist** list) {
+       return pakfire_search_dep(pakfire, SOLVABLE_PROVIDES, what, flags, list);
+}
+
+PAKFIRE_EXPORT int pakfire_whatrequires(Pakfire pakfire, const char* what, int flags,
+               struct pakfire_packagelist** list) {
+       return pakfire_search_dep(pakfire, SOLVABLE_REQUIRES, what, flags, list);
+}
+
 PAKFIRE_EXPORT struct pakfire_packagelist* pakfire_search(Pakfire pakfire, const char* what, int flags) {
        // Refresh repositories
        int r = pakfire_refresh(pakfire, 0);
index 424b5c4d095b68448e2378c72f0ba322abbef929..73694014e482c0630b5a70e6bbf855d33fbddb40 100644 (file)
@@ -90,7 +90,7 @@ class Cli(object):
                # provides
                provides = subparsers.add_parser("provides",
                        help=_("Get a list of packages that provide a given file or feature"))
-               provides.add_argument("pattern", nargs="+", help=_("File or feature to search for"))
+               provides.add_argument("pattern", help=_("File or feature to search for"))
                provides.set_defaults(func=self.handle_provides)
 
                # requires