}
static PyObject* Package_get_groups(PackageObject* self) {
- char** groups = pakfire_package_get_groups(self->package);
+ const char* s = pakfire_package_get_groups(self->package);
PyObject* list = PyList_New(0);
+
+ char** groups = pakfire_split_string(s, ',');
char* group;
while ((group = *groups++) != NULL) {
}
pakfire_free(groups);
- Py_INCREF(list);
+
return list;
}
static int Package_set_groups(PackageObject* self, PyObject* value) {
- if (!PySequence_Check(value)) {
- PyErr_SetString(PyExc_AttributeError, "Expected a sequence.");
- return -1;
- }
-
- const int length = PySequence_Length(value);
- const char* groups[length + 1];
-
- for (int i = 0; i < length; i++) {
- PyObject* item = PySequence_GetItem(value, i);
- groups[i] = PyUnicode_AsUTF8(item);
-
- Py_DECREF(item);
- }
- groups[length] = NULL;
+ const char* groups = PyUnicode_AsUTF8(value);
- pakfire_package_set_groups(self->package, groups);
+ if (groups)
+ pakfire_package_set_groups(self->package, groups);
return 0;
}
void pakfire_package_set_license(PakfirePackage pkg, const char* license);
const char* pakfire_package_get_url(PakfirePackage pkg);
void pakfire_package_set_url(PakfirePackage pkg, const char* url);
-char** pakfire_package_get_groups(PakfirePackage pkg);
-void pakfire_package_set_groups(PakfirePackage pkg, const char** grouplist);
-int pakfire_package_is_in_group(PakfirePackage pkg, const char* group);
+const char* pakfire_package_get_groups(PakfirePackage pkg);
+void pakfire_package_set_groups(PakfirePackage pkg, const char* groups);
const char* pakfire_package_get_vendor(PakfirePackage pkg);
void pakfire_package_set_vendor(PakfirePackage pkg, const char* vendor);
const char* pakfire_package_get_maintainer(PakfirePackage pkg);
if (!value)
value = "";
- solvable_set_str(s, key, value);
+ solvable_set_poolstr(s, key, value);
+}
+
+static void pakfire_package_add_string_array(PakfirePackage pkg, int key, const char* value) {
+ Solvable* s = get_solvable(pkg);
+
+ if (!value)
+ return;
+
+ solvable_add_poolstr_array(s, key, value);
}
PAKFIRE_EXPORT const char* pakfire_package_get_uuid(PakfirePackage pkg) {
pakfire_package_set_string(pkg, SOLVABLE_URL, url);
}
-PAKFIRE_EXPORT char** pakfire_package_get_groups(PakfirePackage pkg) {
- const char* groups = pakfire_package_get_string(pkg, SOLVABLE_GROUP);
-
- // Return nothing when the string is empty
- if (!groups)
- return NULL;
-
- // Copy string to stack and count spaces
- char buffer[strlen(groups) + 2];
-
- size_t count = 1;
- for (unsigned int i = 0; i < strlen(groups) + 1; i++) {
- buffer[i] = groups[i];
-
- if (groups[i] == ' ') {
- buffer[i] = '\0';
- count++;
- }
- }
-
- // Allocate an array of sufficient size
- char** grouplist = pakfire_malloc(sizeof(*grouplist) * (count + 1));
-
- // Copy strings to heap one by one
- unsigned int i = 0;
- char* p = buffer;
- while (*p) {
- grouplist[i++] = pakfire_strdup(p);
-
- // Move pointer to the next string
- p += strlen(p) + 1;
- }
-
- // Terminate array
- grouplist[count] = NULL;
-
- return grouplist;
+PAKFIRE_EXPORT const char* pakfire_package_get_groups(PakfirePackage pkg) {
+ return pakfire_package_get_string(pkg, SOLVABLE_GROUP);
}
-static char* pakfire_package_make_group_string(const char** grouplist) {
- char* s = NULL;
-
- while (grouplist && *grouplist) {
- if (s)
- asprintf(&s, "%s %s", s, *grouplist);
- else
- asprintf(&s, "%s", *grouplist);
+PAKFIRE_EXPORT void pakfire_package_set_groups(PakfirePackage pkg, const char* groups) {
+ char** list = pakfire_split_string(groups, ' ');
- // Move pointer forward
- grouplist++;
+ while (list && *list) {
+ pakfire_package_add_string_array(pkg, SOLVABLE_GROUP, *list);
+ list++;
}
-
- return s;
-}
-
-PAKFIRE_EXPORT void pakfire_package_set_groups(PakfirePackage pkg, const char** grouplist) {
- char* s = pakfire_package_make_group_string(grouplist);
-
- pakfire_package_set_string(pkg, SOLVABLE_GROUP, s);
- pakfire_free(s);
-}
-
-PAKFIRE_EXPORT int pakfire_package_is_in_group(PakfirePackage pkg, const char* group) {
- char** grouplist = pakfire_package_get_groups(pkg);
- if (!grouplist)
- return -1;
-
- int ret = 1;
-
- // Walk through all groups
- while (*grouplist) {
- // Check if the group name matches
- if (strcmp(*grouplist, group) == 0) {
- ret = 0;
- }
-
- // Free the element in the group list
- pakfire_free(*grouplist);
- grouplist++;
- }
-
- pakfire_free(grouplist);
-
- return ret;
}
PAKFIRE_EXPORT const char* pakfire_package_get_vendor(PakfirePackage pkg) {
pakfire_package_dump_add_lines(&string, _("Description"), description);
// Groups
- char** groups = pakfire_package_get_groups(pkg);
+ const char* groups = pakfire_package_get_groups(pkg);
if (groups) {
- char* s = pakfire_package_make_group_string((const char**)groups);
-
- if (s) {
- pakfire_package_dump_add_lines(&string, _("Groups"), s);
- pakfire_free(s);
- }
+ pakfire_package_dump_add_lines(&string, _("Groups"), groups);
}
// URL