]> git.ipfire.org Git - pakfire.git/commitdiff
repo: Add a function to walk through all repositories
authorMichael Tremer <michael.tremer@ipfire.org>
Tue, 1 Nov 2022 13:38:08 +0000 (13:38 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Tue, 1 Nov 2022 13:38:08 +0000 (13:38 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/include/pakfire/pakfire.h
src/libpakfire/pakfire.c

index 5532bb3e8a58df11e7ef7ea56a7a645c3c95f25e..e557f9dee2fd9b8f88ab7b0bf9c83ed404678fe5 100644 (file)
@@ -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);
index 8c1223ae688ee76a997a2f48bb625ccdf66b49fb..379a7bcd79e54a74d72be713457b590138decc05 100644 (file)
@@ -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);