Skip to content

Commit

Permalink
Fix the predicate comparison when using globs in metainfo files
Browse files Browse the repository at this point in the history
The arguments were the wrong way around; the predicate has the pattern and the
version is what has been set from the hardware.
  • Loading branch information
hughsie committed Apr 12, 2017
1 parent ec560da commit a7ca77c
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 13 deletions.
34 changes: 26 additions & 8 deletions libappstream-glib/as-require.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
27 changes: 22 additions & 5 deletions libappstream-glib/as-self-test.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -4789,14 +4803,17 @@ 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);
g_assert_cmpint (as_utils_vercmp ("0x10203", "0x10203"), ==, 0);

/* 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);
Expand Down

0 comments on commit a7ca77c

Please sign in to comment.