Blob Blame History Raw
From 849f65b2466cf15042596119a2703cc6eac67e8c Mon Sep 17 00:00:00 2001
From: Igor Gnatenko <ignatenko@redhat.com>
Date: Thu, 9 Mar 2017 07:39:49 +0100
Subject: [PATCH 2/3] always allocate memory for reldep

Currently if we try to create reldep from "foo = 1" and foo is
not in sack, it would say that it can't create it. But this is wrong,
because reldep is something abstract and we should check that it doesn't
match anything in query/selector rather than just try to find it immediately.

When we process rich deps, we blindly allocate memory for reldep
because we don't know in advance whether it exists or not.

Libsolv doesn't have any function to validate correctness of name, so we can't
do much (it takes care of parsing rpm-md, so it doesn't check there).

Signed-off-by: Igor Gnatenko <ignatenko@redhat.com>

Closes: #266
Approved by: j-mracek
---
 src/python/reldep-py.c            |  4 ----
 src/reldep.c                      |  6 +-----
 tests/python/tests/test_reldep.py | 23 +++++++++--------------
 tests/test_selector.c             |  7 +++++--
 4 files changed, 15 insertions(+), 25 deletions(-)

diff --git a/src/python/reldep-py.c b/src/python/reldep-py.c
index 08229f3..c22a1b8 100644
--- a/src/python/reldep-py.c
+++ b/src/python/reldep-py.c
@@ -134,10 +134,6 @@ reldep_init(_ReldepObject *self, PyObject *args, PyObject *kwds)
     solv_free(name);
     solv_free(evr);
     Py_XDECREF(tmp_py_str);
-    if (self->reldep == NULL) {
-	PyErr_Format(HyExc_Value, "No such reldep: %s", reldep_str);
-	return -1;
-    }
     return 0;
 }
 
diff --git a/src/reldep.c b/src/reldep.c
index d354f00..0784367 100644
--- a/src/reldep.c
+++ b/src/reldep.c
@@ -73,11 +73,7 @@ HyReldep
 hy_reldep_create(HySack sack, const char *name, int cmp_type, const char *evr)
 {
     Pool *pool = sack_pool(sack);
-    Id id = pool_str2id(pool, name, 0);
-
-    if (id == STRID_NULL || id == STRID_EMPTY)
-	// stop right there, this will never match anything.
-	return NULL;
+    Id id = pool_str2id(pool, name, 1);
 
     if (evr) {
 	assert(cmp_type);
diff --git a/tests/python/tests/test_reldep.py b/tests/python/tests/test_reldep.py
index 2232d4c..f0bb1a9 100644
--- a/tests/python/tests/test_reldep.py
+++ b/tests/python/tests/test_reldep.py
@@ -35,20 +35,15 @@ class Reldep(base.TestCase):
         reldep = requires[0]
         self.assertEqual(str(reldep), "P-lib >= 3")
 
-    def test_unicode(self):
-        reldep_str = u"\u0159 >= 3"
-        self.assertRaises(hawkey.ValueException, hawkey.Reldep, self.sack,
-                          reldep_str)
-
     def test_custom_creation(self):
         reldep_str = "P-lib >= 3"
         reldep = hawkey.Reldep(self.sack, reldep_str)
         self.assertEqual(reldep_str, str(reldep))
+        reldep_str = "lane = 4"
+        reldep = hawkey.Reldep(self.sack, reldep_str)
+        self.assertEqual(reldep_str, str(reldep))
 
     def test_custom_creation_fail(self):
-        reldep_str = "lane = 4"
-        self.assertRaises(hawkey.ValueException, hawkey.Reldep, self.sack,
-                          reldep_str)
         reldep_str = "P-lib >="
         self.assertRaises(hawkey.ValueException, hawkey.Reldep, self.sack,
                           reldep_str)
@@ -63,6 +58,12 @@ class Reldep(base.TestCase):
         reldep = hawkey.Reldep(self.sack, "P-lib < 3-3")
         q = hawkey.Query(self.sack).filter(provides=reldep)
         self.assertLength(q, 0)
+        reldep = hawkey.Reldep(self.sack, u"\u0159 >= 3")
+        q = hawkey.Query(self.sack).filter(provides=reldep)
+        self.assertLength(q, 0)
+        reldep = hawkey.Reldep(self.sack, "foo >= 1.0-1.fc20")
+        q = hawkey.Query(self.sack).filter(provides=reldep)
+        self.assertLength(q, 0)
 
     def test_query_name_only(self):
         reldep_str = "P-lib"
@@ -74,9 +75,3 @@ class Reldep(base.TestCase):
 
     def test_not_crash(self):
         self.assertRaises(ValueError, hawkey.Reldep)
-
-    def test_non_num_version(self):
-        reldep_str = 'foo >= 1.0-1.fc20'
-        with self.assertRaises(hawkey.ValueException) as ctx:
-            hawkey.Reldep(self.sack, reldep_str)
-        self.assertEqual(ctx.exception.args[0], "No such reldep: %s" % reldep_str)
diff --git a/tests/test_selector.c b/tests/test_selector.c
index 42915ab..8287546 100644
--- a/tests/test_selector.c
+++ b/tests/test_selector.c
@@ -41,8 +41,11 @@ END_TEST
 START_TEST(test_sltr_provides)
 {
     HySelector sltr = hy_selector_create(test_globals.sack);
-    ck_assert_int_eq(hy_selector_set(sltr, HY_PKG_PROVIDES, HY_EQ, "*"),
-		     HY_E_SELECTOR);
+    fail_if(hy_selector_set(sltr, HY_PKG_PROVIDES, HY_EQ, "*"));
+    HyPackageList plist = hy_selector_matches(sltr);
+    fail_unless(hy_packagelist_count(plist) == 0);
+
+    hy_packagelist_free(plist);
     hy_selector_free(sltr);
 }
 END_TEST
-- 
2.12.1