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;
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);
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);
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);
}
}
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) {
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);
int r;
// Get the pool ready
- pakfire_pool_apply_changes(pakfire);
+ pakfire_pool_internalize(pakfire);
// Initialize the result queue
queue_init(&matches);
// Mirrorlist
char* mirrorlist_url;
char mirrorlist[PATH_MAX];
+
+ // Markers
+ int ready:1;
};
struct pakfire_repo {
}
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,
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) {
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) {
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);
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);
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;
Id key = 0;
// Make the pool ready
- pakfire_pool_apply_changes(request->pakfire);
+ pakfire_pool_internalize(request->pakfire);
Queue jobs;
queue_init(&jobs);