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