static PyObject* Package_get_repo(PackageObject* self) {
PakfireRepo repo = pakfire_package_get_repo(self->package);
-
if (!repo)
return NULL;
const char* name = pakfire_repo_get_name(repo);
- pakfire_repo_free(repo);
+ pakfire_repo_unref(repo);
return new_repo(self->pool, name);
}
}
static void Repo_dealloc(RepoObject* self) {
- if (self->repo)
- pakfire_repo_free(self->repo);
+ pakfire_repo_unref(self->repo);
Py_XDECREF(self->pool);
Py_TYPE(self)->tp_free((PyObject *)self);
PakfireRepo repo;
// XXX COMPAT
- Repo* _repo;
+ void* _repo;
} RepoObject;
extern PyTypeObject RepoType;
#ifndef PAKFIRE_REPO_H
#define PAKFIRE_REPO_H
-#include <solv/repo.h>
-
#include <pakfire/types.h>
PakfireRepo pakfire_repo_create(PakfirePool pool, const char* name);
-PakfireRepo pakfire_repo_create_from_repo(PakfirePool pool, Repo* r);
-void pakfire_repo_free(PakfireRepo pkg);
+
+PakfireRepo pakfire_repo_ref(PakfireRepo repo);
+PakfireRepo pakfire_repo_unref(PakfireRepo repo);
PakfirePool pakfire_repo_pool(PakfireRepo repo);
#ifdef PAKFIRE_PRIVATE
-struct _PakfireRepo {
- PakfirePool pool;
- Repo* repo;
- PakfireRepoCache cache;
- int nrefs;
+#include <solv/repo.h>
- Repodata* filelist;
-};
+PakfireRepo pakfire_repo_create_from_repo(PakfirePool pool, Repo* r);
PakfirePackage pakfire_repo_add_package(PakfireRepo repo);
-static inline Pool* pakfire_repo_solv_pool(PakfireRepo repo) {
- return pakfire_pool_get_solv_pool(repo->pool);
-}
-
-static inline Repo* pakfire_repo_get_solv_repo(PakfireRepo repo) {
- return repo->repo;
-}
+Repo* pakfire_repo_get_repo(PakfireRepo repo);
+Repodata* pakfire_repo_get_repodata(PakfireRepo repo);
#endif
pakfire_repo_count;
pakfire_repo_clean;
pakfire_repo_create;
- pakfire_repo_free;
pakfire_repo_get_cache;
pakfire_repo_get_name;
pakfire_repo_get_enabled;
pakfire_repo_pool;
pakfire_repo_read_solv;
pakfire_repo_read_solv_fp;
+ pakfire_repo_ref;
pakfire_repo_set_enabled;
pakfire_repo_set_name;
pakfire_repo_set_priority;
pakfire_repo_write_solv;
pakfire_repo_write_solv_fp;
+ pakfire_repo_unref;
# repocache
pakfire_repocache_age;
if (repo1 && repo2) {
ret = pakfire_repo_cmp(repo1, repo2);
+ }
- pakfire_repo_free(repo1);
- pakfire_repo_free(repo2);
+ pakfire_repo_unref(repo1);
+ pakfire_repo_unref(repo2);
- if (ret)
- return ret;
- }
+ if (ret)
+ return ret;
// Check package architectures
str1 = pool_id2str(pool, s1->arch);
PakfireRepo repo = pakfire_package_get_repo(pkg);
if (repo) {
pakfire_repo_internalize(repo);
- pakfire_repo_free(repo);
+ pakfire_repo_unref(repo);
}
}
PAKFIRE_EXPORT void pakfire_package_set_repo(PakfirePackage pkg, PakfireRepo repo) {
Solvable* s = get_solvable(pkg);
- s->repo = pakfire_repo_get_solv_repo(repo);
+ s->repo = pakfire_repo_get_repo(repo);
}
PAKFIRE_EXPORT char* pakfire_package_get_location(PakfirePackage pkg) {
const char* repo_name = pakfire_repo_get_name(repo);
pakfire_package_dump_add_line(&string, _("Repo"), repo_name);
- pakfire_repo_free(repo);
+ pakfire_repo_unref(repo);
}
// Summary
cache_path = pakfire_repocache_get_full_path(repo_cache, pkg_cache_path);
out:
- if (repo)
- pakfire_repo_free(repo);
+ pakfire_repo_unref(repo);
return cache_path;
}
PakfireRepo repo = pakfire_package_get_repo(pkg);
Solvable* s = get_solvable(pkg);
Pool* p = pakfire_package_get_solv_pool(pkg);
- Repo* r = pakfire_repo_get_solv_repo(repo);
+ Repo* r = pakfire_repo_get_repo(repo);
int found_marker = 0;
file = pakfire_file_sort(file);
}
+ pakfire_repo_unref(repo);
+
return file;
}
PAKFIRE_EXPORT PakfireFile pakfire_package_filelist_append(PakfirePackage pkg, const char* filename) {
PakfireRepo repo = pakfire_package_get_repo(pkg);
+ Repodata* repodata = pakfire_repo_get_repodata(repo);
Id handle = pakfire_package_get_handle(pkg);
char* dirname = pakfire_dirname(filename);
char* basename = pakfire_basename(filename);
- Id did = repodata_str2dir(repo->filelist, dirname, 1);
+ Id did = repodata_str2dir(repodata, dirname, 1);
if (!did)
- did = repodata_str2dir(repo->filelist, "/", 1);
+ did = repodata_str2dir(repodata, "/", 1);
- repodata_add_dirstr(repo->filelist, handle,
+ repodata_add_dirstr(repodata, handle,
SOLVABLE_FILELIST, did, basename);
+ pakfire_repo_unref(repo);
+
return NULL;
}
if (r == NULL)
continue;
- pakfire_repo_free(r);
+ pakfire_repo_unref(r);
}
}
return;
}
- assert(pool == repo->pool);
- pool_set_installed(pool->pool, repo->repo);
+ pool_set_installed(pool->pool, pakfire_repo_get_repo(repo));
}
PAKFIRE_EXPORT const char** pakfire_pool_get_installonly(PakfirePool pool) {
#include <pakfire/constants.h>
#include <pakfire/errno.h>
+#include <pakfire/logging.h>
#include <pakfire/package.h>
#include <pakfire/pool.h>
#include <pakfire/private.h>
const uint8_t XZ_HEADER_MAGIC[] = { 0xFD, '7', 'z', 'X', 'Z', 0x00 };
const size_t XZ_HEADER_LENGTH = sizeof(XZ_HEADER_MAGIC);
+struct _PakfireRepo {
+ PakfirePool pool;
+ Repo* repo;
+ PakfireRepoCache cache;
+ Repodata* filelist;
+ int nrefs;
+};
+
static Repo* get_repo_by_name(Pool* pool, const char* name) {
Repo* repo;
int i;
}
PAKFIRE_EXPORT PakfireRepo pakfire_repo_create_from_repo(PakfirePool pool, Repo* r) {
- PakfireRepo repo;
+ // Return existing object if we have one
+ if (r->appdata)
+ return pakfire_repo_ref(r->appdata);
- if (r->appdata) {
- repo = r->appdata;
- repo->nrefs++;
-
- } else {
- repo = pakfire_calloc(1, sizeof(*repo));
- if (repo) {
- repo->pool = pool;
-
- repo->repo = r;
- repo->cache = pakfire_repocache_create(repo);
- repo->repo->appdata = repo;
+ PakfireRepo repo = r->appdata = pakfire_calloc(1, sizeof(*repo));
+ if (repo) {
+ DEBUG("Allocated Repo at %p\n", repo);
+ repo->nrefs = 1;
- repo->filelist = repo_add_repodata(r, REPO_EXTEND_SOLVABLES|REPO_LOCALPOOL|REPO_NO_INTERNALIZE|REPO_NO_LOCATION);
+ repo->pool = pakfire_pool_ref(pool);
+ repo->repo = r;
+ repo->cache = pakfire_repocache_create(repo);
- // Initialize reference counter
- repo->nrefs = 1;
- }
+ repo->filelist = repo_add_repodata(r,
+ REPO_EXTEND_SOLVABLES|REPO_LOCALPOOL|REPO_NO_INTERNALIZE|REPO_NO_LOCATION);
}
return repo;
}
-PAKFIRE_EXPORT void pakfire_repo_free(PakfireRepo repo) {
- if (--repo->nrefs > 0)
- return;
+PAKFIRE_EXPORT PakfireRepo pakfire_repo_ref(PakfireRepo repo) {
+ repo->nrefs++;
+
+ return repo;
+}
+static void pakfire_repo_free(PakfireRepo repo) {
if (repo->repo)
repo->repo->appdata = NULL;
if (repo->cache)
pakfire_repocache_free(repo->cache);
+ pakfire_pool_unref(repo->pool);
+
pakfire_free(repo);
+ DEBUG("Released Repo at %p\n", repo);
+}
+
+PAKFIRE_EXPORT PakfireRepo pakfire_repo_unref(PakfireRepo repo) {
+ if (!repo)
+ return NULL;
+
+ if (--repo->nrefs > 0)
+ return repo;
+
+ pakfire_repo_free(repo);
+ return NULL;
+}
+
+Repo* pakfire_repo_get_repo(PakfireRepo repo) {
+ return repo->repo;
+}
+
+Repodata* pakfire_repo_get_repodata(PakfireRepo repo) {
+ return repo->filelist;
}
PAKFIRE_EXPORT PakfirePool pakfire_repo_pool(PakfireRepo repo) {
}
PAKFIRE_EXPORT int pakfire_repo_count(PakfireRepo repo) {
- Pool* pool = pakfire_repo_solv_pool(repo);
+ Pool* pool = pakfire_pool_get_solv_pool(repo->pool);
int cnt = 0;
for (int i = 2; i < pool->nsolvables; i++) {
size_str
);
- pakfire_repo_free(repo);
+ pakfire_repo_unref(repo);
pakfire_free(size_str);
}