}
const int length = PySequence_Length(value);
- PakfireRelationList relationlist = pakfire_relationlist_create(pakfire);
+ PakfireRelationList relationlist;
+
+ int r = pakfire_relationlist_create(&relationlist, pakfire);
+ if (r)
+ return NULL;
for (int i = 0; i < length; i++) {
PyObject* item = PySequence_GetItem(value, i);
}
// Relations
-
PakfireRelationList l;
- char* prerequires = pakfire_archive_get(archive, "dependencies.prerequires");
- if (prerequires) {
- l = pakfire_relationlist_create_from_string(archive->pakfire, prerequires);
- pakfire_package_set_prerequires(pkg, l);
- pakfire_relationlist_unref(l);
- pakfire_free(prerequires);
- }
-
- char* requires = pakfire_archive_get(archive, "dependencies.requires");
- if (requires) {
- l = pakfire_relationlist_create_from_string(archive->pakfire, requires);
- pakfire_package_set_requires(pkg, l);
- pakfire_relationlist_unref(l);
- pakfire_free(requires);
- }
+ const struct __relation {
+ const char* type;
+ void (*func)(PakfirePackage, PakfireRelationList);
+ } relations[] = {
+ { "dependencies.provides", pakfire_package_set_provides },
+ { "dependencies.prerequires", pakfire_package_set_prerequires },
+ { "dependencies.requires", pakfire_package_set_requires },
+ { "dependencies.conflicts", pakfire_package_set_conflicts },
+ { "dependencies.obsoletes", pakfire_package_set_obsoletes },
+ { "dependencies.recommends", pakfire_package_set_recommends },
+ { "dependencies.suggests", pakfire_package_set_suggests },
+ { NULL, NULL },
+ };
+
+ for (const struct __relation* relation = relations; relation->type; relation++) {
+ char* relations = pakfire_archive_get(archive, relation->type);
+ if (!relations)
+ continue;
- char* provides = pakfire_archive_get(archive, "dependencies.provides");
- if (provides) {
- l = pakfire_relationlist_create_from_string(archive->pakfire, provides);
- pakfire_package_set_provides(pkg, l);
- pakfire_relationlist_unref(l);
- pakfire_free(provides);
- }
+ // Parse all relations
+ int r = pakfire_relationlist_create_from_string(&l, archive->pakfire, relations);
+ if (r)
+ goto ERROR;
- char* obsoletes = pakfire_archive_get(archive, "dependencies.obsoletes");
- if (obsoletes) {
- l = pakfire_relationlist_create_from_string(archive->pakfire, obsoletes);
- pakfire_package_set_obsoletes(pkg, l);
- pakfire_relationlist_unref(l);
- pakfire_free(obsoletes);
- }
+ free(relations);
- char* recommends = pakfire_archive_get(archive, "dependencies.recommends");
- if (recommends) {
- l = pakfire_relationlist_create_from_string(archive->pakfire, recommends);
- pakfire_package_set_recommends(pkg, l);
- pakfire_relationlist_unref(l);
- pakfire_free(recommends);
- }
+ // Assign to package
+ relation->func(pkg, l);
- char* suggests = pakfire_archive_get(archive, "dependencies.suggests");
- if (suggests) {
- l = pakfire_relationlist_create_from_string(archive->pakfire, suggests);
- pakfire_package_set_suggests(pkg, l);
pakfire_relationlist_unref(l);
- pakfire_free(suggests);
}
// Import filelist
pakfire_package_set_filelist(pkg, archive->filelist);
return pkg;
+
+ERROR:
+ return NULL;
}
struct pakfire_scriptlet* pakfire_archive_get_scriptlet(
#include <pakfire/types.h>
-PakfireRelationList pakfire_relationlist_create(Pakfire pakfire);
-PakfireRelationList pakfire_relationlist_create_from_string(Pakfire pakfire, const char* s);
+int pakfire_relationlist_create(PakfireRelationList* list, Pakfire pakfire);
+int pakfire_relationlist_create_from_string(PakfireRelationList* list,
+ Pakfire pakfire, const char* s);
PakfireRelationList pakfire_relationlist_ref(PakfireRelationList relationlist);
PakfireRelationList pakfire_relationlist_unref(PakfireRelationList relationlist);
#ifdef PAKFIRE_PRIVATE
-PakfireRelationList pakfire_relationlist_from_queue(Pakfire pakfire, Queue q);
+int pakfire_relationlist_from_queue(PakfireRelationList* list, Pakfire pakfire, Queue q);
void pakfire_relationlist_clone_to_queue(PakfireRelationList relationlist, Queue* q);
#endif
Solvable* s = get_solvable(pkg);
solvable_lookup_idarray(s, type, &q);
- PakfireRelationList relationlist = pakfire_relationlist_from_queue(pkg->pakfire, q);
+ PakfireRelationList list;
+ int r = pakfire_relationlist_from_queue(&list, pkg->pakfire, q);
+
queue_free(&q);
- return relationlist;
+ if (r)
+ return NULL;
+
+ return list;
}
static void pakfire_package_set_relationlist(PakfirePackage pkg, Id type, PakfireRelationList relationlist) {
# #
#############################################################################*/
+#include <errno.h>
+
#include <solv/pooltypes.h>
#include <solv/queue.h>
int nrefs;
};
-PAKFIRE_EXPORT PakfireRelationList pakfire_relationlist_create(Pakfire pakfire) {
- PakfireRelationList relationlist = pakfire_calloc(1, sizeof(*relationlist));
- if (relationlist) {
- DEBUG(pakfire, "Allocated RelationList at %p\n", relationlist);
- relationlist->nrefs = 1;
+PAKFIRE_EXPORT int pakfire_relationlist_create(PakfireRelationList* list, Pakfire pakfire) {
+ PakfireRelationList l = pakfire_calloc(1, sizeof(*l));
+ if (!l)
+ return ENOMEM;
- relationlist->pakfire = pakfire_ref(pakfire);
- queue_init(&relationlist->queue);
- }
+ DEBUG(pakfire, "Allocated RelationList at %p\n", l);
+ l->pakfire = pakfire_ref(pakfire);
+ l->nrefs = 1;
- return relationlist;
+ queue_init(&l->queue);
+
+ *list = l;
+ return 0;
}
-PAKFIRE_EXPORT PakfireRelationList pakfire_relationlist_create_from_string(Pakfire pakfire, const char* s) {
- PakfireRelationList relationlist = pakfire_relationlist_create(pakfire);
- if (!relationlist)
- return NULL;
+PAKFIRE_EXPORT int pakfire_relationlist_create_from_string(PakfireRelationList* list, Pakfire pakfire, const char* s) {
+ int r = pakfire_relationlist_create(list, pakfire);
+ if (r)
+ return r;
// Split input by newline
- char** list = pakfire_split_string(s, '\n');
- if (!list)
- return relationlist;
+ char** elements = pakfire_split_string(s, '\n');
+ if (!elements)
+ return 1;
- char** item = list;
- while (*item) {
- PakfireRelation rel = pakfire_relation_create_from_string(relationlist->pakfire, *item);
+ for (char** element = elements; *element; element++) {
+ PakfireRelation rel = pakfire_relation_create_from_string(pakfire, *element);
if (rel) {
- pakfire_relationlist_add(relationlist, rel);
+ pakfire_relationlist_add(*list, rel);
pakfire_relation_unref(rel);
}
- //pakfire_free(*item);
- item++;
+ pakfire_free(*element);
}
- pakfire_free(list);
+ pakfire_free(elements);
- return relationlist;
+ return 0;
}
PAKFIRE_EXPORT PakfireRelationList pakfire_relationlist_ref(PakfireRelationList relationlist) {
return relationlist->queue.count;
}
-PAKFIRE_EXPORT PakfireRelationList pakfire_relationlist_from_queue(Pakfire pakfire, Queue q) {
- PakfireRelationList relationlist = pakfire_relationlist_create(pakfire);
- if (relationlist) {
- // Release old queue
- queue_free(&relationlist->queue);
+PAKFIRE_EXPORT int pakfire_relationlist_from_queue(PakfireRelationList* list, Pakfire pakfire, Queue q) {
+ int r = pakfire_relationlist_create(list, pakfire);
+ if (r)
+ return r;
- // Copy the queue
- queue_init_clone(&relationlist->queue, &q);
- }
+ // Release old queue
+ queue_free(&(*list)->queue);
- return relationlist;
+ // Copy the queue
+ queue_init_clone(&(*list)->queue, &q);
+
+ return 0;
}
PAKFIRE_EXPORT PakfireRelation pakfire_relationlist_get_clone(PakfireRelationList relationlist, int index) {