From 7d22968f5b927d710ac87fd209e7d871814a07f4 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Tue, 1 Nov 2022 13:38:08 +0000 Subject: [PATCH] repo: Add a function to walk through all repositories Signed-off-by: Michael Tremer --- src/libpakfire/include/pakfire/pakfire.h | 5 +++ src/libpakfire/pakfire.c | 46 +++++++++++++++++------- 2 files changed, 39 insertions(+), 12 deletions(-) diff --git a/src/libpakfire/include/pakfire/pakfire.h b/src/libpakfire/include/pakfire/pakfire.h index 5532bb3e8..e557f9dee 100644 --- a/src/libpakfire/include/pakfire/pakfire.h +++ b/src/libpakfire/include/pakfire/pakfire.h @@ -179,6 +179,11 @@ Pool* pakfire_get_solv_pool(struct pakfire* pakfire); struct pakfire_repo* pakfire_get_installed_repo(struct pakfire* pakfire); +typedef int (*pakfire_repo_walk_callback) + (struct pakfire* pakfire, struct pakfire_repo* repo, void* p); +int pakfire_repo_walk(struct pakfire* pakfire, + pakfire_repo_walk_callback callback, void* p); + // Archive helpers struct archive* pakfire_make_archive_disk_reader(struct pakfire* pakfire, int internal); struct archive* pakfire_make_archive_disk_writer(struct pakfire* pakfire, int internal); diff --git a/src/libpakfire/pakfire.c b/src/libpakfire/pakfire.c index 8c1223ae6..379a7bcd7 100644 --- a/src/libpakfire/pakfire.c +++ b/src/libpakfire/pakfire.c @@ -1089,12 +1089,11 @@ ERROR: return r; } -static int pakfire_foreach_repo(struct pakfire* pakfire, - int (*func)(struct pakfire_repo* repo, int flags), int flags) { - struct pakfire_repo* repo; - - Repo* solv_repo; - int i; +int pakfire_repo_walk(struct pakfire* pakfire, + pakfire_repo_walk_callback callback, void* p) { + struct pakfire_repo* repo = NULL; + Repo* solv_repo = NULL; + int i = 0; int r; Pool* pool = pakfire->pool; @@ -1106,22 +1105,29 @@ static int pakfire_foreach_repo(struct pakfire* pakfire, return 1; // Run callback - r = func(repo, flags); + r = callback(pakfire, repo, p); pakfire_repo_unref(repo); // Raise any errors if (r) - return r; + break; } - return 0; + return r; +} + +static int __pakfire_repo_clean(struct pakfire* pakfire, struct pakfire_repo* repo, + void* p) { + int flags = *(int*)p; + + return pakfire_repo_clean(repo, flags); } PAKFIRE_EXPORT int pakfire_clean(struct pakfire* pakfire, int flags) { int r; // Clean all repositories - r = pakfire_foreach_repo(pakfire, pakfire_repo_clean, flags); + r = pakfire_repo_walk(pakfire, __pakfire_repo_clean, &flags); if (r) return r; @@ -1134,8 +1140,15 @@ PAKFIRE_EXPORT int pakfire_clean(struct pakfire* pakfire, int flags) { return pakfire_rmtree(PAKFIRE_CACHE_DIR, 0); } +static int __pakfire_repo_refresh(struct pakfire* pakfire, struct pakfire_repo* repo, + void* p) { + int flags = *(int*)p; + + return pakfire_repo_refresh(repo, flags); +} + PAKFIRE_EXPORT int pakfire_refresh(struct pakfire* pakfire, int flags) { - return pakfire_foreach_repo(pakfire, pakfire_repo_refresh, flags); + return pakfire_repo_walk(pakfire, __pakfire_repo_refresh, &flags); } enum pakfire_copy_direction { @@ -1263,13 +1276,22 @@ void pakfire_pool_has_changed(struct pakfire* pakfire) { pakfire->pool_ready = 0; } +static int __pakfire_repo_internalize(struct pakfire* pakfire, struct pakfire_repo* repo, + void* p) { + int flags = *(int*)p; + + return pakfire_repo_internalize(repo, flags); +} + void pakfire_pool_internalize(struct pakfire* pakfire) { + int flags = 0; + // Nothing to do if the pool is ready if (pakfire->pool_ready) return; // Internalize all repositories - pakfire_foreach_repo(pakfire, pakfire_repo_internalize, 0); + pakfire_repo_walk(pakfire, __pakfire_repo_internalize, &flags); // Create fileprovides pool_addfileprovides(pakfire->pool); -- 2.39.5