]> git.ipfire.org Git - pakfire.git/commitdiff
repo: Refactor setup and cleanup
authorMichael Tremer <michael.tremer@ipfire.org>
Fri, 12 Mar 2021 19:28:40 +0000 (19:28 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Fri, 12 Mar 2021 19:28:40 +0000 (19:28 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/repo.c

index ce2a5c598eb88b807c0a002c70f3bed847e093a1..f10c0b438b547eaff98b346dc7b918888b4401b4 100644 (file)
@@ -122,6 +122,21 @@ static void free_repo_appdata(struct pakfire_repo_appdata* appdata) {
        free(appdata);
 }
 
+static void pakfire_repo_free(PakfireRepo repo, const int free_repo) {
+       DEBUG(repo->pakfire, "Releasing Repo at %p\n", repo);
+
+       if (free_repo) {
+               free_repo_appdata(repo->repo->appdata);
+               repo_free(repo->repo, 0);
+       }
+
+       if (repo->downloader)
+               pakfire_downloader_unref(repo->downloader);
+       pakfire_unref(repo->pakfire);
+
+       free(repo);
+}
+
 void pakfire_repo_free_all(Pakfire pakfire) {
        Pool* pool = pakfire_get_solv_pool(pakfire);
        if (!pool)
@@ -138,29 +153,48 @@ void pakfire_repo_free_all(Pakfire pakfire) {
 
 PAKFIRE_EXPORT PakfireRepo pakfire_repo_create(Pakfire pakfire, const char* name) {
        PakfireRepo repo = calloc(1, sizeof(*repo));
-       if (repo) {
-               DEBUG(pakfire, "Allocated Repo at %p\n", repo);
-               repo->nrefs = 1;
+       if (!repo)
+               return NULL;
 
-               repo->pakfire = pakfire_ref(pakfire);
+       DEBUG(pakfire, "Allocated Repo at %p\n", repo);
+
+       repo->pakfire = pakfire_ref(pakfire);
+       repo->nrefs = 1;
 
-               // Allocate a libsolv repository
-               Pool* pool = pakfire_get_solv_pool(pakfire);
-               repo->repo = repo_create(pool, name);
+       Pool* pool = pakfire_get_solv_pool(pakfire);
 
-               // Allocate repository appdata
-               repo->appdata = repo->repo->appdata = \
-                       calloc(1, sizeof(*repo->appdata));
+       // Allocate a libsolv repository
+       repo->repo = repo_create(pool, name);
+       if (!repo->repo) {
+               ERROR(repo->pakfire, "Could not allocate repo: %s\n", strerror(errno));
+               goto ERROR;
+       }
 
-               repo->appdata->repodata = repo_add_repodata(repo->repo,
-                       REPO_EXTEND_SOLVABLES|REPO_LOCALPOOL|REPO_NO_INTERNALIZE|REPO_NO_LOCATION);
+       // Allocate repository appdata
+       repo->appdata = repo->repo->appdata = calloc(1, sizeof(*repo->appdata));
+       if (!repo->appdata) {
+               ERROR(repo->pakfire, "Could not allocate repo appdata\n");
+               goto ERROR;
+       }
 
-               // Make path to mirrorlist
-               repo->appdata->mirrorlist = pakfire_make_cache_path(
-                       repo->pakfire, "repodata/%s/mirrorlist", pakfire_repo_get_name(repo));
+       // Allocate repodata
+       repo->appdata->repodata = repo_add_repodata(repo->repo,
+               REPO_EXTEND_SOLVABLES|REPO_LOCALPOOL|REPO_NO_INTERNALIZE|REPO_NO_LOCATION);
+       if (!repo->appdata->repodata) {
+               ERROR(repo->pakfire, "Could not allocate repodata\n");
+               goto ERROR;
        }
 
+       // Make path to mirrorlist
+       repo->appdata->mirrorlist = pakfire_make_cache_path(
+               repo->pakfire, "repodata/%s/mirrorlist", pakfire_repo_get_name(repo));
+
        return repo;
+
+ERROR:
+       pakfire_repo_free(repo, 1);
+
+       return NULL;
 }
 
 PakfireRepo pakfire_repo_create_from_repo(Pakfire pakfire, Repo* r) {
@@ -185,24 +219,12 @@ PAKFIRE_EXPORT PakfireRepo pakfire_repo_ref(PakfireRepo repo) {
        return repo;
 }
 
-static void pakfire_repo_free(PakfireRepo repo) {
-       DEBUG(repo->pakfire, "Releasing Repo at %p\n", repo);
-
-       if (repo->downloader)
-               pakfire_downloader_unref(repo->downloader);
-       pakfire_unref(repo->pakfire);
-
-       free(repo);
-}
-
 PAKFIRE_EXPORT PakfireRepo pakfire_repo_unref(PakfireRepo repo) {
-       if (!repo)
-               return NULL;
-
        if (--repo->nrefs > 0)
                return repo;
 
-       pakfire_repo_free(repo);
+       pakfire_repo_free(repo, 0);
+
        return NULL;
 }