From: Michael Tremer Date: Sat, 20 Jan 2018 13:02:20 +0000 (+0100) Subject: libpakfire: Refactor repos and how they are referenced X-Git-Tag: 0.9.28~1285^2~1150 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=0560505f6fe32567585c5ee1fa03ac862094a7a5;p=pakfire.git libpakfire: Refactor repos and how they are referenced Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/include/pakfire/pakfire.h b/src/libpakfire/include/pakfire/pakfire.h index d7c34f757..0da17661c 100644 --- a/src/libpakfire/include/pakfire/pakfire.h +++ b/src/libpakfire/include/pakfire/pakfire.h @@ -45,6 +45,7 @@ int pakfire_version_compare(Pakfire pakfire, const char* evr1, const char* evr2) size_t pakfire_count_packages(Pakfire pakfire); +PakfireRepo pakfire_get_repo(Pakfire pakfire, const char* name); PakfireRepo pakfire_get_installed_repo(Pakfire pakfire); void pakfire_set_installed_repo(Pakfire pakfire, PakfireRepo repo); diff --git a/src/libpakfire/include/pakfire/repo.h b/src/libpakfire/include/pakfire/repo.h index 192aab5c4..9f0384582 100644 --- a/src/libpakfire/include/pakfire/repo.h +++ b/src/libpakfire/include/pakfire/repo.h @@ -67,6 +67,7 @@ time_t pakfire_repo_cache_age(PakfireRepo repo, const char* path); #include PakfireRepo pakfire_repo_create_from_repo(Pakfire pakfire, Repo* r); +void pakfire_repo_free_all(Pakfire pakfire); PakfirePackage pakfire_repo_add_package(PakfireRepo repo); diff --git a/src/libpakfire/libpakfire.sym b/src/libpakfire/libpakfire.sym index 901fd9f99..2cf01072b 100644 --- a/src/libpakfire/libpakfire.sym +++ b/src/libpakfire/libpakfire.sym @@ -32,6 +32,7 @@ global: pakfire_get_installonly; pakfire_get_path; pakfire_get_pool; + pakfire_get_repo; pakfire_ref; pakfire_search; pakfire_set_cache_path; diff --git a/src/libpakfire/pakfire.c b/src/libpakfire/pakfire.c index 730d06eb3..8deb26e2f 100644 --- a/src/libpakfire/pakfire.c +++ b/src/libpakfire/pakfire.c @@ -98,19 +98,6 @@ PAKFIRE_EXPORT Pakfire pakfire_ref(Pakfire pakfire) { return pakfire; } -static void pakfire_pool_free_repos(Pool* pool) { - Repo* repo; - int i; - - FOR_REPOS(i, repo) { - PakfireRepo r = repo->appdata; - if (r == NULL) - continue; - - pakfire_repo_unref(r); - } -} - PAKFIRE_EXPORT Pakfire pakfire_unref(Pakfire pakfire) { if (!pakfire) return NULL; @@ -118,7 +105,7 @@ PAKFIRE_EXPORT Pakfire pakfire_unref(Pakfire pakfire) { if (--pakfire->nrefs > 0) return pakfire; - pakfire_pool_free_repos(pakfire->pool); + pakfire_repo_free_all(pakfire); pool_free(pakfire->pool); queue_free(&pakfire->installonly); @@ -173,6 +160,21 @@ void pakfire_pool_apply_changes(Pakfire pakfire) { } } +PAKFIRE_EXPORT PakfireRepo pakfire_get_repo(Pakfire pakfire, const char* name) { + Pool* pool = pakfire_get_solv_pool(pakfire); + + Repo* repo; + int i; + + FOR_REPOS(i, repo) { + if (strcmp(repo->name, name) == 0) + return pakfire_repo_create_from_repo(pakfire, repo); + } + + // Nothing found + return NULL; +} + PAKFIRE_EXPORT PakfireRepo pakfire_get_installed_repo(Pakfire pakfire) { if (!pakfire->pool->installed) return NULL; diff --git a/src/libpakfire/repo.c b/src/libpakfire/repo.c index 4973f0879..b721e40d2 100644 --- a/src/libpakfire/repo.c +++ b/src/libpakfire/repo.c @@ -42,66 +42,68 @@ const uint8_t XZ_HEADER_MAGIC[] = { 0xFD, '7', 'z', 'X', 'Z', 0x00 }; const size_t XZ_HEADER_LENGTH = sizeof(XZ_HEADER_MAGIC); +struct pakfire_repo_appdata { + Repodata* repodata; +}; + struct _PakfireRepo { Pakfire pakfire; Repo* repo; - Repodata* filelist; + struct pakfire_repo_appdata* appdata; int nrefs; }; -static Repo* get_repo_by_name(Pool* pool, const char* name) { - Repo* repo; - int i; - - FOR_REPOS(i, repo) { - if (strcmp(repo->name, name) == 0) - return repo; - } - - return NULL; +static void free_repo_appdata(struct pakfire_repo_appdata* appdata) { + repodata_free(appdata->repodata); + pakfire_free(appdata); } -static PakfireRepo get_pakfire_repo_by_name(Pakfire pakfire, const char* name) { +void pakfire_repo_free_all(Pakfire pakfire) { Pool* pool = pakfire_get_solv_pool(pakfire); - Repo* repo = get_repo_by_name(pool, name); - if (repo) - return repo->appdata; + Repo* repo; + int i; - return NULL; + FOR_REPOS(i, repo) { + free_repo_appdata(repo->appdata); + repo_free(repo, 0); + } } PAKFIRE_EXPORT PakfireRepo pakfire_repo_create(Pakfire pakfire, const char* name) { - PakfireRepo repo = get_pakfire_repo_by_name(pakfire, name); + PakfireRepo repo = pakfire_calloc(1, sizeof(*repo)); if (repo) { - repo->nrefs++; - return repo; - } + DEBUG("Allocated Repo at %p\n", repo); + repo->nrefs = 1; - Pool* pool = pakfire_get_solv_pool(pakfire); + repo->pakfire = pakfire_ref(pakfire); - Repo* r = get_repo_by_name(pool, name); - if (!r) - r = repo_create(pool, name); + // Allocate a libsolv repository + Pool* pool = pakfire_get_solv_pool(pakfire); + repo->repo = repo_create(pool, name); - return pakfire_repo_create_from_repo(pakfire, r); -} + // Allocate repository appdata + repo->appdata = repo->repo->appdata = \ + calloc(1, sizeof(*repo->appdata)); -PAKFIRE_EXPORT PakfireRepo pakfire_repo_create_from_repo(Pakfire pakfire, Repo* r) { - // Return existing object if we have one - if (r->appdata) - return pakfire_repo_ref(r->appdata); + repo->appdata->repodata = repo_add_repodata(repo->repo, + REPO_EXTEND_SOLVABLES|REPO_LOCALPOOL|REPO_NO_INTERNALIZE|REPO_NO_LOCATION); + } + return repo; +} + +PakfireRepo pakfire_repo_create_from_repo(Pakfire pakfire, Repo* r) { PakfireRepo repo = r->appdata = pakfire_calloc(1, sizeof(*repo)); if (repo) { DEBUG("Allocated Repo at %p\n", repo); repo->nrefs = 1; repo->pakfire = pakfire_ref(pakfire); - repo->repo = r; - repo->filelist = repo_add_repodata(r, - REPO_EXTEND_SOLVABLES|REPO_LOCALPOOL|REPO_NO_INTERNALIZE|REPO_NO_LOCATION); + // Reference repository + repo->repo = r; + repo->appdata = r->appdata; } return repo; @@ -114,9 +116,6 @@ PAKFIRE_EXPORT PakfireRepo pakfire_repo_ref(PakfireRepo repo) { } static void pakfire_repo_free(PakfireRepo repo) { - if (repo->repo) - repo->repo->appdata = NULL; - pakfire_unref(repo->pakfire); pakfire_free(repo); @@ -139,7 +138,7 @@ Repo* pakfire_repo_get_repo(PakfireRepo repo) { } Repodata* pakfire_repo_get_repodata(PakfireRepo repo) { - return repo->filelist; + return repo->appdata->repodata; } PAKFIRE_EXPORT int pakfire_repo_identical(PakfireRepo repo1, PakfireRepo repo2) {