From 60fec0bd3de1c3f8f6747fbc170765c69e0de438 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Ter=C3=A4s?= <timo.teras@iki.fi> Date: Mon, 11 Mar 2024 13:00:48 +0200 Subject: [PATCH] commit: account for trigger and directory update errors on totals This will include trigger script and directory update errors in the grand total count for commit commands. Should handle the example B in issue #10954 --- src/apk_database.h | 2 +- src/apk_package.h | 4 ++-- src/commit.c | 14 ++++++++------ src/database.c | 3 ++- src/package.c | 14 ++++++++------ 5 files changed, 21 insertions(+), 16 deletions(-) diff --git a/src/apk_database.h b/src/apk_database.h index f6134584..1f20b604 100644 --- a/src/apk_database.h +++ b/src/apk_database.h @@ -223,7 +223,7 @@ int apk_db_permanent(struct apk_database *db); int apk_db_check_world(struct apk_database *db, struct apk_dependency_array *world); int apk_db_fire_triggers(struct apk_database *db); int apk_db_run_script(struct apk_database *db, char *fn, char **argv); -void apk_db_update_directory_permissions(struct apk_database *db); +int apk_db_update_directory_permissions(struct apk_database *db); static inline time_t apk_db_url_since(struct apk_database *db, time_t since) { return apk_ctx_since(db->ctx, since); } diff --git a/src/apk_package.h b/src/apk_package.h index d54e9cf9..3bdef8bd 100644 --- a/src/apk_package.h +++ b/src/apk_package.h @@ -153,8 +153,8 @@ int apk_ipkg_assign_script(struct apk_installed_package *ipkg, unsigned int type int apk_ipkg_add_script(struct apk_installed_package *ipkg, struct apk_istream *is, unsigned int type, unsigned int size); -void apk_ipkg_run_script(struct apk_installed_package *ipkg, struct apk_database *db, - unsigned int type, char **argv); +int apk_ipkg_run_script(struct apk_installed_package *ipkg, struct apk_database *db, + unsigned int type, char **argv); struct apk_package *apk_pkg_parse_index_entry(struct apk_database *db, apk_blob_t entry); int apk_pkg_write_index_header(struct apk_package *pkg, struct apk_ostream *os); diff --git a/src/commit.c b/src/commit.c index 0e9c9162..2bc458b9 100644 --- a/src/commit.c +++ b/src/commit.c @@ -206,13 +206,14 @@ static int cmp_upgrade(struct apk_change *change) return 0; } -static void run_triggers(struct apk_database *db, struct apk_changeset *changeset) +static int run_triggers(struct apk_database *db, struct apk_changeset *changeset) { struct apk_change *change; struct apk_installed_package *ipkg; + int errors = 1; if (apk_db_fire_triggers(db) == 0) - return; + return 0; foreach_array_item(change, changeset->changes) { struct apk_package *pkg = change->new_pkg; @@ -223,10 +224,11 @@ static void run_triggers(struct apk_database *db, struct apk_changeset *changese continue; *apk_string_array_add(&ipkg->pending_triggers) = NULL; - apk_ipkg_run_script(ipkg, db, APK_SCRIPT_TRIGGER, - ipkg->pending_triggers->item); + errors += apk_ipkg_run_script(ipkg, db, APK_SCRIPT_TRIGGER, + ipkg->pending_triggers->item) != 0; apk_string_array_free(&ipkg->pending_triggers); } + return errors; } #define PRE_COMMIT_HOOK 0 @@ -384,8 +386,8 @@ int apk_solver_commit_changeset(struct apk_database *db, apk_print_progress(&prog.prog, prog.total.bytes + prog.total.packages, prog.total.bytes + prog.total.packages); - apk_db_update_directory_permissions(db); - run_triggers(db, changeset); + errors += apk_db_update_directory_permissions(db) != 0; + errors += run_triggers(db, changeset); all_done: apk_dependency_array_copy(&db->world, world); diff --git a/src/database.c b/src/database.c index 4bcefd84..8a7f4388 100644 --- a/src/database.c +++ b/src/database.c @@ -2077,7 +2077,7 @@ static int update_permissions(apk_hash_item item, void *pctx) return 0; } -void apk_db_update_directory_permissions(struct apk_database *db) +int apk_db_update_directory_permissions(struct apk_database *db) { struct apk_out *out = &db->ctx->out; struct apk_installed_package *ipkg; @@ -2103,6 +2103,7 @@ void apk_db_update_directory_permissions(struct apk_database *db) } apk_hash_foreach(&db->installed.dirs, update_permissions, &ctx); if (ctx.errors) apk_err(out, "%d errors updating directory permissions", ctx.errors); + return ctx.errors; } int apk_db_cache_active(struct apk_database *db) diff --git a/src/package.c b/src/package.c index 6628e99a..53bcef1f 100644 --- a/src/package.c +++ b/src/package.c @@ -791,9 +791,9 @@ static inline int make_device_tree(struct apk_database *db) } #endif -void apk_ipkg_run_script(struct apk_installed_package *ipkg, - struct apk_database *db, - unsigned int type, char **argv) +int apk_ipkg_run_script(struct apk_installed_package *ipkg, + struct apk_database *db, + unsigned int type, char **argv) { // script_exec_dir is the directory to which the script is extracted, // executed from, and removed. It needs to not be 'noexec' mounted, and @@ -806,10 +806,10 @@ void apk_ipkg_run_script(struct apk_installed_package *ipkg, struct apk_out *out = &db->ctx->out; struct apk_package *pkg = ipkg->pkg; char fn[PATH_MAX]; - int fd, root_fd = db->root_fd; + int fd, root_fd = db->root_fd, ret = 0; if (type >= APK_SCRIPT_MAX || ipkg->script[type].ptr == NULL) - return; + return 0; argv[0] = (char *) apk_script_types[type]; @@ -818,7 +818,7 @@ void apk_ipkg_run_script(struct apk_installed_package *ipkg, apk_script_types[type]); if ((db->ctx->flags & (APK_NO_SCRIPTS | APK_SIMULATE)) != 0) - return; + return 0; if (!db->script_dirs_checked) { if (apk_make_dirs(root_fd, "tmp", 01777, 0) <0 || @@ -855,8 +855,10 @@ err_log: apk_err(out, "%s: failed to execute: %s", &fn[strlen(script_exec_dir)+1], apk_error_str(errno)); err: ipkg->broken_script = 1; + ret = 1; cleanup: unlinkat(root_fd, fn, 0); + return ret; } static int parse_index_line(void *ctx, apk_blob_t line) -- GitLab