From: Michael Tremer Date: Sat, 15 Mar 2025 11:37:25 +0000 (+0000) Subject: progress: Allow to push/pop the status X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=c3da1bdb5b553ddf8deeab2cf8b5334a561e8e68;p=pakfire.git progress: Allow to push/pop the status That way, we can return to something more useful. Signed-off-by: Michael Tremer --- diff --git a/src/pakfire/progress.c b/src/pakfire/progress.c index 41cd7bad..ecd8ff7c 100644 --- a/src/pakfire/progress.c +++ b/src/pakfire/progress.c @@ -25,6 +25,7 @@ #include #include #include +#include struct pakfire_progress { struct pakfire_ctx* ctx; @@ -34,7 +35,7 @@ struct pakfire_progress { char* title; // Status - char* status; + char** status; // Flags what to show int flags; @@ -79,7 +80,7 @@ static void pakfire_progress_free(struct pakfire_progress* p) { if (p->parent) pakfire_progress_unref(p->parent); if (p->status) - free(p->status); + pakfire_strings_free(p->status); if (p->title) free(p->title); if (p->ctx) @@ -354,34 +355,40 @@ int pakfire_progress_set_title(struct pakfire_progress* p, const char* format, . if (r < 0) return r; - // If we have a parent, we set this title as their status - if (p->parent) { - r = pakfire_progress_set_status(p->parent, "%s", p->title); - if (r < 0) - return r; - } - return 0; } const char* pakfire_progress_get_status(struct pakfire_progress* p) { - return p->status; + if (!p->status) + return NULL; + + size_t length = pakfire_strings_length(p->status); + if (!length) + return NULL; + + return p->status[length - 1]; } -int pakfire_progress_set_status(struct pakfire_progress* p, const char* format, ...) { +int pakfire_progress_push_status(struct pakfire_progress* p, const char* format, ...) { + char status[256]; va_list args; int r; // Format the status va_start(args, format); - r = vasprintf(&p->status, format, args); + r = pakfire_string_vformat(status, format, args); va_end(args); // Fail if (r < 0) return r; - return 0; + // Append the status + return pakfire_strings_append(&p->status, status); +} + +void pakfire_progress_pop_status(struct pakfire_progress* p) { + pakfire_strings_pop(&p->status); } double pakfire_progress_get_percentage(struct pakfire_progress* p) { diff --git a/src/pakfire/progress.h b/src/pakfire/progress.h index bbac640e..1d787d60 100644 --- a/src/pakfire/progress.h +++ b/src/pakfire/progress.h @@ -86,8 +86,9 @@ const char* pakfire_progress_get_title(struct pakfire_progress* p); int pakfire_progress_set_title(struct pakfire_progress* p, const char* format, ...) __attribute__((format(printf, 2, 3))); const char* pakfire_progress_get_status(struct pakfire_progress* p); -int pakfire_progress_set_status(struct pakfire_progress* p, const char* format, ...) +int pakfire_progress_push_status(struct pakfire_progress* p, const char* format, ...) __attribute__((format(printf, 2, 3))); +void pakfire_progress_pop_status(struct pakfire_progress* p); void pakfire_progress_set_max_value(struct pakfire_progress* p, unsigned long int value); #endif /* PAKFIRE_PROGRESS_H */ diff --git a/src/pakfire/transaction.c b/src/pakfire/transaction.c index 676aedb3..ad0a8291 100644 --- a/src/pakfire/transaction.c +++ b/src/pakfire/transaction.c @@ -1330,7 +1330,7 @@ static int pakfire_transaction_extract(struct pakfire_transaction* transaction, const char* nevra = pakfire_package_get_string(pkg, PAKFIRE_PKG_NEVRA); // Update status - r = pakfire_progress_set_status(transaction->progress, _("Installing %s..."), nevra); + r = pakfire_progress_push_status(transaction->progress, _("Installing %s..."), nevra); if (r < 0) return r; @@ -1339,13 +1339,13 @@ static int pakfire_transaction_extract(struct pakfire_transaction* transaction, if (r) { ERROR(transaction->ctx, "Could not extract package %s: %m\n", nevra); - return r; + goto ERROR; } // Is it necessary to call ldconfig? r = pakfire_archive_get_filelist(archive, &filelist); if (r < 0) - return r; + goto ERROR; // Update the runtime linker cache if (pakfire_filelist_contains(filelist, "*/lib*.so.?")) @@ -1354,6 +1354,9 @@ static int pakfire_transaction_extract(struct pakfire_transaction* transaction, if (filelist) pakfire_filelist_unref(filelist); +ERROR: + pakfire_progress_pop_status(transaction->progress); + return 0; } @@ -1366,9 +1369,9 @@ static int pakfire_transaction_erase(struct pakfire_transaction* transaction, const char* nevra = pakfire_package_get_string(pkg, PAKFIRE_PKG_NEVRA); // Update status - r = pakfire_progress_set_status(transaction->progress, _("Removing %s..."), nevra); + r = pakfire_progress_push_status(transaction->progress, _("Removing %s..."), nevra); if (r < 0) - goto ERROR; + return r; // Fetch filelist r = pakfire_db_package_filelist(db, &filelist, pkg); @@ -1384,6 +1387,8 @@ static int pakfire_transaction_erase(struct pakfire_transaction* transaction, pakfire_jail_ldconfig(transaction->pakfire); ERROR: + pakfire_progress_pop_status(transaction->progress); + if (filelist) pakfire_filelist_unref(filelist); @@ -1684,19 +1689,19 @@ static int pakfire_transaction_run_steps(struct pakfire_transaction* transaction // Update status switch (action) { case PAKFIRE_ACTION_VERIFY: - r = pakfire_progress_set_status(transaction->progress, _("Verifying Packages...")); + r = pakfire_progress_push_status(transaction->progress, _("Verifying Packages...")); if (r < 0) return r; break; case PAKFIRE_ACTION_PRETRANS: - r = pakfire_progress_set_status(transaction->progress, _("Preparing Installation...")); + r = pakfire_progress_push_status(transaction->progress, _("Preparing Installation...")); if (r < 0) return r; break; case PAKFIRE_ACTION_POSTTRANS: - r = pakfire_progress_set_status(transaction->progress, _("Finishing Up...")); + r = pakfire_progress_push_status(transaction->progress, _("Finishing Up...")); if (r < 0) return r; break; @@ -1717,6 +1722,18 @@ static int pakfire_transaction_run_steps(struct pakfire_transaction* transaction } } + // Reset the status + switch (action) { + case PAKFIRE_ACTION_VERIFY: + case PAKFIRE_ACTION_PRETRANS: + case PAKFIRE_ACTION_POSTTRANS: + pakfire_progress_pop_status(transaction->progress); + break; + + default: + break; + } + return r; }