From: Michael Tremer Date: Wed, 30 Jun 2021 16:17:02 +0000 (+0000) Subject: pakfire: Refactor whatprovides X-Git-Tag: 0.9.28~1147 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=54334355258c6fd323efdfb1262f351c4996fed1;p=pakfire.git pakfire: Refactor whatprovides This can be implemented in the same way as whatrequires and therefore we can share some code. Signed-off-by: Michael Tremer --- diff --git a/src/_pakfire/pakfire.c b/src/_pakfire/pakfire.c index 4f0207ec3..9b64b23a6 100644 --- a/src/_pakfire/pakfire.c +++ b/src/_pakfire/pakfire.c @@ -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 }, { diff --git a/src/libpakfire/include/pakfire/pakfire.h b/src/libpakfire/include/pakfire/pakfire.h index 162d00559..788b8003b 100644 --- a/src/libpakfire/include/pakfire/pakfire.h +++ b/src/libpakfire/include/pakfire/pakfire.h @@ -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); diff --git a/src/libpakfire/pakfire.c b/src/libpakfire/pakfire.c index 31763e9c6..d5fd69945 100644 --- a/src/libpakfire/pakfire.c +++ b/src/libpakfire/pakfire.c @@ -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); diff --git a/src/pakfire/cli.py b/src/pakfire/cli.py index 424b5c4d0..73694014e 100644 --- a/src/pakfire/cli.py +++ b/src/pakfire/cli.py @@ -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