diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0926e14 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +SOURCES/libcomps-0.1.16.tar.gz diff --git a/.libcomps.metadata b/.libcomps.metadata new file mode 100644 index 0000000..0d83160 --- /dev/null +++ b/.libcomps.metadata @@ -0,0 +1 @@ +2837109aca4e610c57e35e43c7cbb0e296cfdaa9 SOURCES/libcomps-0.1.16.tar.gz diff --git a/SOURCES/0001-Fix-several-covscan-warnings.patch b/SOURCES/0001-Fix-several-covscan-warnings.patch new file mode 100644 index 0000000..6c46773 --- /dev/null +++ b/SOURCES/0001-Fix-several-covscan-warnings.patch @@ -0,0 +1,388 @@ +From 879e67e5f6fa01f5ae745c9287e95f74541d32ad Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= +Date: Mon, 19 Jul 2021 14:53:04 +0200 +Subject: [PATCH 1/3] Fix several covscan warnings + +- don't reuse `tmp` variable across the entire function +- don't reuse `it` variable across the entire function +- check whether malloc was successful +- do not copy strings unnecessarily +- remove couple of macros which were confusing covscans and are too + verbose +- add missing return value checks +--- + libcomps/src/comps_doc.c | 7 +++---- + libcomps/src/comps_doccategory.c | 9 +++++++-- + libcomps/src/comps_docenv.c | 10 ++++++++-- + libcomps/src/comps_docgroup.c | 9 +++++++-- + libcomps/src/comps_parse.c | 12 ++++-------- + libcomps/src/comps_set.c | 18 ++++++++++-------- + libcomps/src/python/src/pycomps.c | 5 ++--- + libcomps/src/python/src/pycomps_sequence.c | 13 +++++++++++++ + 8 files changed, 54 insertions(+), 29 deletions(-) + +diff --git a/libcomps/src/comps_doc.c b/libcomps/src/comps_doc.c +index 9e6005b..c5e65cd 100644 +--- a/libcomps/src/comps_doc.c ++++ b/libcomps/src/comps_doc.c +@@ -644,7 +644,6 @@ static signed char comps_doc_xml(COMPS_Doc *doc, xmlTextWriterPtr writer, + COMPS_ObjMDict *mdict; + COMPS_HSList *hslist; + COMPS_HSListItem *hsit; +- char *tmp; + int retc; + signed char ret = 0, tmpret; + +@@ -709,7 +708,7 @@ static signed char comps_doc_xml(COMPS_Doc *doc, xmlTextWriterPtr writer, + xmlTextWriterWriteAttribute(writer, BAD_CAST "name", + (xmlChar*) ((COMPS_ObjRTreePair*)hsit->data)->key); + +- tmp = comps_object_tostr(((COMPS_ObjRTreePair*)hsit->data)->data); ++ char *tmp = comps_object_tostr(((COMPS_ObjRTreePair*)hsit->data)->data); + xmlTextWriterWriteAttribute(writer, BAD_CAST "install", BAD_CAST tmp); + free(tmp); + +@@ -749,7 +748,7 @@ static signed char comps_doc_xml(COMPS_Doc *doc, xmlTextWriterPtr writer, + xmlTextWriterWriteAttribute(writer, BAD_CAST "name", + (xmlChar*) ((COMPS_ObjRTreePair*)hsit->data)->key); + +- tmp = comps_object_tostr(it->comps_obj); ++ char *tmp = comps_object_tostr(it->comps_obj); + xmlTextWriterWriteAttribute(writer, BAD_CAST "arch", BAD_CAST tmp); + free(tmp); + +@@ -789,7 +788,7 @@ static signed char comps_doc_xml(COMPS_Doc *doc, xmlTextWriterPtr writer, + xmlTextWriterWriteAttribute(writer, BAD_CAST "requires", + (xmlChar*) ((COMPS_ObjRTreePair*)hsit->data)->key); + +- tmp = comps_object_tostr(it->comps_obj); ++ char *tmp = comps_object_tostr(it->comps_obj); + xmlTextWriterWriteAttribute(writer, BAD_CAST "package", BAD_CAST tmp); + free(tmp); + +diff --git a/libcomps/src/comps_doccategory.c b/libcomps/src/comps_doccategory.c +index 9c36633..59f9772 100644 +--- a/libcomps/src/comps_doccategory.c ++++ b/libcomps/src/comps_doccategory.c +@@ -317,8 +317,13 @@ char* comps_doccategory_tostr_u(COMPS_Object* cat) { + total_len += strlen(desc_by_lang_str); + group_ids_str = comps_object_tostr((COMPS_Object*)_cat_->group_ids); + total_len += strlen(group_ids_str); +- +- ret = malloc(sizeof(char) * (total_len+2+(6*2)+strlen(head))); ++ ++ if ((ret = malloc(sizeof(char) * (total_len+2+(6*2)+strlen(head)))) == NULL) { ++ free(name_by_lang_str); ++ free(desc_by_lang_str); ++ free(group_ids_str); ++ return NULL; ++ } + ret[0] = 0; + strcat(ret, head); + for (int i=0; i<4; i++) { +diff --git a/libcomps/src/comps_docenv.c b/libcomps/src/comps_docenv.c +index 11b9b72..c93d7be 100644 +--- a/libcomps/src/comps_docenv.c ++++ b/libcomps/src/comps_docenv.c +@@ -415,8 +415,14 @@ char* comps_docenv_tostr_u(COMPS_Object* env) { + total_len += strlen(group_list_str); + option_list_str = comps_object_tostr((COMPS_Object*)_env_->option_list); + total_len += strlen(option_list_str); +- +- ret = malloc(sizeof(char) * (total_len+2+(8*2)+strlen(head))); ++ ++ if ((ret = malloc(sizeof(char) * (total_len+2+(8*2)+strlen(head)))) == NULL) { ++ free(name_by_lang_str); ++ free(desc_by_lang_str); ++ free(group_list_str); ++ free(option_list_str); ++ return NULL; ++ } + ret[0] = 0; + strcat(ret, head); + for (int i=0; i<4; i++) { +diff --git a/libcomps/src/comps_docgroup.c b/libcomps/src/comps_docgroup.c +index 6c0eb14..6f89ed6 100644 +--- a/libcomps/src/comps_docgroup.c ++++ b/libcomps/src/comps_docgroup.c +@@ -399,8 +399,13 @@ char* comps_docgroup_tostr_u(COMPS_Object* group) { + total_len += strlen(desc_by_lang_str); + group_packages_str = comps_object_tostr((COMPS_Object*)_group_->packages); + total_len += strlen(group_packages_str); +- +- ret = malloc(sizeof(char) * (total_len+2+(8*2)+strlen(head))); ++ ++ if ((ret = malloc(sizeof(char) * (total_len+2+(8*2)+strlen(head)))) == NULL) { ++ free(name_by_lang_str); ++ free(desc_by_lang_str); ++ free(group_packages_str); ++ return NULL; ++ } + ret[0] = 0; + strcat(ret, head); + for (int i=0; i<6; i++) { +diff --git a/libcomps/src/comps_parse.c b/libcomps/src/comps_parse.c +index 55dbd2f..18133a2 100644 +--- a/libcomps/src/comps_parse.c ++++ b/libcomps/src/comps_parse.c +@@ -436,19 +436,16 @@ void comps_parse_char_data_handler(void *userData, + } + + void comps_parse_check_attributes(COMPS_Parsed *parsed, COMPS_Elem* elem) { +- #define parser_line XML_GetCurrentLineNumber(parsed->parser) +- #define parser_col XML_GetCurrentColumnNumber(parsed->parser) + const COMPS_ElemInfo *info; + info = COMPS_ElemInfos[elem->type]; + int attr_count; + COMPS_HSList *keys; + char *val; +- COMPS_HSListItem *it; + + for (attr_count = 0; info->attributes[attr_count] != NULL; attr_count++); + keys = comps_dict_keys(elem->attrs); + for (int x =0; xfirst; it != NULL; it = it->next) { ++ for (COMPS_HSListItem *it = keys->first; it != NULL; it = it->next) { + if (strcmp((char*)it->data, info->attributes[x]->name) == 0) { + if (info->attributes[x]->val_check) { + val = comps_dict_get(elem->attrs, it->data); +@@ -464,12 +461,11 @@ void comps_parse_check_attributes(COMPS_Parsed *parsed, COMPS_Elem* elem) { + } + } + } +- for (it = keys->first; it != NULL; it = it->next) { ++ for (COMPS_HSListItem *it = keys->first; it != NULL; it = it->next) { + comps_log_warning_x(parsed->log, COMPS_ERR_ATTR_UNKNOWN, 4, + comps_str(it->data), comps_str(info->name), +- comps_num(parser_line), comps_num(parser_col)); ++ comps_num(XML_GetCurrentLineNumber(parsed->parser)), ++ comps_num(XML_GetCurrentColumnNumber(parsed->parser))); + } + comps_hslist_destroy(&keys); +- #undef parser_line +- #undef parser_col + } +diff --git a/libcomps/src/comps_set.c b/libcomps/src/comps_set.c +index e3eecfa..9ea048a 100644 +--- a/libcomps/src/comps_set.c ++++ b/libcomps/src/comps_set.c +@@ -113,14 +113,16 @@ char comps_set_add(COMPS_Set * set, void *item) { + } + + void* comps_set_remove(COMPS_Set *set, void *item) { +- void * ret; +- COMPS_HSListItem * it; +- for (it = set->data->first; it != NULL; it = it->next) { +- if (set->eqf(it->data, item)) { +- comps_hslist_remove(set->data, it); +- ret = it->data; +- free(it); +- return ret; ++ if (set && set->data) { ++ void * ret; ++ COMPS_HSListItem * it; ++ for (it = set->data->first; it != NULL; it = it->next) { ++ if (set->eqf(it->data, item)) { ++ comps_hslist_remove(set->data, it); ++ ret = it->data; ++ free(it); ++ return ret; ++ } + } + } + return NULL; +diff --git a/libcomps/src/python/src/pycomps.c b/libcomps/src/python/src/pycomps.c +index aa73a8e..1c1cb3b 100644 +--- a/libcomps/src/python/src/pycomps.c ++++ b/libcomps/src/python/src/pycomps.c +@@ -499,7 +499,6 @@ PyObject* PyCOMPS_filter_arches(PyObject *self, PyObject *other) { + PyCOMPS *doc; + COMPS_Doc *comps_doc; + PyObject *item; +- char *str; + char created = 0; + if ((Py_TYPE(other) != &PyCOMPS_StrSeqType) && + (Py_TYPE(other) != &PyList_Type)) { +@@ -512,9 +511,9 @@ PyObject* PyCOMPS_filter_arches(PyObject *self, PyObject *other) { + arches = COMPS_OBJECT_CREATE(COMPS_ObjList, NULL); + for (Py_ssize_t x=0; x < PyList_Size(other); x++) { + item = PyList_GetItem(other, x); ++ char *str; + __pycomps_arg_to_char(item, &str); +- comps_objlist_append_x(arches, (COMPS_Object*)comps_str(str)); +- free(str); ++ comps_objlist_append_x(arches, (COMPS_Object*)comps_str_x(str)); + } + } else { + arches = ((PyCOMPS_Sequence*)other)->list; +diff --git a/libcomps/src/python/src/pycomps_sequence.c b/libcomps/src/python/src/pycomps_sequence.c +index acd2e71..4f5f886 100644 +--- a/libcomps/src/python/src/pycomps_sequence.c ++++ b/libcomps/src/python/src/pycomps_sequence.c +@@ -307,12 +307,14 @@ int list_set_slice(PyObject *self, PyObject *key, PyObject *val) { + n = _seq_->list->len; + uret = PySlice_GetIndicesEx((PyObject*)key, n, + &istart, &istop, &istep, &ilen); ++ if (uret) return -1; + if (ilen == 0) { + uret = PySlice_GetIndicesEx((PyObject*)key, n+istart, + &istart, &istop, &istep, &ilen); + } + if (uret) return -1; + if (val) { ++ // set val for list items indexed by given slice + if (Py_TYPE(self) != Py_TYPE(val)) { + PyErr_SetString(PyExc_TypeError, "different object class"); + return -1; +@@ -340,6 +342,11 @@ int list_set_slice(PyObject *self, PyObject *key, PyObject *val) { + for (i=0 ; inext, i++); + if (istep != 1) { + while (clen != ilen) { ++ if (!it) { ++ PyErr_SetString(PyExc_ValueError, ++ "failed to index list using the given slice"); ++ return -1; ++ } + COMPS_OBJECT_DESTROY(it->comps_obj); + it->comps_obj = comps_object_incref(it2->comps_obj); + clen += 1; +@@ -372,10 +379,16 @@ int list_set_slice(PyObject *self, PyObject *key, PyObject *val) { + } + return 0; + } else { ++ // if val is NULL we want to delete list items indexed by given slice + clen = 0; + it = ((PyCOMPS_Sequence*)self)->list->first; + for (i=0 ; inext, i++); + while (clen != ilen) { ++ if (!it) { ++ PyErr_SetString(PyExc_ValueError, ++ "failed to index list using the given slice"); ++ return -1; ++ } + if (it->comps_obj) { + COMPS_OBJECT_DESTROY(it->comps_obj); + it->comps_obj = NULL; + +From 50f3b3b80c8f21987ddfc726bcc75980e0db1b95 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= +Date: Tue, 20 Jul 2021 11:44:35 +0200 +Subject: [PATCH 2/3] Add missing undef for _seq_ macro and use it everywhere + +--- + libcomps/src/python/src/pycomps_sequence.c | 19 +++++++++---------- + 1 file changed, 9 insertions(+), 10 deletions(-) + +diff --git a/libcomps/src/python/src/pycomps_sequence.c b/libcomps/src/python/src/pycomps_sequence.c +index 4f5f886..9b42341 100644 +--- a/libcomps/src/python/src/pycomps_sequence.c ++++ b/libcomps/src/python/src/pycomps_sequence.c +@@ -352,7 +352,7 @@ int list_set_slice(PyObject *self, PyObject *key, PyObject *val) { + clen += 1; + it2 = it2->next; + for (i=0 ; inext, i++); +- if (!it) it = ((PyCOMPS_Sequence*)self)->list->first; ++ if (!it) it = _seq_->list->first; + for (; inext, i++); + } + } else { +@@ -366,14 +366,12 @@ int list_set_slice(PyObject *self, PyObject *key, PyObject *val) { + } + if (it == NULL) { + for (;it2 != NULL; it2 = it2->next) { +- comps_objlist_append(((PyCOMPS_Sequence*)self)->list, +- it2->comps_obj); ++ comps_objlist_append(_seq_->list, it2->comps_obj); + } + } + if (it != NULL) { + for (c = i; c < istop; c++) { +- comps_objlist_remove_at(((PyCOMPS_Sequence*)self)->list, +- i); ++ comps_objlist_remove_at(_seq_->list, i); + } + } + } +@@ -381,7 +379,7 @@ int list_set_slice(PyObject *self, PyObject *key, PyObject *val) { + } else { + // if val is NULL we want to delete list items indexed by given slice + clen = 0; +- it = ((PyCOMPS_Sequence*)self)->list->first; ++ it = _seq_->list->first; + for (i=0 ; inext, i++); + while (clen != ilen) { + if (!it) { +@@ -395,23 +393,24 @@ int list_set_slice(PyObject *self, PyObject *key, PyObject *val) { + } + clen+=1; + for (i=0 ; inext, i++); +- if (!it) it = ((PyCOMPS_Sequence*)self)->list->first; ++ if (!it) it = _seq_->list->first; + for (; inext, i++); + } + it2 = NULL; +- for (i=0, it = ((PyCOMPS_Sequence*)self)->list->first; ++ for (i=0, it = _seq_->list->first; + it != NULL; it2 = it, it = it->next, i++) { + if (it2 && !it2->comps_obj) { +- comps_objlist_remove_at(((PyCOMPS_Sequence*)self)->list, i); ++ comps_objlist_remove_at(_seq_->list, i); + } + } + if (it2 && !it2->comps_obj) { +- comps_objlist_remove_at(((PyCOMPS_Sequence*)self)->list, i); ++ comps_objlist_remove_at(_seq_->list, i); + } + return 0; + } + } + return 0; ++ #undef _seq_ + } + + int __PyCOMPSSeq_set(PyObject *self, PyObject *key, PyObject *val, + +From e7521d21bba6407957325a63cb9d65c07a2e0a94 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= +Date: Tue, 10 Aug 2021 08:12:28 +0200 +Subject: [PATCH 3/3] Check return value of `__pycomps_arg_to_char` and add a + test + +It fixes a crash when the conversion to char is not successful. +--- + libcomps/src/python/src/pycomps.c | 5 ++++- + libcomps/src/python/tests/__test.py | 5 +++++ + 2 files changed, 9 insertions(+), 1 deletion(-) + +diff --git a/libcomps/src/python/src/pycomps.c b/libcomps/src/python/src/pycomps.c +index 1c1cb3b..ee6f691 100644 +--- a/libcomps/src/python/src/pycomps.c ++++ b/libcomps/src/python/src/pycomps.c +@@ -512,7 +512,10 @@ PyObject* PyCOMPS_filter_arches(PyObject *self, PyObject *other) { + for (Py_ssize_t x=0; x < PyList_Size(other); x++) { + item = PyList_GetItem(other, x); + char *str; +- __pycomps_arg_to_char(item, &str); ++ if (__pycomps_arg_to_char(item, &str)) { ++ COMPS_OBJECT_DESTROY(arches); ++ return NULL; ++ } + comps_objlist_append_x(arches, (COMPS_Object*)comps_str_x(str)); + } + } else { +diff --git a/libcomps/src/python/tests/__test.py b/libcomps/src/python/tests/__test.py +index 35a41f7..4152c7d 100644 +--- a/libcomps/src/python/tests/__test.py ++++ b/libcomps/src/python/tests/__test.py +@@ -1088,6 +1088,11 @@ def test_arches(self): + comps5.fromxml_str(s) + self.assertTrue(comps == comps5) + ++ def test_arches_invalid_input(self): ++ INVALID_UTF8_CHAR = '\udcfd' ++ c = libcomps.Comps() ++ self.assertRaises(TypeError, c.arch_filter, [INVALID_UTF8_CHAR]) ++ + #@unittest.skip("") + def test_validate(self): + c = libcomps.Comps() diff --git a/SPECS/libcomps.spec b/SPECS/libcomps.spec new file mode 100644 index 0000000..eb0cc81 --- /dev/null +++ b/SPECS/libcomps.spec @@ -0,0 +1,363 @@ +%define __cmake_in_source_build 1 + +Name: libcomps +Version: 0.1.16 +Release: 4%{?dist} +Summary: Comps XML file manipulation library + +License: GPLv2+ +URL: https://github.com/rpm-software-management/libcomps +Source0: %{url}/archive/%{version}/%{name}-%{version}.tar.gz +Patch1: 0001-Fix-several-covscan-warnings.patch + +BuildRequires: gcc-c++ +BuildRequires: cmake +BuildRequires: gcc +BuildRequires: libxml2-devel +BuildRequires: check-devel +BuildRequires: expat-devel +BuildRequires: zlib-devel + +%description +Libcomps is library for structure-like manipulation with content of +comps XML files. Supports read/write XML file, structure(s) modification. + +%package devel +Summary: Development files for libcomps library +Requires: %{name}%{?_isa} = %{version}-%{release} + +%description devel +Development files for libcomps library. + +%package doc +Summary: Documentation files for libcomps library +Requires: %{name} = %{version}-%{release} +BuildArch: noarch +BuildRequires: doxygen + +%description doc +Documentation files for libcomps library. + +%package -n python-%{name}-doc +Summary: Documentation files for python bindings libcomps library +Requires: %{name} = %{version}-%{release} +BuildArch: noarch +BuildRequires: python3-sphinx + + +%description -n python-%{name}-doc +Documentation files for python bindings libcomps library. + +%package -n python3-%{name} +Summary: Python 3 bindings for libcomps library +BuildRequires: python3-devel +BuildRequires: make +%{?python_provide:%python_provide python3-%{name}} +Requires: %{name}%{?_isa} = %{version}-%{release} +Obsoletes: platform-python-%{name} < %{version}-%{release} + +%description -n python3-%{name} +Python3 bindings for libcomps library. + +%prep +%autosetup -p1 -n %{name}-%{version} + +mkdir build-py3 +mkdir build-doc + +%build +pushd build-py3 + %cmake ../libcomps/ + %make_build +popd + +pushd build-doc + %cmake ../libcomps/ + make %{?_smp_mflags} docs + make %{?_smp_mflags} pydocs +popd + +%install +pushd build-py3 + %make_install +popd + +%check +pushd build-py3 + make test + make pytest +popd + +%if %{undefined ldconfig_scriptlets} +%post -p /sbin/ldconfig +%postun -p /sbin/ldconfig +%else +%ldconfig_scriptlets +%endif + +%files +%license COPYING +%doc README.md +%{_libdir}/%{name}.so.* + +%files devel +%{_libdir}/%{name}.so +%{_libdir}/pkgconfig/%{name}.pc +%{_includedir}/%{name}/ + +%files doc +%doc build-doc/docs/libcomps-doc/html + +%files -n python-%{name}-doc +%doc build-doc/src/python/docs/html + +%files -n python3-%{name} +%{python3_sitearch}/%{name}/ +%{python3_sitearch}/%{name}-%{version}-py%{python3_version}.egg-info + +%changelog +* Mon Aug 16 2021 Pavla Kratochvilova - 0.1.16-4 +- Fix issues detected by static analyzers + +* Mon Aug 09 2021 Mohan Boddu - 0.1.16-3 +- Rebuilt for IMA sigs, glibc 2.34, aarch64 flags + Related: rhbz#1991688 + +* Tue Apr 27 2021 Pavla Kratochvilova - 0.1.16-1 +- Update to 0.1.16 +- Fix a crash when clearing COMPS_ObjRTree (RhBug:1888343) +- Fix memory leaks and resource leaks + +* Fri Apr 16 2021 Mohan Boddu - 0.1.15-7 +- Rebuilt for RHEL 9 BETA on Apr 15th 2021. Related: rhbz#1947937 + +* Tue Jan 26 2021 Fedora Release Engineering - 0.1.15-6 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild + +* Fri Aug 07 2020 Nicola Sella - 0.1.15-5 +- spec: Fix building with new cmake macros + +* Sat Aug 01 2020 Fedora Release Engineering - 0.1.15-4 +- Second attempt - Rebuilt for + https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild + +* Tue Jul 28 2020 Fedora Release Engineering - 0.1.15-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild + +* Fri May 22 2020 Miro Hrončok - 0.1.15-2 +- Rebuilt for Python 3.9 + +* Wed Apr 01 2020 Ales Matej - 0.1.15-1 +- Update to 0.1.15 +- Do not skip type=mandatory in xml output (RhBug:1771224) + +* Fri Jan 31 2020 Ales Matej - 0.1.14-4 +- Fix global header variable defined without extern for gcc-10 + +* Wed Jan 29 2020 Fedora Release Engineering - 0.1.14-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild + +* Sat Dec 14 2019 Jeff Law - 0.1.14-2 +- Fix inline vs static inline issue for gcc-10 + +* Fri Nov 29 2019 Ales Matej - 0.1.14-1 +- Update to 0.1.14 + +* Fri Nov 29 2019 Ales Matej - 0.1.12-1 +- Update to 0.1.12 + +* Thu Oct 03 2019 Miro Hrončok - 0.1.11-5 +- Rebuilt for Python 3.8.0rc1 (#1748018) + +* Thu Aug 15 2019 Miro Hrončok - 0.1.11-4 +- Rebuilt for Python 3.8 + +* Wed Jul 31 2019 Miro Hrončok - 0.1.11-3 +- Fix Python method descriptors for Python 3.8 (#1734777) + +* Thu Jul 25 2019 Fedora Release Engineering - 0.1.11-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild + +* Mon Mar 11 2019 Pavla Kratochvilova - 0.1.11-1 +- Update to 0.1.11 + +* Wed Feb 13 2019 Pavla Kratochvilova - 0.1.10-1 +- Update to 0.1.10 + +* Fri Feb 01 2019 Fedora Release Engineering - 0.1.9-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild + +* Tue Nov 27 2018 Marek Blaha - 0.1.8-15 +- Disable Python 2 bindings for Fedora >= 30 + +* Fri Jul 13 2018 Fedora Release Engineering - 0.1.8-14 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild + +* Fri Jun 15 2018 Miro Hrončok - 0.1.8-13 +- Rebuilt for Python 3.7 + +* Tue Feb 20 2018 Iryna Shcherbina - 0.1.8-12 +- Update Python 2 dependency declarations to new packaging standards + (See https://fedoraproject.org/wiki/FinalizingFedoraSwitchtoPython3) + +* Wed Feb 07 2018 Fedora Release Engineering - 0.1.8-11 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild + +* Wed Jan 31 2018 Igor Gnatenko - 0.1.8-10 +- Switch to %%ldconfig_scriptlets + +* Tue Nov 07 2017 Igor Gnatenko - 0.1.8-9 +- Use better Obsoletes for platform-python + +* Fri Nov 03 2017 Igor Gnatenko - 0.1.8-8 +- Remove platform-python subpackage + +* Fri Sep 01 2017 Igor Gnatenko - 0.1.8-7 +- Disable platform python on old releases + +* Thu Aug 10 2017 Lumír Balhar - 0.1.8-6 +- Add Platform Python subpackage (https://fedoraproject.org/wiki/Changes/Platform_Python_Stack) + +* Thu Aug 03 2017 Fedora Release Engineering - 0.1.8-5 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild + +* Wed Jul 26 2017 Fedora Release Engineering - 0.1.8-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild + +* Fri Feb 10 2017 Fedora Release Engineering - 0.1.8-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild + +* Tue Dec 13 2016 Stratakis Charalampos - 0.1.8-2 +- Rebuild for Python 3.6 + +* Thu Sep 22 2016 Igor Gnatenko - 0.1.8-1 +- Update to 0.1.8 + +* Tue Aug 09 2016 Igor Gnatenko - 0.1.7-6 +- Add %%{?system_python_abi} + +* Tue Jul 19 2016 Fedora Release Engineering - 0.1.7-5 +- https://fedoraproject.org/wiki/Changes/Automatic_Provides_for_Python_RPM_Packages + +* Tue Apr 12 2016 Igor Gnatenko - 0.1.7-4 +- Adopt to new packaging guidelines +- Use %%license macro +- Fix file ownerships + +* Thu Feb 04 2016 Fedora Release Engineering - 0.1.7-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild + +* Wed Oct 14 2015 Robert Kuska - 0.1.7-2 +- Rebuilt for Python3.5 rebuild + +* Thu Jul 02 2015 Jindrich Luza 0.1.7 +- added langpacks to union process +- comps DOCTYPE read-write-read fix +- support biarchonly attribute +- fixed rhbz#1073885 rhbz#1073890 rhbz#1073907 rhbz#1073979 +- fix rhbz#1073079 +- comps_*_match() now support fnmatching +- added libpycomps.MATCH_IGNORECASE as matching flag +- added group.packages_match +- added comps.groups_match, comps.categories_match, comps.entironments_match +- PyCOMPS_Package hash +- cmake-2.6, python-2.6, RHEL-6 compatible +- '_arch' attribute change to 'arch' +- empty 'arch' attribute will be ommited from output from now + +* Wed Jan 29 2014 Jindrich Luza 0.1.6 +- version bumped +- added libcomps.MDict.keys() +- libcomps.MDict.values() +- libcomps.MDict.items() +- libcomps.MDict.clear() +- libcomps.MDict.update() +- libcomps.MDict.copy() +- COMPS_List replaced with COMPS_HSList +- added missing basearchonly to DocGroupPackage +- python3/CMakeLists.txt fixed +- added explicit attributes support for xml options +- added arch_filter test for python +- insert method in libcomps.Sequence +- Unioning is now accomplished with replace x append policy +- Weaker package equality check (comparing only name now) +- Fixed leeks in unioning +- modified test_merge_comps test_libcomps +- dictionaries are now storing keys in alphabetical order +- comps parser redesigned +- change python/tests directory composition +- added elem attributes check in parser +- xml output '_arch' attribute support +- parser and xml output defaults options for specify defaults values +- comps object validation in python +- added validity checker before append/set object to list (python only) +- .validate() method +- added libcomps.Dict.keys +- libcomps.Dict.values +- libcomps.Dict.items +- libcomps.Dict.clear +- libcomps.Dict.update +- libcomps.Dict.copy +- added xml output options (comps.xml_str([options = {}]), comps.xml_f(options = {})) + +* Wed Oct 23 2013 Jindrich Luza 0.1.4-4 +- group.uservisible is true by default now. +- fixed comps_mobjradix parent node problem +- implemented bindings for blacklist, whiteout and langpacks +- COMPS_Logger redesigned + +* Tue Oct 08 2013 Jindrich Luza 0.1.5 +- version bump +- PyCOMPS_Sequence.__getitem__["objectid"] implemented for libcomps.GroupList, libcomps.CategoryList, libcomps.EnvList +- added missing files +- missing display_order fix for libcomps.Environment + +* Tue Oct 01 2013 Jindrich Luza 0.1.4 +- added missing files +- architectural redesign finished +- fixed #1003986 by Gustavo Luiz Duarte guidelines (but not tested on ppc) +- fixed bug #1000449 +- fixed bug #1000442 +- added GroupId.default test +- some minor unreported bugs discovered during testing fixed +- finished default attribute support in groupid object +- Comps.get_last_parse_errors and Comps.get_last_parse_log has been renamed +- as Comps.get_last_errors and Comps.get_last_log +- version bumped. Python bindings is now easier. +- added missing files + +* Tue Aug 20 2013 Jindrich Luza 0.1.3 +- finished default attribute support in groupid object +- Comps.get_last_parse_errors and Comps.get_last_parse_log has been renamed +- as Comps.get_last_errors and Comps.get_last_log +- finished default attribute support in groupid object +- Comps.get_last_parse_errors and Comps.get_last_parse_log has been renamed +- as Comps.get_last_errors and Comps.get_last_log + +* Thu Jul 18 2013 Jindrich Luza 0.1.2 +- automatic changelog system +- fixed issue #14 +- libcomps.Dict is now behave more like python dict. Implemented iter(libcomps.Dict) +- libcomps.iteritems() and libcomps.itervalues() +- remaked error reporting system. +- libcomps.Comps.fromxml_f and libcomps.Comps.fromxml_str now return +- -1, 0 or 1. 0 means parse procedure completed without any problem, +- 1 means there's some errors or warnings but not fatal. -1 indicates +- fatal error problem (some results maybe given, but probably incomplete +- and invalid) +- errors catched during parsing can be obtained by calling +- libcomps.Comps.get_last_parse_errors +- all log is given by +- libcomps.Comps.get_last_parse_log +- prop system complete +- fixed issue 1 +- fixed issue 3 +- added support +- new prop system in progress.... +- separated doc package +- some minor fixes in CMakeFiles +- improved integrated tests + +* Tue Jun 25 2013 Jindrich Luza 0.1.1-1 +- Automatic commit of package [libcomps] release [0.1.1-1]. +