From a3b276d122ff1470c6c3a9b082d370ec6eb1f863 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Tue, 23 Aug 2022 15:03:51 +0000 Subject: [PATCH] compress: Add flag to perform a dry-run extraction Signed-off-by: Michael Tremer --- src/libpakfire/compress.c | 50 ++++++++++++++--------- src/libpakfire/include/pakfire/compress.h | 3 +- 2 files changed, 33 insertions(+), 20 deletions(-) diff --git a/src/libpakfire/compress.c b/src/libpakfire/compress.c index 81f7a8316..a83924d20 100644 --- a/src/libpakfire/compress.c +++ b/src/libpakfire/compress.c @@ -524,6 +524,9 @@ struct pakfire_extract { // Reference to Pakfire struct pakfire* pakfire; + // Flags + int flags; + // The archive to extract struct archive* archive; @@ -634,23 +637,25 @@ static int __pakfire_extract_entry(struct pakfire* pakfire, struct pakfire_extra } // Create file & extract payload - r = archive_read_extract2(data->archive, entry, data->writer); - switch (r) { - case ARCHIVE_OK: - r = 0; - break; + if (data->writer) { + r = archive_read_extract2(data->archive, entry, data->writer); + switch (r) { + case ARCHIVE_OK: + r = 0; + break; - case ARCHIVE_WARN: - ERROR(pakfire, "%s\n", archive_error_string(data->writer)); + case ARCHIVE_WARN: + ERROR(pakfire, "%s\n", archive_error_string(data->writer)); - // Pretend everything has been okay - r = 0; - break; + // Pretend everything has been okay + r = 0; + break; - case ARCHIVE_FATAL: - ERROR(pakfire, "%s\n", archive_error_string(data->writer)); - r = 1; - break; + case ARCHIVE_FATAL: + ERROR(pakfire, "%s\n", archive_error_string(data->writer)); + r = 1; + break; + } } ERROR: @@ -668,19 +673,26 @@ int pakfire_extract(struct pakfire* pakfire, struct archive* archive, struct pakfire_extract data = { .pakfire = pakfire, .archive = archive, + .flags = flags, + .writer = NULL, }; + // Is this a dry run? + const int dry_run = flags & PAKFIRE_EXTRACT_DRY_RUN; + // Set prefix (including pakfire path) r = pakfire_path(pakfire, data.prefix, "%s", prefix); if (r) goto ERROR; // Allocate writer - data.writer = pakfire_make_archive_disk_writer(pakfire, 1); - if (!data.writer) { - ERROR(pakfire, "Could not create disk writer: %m\n"); - r = 1; - goto ERROR; + if (!dry_run) { + data.writer = pakfire_make_archive_disk_writer(pakfire, 1); + if (!data.writer) { + ERROR(pakfire, "Could not create disk writer: %m\n"); + r = 1; + goto ERROR; + } } // Create the progressbar diff --git a/src/libpakfire/include/pakfire/compress.h b/src/libpakfire/include/pakfire/compress.h index de5c9a648..66565ab8f 100644 --- a/src/libpakfire/include/pakfire/compress.h +++ b/src/libpakfire/include/pakfire/compress.h @@ -38,7 +38,8 @@ FILE* pakfire_zstdfopen(FILE* f, const char* mode); // Extract enum pakfire_extract_flags { - PAKFIRE_EXTRACT_SHOW_THROUGHPUT = (1 << 0), + PAKFIRE_EXTRACT_DRY_RUN = (1 << 0), + PAKFIRE_EXTRACT_SHOW_THROUGHPUT = (1 << 1), }; int pakfire_extract(struct pakfire* pakfire, struct archive* archive, -- 2.39.5