}
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);
// 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);
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
}
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
}
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;
}
/*
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) {
#include <pakfire/xfer.h>
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);
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);