]> git.ipfire.org Git - pakfire.git/commitdiff
transactions: Use callbacks to show status & progress
authorMichael Tremer <michael.tremer@ipfire.org>
Thu, 9 Dec 2021 12:06:30 +0000 (12:06 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Thu, 9 Dec 2021 12:06:30 +0000 (12:06 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/transaction.c

index aa3faa52218480ee54003dfaaaf42b70294d9bcc..e5a050533af72dd00b0812500e751b944148c0d3 100644 (file)
@@ -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,