]> git.ipfire.org Git - pakfire.git/commitdiff
libpakfire: Refactor repos and how they are referenced
authorMichael Tremer <michael.tremer@ipfire.org>
Sat, 20 Jan 2018 13:02:20 +0000 (14:02 +0100)
committerMichael Tremer <michael.tremer@ipfire.org>
Sat, 20 Jan 2018 13:02:20 +0000 (14:02 +0100)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/include/pakfire/pakfire.h
src/libpakfire/include/pakfire/repo.h
src/libpakfire/libpakfire.sym
src/libpakfire/pakfire.c
src/libpakfire/repo.c

index d7c34f75711bbce3c3fada7c90a02495d475fb6a..0da17661c9b08012d1ebfddc119be19ebabc2522 100644 (file)
@@ -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);
 
index 192aab5c46a58efed9899478256db5c02576b276..9f03845821d64fd9879a41d9b41764d3c3be0af9 100644 (file)
@@ -67,6 +67,7 @@ time_t pakfire_repo_cache_age(PakfireRepo repo, const char* path);
 #include <solv/repo.h>
 
 PakfireRepo pakfire_repo_create_from_repo(Pakfire pakfire, Repo* r);
+void pakfire_repo_free_all(Pakfire pakfire);
 
 PakfirePackage pakfire_repo_add_package(PakfireRepo repo);
 
index 901fd9f99eaf07450910fc33967984f2a296e2d2..2cf01072b77ee31f9138f02cfd8b58ca5e422e65 100644 (file)
@@ -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;
index 730d06eb3116bf2f88b175ccc178955dd58fed4f..8deb26e2f4d072ef414316a063d9e9f4b411d608 100644 (file)
@@ -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;
index 4973f08795a87ecdc2f216cdc7b6778689d0ecb6..b721e40d23600f3c10c701a8d278a3045642b259 100644 (file)
 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) {