]> git.ipfire.org Git - pakfire.git/commitdiff
pool: Mark repos/pool as dirty and create indices when needed
authorMichael Tremer <michael.tremer@ipfire.org>
Wed, 10 Nov 2021 12:21:43 +0000 (12:21 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Wed, 10 Nov 2021 12:21:43 +0000 (12:21 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/db.c
src/libpakfire/include/pakfire/pakfire.h
src/libpakfire/include/pakfire/repo.h
src/libpakfire/package.c
src/libpakfire/pakfire.c
src/libpakfire/repo.c
src/libpakfire/request.c

index f715b4958edb772eb86176ad21a0058243286248..2edd73241fb67242404fc7c13836ec01bcbeaf28 100644 (file)
@@ -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;
index 9a170682fa4f7daf9856e24f76f77bbad350dac0..4b941cfb2fb84a275e503a409852e3170ba769c6 100644 (file)
@@ -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);
 
index d925623d265bbbf15132ab5bd618f9e7d8baa2a2..22acae2bd6bf9972257783613ec43d486d648c18 100644 (file)
@@ -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);
index 6e82e6a41198ac92944e558531e37883e10d55bd..38f70ec3ec54c451fe5c77db41523cb30cffecc0 100644 (file)
@@ -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);
        }
 }
index 49baad1a4f694464273cbb634e919a055c6d451e..09c822cc64d12c5d53fdb82c2bff87a274071bb7 100644 (file)
@@ -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);
index 2524a84d5d3b25079ac40bdae15d009f1a3b87c8..d6d7308e4a60b964bea41420ae5b7956a107f43a 100644 (file)
@@ -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);
index e3edcdb021f5d77e1ceb658b6292dd75d1c2a3a5..d335c5f63da614d18b2b630aa12b6d6445ee3e5f 100644 (file)
@@ -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);