From: Michael Tremer Date: Thu, 30 Jan 2025 09:04:30 +0000 (+0000) Subject: repo: Refactor opening existing repositories X-Git-Tag: 0.9.30~283 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d1cf443da0589681eed825b36c6c8fd5998f49e6;p=pakfire.git repo: Refactor opening existing repositories Signed-off-by: Michael Tremer --- diff --git a/src/pakfire/package.c b/src/pakfire/package.c index 87538a96..8b102421 100644 --- a/src/pakfire/package.c +++ b/src/pakfire/package.c @@ -1648,10 +1648,15 @@ int pakfire_package_matches_dep(struct pakfire_package* pkg, } struct pakfire_repo* pakfire_package_get_repo(struct pakfire_package* pkg) { + int r; + + // Open the repository if not done, yet if (!pkg->repo) { Solvable* s = get_solvable(pkg); - pkg->repo = pakfire_repo_create_from_repo(pkg->pakfire, s->repo); + r = pakfire_repo_open(&pkg->repo, pkg->pakfire, s->repo); + if (r < 0) + return NULL; } return pakfire_repo_ref(pkg->repo); diff --git a/src/pakfire/pakfire.c b/src/pakfire/pakfire.c index 6a7d90f2..46c2e00b 100644 --- a/src/pakfire/pakfire.c +++ b/src/pakfire/pakfire.c @@ -1121,9 +1121,9 @@ int pakfire_repo_walk(struct pakfire* pakfire, // Run func for every repository FOR_REPOS(i, solv_repo) { - repo = pakfire_repo_create_from_repo(pakfire, solv_repo); - if (!repo) - return 1; + r = pakfire_repo_open(&repo, pakfire, solv_repo); + if (r < 0) + return r; // Run callback r = callback(pakfire, repo, p); @@ -1242,8 +1242,8 @@ struct pakfire_repolist* pakfire_get_repos(struct pakfire* pakfire) { continue; // Create repository - repo = pakfire_repo_create_from_repo(pakfire, solv_repo); - if (!repo) + r = pakfire_repo_open(&repo, pakfire, solv_repo); + if (r < 0) goto ERROR; // Append it to the list @@ -1264,16 +1264,23 @@ ERROR: } struct pakfire_repo* pakfire_get_repo(struct pakfire* pakfire, const char* name) { + struct pakfire_repo* repo = NULL; + Repo* solv_repo = NULL; + int r; + int i; + Pool* pool = pakfire_get_solv_pool(pakfire); if (!pool) return NULL; - Repo* repo; - int i; + FOR_REPOS(i, solv_repo) { + if (strcmp(solv_repo->name, name) == 0) { + r = pakfire_repo_open(&repo, pakfire, solv_repo); + if (r < 0) + return NULL; - FOR_REPOS(i, repo) { - if (strcmp(repo->name, name) == 0) - return pakfire_repo_create_from_repo(pakfire, repo); + return repo; + } } // Nothing found @@ -1281,10 +1288,18 @@ struct pakfire_repo* pakfire_get_repo(struct pakfire* pakfire, const char* name) } struct pakfire_repo* pakfire_get_installed_repo(struct pakfire* pakfire) { + struct pakfire_repo* repo = NULL; + int r; + if (!pakfire->pool->installed) return NULL; - return pakfire_repo_create_from_repo(pakfire, pakfire->pool->installed); + // Open the repository + r = pakfire_repo_open(&repo, pakfire, pakfire->pool->installed); + if (r < 0) + return NULL; + + return repo; } /* diff --git a/src/pakfire/repo.c b/src/pakfire/repo.c index 9fc4eafe..2bb251e8 100644 --- a/src/pakfire/repo.c +++ b/src/pakfire/repo.c @@ -852,24 +852,33 @@ ERROR: return r; } -struct pakfire_repo* pakfire_repo_create_from_repo(struct pakfire* pakfire, Repo* r) { - struct pakfire_repo* repo = calloc(1, sizeof(*repo)); - if (repo) { - // Store a reference to the context - repo->ctx = pakfire_ctx(pakfire); +int pakfire_repo_open(struct pakfire_repo** repo, struct pakfire* pakfire, Repo* _repo) { + struct pakfire_repo* self = NULL; - // Store a reference to Pakfire - repo->pakfire = pakfire_ref(pakfire); + // Allocate some memory + self = calloc(1, sizeof(*self)); + if (!self) + return -errno; - // Initialize the reference counter - repo->nrefs = 1; + // Store a reference to the context + self->ctx = pakfire_ctx(pakfire); - // Reference repository - repo->repo = r; - repo->appdata = r->appdata; - } + // Store a reference to Pakfire + self->pakfire = pakfire_ref(pakfire); - return repo; + // Initialize the reference counter + self->nrefs = 1; + + // Store a reference to the repository + self->repo = _repo; + + // Initialize appdata + self->appdata = self->repo->appdata; + + // Return the pointer + *repo = self; + + return 0; } struct pakfire_repo* pakfire_repo_ref(struct pakfire_repo* repo) { diff --git a/src/pakfire/repo.h b/src/pakfire/repo.h index cc8d8c32..400dcc5a 100644 --- a/src/pakfire/repo.h +++ b/src/pakfire/repo.h @@ -39,6 +39,7 @@ struct pakfire_repo; #include int pakfire_repo_create(struct pakfire_repo** repo, struct pakfire* pakfire, const char* name); +int pakfire_repo_open(struct pakfire_repo** repo, struct pakfire* pakfire, Repo* _repo); struct pakfire_repo* pakfire_repo_ref(struct pakfire_repo* repo); struct pakfire_repo* pakfire_repo_unref(struct pakfire_repo* repo); @@ -129,7 +130,6 @@ int pakfire_repo_download_package(struct pakfire_xfer** xfer, int pakfire_repo_add(struct pakfire_repo* repo, const char* path, struct pakfire_package** package); -struct pakfire_repo* pakfire_repo_create_from_repo(struct pakfire* pakfire, Repo* r); void pakfire_repo_free_all(struct pakfire* pakfire); Repo* pakfire_repo_get_repo(struct pakfire_repo* repo);