]> git.ipfire.org Git - pakfire.git/commitdiff
progress: Allow to push/pop the status
authorMichael Tremer <michael.tremer@ipfire.org>
Sat, 15 Mar 2025 11:37:25 +0000 (11:37 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Sat, 15 Mar 2025 11:37:25 +0000 (11:37 +0000)
That way, we can return to something more useful.

Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/pakfire/progress.c
src/pakfire/progress.h
src/pakfire/transaction.c

index 41cd7badadb5efb863a7f2bcebfbb1ecc766c889..ecd8ff7c96669670f9b9cba4f39ec750085261ae 100644 (file)
@@ -25,6 +25,7 @@
 #include <pakfire/ctx.h>
 #include <pakfire/logging.h>
 #include <pakfire/progress.h>
+#include <pakfire/string.h>
 
 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) {
index bbac640ea886347a24ec4a0e443931339b57b01c..1d787d60e9be486ec288b94f5c268ed75f3edf0f 100644 (file)
@@ -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 */
index 676aedb3f00fb6de59549e540bd7bf2dd171d3a0..ad0a829139fddca7d3a7f06ca1a32adf87acd912 100644 (file)
@@ -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;
 }