From: Michael Tremer Date: Thu, 29 Apr 2021 22:33:06 +0000 (+0000) Subject: packages: Handle dependencies as strings X-Git-Tag: 0.9.28~1285^2~187 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=452d3833a5adca03c79c7a09b3d19fcf7c9d5bb2;p=pakfire.git packages: Handle dependencies as strings Signed-off-by: Michael Tremer --- diff --git a/src/_pakfire/package.c b/src/_pakfire/package.c index 9c9b6431c..b378e84ba 100644 --- a/src/_pakfire/package.c +++ b/src/_pakfire/package.c @@ -404,270 +404,109 @@ static PyObject* Package_get_path(PackageObject* self) { return PyUnicode_FromString(path); } -static PyObject* PyList_FromRelationList(PakfireRelationList relationlist) { +static PyObject* PyList_FromRelationList(char** deps) { PyObject* list = PyList_New(0); if (list == NULL) return NULL; - const size_t count = pakfire_relationlist_size(relationlist); + // Empty list? + if (!deps) + return list; - for (unsigned int i = 0; i < count; i++) { - PakfireRelation relation = pakfire_relationlist_get(relationlist, i); - PyObject* relation_obj = new_relation(&RelationType, relation); - - pakfire_relation_unref(relation); - if (relation_obj == NULL) - goto fail; - - int ret = PyList_Append(list, relation_obj); - Py_DECREF(relation_obj); + for (char** dep = deps; *dep; dep++) { + PyObject* obj = PyUnicode_FromString(*dep); + if (!obj) + break; - if (ret == -1) - goto fail; + PyList_Append(list, obj); + Py_DECREF(obj); } return list; - -fail: - Py_DECREF(list); - return NULL; } -static PakfireRelationList PyList_AsRelationList(Pakfire pakfire, PyObject* value) { - if (!PySequence_Check(value)) { - PyErr_SetString(PyExc_AttributeError, "Expected a sequence."); - return NULL; - } - - const int length = PySequence_Length(value); - 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); - - if (!PyObject_TypeCheck(item, &RelationType)) { - pakfire_relationlist_unref(relationlist); - Py_DECREF(item); - - PyErr_SetString(PyExc_AttributeError, "Expected a Relation object"); - return NULL; - } +static PyObject* Package_get_provides(PackageObject* self) { + char** deps = pakfire_package_get_provides(self->package); - RelationObject* relation = (RelationObject *)item; - pakfire_relationlist_add(relationlist, relation->relation); + PyObject* list = PyList_FromRelationList(deps); - Py_DECREF(item); + if (deps) { + for (char** dep = deps; *dep; dep++) + free(*dep); + free(deps); } - return relationlist; -} - -static PyObject* Package_get_provides(PackageObject* self) { - PakfireRelationList relationlist = pakfire_package_get_provides(self->package); - - PyObject* list = PyList_FromRelationList(relationlist); - pakfire_relationlist_unref(relationlist); - return list; } -static int Package_set_provides(PackageObject* self, PyObject* value) { - Pakfire pakfire = pakfire_package_get_pakfire(self->package); - - PakfireRelationList relationlist = PyList_AsRelationList(pakfire, value); - pakfire_unref(pakfire); - if (!relationlist) - return -1; - - pakfire_package_set_provides(self->package, relationlist); - pakfire_relationlist_unref(relationlist); - - return 0; -} - -static PyObject* Package_add_provides(PackageObject* self, PyObject* args) { - RelationObject* relation = NULL; - - if (!PyArg_ParseTuple(args, "O!", &RelationType, &relation)) - return NULL; - - pakfire_package_add_provides(self->package, relation->relation); - - Py_RETURN_NONE; -} - static PyObject* Package_get_requires(PackageObject* self) { - PakfireRelationList relationlist = pakfire_package_get_requires(self->package); - - PyObject* list = PyList_FromRelationList(relationlist); - pakfire_relationlist_unref(relationlist); - - return list; -} - -static int Package_set_requires(PackageObject* self, PyObject* value) { - Pakfire pakfire = pakfire_package_get_pakfire(self->package); - - PakfireRelationList relationlist = PyList_AsRelationList(pakfire, value); - pakfire_unref(pakfire); - if (!relationlist) - return -1; - - pakfire_package_set_requires(self->package, relationlist); - pakfire_relationlist_unref(relationlist); - - return 0; -} - -static PyObject* Package_add_requires(PackageObject* self, PyObject* args) { - RelationObject* relation = NULL; + char** deps = pakfire_package_get_requires(self->package); - if (!PyArg_ParseTuple(args, "O!", &RelationType, &relation)) - return NULL; - - pakfire_package_add_requires(self->package, relation->relation); - - Py_RETURN_NONE; -} - -static PyObject* Package_get_obsoletes(PackageObject* self) { - PakfireRelationList relationlist = pakfire_package_get_obsoletes(self->package); + PyObject* list = PyList_FromRelationList(deps); - PyObject* list = PyList_FromRelationList(relationlist); - pakfire_relationlist_unref(relationlist); + if (deps) { + for (char** dep = deps; *dep; dep++) + free(*dep); + free(deps); + } return list; } -static int Package_set_obsoletes(PackageObject* self, PyObject* value) { - Pakfire pakfire = pakfire_package_get_pakfire(self->package); - - PakfireRelationList relationlist = PyList_AsRelationList(pakfire, value); - pakfire_unref(pakfire); - if (!relationlist) - return -1; - - pakfire_package_set_obsoletes(self->package, relationlist); - pakfire_relationlist_unref(relationlist); - - return 0; -} - -static PyObject* Package_add_obsoletes(PackageObject* self, PyObject* args) { - RelationObject* relation = NULL; - - if (!PyArg_ParseTuple(args, "O!", &RelationType, &relation)) - return NULL; - - pakfire_package_add_obsoletes(self->package, relation->relation); +static PyObject* Package_get_obsoletes(PackageObject* self) { + char** deps = pakfire_package_get_obsoletes(self->package); - Py_RETURN_NONE; -} + PyObject* list = PyList_FromRelationList(deps); -static PyObject* Package_get_conflicts(PackageObject* self) { - PakfireRelationList relationlist = pakfire_package_get_conflicts(self->package); - - PyObject* list = PyList_FromRelationList(relationlist); - pakfire_relationlist_unref(relationlist); + if (deps) { + for (char** dep = deps; *dep; dep++) + free(*dep); + free(deps); + } return list; } -static int Package_set_conflicts(PackageObject* self, PyObject* value) { - Pakfire pakfire = pakfire_package_get_pakfire(self->package); - - PakfireRelationList relationlist = PyList_AsRelationList(pakfire, value); - pakfire_unref(pakfire); - if (!relationlist) - return -1; - - pakfire_package_set_conflicts(self->package, relationlist); - pakfire_relationlist_unref(relationlist); - - return 0; -} - -static PyObject* Package_add_conflicts(PackageObject* self, PyObject* args) { - RelationObject* relation = NULL; - - if (!PyArg_ParseTuple(args, "O!", &RelationType, &relation)) - return NULL; - - pakfire_package_add_conflicts(self->package, relation->relation); - - Py_RETURN_NONE; -} +static PyObject* Package_get_conflicts(PackageObject* self) { + char** deps = pakfire_package_get_conflicts(self->package); -static PyObject* Package_get_recommends(PackageObject* self) { - PakfireRelationList relationlist = pakfire_package_get_recommends(self->package); + PyObject* list = PyList_FromRelationList(deps); - PyObject* list = PyList_FromRelationList(relationlist); - pakfire_relationlist_unref(relationlist); + if (deps) { + for (char** dep = deps; *dep; dep++) + free(*dep); + free(deps); + } return list; } -static int Package_set_recommends(PackageObject* self, PyObject* value) { - Pakfire pakfire = pakfire_package_get_pakfire(self->package); - - PakfireRelationList relationlist = PyList_AsRelationList(pakfire, value); - pakfire_unref(pakfire); - if (!relationlist) - return -1; - - pakfire_package_set_recommends(self->package, relationlist); - pakfire_relationlist_unref(relationlist); - - return 0; -} - -static PyObject* Package_add_recommends(PackageObject* self, PyObject* args) { - RelationObject* relation = NULL; - - if (!PyArg_ParseTuple(args, "O!", &RelationType, &relation)) - return NULL; - - pakfire_package_add_recommends(self->package, relation->relation); - - Py_RETURN_NONE; -} +static PyObject* Package_get_recommends(PackageObject* self) { + char** deps = pakfire_package_get_recommends(self->package); -static PyObject* Package_get_suggests(PackageObject* self) { - PakfireRelationList relationlist = pakfire_package_get_suggests(self->package); + PyObject* list = PyList_FromRelationList(deps); - PyObject* list = PyList_FromRelationList(relationlist); - pakfire_relationlist_unref(relationlist); + if (deps) { + for (char** dep = deps; *dep; dep++) + free(*dep); + free(deps); + } return list; } -static int Package_set_suggests(PackageObject* self, PyObject* value) { - Pakfire pakfire = pakfire_package_get_pakfire(self->package); - - PakfireRelationList relationlist = PyList_AsRelationList(pakfire, value); - pakfire_unref(pakfire); - if (!relationlist) - return -1; - - pakfire_package_set_suggests(self->package, relationlist); - pakfire_relationlist_unref(relationlist); - - return 0; -} - -static PyObject* Package_add_suggests(PackageObject* self, PyObject* args) { - RelationObject* relation = NULL; +static PyObject* Package_get_suggests(PackageObject* self) { + char** deps = pakfire_package_get_suggests(self->package); - if (!PyArg_ParseTuple(args, "O!", &RelationType, &relation)) - return NULL; + PyObject* list = PyList_FromRelationList(deps); - pakfire_package_add_suggests(self->package, relation->relation); + if (deps) { + for (char** dep = deps; *dep; dep++) + free(*dep); + free(deps); + } - Py_RETURN_NONE; + return list; } static PyObject* Package_get_filelist(PackageObject* self, PyObject* args) { @@ -798,42 +637,6 @@ static PyObject* Package_dump(PackageObject* self, PyObject *args, PyObject* kwd } static struct PyMethodDef Package_methods[] = { - { - "add_provides", - (PyCFunction)Package_add_provides, - METH_VARARGS, - NULL - }, - { - "add_requires", - (PyCFunction)Package_add_requires, - METH_VARARGS, - NULL - }, - { - "add_conflicts", - (PyCFunction)Package_add_conflicts, - METH_VARARGS, - NULL - }, - { - "add_obsoletes", - (PyCFunction)Package_add_obsoletes, - METH_VARARGS, - NULL - }, - { - "add_recommends", - (PyCFunction)Package_add_recommends, - METH_VARARGS, - NULL - }, - { - "add_suggests", - (PyCFunction)Package_add_suggests, - METH_VARARGS, - NULL - }, { "dump", (PyCFunction)Package_dump, @@ -982,42 +785,42 @@ static struct PyGetSetDef Package_getsetters[] = { { "provides", (getter)Package_get_provides, - (setter)Package_set_provides, + NULL, NULL, NULL }, { "requires", (getter)Package_get_requires, - (setter)Package_set_requires, + NULL, NULL, NULL }, { "obsoletes", (getter)Package_get_obsoletes, - (setter)Package_set_obsoletes, + NULL, NULL, NULL }, { "conflicts", (getter)Package_get_conflicts, - (setter)Package_set_conflicts, + NULL, NULL, NULL }, { "recommends", (getter)Package_get_recommends, - (setter)Package_set_recommends, + NULL, NULL, NULL }, { "suggests", (getter)Package_get_suggests, - (setter)Package_set_suggests, + NULL, NULL, NULL }, diff --git a/src/libpakfire/archive.c b/src/libpakfire/archive.c index bc43df607..9825e864f 100644 --- a/src/libpakfire/archive.c +++ b/src/libpakfire/archive.c @@ -1501,21 +1501,20 @@ PAKFIRE_EXPORT PakfirePackage pakfire_archive_make_package(PakfireArchive archiv } // Relations - PakfireRelationList l; const struct __relation { const char* type; - void (*func)(PakfirePackage, PakfireRelationList); + void (*func)(PakfirePackage, const char* dep); } relations[] = { - { "provides", pakfire_package_set_provides }, - { "prerequires", pakfire_package_set_prerequires }, - { "requires", pakfire_package_set_requires }, - { "conflicts", pakfire_package_set_conflicts }, - { "obsoletes", pakfire_package_set_obsoletes }, - { "recommends", pakfire_package_set_recommends }, - { "suggests", pakfire_package_set_suggests }, - { "supplements", pakfire_package_set_supplements }, - { "enhances", pakfire_package_set_enhances }, + { "provides", pakfire_package_add_provides }, + { "prerequires", pakfire_package_add_prerequires }, + { "requires", pakfire_package_add_requires }, + { "conflicts", pakfire_package_add_conflicts }, + { "obsoletes", pakfire_package_add_obsoletes }, + { "recommends", pakfire_package_add_recommends }, + { "suggests", pakfire_package_add_suggests }, + { "supplements", pakfire_package_add_supplements }, + { "enhances", pakfire_package_add_enhances }, { NULL, NULL }, }; @@ -1524,17 +1523,24 @@ PAKFIRE_EXPORT PakfirePackage pakfire_archive_make_package(PakfireArchive archiv if (!relations) continue; - // Parse all relations - int r = pakfire_relationlist_create_from_string(&l, archive->pakfire, relations); - if (r) - goto ERROR; + char* p = relations; + while (*p) { + char* e = strchr(p, '\n'); - free(relations); + // Terminate the string + if (e) + *e = '\0'; - // Assign to package - relation->func(pkg, l); + // Add the dependency + relation->func(pkg, p); - pakfire_relationlist_unref(l); + // End loop when we reached the end + if (!e) + break; + + // Or continue at the next line + p = e + 1; + } } // Import filelist diff --git a/src/libpakfire/db.c b/src/libpakfire/db.c index c9db0c509..27cde2ba9 100644 --- a/src/libpakfire/db.c +++ b/src/libpakfire/db.c @@ -672,7 +672,7 @@ static int pakfire_db_add_dependencies(struct pakfire_db* db, unsigned long id, const struct __relation { const char* type; - PakfireRelationList (*func)(PakfirePackage); + char** (*func)(PakfirePackage); } relations[] = { { "provides", pakfire_package_get_provides }, { "prerequires", pakfire_package_get_prerequires }, @@ -687,28 +687,16 @@ static int pakfire_db_add_dependencies(struct pakfire_db* db, unsigned long id, }; for (const struct __relation* relation = relations; relation->type; relation++) { - PakfireRelationList list = relation->func(pkg); + char** list = relation->func(pkg); if (!list) continue; - for (unsigned int i = 0; i < pakfire_relationlist_size(list); i++) { - PakfireRelation rel = pakfire_relationlist_get(list, i); - if (!rel) - goto END; - - char* dependency = pakfire_relation_str(rel); - if (!dependency) { - pakfire_relation_unref(rel); - r = 1; - goto END; - } - + for (char** dep = list; *dep; dep++) { // Bind package ID r = sqlite3_bind_int64(stmt, 1, id); if (r) { ERROR(db->pakfire, "Could not bind id: %s\n", sqlite3_errmsg(db->handle)); - pakfire_relation_unref(rel); goto END; } @@ -717,16 +705,14 @@ static int pakfire_db_add_dependencies(struct pakfire_db* db, unsigned long id, if (r) { ERROR(db->pakfire, "Could not bind type: %s\n", sqlite3_errmsg(db->handle)); - pakfire_relation_unref(rel); goto END; } // Bind dependency - r = sqlite3_bind_text(stmt, 3, dependency, -1, NULL); + r = sqlite3_bind_text(stmt, 3, *dep, -1, NULL); if (r) { ERROR(db->pakfire, "Could not bind dependency: %s\n", sqlite3_errmsg(db->handle)); - pakfire_relation_unref(rel); goto END; } @@ -735,14 +721,13 @@ static int pakfire_db_add_dependencies(struct pakfire_db* db, unsigned long id, r = sqlite3_step(stmt); } while (r == SQLITE_BUSY); - pakfire_relation_unref(rel); - free(dependency); + free(*dep); // Reset bound values sqlite3_reset(stmt); } - pakfire_relationlist_unref(list); + free(list); } // All okay @@ -1491,31 +1476,47 @@ static int pakfire_db_load_package(struct pakfire_db* db, PakfireRepo repo, sqli const struct dependency { unsigned int field; - void (*func)(PakfirePackage pkg, PakfireRelationList list); + void (*func)(PakfirePackage pkg, const char* dep); } dependencies[] = { - { 17, pakfire_package_set_provides }, - { 18, pakfire_package_set_prerequires }, - { 10, pakfire_package_set_requires }, - { 20, pakfire_package_set_conflicts }, - { 21, pakfire_package_set_obsoletes }, - { 22, pakfire_package_set_recommends }, - { 23, pakfire_package_set_suggests }, - { 24, pakfire_package_set_supplements }, - { 25, pakfire_package_set_enhances }, + { 17, pakfire_package_add_provides }, + { 18, pakfire_package_add_prerequires }, + { 10, pakfire_package_add_requires }, + { 20, pakfire_package_add_conflicts }, + { 21, pakfire_package_add_obsoletes }, + { 22, pakfire_package_add_recommends }, + { 23, pakfire_package_add_suggests }, + { 24, pakfire_package_add_supplements }, + { 25, pakfire_package_add_enhances }, { 0, NULL }, }; for (const struct dependency* deps = dependencies; deps->field; deps++) { const char* relations = (const char*)sqlite3_column_text(stmt, deps->field); if (relations) { - PakfireRelationList list; - - r = pakfire_relationlist_create_from_string(&list, db->pakfire, relations); - if (r) + // Copy list + char* p = strdupa(relations); + if (!p) { + r = 1; goto ERROR; + } + + while (*p) { + char* e = strchr(p, '\n'); + + // Terminate the string + if (e) + *e = '\0'; - deps->func(pkg, list); - pakfire_relationlist_unref(list); + // Add the dependency + deps->func(pkg, p); + + // End loop when we reached the end + if (!e) + break; + + // Or continue at the next line + p = e + 1; + } } } diff --git a/src/libpakfire/include/pakfire/package.h b/src/libpakfire/include/pakfire/package.h index d4939cc44..2457086f5 100644 --- a/src/libpakfire/include/pakfire/package.h +++ b/src/libpakfire/include/pakfire/package.h @@ -82,30 +82,15 @@ void pakfire_package_set_build_time(PakfirePackage pkg, time_t build_time); time_t pakfire_package_get_install_time(PakfirePackage pkg); void pakfire_package_set_install_time(PakfirePackage pkg, time_t install_time); -PakfireRelationList pakfire_package_get_provides(PakfirePackage pkg); -void pakfire_package_set_provides(PakfirePackage pkg, PakfireRelationList relationlist); -void pakfire_package_add_provides(PakfirePackage pkg, PakfireRelation relation); -PakfireRelationList pakfire_package_get_prerequires(PakfirePackage pkg); -void pakfire_package_set_prerequires(PakfirePackage pkg, PakfireRelationList relationlist); -PakfireRelationList pakfire_package_get_requires(PakfirePackage pkg); -void pakfire_package_set_requires(PakfirePackage pkg, PakfireRelationList relationlist); -void pakfire_package_add_requires(PakfirePackage pkg, PakfireRelation relation); -PakfireRelationList pakfire_package_get_conflicts(PakfirePackage pkg); -void pakfire_package_set_conflicts(PakfirePackage pkg, PakfireRelationList relationlist); -void pakfire_package_add_conflicts(PakfirePackage pkg, PakfireRelation relation); -PakfireRelationList pakfire_package_get_obsoletes(PakfirePackage pkg); -void pakfire_package_set_obsoletes(PakfirePackage pkg, PakfireRelationList relationlist); -void pakfire_package_add_obsoletes(PakfirePackage pkg, PakfireRelation relation); -PakfireRelationList pakfire_package_get_recommends(PakfirePackage pkg); -void pakfire_package_set_recommends(PakfirePackage pkg, PakfireRelationList relationlist); -void pakfire_package_add_recommends(PakfirePackage pkg, PakfireRelation relation); -PakfireRelationList pakfire_package_get_suggests(PakfirePackage pkg); -void pakfire_package_set_suggests(PakfirePackage pkg, PakfireRelationList relationlist); -void pakfire_package_add_suggests(PakfirePackage pkg, PakfireRelation relation); -PakfireRelationList pakfire_package_get_supplements(PakfirePackage pkg); -void pakfire_package_set_supplements(PakfirePackage pkg, PakfireRelationList relationlist); -PakfireRelationList pakfire_package_get_enhances(PakfirePackage pkg); -void pakfire_package_set_enhances(PakfirePackage pkg, PakfireRelationList relationlist); +char** pakfire_package_get_provides(PakfirePackage pkg); +char** pakfire_package_get_prerequires(PakfirePackage pkg); +char** pakfire_package_get_requires(PakfirePackage pkg); +char** pakfire_package_get_conflicts(PakfirePackage pkg); +char** pakfire_package_get_obsoletes(PakfirePackage pkg); +char** pakfire_package_get_recommends(PakfirePackage pkg); +char** pakfire_package_get_suggests(PakfirePackage pkg); +char** pakfire_package_get_supplements(PakfirePackage pkg); +char** pakfire_package_get_enhances(PakfirePackage pkg); PakfireRepo pakfire_package_get_repo(PakfirePackage pkg); @@ -133,6 +118,16 @@ int pakfire_package_is_source(PakfirePackage pkg); char* pakfire_package_join_evr(const char* e, const char* v, const char* r); +void pakfire_package_add_provides(PakfirePackage pkg, const char* dep); +void pakfire_package_add_prerequires(PakfirePackage pkg, const char* dep); +void pakfire_package_add_requires(PakfirePackage pkg, const char* dep); +void pakfire_package_add_conflicts(PakfirePackage pkg, const char* dep); +void pakfire_package_add_obsoletes(PakfirePackage pkg, const char* dep); +void pakfire_package_add_recommends(PakfirePackage pkg, const char* dep); +void pakfire_package_add_suggests(PakfirePackage pkg, const char* dep); +void pakfire_package_add_supplements(PakfirePackage pkg, const char* dep); +void pakfire_package_add_enhances(PakfirePackage pkg, const char* dep); + #endif #endif /* PAKFIRE_PACKAGE_H */ diff --git a/src/libpakfire/package.c b/src/libpakfire/package.c index fd370d464..d8d1bc53b 100644 --- a/src/libpakfire/package.c +++ b/src/libpakfire/package.c @@ -59,9 +59,10 @@ struct _PakfirePackage { }; static void pakfire_package_add_self_provides(Pakfire pakfire, PakfirePackage pkg, const char* name, const char* evr) { - PakfireRelation relation = pakfire_relation_create(pakfire, name, PAKFIRE_EQ, evr); - pakfire_package_add_provides(pkg, relation); - pakfire_relation_unref(relation); + char buffer[1024]; + pakfire_string_format(buffer, "%s = %s", name, evr); + + pakfire_package_add_provides(pkg, buffer); } PakfirePackage pakfire_package_create_from_solvable(Pakfire pakfire, Id id) { @@ -604,23 +605,39 @@ PAKFIRE_EXPORT void pakfire_package_set_install_time(PakfirePackage pkg, time_t pakfire_package_set_num(pkg, SOLVABLE_INSTALLTIME, install_time); } -static PakfireRelationList pakfire_package_get_relationlist( +static char** pakfire_package_get_relationlist( PakfirePackage pkg, Id type, Id marker) { + char** array = NULL; + Queue q; queue_init(&q); Solvable* s = get_solvable(pkg); + + // Fetch all deps solvable_lookup_deparray(s, type, &q, marker); - PakfireRelationList list; - int r = pakfire_relationlist_from_queue(&list, pkg->pakfire, q); + // Nothing to do if the array was empty + if (!q.count) + goto ERROR; - queue_free(&q); + Pool* pool = pakfire_get_solv_pool(pkg->pakfire); - if (r) - return NULL; + // Allocate array + array = calloc(q.count + 1, sizeof(*array)); + if (!array) + goto ERROR; + + for (int i = 0; i < q.count; i++) { + const char* dep = pool_dep2str(pool, q.elements[i]); - return list; + array[i] = strdup(dep); + } + +ERROR: + queue_free(&q); + + return array; } static void pakfire_package_set_relationlist(PakfirePackage pkg, Id type, @@ -637,14 +654,19 @@ static void pakfire_package_set_relationlist(PakfirePackage pkg, Id type, #endif } -static void pakfire_package_add_relation(PakfirePackage pkg, Id type, - PakfireRelation relation, Id marker) { +static void pakfire_package_add_dep(PakfirePackage pkg, Id type, + const char* dep, Id marker) { Solvable* s = get_solvable(pkg); - solvable_add_deparray(s, type, pakfire_relation_get_id(relation), marker); + // Parse the dependency + Id id = pakfire_parse_dep(pkg->pakfire, dep); + if (!id) + return; + + solvable_add_deparray(s, type, id, marker); } -PAKFIRE_EXPORT PakfireRelationList pakfire_package_get_provides(PakfirePackage pkg) { +PAKFIRE_EXPORT char** pakfire_package_get_provides(PakfirePackage pkg) { return pakfire_package_get_relationlist(pkg, SOLVABLE_PROVIDES, -SOLVABLE_FILEMARKER); } @@ -652,11 +674,11 @@ PAKFIRE_EXPORT void pakfire_package_set_provides(PakfirePackage pkg, PakfireRela pakfire_package_set_relationlist(pkg, SOLVABLE_PROVIDES, relationlist, -SOLVABLE_FILEMARKER); } -PAKFIRE_EXPORT void pakfire_package_add_provides(PakfirePackage pkg, PakfireRelation relation) { - pakfire_package_add_relation(pkg, SOLVABLE_PROVIDES, relation, -SOLVABLE_FILEMARKER); +PAKFIRE_EXPORT void pakfire_package_add_provides(PakfirePackage pkg, const char* dep) { + pakfire_package_add_dep(pkg, SOLVABLE_PROVIDES, dep, -SOLVABLE_FILEMARKER); } -PAKFIRE_EXPORT PakfireRelationList pakfire_package_get_prerequires(PakfirePackage pkg) { +PAKFIRE_EXPORT char** pakfire_package_get_prerequires(PakfirePackage pkg) { return pakfire_package_get_relationlist(pkg, SOLVABLE_REQUIRES, SOLVABLE_PREREQMARKER); } @@ -664,7 +686,11 @@ PAKFIRE_EXPORT void pakfire_package_set_prerequires(PakfirePackage pkg, PakfireR pakfire_package_set_relationlist(pkg, SOLVABLE_REQUIRES, relationlist, SOLVABLE_PREREQMARKER); } -PAKFIRE_EXPORT PakfireRelationList pakfire_package_get_requires(PakfirePackage pkg) { +PAKFIRE_EXPORT void pakfire_package_add_prerequires(PakfirePackage pkg, const char* dep) { + pakfire_package_add_dep(pkg, SOLVABLE_REQUIRES, dep, SOLVABLE_PREREQMARKER); +} + +PAKFIRE_EXPORT char** pakfire_package_get_requires(PakfirePackage pkg) { return pakfire_package_get_relationlist(pkg, SOLVABLE_REQUIRES, -SOLVABLE_PREREQMARKER); } @@ -672,11 +698,11 @@ PAKFIRE_EXPORT void pakfire_package_set_requires(PakfirePackage pkg, PakfireRela pakfire_package_set_relationlist(pkg, SOLVABLE_REQUIRES, relationlist, -SOLVABLE_PREREQMARKER); } -PAKFIRE_EXPORT void pakfire_package_add_requires(PakfirePackage pkg, PakfireRelation relation) { - pakfire_package_add_relation(pkg, SOLVABLE_REQUIRES, relation, -SOLVABLE_PREREQMARKER); +PAKFIRE_EXPORT void pakfire_package_add_requires(PakfirePackage pkg, const char* dep) { + pakfire_package_add_dep(pkg, SOLVABLE_REQUIRES, dep, -SOLVABLE_PREREQMARKER); } -PAKFIRE_EXPORT PakfireRelationList pakfire_package_get_conflicts(PakfirePackage pkg) { +PAKFIRE_EXPORT char** pakfire_package_get_conflicts(PakfirePackage pkg) { return pakfire_package_get_relationlist(pkg, SOLVABLE_CONFLICTS, 0); } @@ -684,11 +710,11 @@ PAKFIRE_EXPORT void pakfire_package_set_conflicts(PakfirePackage pkg, PakfireRel pakfire_package_set_relationlist(pkg, SOLVABLE_CONFLICTS, relationlist, 0); } -PAKFIRE_EXPORT void pakfire_package_add_conflicts(PakfirePackage pkg, PakfireRelation relation) { - pakfire_package_add_relation(pkg, SOLVABLE_CONFLICTS, relation, 0); +PAKFIRE_EXPORT void pakfire_package_add_conflicts(PakfirePackage pkg, const char* dep) { + pakfire_package_add_dep(pkg, SOLVABLE_CONFLICTS, dep, 0); } -PAKFIRE_EXPORT PakfireRelationList pakfire_package_get_obsoletes(PakfirePackage pkg) { +PAKFIRE_EXPORT char** pakfire_package_get_obsoletes(PakfirePackage pkg) { return pakfire_package_get_relationlist(pkg, SOLVABLE_OBSOLETES, 0); } @@ -696,11 +722,11 @@ PAKFIRE_EXPORT void pakfire_package_set_obsoletes(PakfirePackage pkg, PakfireRel pakfire_package_set_relationlist(pkg, SOLVABLE_OBSOLETES, relationlist, 0); } -PAKFIRE_EXPORT void pakfire_package_add_obsoletes(PakfirePackage pkg, PakfireRelation relation) { - pakfire_package_add_relation(pkg, SOLVABLE_OBSOLETES, relation, 0); +PAKFIRE_EXPORT void pakfire_package_add_obsoletes(PakfirePackage pkg, const char* dep) { + pakfire_package_add_dep(pkg, SOLVABLE_OBSOLETES, dep, 0); } -PAKFIRE_EXPORT PakfireRelationList pakfire_package_get_recommends(PakfirePackage pkg) { +PAKFIRE_EXPORT char** pakfire_package_get_recommends(PakfirePackage pkg) { return pakfire_package_get_relationlist(pkg, SOLVABLE_RECOMMENDS, 0); } @@ -708,11 +734,11 @@ PAKFIRE_EXPORT void pakfire_package_set_recommends(PakfirePackage pkg, PakfireRe pakfire_package_set_relationlist(pkg, SOLVABLE_RECOMMENDS, relationlist, 0); } -PAKFIRE_EXPORT void pakfire_package_add_recommends(PakfirePackage pkg, PakfireRelation relation) { - pakfire_package_add_relation(pkg, SOLVABLE_RECOMMENDS, relation, 0); +PAKFIRE_EXPORT void pakfire_package_add_recommends(PakfirePackage pkg, const char* dep) { + pakfire_package_add_dep(pkg, SOLVABLE_RECOMMENDS, dep, 0); } -PAKFIRE_EXPORT PakfireRelationList pakfire_package_get_suggests(PakfirePackage pkg) { +PAKFIRE_EXPORT char** pakfire_package_get_suggests(PakfirePackage pkg) { return pakfire_package_get_relationlist(pkg, SOLVABLE_SUGGESTS, 0); } @@ -720,11 +746,11 @@ PAKFIRE_EXPORT void pakfire_package_set_suggests(PakfirePackage pkg, PakfireRela pakfire_package_set_relationlist(pkg, SOLVABLE_SUGGESTS, relationlist, 0); } -PAKFIRE_EXPORT void pakfire_package_add_suggests(PakfirePackage pkg, PakfireRelation relation) { - pakfire_package_add_relation(pkg, SOLVABLE_SUGGESTS, relation, 0); +PAKFIRE_EXPORT void pakfire_package_add_suggests(PakfirePackage pkg, const char* dep) { + pakfire_package_add_dep(pkg, SOLVABLE_SUGGESTS, dep, 0); } -PAKFIRE_EXPORT PakfireRelationList pakfire_package_get_supplements(PakfirePackage pkg) { +PAKFIRE_EXPORT char** pakfire_package_get_supplements(PakfirePackage pkg) { return pakfire_package_get_relationlist(pkg, SOLVABLE_SUPPLEMENTS, 0); } @@ -732,7 +758,11 @@ PAKFIRE_EXPORT void pakfire_package_set_supplements(PakfirePackage pkg, PakfireR pakfire_package_set_relationlist(pkg, SOLVABLE_SUPPLEMENTS, relationlist, 0); } -PAKFIRE_EXPORT PakfireRelationList pakfire_package_get_enhances(PakfirePackage pkg) { +PAKFIRE_EXPORT void pakfire_package_add_supplements(PakfirePackage pkg, const char* dep) { + pakfire_package_add_dep(pkg, SOLVABLE_SUPPLEMENTS, dep, 0); +} + +PAKFIRE_EXPORT char** pakfire_package_get_enhances(PakfirePackage pkg) { return pakfire_package_get_relationlist(pkg, SOLVABLE_ENHANCES, 0); } @@ -740,6 +770,10 @@ PAKFIRE_EXPORT void pakfire_package_set_enhances(PakfirePackage pkg, PakfireRela pakfire_package_set_relationlist(pkg, SOLVABLE_ENHANCES, relationlist, 0); } +PAKFIRE_EXPORT void pakfire_package_add_enhances(PakfirePackage pkg, const char* dep) { + pakfire_package_add_dep(pkg, SOLVABLE_ENHANCES, dep, 0); +} + PAKFIRE_EXPORT PakfireRepo pakfire_package_get_repo(PakfirePackage pkg) { if (!pkg->repo) { Solvable* s = get_solvable(pkg); @@ -776,25 +810,6 @@ static void pakfire_package_dump_add_line_date(char** str, const char* key, unsi pakfire_package_dump_add_line(str, key, val); } -static void pakfire_package_dump_add_line_relations(char** str, const char* key, PakfireRelationList deps) { - pakfire_relationlist_sort(deps); - - size_t size = pakfire_relationlist_size(deps); - for (unsigned int i = 0; i < size; i++) { - PakfireRelation relation = pakfire_relationlist_get(deps, i); - - if (relation) { - char* dep = pakfire_relation_str(relation); - pakfire_relation_unref(relation); - - if (dep) { - pakfire_package_dump_add_line(str, (i == 0) ? key : "", dep); - free(dep); - } - } - } -} - static void pakfire_package_dump_add_line_size(char** str, const char* key, unsigned long long size) { char buffer[128]; pakfire_format_size(buffer, sizeof(buffer) - 1, size); @@ -894,7 +909,7 @@ PAKFIRE_EXPORT char* pakfire_package_dump(PakfirePackage pkg, int flags) { const struct relation { const char* name; - PakfireRelationList (*get)(PakfirePackage pkg); + char** (*get)(PakfirePackage pkg); } relations[] = { { _("Provides"), pakfire_package_get_provides, }, { _("Pre-Requires"), pakfire_package_get_prerequires, }, @@ -909,10 +924,13 @@ PAKFIRE_EXPORT char* pakfire_package_dump(PakfirePackage pkg, int flags) { }; for (const struct relation* relation = relations; relation->name; relation++) { - PakfireRelationList list = relation->get(pkg); + char** list = relation->get(pkg); if (list) { - pakfire_package_dump_add_line_relations(&string, relation->name, list); - pakfire_relationlist_unref(list); + for (char** dep = list; *dep; dep++) { + pakfire_package_dump_add_line(&string, relation->name, *dep); + free(*dep); + } + free(list); } } } diff --git a/src/libpakfire/packager.c b/src/libpakfire/packager.c index 506ffbee4..634f8e3b3 100644 --- a/src/libpakfire/packager.c +++ b/src/libpakfire/packager.c @@ -443,7 +443,7 @@ static char* pakfire_package_make_metadata(struct pakfire_packager* packager) { const struct dependencies { const char* type; - PakfireRelationList (*func)(PakfirePackage pkg); + char** (*func)(PakfirePackage pkg); } dependencies[] = { { "prerequires", pakfire_package_get_prerequires }, { "requires", pakfire_package_get_requires }, @@ -458,48 +458,26 @@ static char* pakfire_package_make_metadata(struct pakfire_packager* packager) { }; for (const struct dependencies* d = dependencies; d->type; d++) { - PakfireRelationList list = d->func(pkg); + char** list = d->func(pkg); if (!list) continue; - size_t l = pakfire_relationlist_size(list); - - // Skip for empty lists - if (l == 0) { - pakfire_relationlist_unref(list); - continue; - } - // Write header r = asprintf(&buffer, "%s\t%s\n", buffer, d->type); if (r < 0) { - pakfire_relationlist_unref(list); goto ERROR; } - for (unsigned int i = 0; i < l; i++) { - PakfireRelation rel = pakfire_relationlist_get(list, i); - - char* s = pakfire_relation_str(rel); - if (s) { - r = asprintf(&buffer, "%s\t\t%s\n", buffer, s); - free(s); - if (r < 0) { - pakfire_relationlist_unref(list); - pakfire_relation_unref(rel); - goto ERROR; - } - } - - pakfire_relation_unref(rel); + for (char** dep = list; *dep; dep++) { + asprintf(&buffer, "%s\t\t%s\n", buffer, *dep); + free(*dep); } + free(list); // End block r = asprintf(&buffer, "%s\tend\n", buffer); if (r < 0) goto ERROR; - - pakfire_relationlist_unref(list); } // End dependencies block