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