]> git.ipfire.org Git - pakfire.git/commitdiff
repo: Automatically cleanup temporary files in @commandline repo
authorMichael Tremer <michael.tremer@ipfire.org>
Tue, 5 Oct 2021 12:08:55 +0000 (12:08 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Tue, 5 Oct 2021 12:08:55 +0000 (12:08 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/pakfire.c
src/libpakfire/repo.c

index 56606ed4da652f932a5559107491545b9f400336..9882d86832b74133ab528124cc855764bf4a741e 100644 (file)
@@ -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);
index 542c66bd943a1e53ad9d499fd06fd53797137b26..5e80527a475facbf49632d133ec54d7e1082e251 100644 (file)
@@ -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);