enum {
PAKFIRE_BUILD_CLEANUP_FILES = (1 << 0),
PAKFIRE_BUILD_ERROR_IF_NOT_EMPTY = (1 << 1),
+ PAKFIRE_BUILD_SHOW_PROGRESS = (1 << 2),
};
/*
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;
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) {
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;
}
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);