From: Michael Tremer Date: Tue, 23 Aug 2022 15:20:21 +0000 (+0000) Subject: archive: Collect the filelist on the regular extraction X-Git-Tag: 0.9.28~398 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=85b0e5be98aedf778861483767018dbfb8032e46;p=pakfire.git archive: Collect the filelist on the regular extraction This will save us from running through the archive again. Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/archive.c b/src/libpakfire/archive.c index 03101ffcb..4a1d34851 100644 --- a/src/libpakfire/archive.c +++ b/src/libpakfire/archive.c @@ -841,8 +841,8 @@ ERROR: return r; } -static int __pakfire_archive_extract(struct pakfire_archive* archive, - struct pakfire_filelist* filelist, int flags) { +static int __pakfire_archive_extract(struct pakfire_archive* archive, int flags) { + struct pakfire_filelist* filelist = NULL; struct pakfire_package* pkg = NULL; struct archive* a = NULL; struct archive* payload = NULL; @@ -872,12 +872,25 @@ static int __pakfire_archive_extract(struct pakfire_archive* archive, if (!payload) goto ERROR; + // Load the filelist (if not done already) + if (!archive->filelist) { + r = pakfire_filelist_create(&filelist, archive->pakfire); + if (r) + goto ERROR; + } + // Extract r = pakfire_extract(archive->pakfire, payload, size, filelist, prefix, nevra, flags); if (r) goto ERROR; + // Store the filelist permanently + if (!archive->filelist) + archive->filelist = pakfire_filelist_ref(filelist); + ERROR: + if (filelist) + pakfire_filelist_unref(filelist); if (pkg) pakfire_package_unref(pkg); if (payload) @@ -889,7 +902,7 @@ ERROR: } PAKFIRE_EXPORT int pakfire_archive_extract(struct pakfire_archive* archive) { - return __pakfire_archive_extract(archive, NULL, 0); + return __pakfire_archive_extract(archive, 0); } PAKFIRE_EXPORT const char* pakfire_archive_get_path(struct pakfire_archive* archive) { @@ -901,23 +914,9 @@ PAKFIRE_EXPORT unsigned int pakfire_archive_get_format(struct pakfire_archive* a } static int pakfire_archive_load_filelist(struct pakfire_archive* archive) { - int r; - - // Create a new filelist - r = pakfire_filelist_create(&archive->filelist, archive->pakfire); - if (r) - return r; - - // Peform a dry-run extraction - r = __pakfire_archive_extract(archive, archive->filelist, + // Perform a dry-run extraction + return __pakfire_archive_extract(archive, PAKFIRE_EXTRACT_DRY_RUN|PAKFIRE_EXTRACT_NO_PROGRESS); - if (r) { - // Free the incomplete filelist on error - pakfire_filelist_unref(archive->filelist); - archive->filelist = NULL; - } - - return r; } PAKFIRE_EXPORT struct pakfire_filelist* pakfire_archive_get_filelist(struct pakfire_archive* archive) {