From: Michael Tremer Date: Fri, 17 Mar 2023 14:56:28 +0000 (+0000) Subject: filelist: Add option to show a progressbar X-Git-Tag: 0.9.29~263 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=73c6c3dacb571dc909aa3289c7be76badd4867ef;p=pakfire.git filelist: Add option to show a progressbar Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/build.c b/src/libpakfire/build.c index d2eb5db18..d75140e40 100644 --- a/src/libpakfire/build.c +++ b/src/libpakfire/build.c @@ -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) { diff --git a/src/libpakfire/filelist.c b/src/libpakfire/filelist.c index 68224819c..c76c34e4e 100644 --- a/src/libpakfire/filelist.c +++ b/src/libpakfire/filelist.c @@ -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; } diff --git a/src/libpakfire/include/pakfire/filelist.h b/src/libpakfire/include/pakfire/filelist.h index 3aed020bd..3114f9923 100644 --- a/src/libpakfire/include/pakfire/filelist.h +++ b/src/libpakfire/include/pakfire/filelist.h @@ -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);