From: Michael Tremer Date: Thu, 22 Apr 2021 11:33:00 +0000 (+0000) Subject: snapshots: Add progressbar when extracting X-Git-Tag: 0.9.28~1285^2~274 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2d8abc60b11a857232b4650b21b985dee870a125;p=pakfire.git snapshots: Add progressbar when extracting Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/snapshot.c b/src/libpakfire/snapshot.c index e6c6b4ce0..682c8a1b5 100644 --- a/src/libpakfire/snapshot.c +++ b/src/libpakfire/snapshot.c @@ -28,8 +28,10 @@ #include #include #include +#include #include #include +#include #include #include #include @@ -55,6 +57,31 @@ static int pakfire_snapshot_path_is_excluded(const char* path) { return 0; } +static int pakfire_snapshot_progressbar( + struct pakfire_progressbar** progressbar, const char* message) { + int r = pakfire_progressbar_create(progressbar, NULL); + if (r) + return r; + + // Add message + r = pakfire_progressbar_add_string(*progressbar, "%s", message); + if (r) + goto ERROR; + + // Add bar + r = pakfire_progressbar_add_bar(*progressbar); + if (r) + goto ERROR; + + return 0; + +ERROR: + pakfire_progressbar_unref(*progressbar); + *progressbar = NULL; + + return 1; +} + static struct archive* pakfire_snapshot_create_archive(Pakfire pakfire, FILE* f) { struct archive* a = archive_write_new(); if (!a) { @@ -208,9 +235,18 @@ ERROR: } static int pakfire_snapshot_extract(Pakfire pakfire, FILE* f) { + struct pakfire_progressbar* progressbar = NULL; char sourcepath[PATH_MAX]; + struct stat st; int r = 1; + // Stat the input file + r = fstat(fileno(f), &st); + if (r) { + ERROR(pakfire, "Could not stat snapshot: %s\n", strerror(errno)); + return 1; + } + struct archive* a = archive_read_new(); if (!a) return 1; @@ -232,6 +268,15 @@ static int pakfire_snapshot_extract(Pakfire pakfire, FILE* f) { goto ERROR; } + // Make progressbar + r = pakfire_snapshot_progressbar(&progressbar, _("Extracting snapshot...")); + if (r) + goto ERROR; + + r = pakfire_progressbar_start(progressbar, st.st_size); + if (r) + goto ERROR; + struct archive_entry* e = NULL; while (1) { r = archive_read_next_header(a, &e); @@ -242,6 +287,12 @@ static int pakfire_snapshot_extract(Pakfire pakfire, FILE* f) { goto ERROR; } + // How much of the archive has been read? + size_t bytes_read = archive_filter_bytes(a, -1); + + // Update progress + pakfire_progressbar_update(progressbar, bytes_read); + const char* path = archive_entry_pathname(e); DEBUG(pakfire, "Extracting %s...\n", path); @@ -262,10 +313,15 @@ static int pakfire_snapshot_extract(Pakfire pakfire, FILE* f) { } } + // Finish the progressbar + pakfire_progressbar_finish(progressbar); + // Success r = 0; ERROR: + if (progressbar) + pakfire_progressbar_unref(progressbar); if (disk) archive_write_free(disk); archive_read_free(a);