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