]> git.ipfire.org Git - pakfire.git/commitdiff
packages: Handle dependencies as strings
authorMichael Tremer <michael.tremer@ipfire.org>
Thu, 29 Apr 2021 22:33:06 +0000 (22:33 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Thu, 29 Apr 2021 22:33:06 +0000 (22:33 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/_pakfire/package.c
src/libpakfire/archive.c
src/libpakfire/db.c
src/libpakfire/include/pakfire/package.h
src/libpakfire/package.c
src/libpakfire/packager.c

index 9c9b6431c87ea6ea05bbb86b2c6d7965f6fd1955..b378e84ba47a525de4c3dc18c7f0266df15d5b93 100644 (file)
@@ -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
        },
index bc43df60766a8a47c682994196f3132dcb212a1f..9825e864f51cc98b9944296e9831a6ffcfb1c108 100644 (file)
@@ -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
index c9db0c509de37f1442f642cb017bd8c7f9ff6bba..27cde2ba94be4bc07f3020c03abf52fc720b029d 100644 (file)
@@ -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;
+                       }
                }
        }
 
index d4939cc44d2e6c4d755647da776b708900af3666..2457086f52c1579b24f6fefc3b4f0b2052fd8aea 100644 (file)
@@ -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 */
index fd370d464b1d94872e3e9cba41291b75a9dd6bde..d8d1bc53b823a2b1279282a4a5f2f05ac5ecc890 100644 (file)
@@ -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);
                        }
                }
        }
index 506ffbee4bf1f0887dcc995b4733f44be0ed136c..634f8e3b3489c29eaaa889b9b6695a3fd3f6d4a9 100644 (file)
@@ -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