]> git.ipfire.org Git - pakfire.git/commitdiff
filelist: Add option to show a progressbar
authorMichael Tremer <michael.tremer@ipfire.org>
Fri, 17 Mar 2023 14:56:28 +0000 (14:56 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Fri, 17 Mar 2023 14:56:28 +0000 (14:56 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/build.c
src/libpakfire/filelist.c
src/libpakfire/include/pakfire/filelist.h

index d2eb5db18c4e3663402f64b87c7720a505095a13..d75140e40293987f673e0c92f9b80c077464f4f3 100644 (file)
@@ -1022,6 +1022,7 @@ ERROR:
 enum {
        PAKFIRE_BUILD_CLEANUP_FILES         = (1 << 0),
        PAKFIRE_BUILD_ERROR_IF_NOT_EMPTY    = (1 << 1),
+       PAKFIRE_BUILD_SHOW_PROGRESS         = (1 << 2),
 };
 
 /*
@@ -1041,7 +1042,8 @@ static int pakfire_build_post_process_files(struct pakfire_build* build,
                goto ERROR;
 
        // Find all files that need to be removed
-       r = pakfire_filelist_walk(filelist, callback, removees, 0);
+       r = pakfire_filelist_walk(filelist, callback, removees,
+               (flags & PAKFIRE_BUILD_SHOW_PROGRESS) ? PAKFIRE_FILELIST_SHOW_PROGRESS : 0);
        if (r)
                goto ERROR;
 
@@ -1222,7 +1224,7 @@ static int pakfire_build_post_check_files(
                filelist,
                "File Issues:",
                __pakfire_build_post_check_files,
-               PAKFIRE_BUILD_ERROR_IF_NOT_EMPTY);
+               PAKFIRE_BUILD_ERROR_IF_NOT_EMPTY|PAKFIRE_BUILD_SHOW_PROGRESS);
 }
 
 static int pakfire_build_run_post_build_checks(struct pakfire_build* build) {
index 68224819c72f4aa938e6997fb4de89846ece3b65..c76c34e4ea8def80bdce9d8534b4a5de495eeae0 100644 (file)
@@ -406,19 +406,88 @@ int pakfire_filelist_contains(struct pakfire_filelist* list, const char* pattern
        return 0;
 }
 
+static int pakfire_filelist_progressbar_create(
+               struct pakfire_progressbar** progressbar, const char* message) {
+       struct pakfire_progressbar* p = NULL;
+       int r;
+
+       // Create the progressbar
+       r = pakfire_progressbar_create(&p, NULL);
+       if (r)
+               goto ERROR;
+
+       // Add message
+       if (message) {
+               r = pakfire_progressbar_add_string(p, "%s", message);
+               if (r)
+                       goto ERROR;
+       }
+
+       // Add bar
+       r = pakfire_progressbar_add_bar(p);
+       if (r)
+               goto ERROR;
+
+       // Add percentage
+       r = pakfire_progressbar_add_percentage(p);
+       if (r)
+               goto ERROR;
+
+       // Add ETA
+       r = pakfire_progressbar_add_eta(p);
+       if (r)
+               goto ERROR;
+
+       *progressbar = p;
+
+       return 0;
+
+ERROR:
+       if (p)
+               pakfire_progressbar_unref(p);
+
+       return r;
+}
+
 int pakfire_filelist_walk(struct pakfire_filelist* list,
                pakfire_filelist_walk_callback callback, void* data, int flags) {
+       struct pakfire_progressbar* progressbar = NULL;
        struct pakfire_filelist_element* element = NULL;
        int r = 0;
 
+       // Show a progressbar when iterating over the filelist
+       if (flags & PAKFIRE_FILELIST_SHOW_PROGRESS) {
+               r = pakfire_filelist_progressbar_create(&progressbar, "Processing Files...");
+               if (r)
+                       goto ERROR;
+
+               const size_t length = pakfire_filelist_length(list);
+
+               // Start progressbar
+               pakfire_progressbar_start(progressbar, length);
+       }
+
        // Call the callback once for every element on the list
        TAILQ_FOREACH(element, &list->files, nodes) {
+               // Increment the progressbar
+               if (progressbar)
+                       pakfire_progressbar_increment(progressbar, 1);
+
                // Call the callback
                r = callback(list->pakfire, element->file, data);
                if (r)
                        break;
        }
 
+       // Done!
+       if (progressbar)
+               pakfire_progressbar_finish(progressbar);
+
+ERROR:
+       // Finish progress
+       if (progressbar)
+               pakfire_progressbar_unref(progressbar);
+
        return r;
 }
 
index 3aed020bd972fb336ae54c0b2776390ba896124e..3114f9923067bc238e7a458b3b853933408ceeb0 100644 (file)
@@ -55,6 +55,10 @@ int pakfire_filelist_contains(struct pakfire_filelist* list, const char* pattern
 typedef int (*pakfire_filelist_walk_callback)
        (struct pakfire* pakfire, struct pakfire_file* file, void* data);
 
+enum pakfire_filelist_walk_flags {
+       PAKFIRE_FILELIST_SHOW_PROGRESS = (1 << 0),
+};
+
 int pakfire_filelist_walk(struct pakfire_filelist* list,
        pakfire_filelist_walk_callback callback, void* data, int flags);
 int pakfire_filelist_dump(struct pakfire_filelist* list, int flags);