summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Hughes <richard@hughsie.com>2017-04-11 17:08:18 +0100
committerRichard Hughes <richard@hughsie.com>2017-04-12 08:49:46 +0100
commita7ca77c563fd6898928ed4b083d8b36b477f45cc (patch)
tree5e78166b4a42e82aa5c42344816a680033c035f8
parentec560da75f06d86b51cc8a83bb6cfca13ef4b43d (diff)
downloadappstream-glib-a7ca77c563fd6898928ed4b083d8b36b477f45cc.tar.gz
Fix the predicate comparison when using globs in metainfo files
The arguments were the wrong way around; the predicate has the pattern and the version is what has been set from the hardware.
-rw-r--r--libappstream-glib/as-require.c34
-rw-r--r--libappstream-glib/as-self-test.c27
2 files changed, 48 insertions, 13 deletions
diff --git a/libappstream-glib/as-require.c b/libappstream-glib/as-require.c
index a67c2de..f6a4bd6 100644
--- a/libappstream-glib/as-require.c
+++ b/libappstream-glib/as-require.c
@@ -339,36 +339,54 @@ as_require_version_compare (AsRequire *require,
{
AsRequirePrivate *priv = GET_PRIVATE (require);
gboolean ret = FALSE;
+ gint rc = 0;
switch (priv->compare) {
case AS_REQUIRE_COMPARE_EQ:
- ret = as_utils_vercmp (version, priv->version) == 0;
+ rc = as_utils_vercmp (version, priv->version);
+ ret = rc == 0;
break;
case AS_REQUIRE_COMPARE_NE:
- ret = as_utils_vercmp (version, priv->version) != 0;
+ rc = as_utils_vercmp (version, priv->version);
+ ret = rc != 0;
break;
case AS_REQUIRE_COMPARE_LT:
- ret = as_utils_vercmp (version, priv->version) < 0;
+ rc = as_utils_vercmp (version, priv->version);
+ ret = rc < 0;
break;
case AS_REQUIRE_COMPARE_GT:
- ret = as_utils_vercmp (version, priv->version) > 0;
+ rc = as_utils_vercmp (version, priv->version);
+ ret = rc > 0;
break;
case AS_REQUIRE_COMPARE_LE:
- ret = as_utils_vercmp (version, priv->version) <= 0;
+ rc = as_utils_vercmp (version, priv->version);
+ ret = rc <= 0;
break;
case AS_REQUIRE_COMPARE_GE:
- ret = as_utils_vercmp (version, priv->version) >= 0;
+ rc = as_utils_vercmp (version, priv->version);
+ ret = rc >= 0;
break;
case AS_REQUIRE_COMPARE_GLOB:
- ret = fnmatch (version, priv->version, 0) == 0;
+ ret = fnmatch (priv->version, version, 0) == 0;
break;
case AS_REQUIRE_COMPARE_REGEX:
- ret = g_regex_match_simple (version, priv->version, 0, 0);
+ ret = g_regex_match_simple (priv->version, version, 0, 0);
break;
default:
break;
}
+ /* could not compare */
+ if (rc == G_MAXINT) {
+ g_set_error (error,
+ AS_UTILS_ERROR,
+ AS_UTILS_ERROR_FAILED,
+ "failed to compare [%s] and [%s]",
+ priv->version,
+ version);
+ return FALSE;
+ }
+
/* set error */
if (!ret && error != NULL) {
g_set_error (error,
diff --git a/libappstream-glib/as-self-test.c b/libappstream-glib/as-self-test.c
index e1000f5..c61cc34 100644
--- a/libappstream-glib/as-self-test.c
+++ b/libappstream-glib/as-self-test.c
@@ -1308,15 +1308,29 @@ as_test_require_func (void)
require = as_require_new ();
as_require_set_version (require, "0.1.2");
as_require_set_compare (require, AS_REQUIRE_COMPARE_EQ);
- g_assert (as_require_version_compare (require, "0.1.2", NULL));
+ ret = as_require_version_compare (require, "0.1.2", &error);
+ g_assert_no_error (error);
+ g_assert (ret);
as_require_set_compare (require, AS_REQUIRE_COMPARE_LT);
- g_assert (as_require_version_compare (require, "0.1.1", NULL));
+ ret = as_require_version_compare (require, "0.1.1", &error);
+ g_assert_no_error (error);
+ g_assert (ret);
as_require_set_compare (require, AS_REQUIRE_COMPARE_LE);
- g_assert (as_require_version_compare (require, "0.1.2", NULL));
+ ret = as_require_version_compare (require, "0.1.2", &error);
+ g_assert_no_error (error);
+ g_assert (ret);
+
+ as_require_set_version (require, "0.1.?");
as_require_set_compare (require, AS_REQUIRE_COMPARE_GLOB);
- g_assert (as_require_version_compare (require, "0.?.*", NULL));
+ ret = as_require_version_compare (require, "0.1.9", &error);
+ g_assert_no_error (error);
+ g_assert (ret);
+
+ as_require_set_version (require, "0.1.[0-9]");
as_require_set_compare (require, AS_REQUIRE_COMPARE_REGEX);
- g_assert (as_require_version_compare (require, "0.1.[0-9]", NULL));
+ ret = as_require_version_compare (require, "0.1.9", &error);
+ g_assert_no_error (error);
+ g_assert (ret);
}
static void
@@ -4789,6 +4803,7 @@ as_test_utils_vercmp_func (void)
{
/* same */
g_assert_cmpint (as_utils_vercmp ("1.2.3", "1.2.3"), ==, 0);
+ g_assert_cmpint (as_utils_vercmp ("001.002.003", "001.002.003"), ==, 0);
/* same, not dotted decimal */
g_assert_cmpint (as_utils_vercmp ("1.2.3", "0x1020003"), ==, 0);
@@ -4796,7 +4811,9 @@ as_test_utils_vercmp_func (void)
/* upgrade and downgrade */
g_assert_cmpint (as_utils_vercmp ("1.2.3", "1.2.4"), <, 0);
+ g_assert_cmpint (as_utils_vercmp ("001.002.000", "001.002.009"), <, 0);
g_assert_cmpint (as_utils_vercmp ("1.2.3", "1.2.2"), >, 0);
+ g_assert_cmpint (as_utils_vercmp ("001.002.009", "001.002.000"), >, 0);
/* unequal depth */
g_assert_cmpint (as_utils_vercmp ("1.2.3", "1.2.3.1"), <, 0);