]> git.ipfire.org Git - pakfire.git/commitdiff
snapshots: Add progressbar when extracting
authorMichael Tremer <michael.tremer@ipfire.org>
Thu, 22 Apr 2021 11:33:00 +0000 (11:33 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Thu, 22 Apr 2021 11:33:00 +0000 (11:33 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/snapshot.c

index e6c6b4ce0403c08d2b4fd5b1ef570938cd52b5f5..682c8a1b5b9b194587e078fc0fd12e09f10b01c2 100644 (file)
 #include <pakfire/db.h>
 #include <pakfire/file.h>
 #include <pakfire/filelist.h>
+#include <pakfire/i18n.h>
 #include <pakfire/logging.h>
 #include <pakfire/private.h>
+#include <pakfire/progressbar.h>
 #include <pakfire/repo.h>
 #include <pakfire/snapshot.h>
 #include <pakfire/types.h>
@@ -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);