}
int cli_dump_packagelist(struct pakfire_packagelist* list, int flags) {
- return pakfire_packagelist_walk(list, __cli_dump_package, &flags);
+ return pakfire_packagelist_walk(list, __cli_dump_package, &flags, 0);
}
int cli_dump_repolist(struct pakfire_repolist* list, int flags) {
goto ERROR;
// Dump them all
- r = pakfire_packagelist_walk(build->packages, pakfire_build_package_dump, build);
+ r = pakfire_packagelist_walk(build->packages, pakfire_build_package_dump, build, 0);
if (r)
goto ERROR;
goto ERROR;
// Add all packages
- r = pakfire_packagelist_walk(build->packages, pakfire_build_install_package, transaction);
+ r = pakfire_packagelist_walk(build->packages,
+ pakfire_build_install_package, transaction, 0);
if (r < 0)
goto ERROR;
// Copy all packages to the target path
if (*build->target) {
r = pakfire_packagelist_walk(build->packages,
- pakfire_build_copy_package, build->target);
+ pakfire_build_copy_package, build->target, 0);
if (r)
goto ERROR;
}
const char* path = pakfire_repo_get_path(local);
if (path) {
r = pakfire_packagelist_walk(build->packages,
- pakfire_build_copy_package, (void*)path);
+ pakfire_build_copy_package, (void*)path, 0);
if (r)
goto ERROR;
}
}
static int pakfire_build_lint(struct pakfire_build* build) {
- return pakfire_packagelist_walk(build->packages, pakfire_build_lint_package, build);
+ int r;
+
+ // Lint all packages
+ r = pakfire_packagelist_walk(build->packages,
+ pakfire_build_lint_package, build, PAKFIRE_PACKAGELIST_KEEPGOING);
+
+ if (r > 0)
+ ERROR(build->ctx, "Linting failed\n");
+
+ return r;
}
PAKFIRE_EXPORT int pakfire_build_exec(struct pakfire_build* build, const char* path) {
// Lint the packages
r = pakfire_build_lint(build);
- if (r < 0)
+ if (r)
goto ERROR;
// Copy packages to their destination
typedef int (*pakfire_packagelist_walk_callback)
(struct pakfire_ctx* ctx, struct pakfire_package* pkg, void* p);
+enum pakfire_packagelist_walk_flags {
+ PAKFIRE_PACKAGELIST_KEEPGOING = (1 << 0),
+};
+
int pakfire_packagelist_walk(struct pakfire_packagelist* list,
- pakfire_packagelist_walk_callback callback, void* p);
+ pakfire_packagelist_walk_callback callback, void* p, int flags);
#ifdef PAKFIRE_PRIVATE
}
// Add all packages to the array
- r = pakfire_packagelist_walk(packages, __pakfire_package_add_build_packages, object);
+ r = pakfire_packagelist_walk(packages, __pakfire_package_add_build_packages, object, 0);
if (r)
goto ERROR;
}
PAKFIRE_EXPORT int pakfire_packagelist_walk(struct pakfire_packagelist* list,
- pakfire_packagelist_walk_callback callback, void* data) {
+ pakfire_packagelist_walk_callback callback, void* data, int flags) {
struct pakfire_packagelist_element* element = NULL;
+ int kept_going = 0;
int r = 0;
// Call the callback once for every element on the list
TAILQ_FOREACH(element, &list->packages, nodes) {
// Call the callback
r = callback(list->ctx, element->pkg, data);
- if (r)
- break;
+
+ // Exit on error
+ if (r < 0)
+ return r;
+
+ // If have been asked to keep going, we
+ else if (flags & PAKFIRE_PACKAGELIST_KEEPGOING)
+ kept_going = 1;
+
+ else if (r > 0)
+ return r;
}
- return r;
+ return (kept_going > 0) ? kept_going : r;
}
int pakfire_packagelist_import_solvables(struct pakfire_packagelist* list,
goto ERROR;
// Find everything for all packages
- r = pakfire_packagelist_walk(packages, __pakfire_whatrequires, list);
+ r = pakfire_packagelist_walk(packages, __pakfire_whatrequires, list, 0);
if (r)
goto ERROR;