]> git.ipfire.org Git - pakfire.git/commitdiff
archive: Collect the filelist on the regular extraction
authorMichael Tremer <michael.tremer@ipfire.org>
Tue, 23 Aug 2022 15:20:21 +0000 (15:20 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Tue, 23 Aug 2022 15:20:21 +0000 (15:20 +0000)
This will save us from running through the archive again.

Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/archive.c

index 03101ffcb255686bb91444f051ab857e51342185..4a1d3485177f068a2f3d0b8bf3a8f09e625ed6aa 100644 (file)
@@ -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) {