From: Michael Tremer Date: Tue, 5 Oct 2021 12:08:55 +0000 (+0000) Subject: repo: Automatically cleanup temporary files in @commandline repo X-Git-Tag: 0.9.28~911 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2cf6d086e33387dedd62ea878d713a0370e49a65;p=pakfire.git repo: Automatically cleanup temporary files in @commandline repo Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/pakfire.c b/src/libpakfire/pakfire.c index 56606ed4d..9882d8683 100644 --- a/src/libpakfire/pakfire.c +++ b/src/libpakfire/pakfire.c @@ -514,10 +514,23 @@ static int pakfire_mount_interpreter(struct pakfire* pakfire) { } static void pakfire_free(struct pakfire* pakfire) { + struct pakfire_repo* repo = NULL; + int r; + // Avoid recursive free if (pakfire->in_free++) return; + // Destroy the commandline repository + repo = pakfire_get_repo(pakfire, PAKFIRE_REPO_COMMANDLINE); + if (repo) { + r = pakfire_repo_clean(repo, PAKFIRE_REPO_CLEAN_FLAGS_DESTROY); + if (r) + ERROR(pakfire, "Could not cleanup %s repository: %m\n", PAKFIRE_REPO_COMMANDLINE); + + pakfire_repo_unref(repo); + } + // Release GPGME context if (pakfire->gpgctx) pakfire_keystore_destroy(pakfire, &pakfire->gpgctx); diff --git a/src/libpakfire/repo.c b/src/libpakfire/repo.c index 542c66bd9..5e80527a4 100644 --- a/src/libpakfire/repo.c +++ b/src/libpakfire/repo.c @@ -899,10 +899,52 @@ PAKFIRE_EXPORT int pakfire_repo_write_solv(struct pakfire_repo* repo, FILE *f, i return r; } +static int pakfire_repo_delete_all_packages( + struct pakfire_repo* repo, const char* prefix) { + struct pakfire_package* pkg = NULL; + Solvable* s = NULL; + int i = 0; + int r; + + Pool* pool = repo->repo->pool; + + FOR_REPO_SOLVABLES(repo->repo, i, s) { + Id id = pool_solvable2id(pool, s); + + // Allocate package + pkg = pakfire_package_create_from_solvable(repo->pakfire, id); + if (!pkg) + return 1; + + const char* nevra = pakfire_package_get_nevra(pkg); + const char* path = pakfire_package_get_path(pkg); + + DEBUG(repo->pakfire, "Removing %s at %s\n", nevra, path); + + // Delete the file + r = unlink(path); + if (r) { + ERROR(repo->pakfire, "Could not unlink %s at %s: %m\n", + nevra, path); + } + + pakfire_package_unref(pkg); + } + + return 0; +} + PAKFIRE_EXPORT int pakfire_repo_clean(struct pakfire_repo* repo, int flags) { char cache_path[PATH_MAX]; int r; + // Delete all temporary files from the command line repository + if (pakfire_repo_name_equals(repo, PAKFIRE_REPO_COMMANDLINE)) { + r = pakfire_repo_delete_all_packages(repo, PAKFIRE_TMP_DIR); + if (r) + return r; + } + // Drop all meta-data from memory repo_empty(repo->repo, 0);