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;
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);
}
}
+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;
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;
}
static void pakfire_repo_free(PakfireRepo repo) {
- if (repo->repo)
- repo->repo->appdata = NULL;
-
pakfire_unref(repo->pakfire);
pakfire_free(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) {