#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>
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) {
}
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;
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);
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);
}
}
+ // 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);