From ea1ae0c41b95d806be278f1e3401d57991b6d594 Mon Sep 17 00:00:00 2001 From: Igor Gnatenko Date: Feb 13 2017 20:00:44 +0000 Subject: Backport patches for rel-eng Signed-off-by: Igor Gnatenko --- diff --git a/0001-hy-package-add-support-for-Requires-pre-Related-RhBu.patch b/0001-hy-package-add-support-for-Requires-pre-Related-RhBu.patch new file mode 100644 index 0000000..0d57824 --- /dev/null +++ b/0001-hy-package-add-support-for-Requires-pre-Related-RhBu.patch @@ -0,0 +1,86 @@ +From 0f7f66f5731ef04948794329f1a1ed6597015589 Mon Sep 17 00:00:00 2001 +From: Michal Luscon +Date: Mon, 14 Mar 2016 17:29:20 +0100 +Subject: [PATCH 1/3] hy-package: add support for Requires(pre) + (Related:RhBug:1303117) + +Closes: #95 + +Reviewed-by: Igor Gnatenko +--- + src/package.c | 16 +++++++++++++++- + src/package.h | 1 + + src/python/package-py.c | 2 ++ + 3 files changed, 18 insertions(+), 1 deletion(-) + +diff --git a/src/package.c b/src/package.c +index 3c47d24..1bd5fb3 100644 +--- a/src/package.c ++++ b/src/package.c +@@ -25,6 +25,7 @@ + #include + #include + #include ++#include + #include + + // hawkey +@@ -65,9 +66,16 @@ reldeps_for(HyPackage pkg, Id type) + Solvable *s = get_solvable(pkg); + HyReldepList reldeplist; + Queue q; ++ Id marker = -1; ++ Id solv_type = type; + ++ if (type == SOLVABLE_PREREQMARKER) { ++ solv_type = SOLVABLE_REQUIRES; ++ marker = 1; ++ } + queue_init(&q); +- solvable_lookup_deparray(s, type, &q, -1); ++ solvable_lookup_deparray(s, solv_type, &q, marker); ++ + reldeplist = reldeplist_from_queue(pool, q); + + queue_free(&q); +@@ -425,6 +433,12 @@ hy_package_get_requires(HyPackage pkg) + } + + HyReldepList ++hy_package_get_requires_pre(HyPackage pkg) ++{ ++ return reldeps_for(pkg, SOLVABLE_PREREQMARKER); ++} ++ ++HyReldepList + hy_package_get_suggests(HyPackage pkg) + { + return reldeps_for(pkg, SOLVABLE_SUGGESTS); +diff --git a/src/package.h b/src/package.h +index 742f0f6..43f335b 100644 +--- a/src/package.h ++++ b/src/package.h +@@ -83,6 +83,7 @@ HyReldepList hy_package_get_obsoletes(HyPackage pkg); + HyReldepList hy_package_get_provides(HyPackage pkg); + HyReldepList hy_package_get_recommends(HyPackage pkg); + HyReldepList hy_package_get_requires(HyPackage pkg); ++HyReldepList hy_package_get_requires_pre(HyPackage pkg); + HyReldepList hy_package_get_suggests(HyPackage pkg); + HyReldepList hy_package_get_supplements(HyPackage pkg); + HyStringArray hy_package_get_files(HyPackage pkg); +diff --git a/src/python/package-py.c b/src/python/package-py.c +index 7087cf9..cd41e15 100644 +--- a/src/python/package-py.c ++++ b/src/python/package-py.c +@@ -332,6 +332,8 @@ static PyGetSetDef package_getsetters[] = { + (void *)hy_package_get_recommends}, + {"requires", (getter)get_reldep, NULL, NULL, + (void *)hy_package_get_requires}, ++ {"requires_pre", (getter)get_reldep, NULL, NULL, ++ (void *)hy_package_get_requires_pre}, + {"suggests", (getter)get_reldep, NULL, NULL, + (void *)hy_package_get_suggests}, + {"supplements", (getter)get_reldep, NULL, NULL, +-- +2.11.1 + diff --git a/0002-hy-query-implemented-set-operations-union-intersecti.patch b/0002-hy-query-implemented-set-operations-union-intersecti.patch new file mode 100644 index 0000000..e5b36b1 --- /dev/null +++ b/0002-hy-query-implemented-set-operations-union-intersecti.patch @@ -0,0 +1,248 @@ +From e4fc14cf80a6613fa8a51d15d81652152e7bf2f6 Mon Sep 17 00:00:00 2001 +From: Michael Mraka +Date: Mon, 21 Mar 2016 11:55:20 +0100 +Subject: [PATCH 2/3] hy-query: implemented set operations (union, + intersection, difference) + +--- + src/python/__init__.py | 12 +++++++++ + src/python/query-py.c | 36 ++++++++++++++++++++++++++ + src/query.c | 24 ++++++++++++++++++ + src/query.h | 3 +++ + tests/python/tests/test_query.py | 27 ++++++++++++++++++++ + tests/test_query.c | 55 ++++++++++++++++++++++++++++++++++++++++ + 6 files changed, 157 insertions(+) + +diff --git a/src/python/__init__.py b/src/python/__init__.py +index d92edbc..aef959f 100644 +--- a/src/python/__init__.py ++++ b/src/python/__init__.py +@@ -334,6 +334,18 @@ class Query(_hawkey.Query): + raise NotImplementedError( + "hawkey.Query.provides is not implemented yet") + ++ def difference(self, other): ++ new_query = type(self)(query=self) ++ return super(Query, new_query).difference(other) ++ ++ def intersection(self, other): ++ new_query = type(self)(query=self) ++ return super(Query, new_query).intersection(other) ++ ++ def union(self, other): ++ new_query = type(self)(query=self) ++ return super(Query, new_query).union(other) ++ + + class Selector(_hawkey.Selector): + +diff --git a/src/python/query-py.c b/src/python/query-py.c +index 37a0bbd..c4410be 100644 +--- a/src/python/query-py.c ++++ b/src/python/query-py.c +@@ -324,6 +324,36 @@ apply(PyObject *self, PyObject *unused) + return self; + } + ++static PyObject * ++q_union(PyObject *self, PyObject *other) ++{ ++ HyQuery self_q = ((_QueryObject *) self)->query; ++ HyQuery other_q = ((_QueryObject *) other)->query; ++ hy_query_union(self_q, other_q); ++ Py_INCREF(self); ++ return self; ++} ++ ++static PyObject * ++q_intersection(PyObject *self, PyObject *other) ++{ ++ HyQuery self_q = ((_QueryObject *) self)->query; ++ HyQuery other_q = ((_QueryObject *) other)->query; ++ hy_query_intersection(self_q, other_q); ++ Py_INCREF(self); ++ return self; ++} ++ ++static PyObject * ++q_difference(PyObject *self, PyObject *other) ++{ ++ HyQuery self_q = ((_QueryObject *) self)->query; ++ HyQuery other_q = ((_QueryObject *) other)->query; ++ hy_query_difference(self_q, other_q); ++ Py_INCREF(self); ++ return self; ++} ++ + static struct PyMethodDef query_methods[] = { + {"clear", (PyCFunction)clear, METH_NOARGS, + NULL}, +@@ -333,6 +363,12 @@ static struct PyMethodDef query_methods[] = { + NULL}, + {"apply", (PyCFunction)apply, METH_NOARGS, + NULL}, ++ {"union", (PyCFunction)q_union, METH_O, ++ NULL}, ++ {"intersection", (PyCFunction)q_intersection, METH_O, ++ NULL}, ++ {"difference", (PyCFunction)q_difference, METH_O, ++ NULL}, + {NULL} /* sentinel */ + }; + +diff --git a/src/query.c b/src/query.c +index 9a320d6..becb8dd 100644 +--- a/src/query.c ++++ b/src/query.c +@@ -1274,3 +1274,27 @@ hy_query_run_set(HyQuery q) + hy_query_apply(q); + return packageset_from_bitmap(q->sack, q->result); + } ++ ++void ++hy_query_union(HyQuery q, HyQuery other) ++{ ++ hy_query_apply(q); ++ hy_query_apply(other); ++ map_or(q->result, other->result); ++} ++ ++void ++hy_query_intersection(HyQuery q, HyQuery other) ++{ ++ hy_query_apply(q); ++ hy_query_apply(other); ++ map_and(q->result, other->result); ++} ++ ++void ++hy_query_difference(HyQuery q, HyQuery other) ++{ ++ hy_query_apply(q); ++ hy_query_apply(other); ++ map_subtract(q->result, other->result); ++} +diff --git a/src/query.h b/src/query.h +index 8b8ae1d..c3ee006 100644 +--- a/src/query.h ++++ b/src/query.h +@@ -89,6 +89,9 @@ void hy_query_filter_latest(HyQuery q, int val); + HyPackageList hy_query_run(HyQuery q); + HyPackageSet hy_query_run_set(HyQuery q); + ++void hy_query_union(HyQuery q, HyQuery other); ++void hy_query_intersection(HyQuery q, HyQuery other); ++void hy_query_difference(HyQuery q, HyQuery other); + + #ifdef __cplusplus + } +diff --git a/tests/python/tests/test_query.py b/tests/python/tests/test_query.py +index 85f73b7..cb03f66 100644 +--- a/tests/python/tests/test_query.py ++++ b/tests/python/tests/test_query.py +@@ -380,3 +380,30 @@ class TestQuerySubclass(base.TestCase): + self.assertIsInstance(q, self.CustomQuery) + q = q.filter(name="pepper") + self.assertIsInstance(q, self.CustomQuery) ++ ++class TestQuerySetOperations(base.TestCase): ++ def setUp(self): ++ self.sack = base.TestSack(repo_dir=self.repo_dir) ++ self.sack.load_system_repo() ++ self.q = hawkey.Query(self.sack) ++ self.q1 = self.q.filter(version='4') ++ self.q2 = self.q.filter(name__glob='p*') ++ ++ def test_difference(self): ++ qi = self.q1.difference(self.q2) ++ difference = [p for p in self.q1 if p not in self.q2] ++ self.assertEqual(qi.run(), difference) ++ ++ def test_intersection(self): ++ qi = self.q1.intersection(self.q2) ++ intersection = self.q.filter(version='4', name__glob='p*') ++ self.assertEqual(qi.run(), intersection.run()) ++ ++ def test_union(self): ++ qu = self.q1.union(self.q2) ++ union = set(self.q1.run() + self.q2.run()) ++ self.assertEqual(set(qu), union) ++ ++ def test_zzz_queries_not_modified(self): ++ self.assertEqual(len(self.q1), 5) ++ self.assertEqual(len(self.q2), 5) +diff --git a/tests/test_query.c b/tests/test_query.c +index 48f2aef..12875f7 100644 +--- a/tests/test_query.c ++++ b/tests/test_query.c +@@ -991,6 +991,54 @@ START_TEST(test_query_apply) + } + END_TEST + ++START_TEST(test_difference) ++{ ++ HyQuery q1 = hy_query_create(test_globals.sack); ++ hy_query_filter(q1, HY_PKG_VERSION, HY_EQ, "4"); ++ HyQuery q2 = hy_query_create(test_globals.sack); ++ hy_query_filter(q2, HY_PKG_NAME, HY_GLOB, "p*"); ++ ++ hy_query_difference(q1, q2); ++ HyPackageList plist = hy_query_run(q1); ++ ck_assert_int_eq(hy_packagelist_count(plist), 2); ++ hy_packagelist_free(plist); ++ hy_query_free(q2); ++ hy_query_free(q1); ++} ++END_TEST ++ ++START_TEST(test_intersection) ++{ ++ HyQuery q1 = hy_query_create(test_globals.sack); ++ hy_query_filter(q1, HY_PKG_VERSION, HY_EQ, "4"); ++ HyQuery q2 = hy_query_create(test_globals.sack); ++ hy_query_filter(q2, HY_PKG_NAME, HY_GLOB, "p*"); ++ ++ hy_query_intersection(q1, q2); ++ HyPackageList plist = hy_query_run(q1); ++ ck_assert_int_eq(hy_packagelist_count(plist), 7); ++ hy_packagelist_free(plist); ++ hy_query_free(q2); ++ hy_query_free(q1); ++} ++END_TEST ++ ++START_TEST(test_union) ++{ ++ HyQuery q1 = hy_query_create(test_globals.sack); ++ hy_query_filter(q1, HY_PKG_VERSION, HY_EQ, "4"); ++ HyQuery q2 = hy_query_create(test_globals.sack); ++ hy_query_filter(q2, HY_PKG_NAME, HY_GLOB, "p*"); ++ ++ hy_query_union(q1, q2); ++ HyPackageList plist = hy_query_run(q1); ++ ck_assert_int_eq(hy_packagelist_count(plist), 11); ++ hy_packagelist_free(plist); ++ hy_query_free(q2); ++ hy_query_free(q1); ++} ++END_TEST ++ + Suite * + query_suite(void) + { +@@ -1075,5 +1123,12 @@ query_suite(void) + tcase_add_test(tc, test_disabled_repo); + suite_add_tcase(s, tc); + ++ tc = tcase_create("Set Operations"); ++ tcase_add_unchecked_fixture(tc, fixture_with_main, teardown); ++ tcase_add_test(tc, test_difference); ++ tcase_add_test(tc, test_intersection); ++ tcase_add_test(tc, test_union); ++ suite_add_tcase(s, tc); ++ + return s; + } +-- +2.11.1 + diff --git a/0003-implement-query.filter-pkg__neq-.-RhBug-1233770.patch b/0003-implement-query.filter-pkg__neq-.-RhBug-1233770.patch new file mode 100644 index 0000000..f610458 --- /dev/null +++ b/0003-implement-query.filter-pkg__neq-.-RhBug-1233770.patch @@ -0,0 +1,29 @@ +From fb1fb6df6ad4390feaebc432fb318828bd98ab87 Mon Sep 17 00:00:00 2001 +From: Michael Mraka +Date: Thu, 31 Mar 2016 11:00:42 +0200 +Subject: [PATCH 3/3] implement query.filter(pkg__neq=..) (RhBug: 1233770) + +this was easy one :) + +Closes: #94 +Approved by: jsilhan +--- + src/query.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/query.c b/src/query.c +index becb8dd..22a7a8e 100644 +--- a/src/query.c ++++ b/src/query.c +@@ -218,7 +218,7 @@ valid_filter_pkg(int keyname, int cmp_type) + { + if (!match_type_pkg(keyname)) + return 0; +- return cmp_type == HY_EQ; ++ return cmp_type == HY_EQ || cmp_type == HY_NEQ; + } + + static int +-- +2.11.1 + diff --git a/hawkey.spec b/hawkey.spec index 41072a9..63068b4 100644 --- a/hawkey.spec +++ b/hawkey.spec @@ -2,7 +2,7 @@ Name: hawkey Version: 0.6.3 -Release: 10%{?dist} +Release: 11%{?dist} Summary: Library providing simplified C and Python API to libsolv License: LGPLv2+ URL: https://github.com/rpm-software-management/%{name} @@ -14,6 +14,10 @@ Patch0003: 0001-util-detect-armv7hnl-properly.patch Patch0004: 0001-build-don-t-set-default-build-type-and-define-_GNU_S.patch Patch0005: 0001-selector-prefer-obsoletes-Related-RhBug-1096506.patch Patch0006: 0002-nevra-added-_has_just_name-helper-method.patch +# https://pagure.io/pungi/pull-request/526#comment-18391 +Patch0007: 0001-hy-package-add-support-for-Requires-pre-Related-RhBu.patch +Patch0008: 0002-hy-query-implemented-set-operations-union-intersecti.patch +Patch0009: 0003-implement-query.filter-pkg__neq-.-RhBug-1233770.patch BuildRequires: libsolv-devel >= %{libsolv_version} BuildRequires: cmake @@ -82,6 +86,9 @@ popd %{_includedir}/%{name}/ %changelog +* Mon Feb 13 2017 Igor Gnatenko - 0.6.3-11 +- Backport patches for rel-eng + * Fri Feb 10 2017 Fedora Release Engineering - 0.6.3-10 - Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild