}
int pakfire_package_get_reverse_requires(struct pakfire_package* pkg,
- struct pakfire_packagelist* list) {
+ struct pakfire_packagelist** ret) {
+ struct pakfire_packagelist* list = NULL;
Queue matches;
+ int r;
+
+ // Initialize the queue
queue_init(&matches);
+ // Create a new package list
+ r = pakfire_packagelist_create(&list, pkg->ctx);
+ if (r < 0)
+ goto ERROR;
+
// Get the pool ready
pakfire_pool_internalize(pkg->pakfire);
pool_whatmatchessolvable(pool, SOLVABLE_REQUIRES, pkg->id, &matches, 0);
// Import the result to the package list
- int r = pakfire_packagelist_import_solvables(list, pkg->pakfire, &matches);
- if (r)
+ r = pakfire_packagelist_import_solvables(list, pkg->pakfire, &matches);
+ if (r < 0)
goto ERROR;
+ // Return the list
+ *ret = pakfire_packagelist_ref(list);
+
ERROR:
+ if (list)
+ pakfire_packagelist_unref(list);
queue_free(&matches);
return r;
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);
return 0;
}
+int pakfire_packagelist_add_list(struct pakfire_packagelist* self, struct pakfire_packagelist* other) {
+ int r;
+
+ // Add all packages from the other list
+ for (unsigned int i = 0; i < other->num_packages; i++) {
+ r = pakfire_packagelist_add(self, other->packages[i]);
+ if (r < 0)
+ return r;
+ }
+
+ return 0;
+}
+
int pakfire_packagelist_walk(struct pakfire_packagelist* self,
pakfire_packagelist_walk_callback callback, void* data, int flags) {
int kept_going = 0;
struct pakfire_package* pakfire_packagelist_get(struct pakfire_packagelist* list, unsigned int index);
int pakfire_packagelist_add(struct pakfire_packagelist* list, struct pakfire_package* pkg);
+int pakfire_packagelist_add_list(struct pakfire_packagelist* self, struct pakfire_packagelist* other);
typedef int (*pakfire_packagelist_walk_callback)
(struct pakfire_ctx* ctx, struct pakfire_package* pkg, void* p);
}
static int __pakfire_whatrequires(struct pakfire_ctx* ctx, struct pakfire_package* pkg, void* data) {
- struct pakfire_packagelist* list = (struct pakfire_packagelist*)data;
+ struct pakfire_packagelist* reverse = NULL;
+ struct pakfire_packagelist* list = data;
+ int r;
+
+ // Fetch all elements
+ r = pakfire_package_get_reverse_requires(pkg, &reverse);
+ if (r < 0)
+ goto ERROR;
+
+ // Merge them into the result list
+ r = pakfire_packagelist_add_list(list, reverse);
+ if (r < 0)
+ goto ERROR;
- return pakfire_package_get_reverse_requires(pkg, list);
+ERROR:
+ if (reverse)
+ pakfire_packagelist_unref(reverse);
+
+ return r;
}
int pakfire_whatrequires(struct pakfire* pakfire, const char* what, int flags,
PyObject* ret = NULL;
int r;
- // Create a new packagelist
- r = pakfire_packagelist_create(&list, self->ctx);
- if (r < 0) {
- errno = -r;
- PyErr_SetFromErrno(PyExc_OSError);
- goto ERROR;
- }
-
// Search for all reverse requires
- r = pakfire_package_get_reverse_requires(self->package, list);
+ r = pakfire_package_get_reverse_requires(self->package, &list);
if (r < 0) {
errno = -r;
PyErr_SetFromErrno(PyExc_OSError);