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) {
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;
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);
}
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;
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,