From: Michael Tremer Date: Thu, 9 Dec 2021 12:06:30 +0000 (+0000) Subject: transactions: Use callbacks to show status & progress X-Git-Tag: 0.9.28~839 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=06bdd186f0aecd388cdb5f0f7bc0c236054453f1;p=pakfire.git transactions: Use callbacks to show status & progress Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/transaction.c b/src/libpakfire/transaction.c index aa3faa522..e5a050533 100644 --- a/src/libpakfire/transaction.c +++ b/src/libpakfire/transaction.c @@ -53,6 +53,7 @@ struct pakfire_transaction { struct pakfire_archive** archives; struct pakfire_package** packages; size_t num; + size_t progress; }; enum pakfire_actions { @@ -261,6 +262,10 @@ PAKFIRE_EXPORT struct pakfire_transaction* pakfire_transaction_unref( return NULL; } +static int pakfire_transaction_get_progress(struct pakfire_transaction* transaction) { + return transaction->progress * 100 / transaction->num; +} + PAKFIRE_EXPORT size_t pakfire_transaction_count(struct pakfire_transaction* transaction) { return transaction->num; } @@ -693,11 +698,16 @@ static int pakfire_transaction_run_script(struct pakfire_transaction* transactio static int pakfire_transaction_extract(struct pakfire_transaction* transaction, struct pakfire_package* pkg, struct pakfire_archive* archive) { + const char* nevra = pakfire_package_get_nevra(pkg); + + // Update status + pakfire_call_status_callback(transaction->pakfire, _("Installing %s..."), nevra); + // Extract payload to the root of the Pakfire instance int r = pakfire_archive_extract(archive, NULL); if (r) { ERROR(transaction->pakfire, "Could not extract package %s: %m\n", - pakfire_package_get_nevra(pkg)); + nevra); return r; } @@ -863,6 +873,13 @@ static int pakfire_transaction_run_step(struct pakfire_transaction* transaction, // Execute the action of this script case PAKFIRE_ACTION_EXECUTE: + // Increment progress + transaction->progress++; + + // Update progress callback + pakfire_call_progress_callback(transaction->pakfire, + pakfire_transaction_get_progress(transaction)); + switch (type) { case PAKFIRE_STEP_INSTALL: case PAKFIRE_STEP_REINSTALL: @@ -950,6 +967,24 @@ static int pakfire_transaction_run_steps(struct pakfire_transaction* transaction struct pakfire_db* db, enum pakfire_actions action) { int r = 0; + // Update status + switch (action) { + case PAKFIRE_ACTION_VERIFY: + pakfire_call_status_callback(transaction->pakfire, _("Verifying packages...")); + break; + + case PAKFIRE_ACTION_PRETRANS: + pakfire_call_status_callback(transaction->pakfire, _("Preparing installation...")); + break; + + case PAKFIRE_ACTION_POSTTRANS: + pakfire_call_status_callback(transaction->pakfire, _("Finishing up...")); + break; + + default: + break; + } + // Walk through all steps for (unsigned int i = 0; i < transaction->num; i++) { r = pakfire_transaction_run_step(transaction, db, action,