diff options
author | Richard Hughes <richard@hughsie.com> | 2017-04-11 17:08:18 +0100 |
---|---|---|
committer | Richard Hughes <richard@hughsie.com> | 2017-04-12 08:49:46 +0100 |
commit | a7ca77c563fd6898928ed4b083d8b36b477f45cc (patch) | |
tree | 5e78166b4a42e82aa5c42344816a680033c035f8 | |
parent | ec560da75f06d86b51cc8a83bb6cfca13ef4b43d (diff) | |
download | appstream-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.c | 34 | ||||
-rw-r--r-- | libappstream-glib/as-self-test.c | 27 |
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); |