#include <pakfire/repo.h>
#include <pakfire/util.h>
+#include "archive.h"
#include "package.h"
#include "repo.h"
return obj;
}
+static PyObject* Repo_add_archive(RepoObject* self, PyObject* args) {
+ ArchiveObject* archive = NULL;
+
+ if (!PyArg_ParseTuple(args, "O!", &ArchiveType, &archive))
+ return NULL;
+
+ // Add package
+ PakfirePackage pkg = pakfire_repo_add_archive(self->repo, archive->archive);
+ assert(pkg);
+
+ // Create Python object
+ PyObject* obj = new_package(&PackageType, pkg);
+ pakfire_package_unref(pkg);
+
+ return obj;
+}
+
static PyObject* Repo_cache_age(RepoObject* self, PyObject* args) {
const char* path = NULL;
METH_VARARGS,
NULL
},
+ {
+ "add_archive",
+ (PyCFunction)Repo_add_archive,
+ METH_VARARGS,
+ NULL
+ },
{ NULL }
};
#include <pakfire/i18n.h>
#include <pakfire/key.h>
#include <pakfire/logging.h>
+#include <pakfire/package.h>
#include <pakfire/pakfire.h>
#include <pakfire/parser.h>
#include <pakfire/private.h>
return pakfire_archive_walk(archive, pakfire_archive_read_metadata_entry);
}
+PAKFIRE_EXPORT char* pakfire_archive_get(PakfireArchive archive, const char* key) {
+ return pakfire_parser_get(archive->parser, key);
+}
+
static int archive_copy_data(struct archive* in, struct archive* out) {
int r;
const void* buff;
return NULL;
}
+
+/*
+ Copy all metadata from this archive to the package object
+*/
+PAKFIRE_EXPORT PakfirePackage pakfire_archive_make_package(PakfireArchive archive, PakfireRepo repo) {
+ char* name = pakfire_archive_get(archive, "package.name");
+ char* arch = pakfire_archive_get(archive, "package.arch");
+
+ char* e = pakfire_archive_get(archive, "package.epoch");
+ char* v = pakfire_archive_get(archive, "package.version");
+ char* r = pakfire_archive_get(archive, "package.release");
+ char* evr = pakfire_package_join_evr(e, v, r);
+
+ PakfirePackage pkg = pakfire_package_create2(
+ archive->pakfire, repo, name, evr, arch
+ );
+
+ pakfire_free(name);
+ pakfire_free(arch);
+ pakfire_free(e);
+ pakfire_free(v);
+ pakfire_free(r);
+ pakfire_free(evr);
+
+#ifdef ENABLE_DEBUG
+ char* nevra = pakfire_package_get_nevra(pkg);
+ DEBUG(archive->pakfire, "Created package %s (%p) from archive %p\n",
+ nevra, pkg, archive);
+ pakfire_free(nevra);
+#endif
+
+ // Set UUID
+ char* uuid = pakfire_archive_get(archive, "package.uuid");
+ if (uuid) {
+ pakfire_package_set_uuid(pkg, uuid);
+ pakfire_free(uuid);
+ }
+
+ // Set groups
+#warning broken
+#if 0
+ char* groups = pakfire_archive_get(archive, "package.groups");
+ if (groups) {
+ pakfire_package_set_groups(pkg, groups);
+ pakfire_free(groups);
+ }
+#endif
+
+ // Set maintainer
+ char* maintainer = pakfire_archive_get(archive, "package.maintainer");
+ if (maintainer) {
+ pakfire_package_set_maintainer(pkg, maintainer);
+ pakfire_free(maintainer);
+ }
+
+ // Set URL
+ char* url = pakfire_archive_get(archive, "package.url");
+ if (url) {
+ pakfire_package_set_url(pkg, url);
+ pakfire_free(url);
+ }
+
+ // Set license
+ char* license = pakfire_archive_get(archive, "package.license");
+ if (license) {
+ pakfire_package_set_license(pkg, license);
+ pakfire_free(license);
+ }
+
+ // Set summary
+ char* summary = pakfire_archive_get(archive, "package.summary");
+ if (summary) {
+ pakfire_package_set_summary(pkg, summary);
+ pakfire_free(summary);
+ }
+
+ // Set description
+ char* description = pakfire_archive_get(archive, "package.description");
+ if (description) {
+ pakfire_package_set_description(pkg, description);
+ pakfire_free(description);
+ }
+
+ // XXX Get package size
+
+ // Get install size
+ char* size = pakfire_archive_get(archive, "package.size");
+ if (size) {
+ size_t s = pakfire_string_to_size(size);
+ pakfire_free(size);
+
+ pakfire_package_set_installsize(pkg, s);
+ }
+
+ // XXX more data to follow
+
+ return pkg;
+}
PakfireArchive pakfire_archive_ref(PakfireArchive archive);
PakfireArchive pakfire_archive_unref(PakfireArchive archive);
+char* pakfire_archive_get(PakfireArchive archive, const char* key);
+
PakfireArchive pakfire_archive_open(Pakfire pakfire, const char* path);
int pakfire_archive_read(PakfireArchive archive, const char* filename,
void pakfire_archive_signature_unref(PakfireArchiveSignature signature);
const char* pakfire_archive_signature_get_data(PakfireArchiveSignature signature);
+PakfirePackage pakfire_archive_make_package(PakfireArchive archive, PakfireRepo repo);
+
#define PAKFIRE_ARCHIVE_FN_CHECKSUMS "chksums"
#define PAKFIRE_ARCHIVE_FN_FILELIST "filelist"
#define PAKFIRE_ARCHIVE_FN_FORMAT "pakfire-format"
void pakfire_package_set_name(PakfirePackage pkg, const char* name);
const char* pakfire_package_get_evr(PakfirePackage pkg);
void pakfire_package_set_evr(PakfirePackage pkg, const char* evr);
+char* pakfire_package_join_evr(const char* e, const char* v, const char* r);
unsigned long pakfire_package_get_epoch(PakfirePackage pkg);
const char* pakfire_package_get_version(PakfirePackage pkg);
const char* pakfire_package_get_release(PakfirePackage pkg);
int pakfire_repo_write_solv(PakfireRepo repo, const char* filename, int flags);
int pakfire_repo_write_solv_fp(PakfireRepo repo, FILE *f, int flags);
+PakfirePackage pakfire_repo_add_archive(PakfireRepo repo, PakfireArchive archive);
+
// Cache
int pakfire_repo_clean(PakfireRepo repo);
int pakfire_read_file_into_buffer(FILE* f, char** buffer, size_t* len);
+size_t pakfire_string_to_size(const char* s);
+
#endif /* PAKFIRE_UTIL_H */
pakfire_package_id;
pakfire_package_is_installed;
pakfire_package_is_in_group;
+ pakfire_package_join_evr;
pakfire_package_ref;
pakfire_package_set_arch;
pakfire_package_set_buildhost;
pakfire_problem_unref;
# repo
+ pakfire_repo_add_archive;
pakfire_repo_cache_access;
pakfire_repo_cache_age;
pakfire_repo_cache_get_path;
pakfire_get_errno;
pakfire_path_join;
pakfire_read_file_into_buffer;
+ pakfire_string_to_size;
local:
*;
s->evr = pool_str2id(pool, evr, 1);
}
+PAKFIRE_EXPORT char* pakfire_package_join_evr(const char* e, const char* v, const char* r) {
+ size_t l = strlen(v) + strlen(r) + 2;
+
+ // Do not include epoch when it is zero
+ if (strncmp(e, "0", strlen("0")) == 0) {
+ e = NULL;
+ } else {
+ l += strlen(e);
+ }
+
+ char* buffer = pakfire_malloc(l + 1);
+ if (e)
+ snprintf(buffer, l + 1, "%s:%s.%s", e, v, r);
+ else
+ snprintf(buffer, l + 1, "%s.%s", v, r);
+
+ return buffer;
+}
+
static void split_evr(Pool* pool, const char* evr_c, char** epoch, char** version, char** release) {
char *e, *v, *r;
#include <lzma.h>
+#include <pakfire/archive.h>
#include <pakfire/constants.h>
#include <pakfire/errno.h>
#include <pakfire/logging.h>
return pakfire_package_create(repo->pakfire, id);
}
+PAKFIRE_EXPORT PakfirePackage pakfire_repo_add_archive(PakfireRepo repo, PakfireArchive archive) {
+ return pakfire_archive_make_package(archive, repo);
+}
+
// Cache
static char* pakfire_repo_get_cache_prefix(PakfireRepo repo) {
return 0;
}
+
+PAKFIRE_EXPORT size_t pakfire_string_to_size(const char* s) {
+ size_t size;
+
+ int r = sscanf(s, "%zu", &size);
+ if (r == 1)
+ return size;
+
+ return 0;
+}
return request.solve(**kwargs)
- def info(self, patterns):
+ def info(self, args):
pkgs = []
- # For all patterns we run a single search which returns us a bunch
- # of solvables which are transformed into Package objects.
- for pattern in patterns:
- if os.path.exists(pattern) and not os.path.isdir(pattern):
- pkg = packages.open(self.pakfire, self.pakfire.repos.dummy, pattern)
- if pkg:
+ with _pakfire.Repo(self.pakfire, "tmp", clean=True) as r:
+ for arg in args:
+ if os.path.exists(arg) and not os.path.isdir(arg):
+ archive = _pakfire.Archive(self.pakfire, arg)
+
+ # Add the archive to the repository
+ pkg = r.add_archive(archive)
pkgs.append(pkg)
- else:
- pkgs += self.pakfire.whatprovides(pattern, name_only=True)
+ else:
+ pkgs += self.pakfire.whatprovides(arg, name_only=True)
return sorted(pkgs)
with self.pakfire(ns) as p:
for pkg in p.info(ns.package):
s = pkg.dump(long=ns.verbose)
- print(s)
+ self.ui.message(s)
def handle_search(self, ns):
with self.pakfire(ns) as p: