From: Michael Tremer Date: Wed, 10 Nov 2021 12:21:43 +0000 (+0000) Subject: pool: Mark repos/pool as dirty and create indices when needed X-Git-Tag: 0.9.28~875 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9eba3d6558c172096feb55e1bea56ced29935fad;p=pakfire.git pool: Mark repos/pool as dirty and create indices when needed Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/db.c b/src/libpakfire/db.c index f715b4958..2edd73241 100644 --- a/src/libpakfire/db.c +++ b/src/libpakfire/db.c @@ -1702,8 +1702,8 @@ END: DEBUG(db->pakfire, "Loading package database completed in %.4fms\n", (double)(t_end - t_start) * 1000 / CLOCKS_PER_SEC); - // Internalize repository - pakfire_repo_internalize(repo); + // Mark repository as changed + pakfire_repo_has_changed(repo); // All done r = 0; diff --git a/src/libpakfire/include/pakfire/pakfire.h b/src/libpakfire/include/pakfire/pakfire.h index 9a170682f..4b941cfb2 100644 --- a/src/libpakfire/include/pakfire/pakfire.h +++ b/src/libpakfire/include/pakfire/pakfire.h @@ -154,7 +154,7 @@ int __pakfire_make_cache_path(struct pakfire* pakfire, char* path, size_t length const char* format, ...) __attribute__((format(printf, 4, 5))); void pakfire_pool_has_changed(struct pakfire* pakfire); -void pakfire_pool_apply_changes(struct pakfire* pakfire); +void pakfire_pool_internalize(struct pakfire* pakfire); Pool* pakfire_get_solv_pool(struct pakfire* pakfire); diff --git a/src/libpakfire/include/pakfire/repo.h b/src/libpakfire/include/pakfire/repo.h index d925623d2..22acae2bd 100644 --- a/src/libpakfire/include/pakfire/repo.h +++ b/src/libpakfire/include/pakfire/repo.h @@ -113,7 +113,8 @@ int pakfire_repo_name_equals(struct pakfire_repo* repo, const char* name); int pakfire_repo_import(struct pakfire* pakfire, struct pakfire_config* config); const char* pakfire_repo_get_path(struct pakfire_repo* repo); -void pakfire_repo_internalize(struct pakfire_repo* repo); +void pakfire_repo_has_changed(struct pakfire_repo* repo); +int pakfire_repo_internalize(struct pakfire_repo* repo, int flags); Id pakfire_repo_add_solvable(struct pakfire_repo* repo); int pakfire_repo_add_archive(struct pakfire_repo* repo, struct pakfire_archive* archive, struct pakfire_package** package); diff --git a/src/libpakfire/package.c b/src/libpakfire/package.c index 6e82e6a41..38f70ec3e 100644 --- a/src/libpakfire/package.c +++ b/src/libpakfire/package.c @@ -301,7 +301,7 @@ int pakfire_package_is_source(struct pakfire_package* pkg) { static void pakfire_package_internalize_repo(struct pakfire_package* pkg) { struct pakfire_repo* repo = pakfire_package_get_repo(pkg); if (repo) { - pakfire_repo_internalize(repo); + pakfire_repo_internalize(repo, 0); pakfire_repo_unref(repo); } } diff --git a/src/libpakfire/pakfire.c b/src/libpakfire/pakfire.c index 49baad1a4..09c822cc6 100644 --- a/src/libpakfire/pakfire.c +++ b/src/libpakfire/pakfire.c @@ -1354,12 +1354,22 @@ void pakfire_pool_has_changed(struct pakfire* pakfire) { pakfire->pool_ready = 0; } -void pakfire_pool_apply_changes(struct pakfire* pakfire) { - if (!pakfire->pool_ready) { - pool_addfileprovides(pakfire->pool); - pool_createwhatprovides(pakfire->pool); - pakfire->pool_ready = 1; - } +void pakfire_pool_internalize(struct pakfire* pakfire) { + // Nothing to do if the pool is ready + if (pakfire->pool_ready) + return; + + // Internalize all repositories + pakfire_foreach_repo(pakfire, pakfire_repo_internalize, 0); + + // Create fileprovides + pool_addfileprovides(pakfire->pool); + + // Create whatprovides index + pool_createwhatprovides(pakfire->pool); + + // Mark the pool as ready + pakfire->pool_ready = 1; } PAKFIRE_EXPORT struct pakfire_repolist* pakfire_get_repos(struct pakfire* pakfire) { @@ -1429,7 +1439,7 @@ static int pakfire_search_dep(struct pakfire* pakfire, Id type, const char* what int r; // Get the pool ready - pakfire_pool_apply_changes(pakfire); + pakfire_pool_internalize(pakfire); // Translate dependency to ID Id dep = pakfire_str2dep(pakfire, what); @@ -1479,7 +1489,7 @@ PAKFIRE_EXPORT int pakfire_search(struct pakfire* pakfire, const char* what, int int r; // Get the pool ready - pakfire_pool_apply_changes(pakfire); + pakfire_pool_internalize(pakfire); // Initialize the result queue queue_init(&matches); diff --git a/src/libpakfire/repo.c b/src/libpakfire/repo.c index 2524a84d5..d6d7308e4 100644 --- a/src/libpakfire/repo.c +++ b/src/libpakfire/repo.c @@ -65,6 +65,9 @@ struct pakfire_repo_appdata { // Mirrorlist char* mirrorlist_url; char mirrorlist[PATH_MAX]; + + // Markers + int ready:1; }; struct pakfire_repo { @@ -267,7 +270,12 @@ ERROR: } Id pakfire_repo_add_solvable(struct pakfire_repo* repo) { - return repo_add_solvable(repo->repo); + Id id = repo_add_solvable(repo->repo); + + // Mark this repository as changed + pakfire_repo_has_changed(repo); + + return id; } int pakfire_repo_add_archive(struct pakfire_repo* repo, @@ -654,8 +662,24 @@ PAKFIRE_EXPORT int pakfire_repo_count(struct pakfire_repo* repo) { return cnt; } -void pakfire_repo_internalize(struct pakfire_repo* repo) { +void pakfire_repo_has_changed(struct pakfire_repo* repo) { + repo->appdata->ready = 0; + + // Mark pool as changed, too + pakfire_pool_has_changed(repo->pakfire); +} + +int pakfire_repo_internalize(struct pakfire_repo* repo, int flags) { + if (repo->appdata->ready) + return 0; + + // Internalize all repository data repo_internalize(repo->repo); + + // Mark this repository as ready + repo->appdata->ready = 1; + + return 0; } PAKFIRE_EXPORT const char* pakfire_repo_get_name(struct pakfire_repo* repo) { @@ -685,7 +709,7 @@ PAKFIRE_EXPORT int pakfire_repo_get_enabled(struct pakfire_repo* repo) { PAKFIRE_EXPORT void pakfire_repo_set_enabled(struct pakfire_repo* repo, int enabled) { repo->repo->disabled = !enabled; - pakfire_pool_has_changed(repo->pakfire); + pakfire_repo_has_changed(repo); } PAKFIRE_EXPORT int pakfire_repo_get_priority(struct pakfire_repo* repo) { @@ -883,13 +907,13 @@ PAKFIRE_EXPORT int pakfire_repo_read_solv(struct pakfire_repo* repo, FILE *f, in return 1; } - pakfire_pool_has_changed(repo->pakfire); + pakfire_repo_has_changed(repo); return 0; } PAKFIRE_EXPORT int pakfire_repo_write_solv(struct pakfire_repo* repo, FILE *f, int flags) { - pakfire_repo_internalize(repo); + pakfire_pool_internalize(repo->pakfire); // Export repository data int r = repo_write(repo->repo, f); @@ -1080,9 +1104,8 @@ PAKFIRE_EXPORT int pakfire_repo_scan(struct pakfire_repo* repo, int flags) { pakfire_file_unref(file); } - // Internalize all scanned content - pakfire_repo_internalize(repo); - pakfire_pool_has_changed(repo->pakfire); + // Mark repository data as changed + pakfire_repo_has_changed(repo); // Finish the progress bar r = pakfire_progressbar_finish(progressbar); diff --git a/src/libpakfire/request.c b/src/libpakfire/request.c index e3edcdb02..d335c5f63 100644 --- a/src/libpakfire/request.c +++ b/src/libpakfire/request.c @@ -236,7 +236,8 @@ PAKFIRE_EXPORT int pakfire_request_solve(struct pakfire_request* request, struct pakfire_transaction** transaction, struct pakfire_problem*** problems) { int r; - pakfire_pool_apply_changes(request->pakfire); + // Prepare pool + pakfire_pool_internalize(request->pakfire); // Reset pointers *transaction = NULL; @@ -329,7 +330,7 @@ static int pakfire_request_add_job(struct pakfire_request* request, int action, Id key = 0; // Make the pool ready - pakfire_pool_apply_changes(request->pakfire); + pakfire_pool_internalize(request->pakfire); Queue jobs; queue_init(&jobs);