summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Hughes <richard@hughsie.com>2016-12-22 19:25:48 +0000
committerRichard Hughes <richard@hughsie.com>2016-12-22 19:25:48 +0000
commit4ed21093c8bc522e367f45bb03f59657300aa6b3 (patch)
tree5959ccb0bd34f58aed876b8275e7e327fe309a36
parent01b9771203fd450741282504c730d296d7b9cce5 (diff)
downloadappstream-glib-4ed21093c8bc522e367f45bb03f59657300aa6b3.tar.gz
Support glob and regex matches in requires compare tags
-rw-r--r--libappstream-glib/as-require.c29
-rw-r--r--libappstream-glib/as-require.h2
-rw-r--r--libappstream-glib/as-self-test.c4
3 files changed, 28 insertions, 7 deletions
diff --git a/libappstream-glib/as-require.c b/libappstream-glib/as-require.c
index 64bca14..1f66a5b 100644
--- a/libappstream-glib/as-require.c
+++ b/libappstream-glib/as-require.c
@@ -32,6 +32,8 @@
#include "config.h"
+#include <fnmatch.h>
+
#include "as-require-private.h"
#include "as-node-private.h"
#include "as-ref-string.h"
@@ -142,6 +144,10 @@ as_require_compare_from_string (const gchar *compare)
return AS_REQUIRE_COMPARE_GE;
if (g_strcmp0 (compare, "le") == 0)
return AS_REQUIRE_COMPARE_LE;
+ if (g_strcmp0 (compare, "glob") == 0)
+ return AS_REQUIRE_COMPARE_GLOB;
+ if (g_strcmp0 (compare, "regex") == 0)
+ return AS_REQUIRE_COMPARE_REGEX;
return AS_REQUIRE_COMPARE_UNKNOWN;
}
@@ -170,6 +176,10 @@ as_require_compare_to_string (AsRequireCompare compare)
return "ge";
if (compare == AS_REQUIRE_COMPARE_LE)
return "le";
+ if (compare == AS_REQUIRE_COMPARE_GLOB)
+ return "glob";
+ if (compare == AS_REQUIRE_COMPARE_REGEX)
+ return "regex";
return NULL;
}
@@ -328,27 +338,32 @@ as_require_version_compare (AsRequire *require,
GError **error)
{
AsRequirePrivate *priv = GET_PRIVATE (require);
- gint tmp = as_utils_vercmp (version, priv->version);
gboolean ret = FALSE;
switch (priv->compare) {
case AS_REQUIRE_COMPARE_EQ:
- ret = tmp == 0;
+ ret = as_utils_vercmp (version, priv->version) == 0;
break;
case AS_REQUIRE_COMPARE_NE:
- ret = tmp != 0;
+ ret = as_utils_vercmp (version, priv->version) != 0;
break;
case AS_REQUIRE_COMPARE_LT:
- ret = tmp < 0;
+ ret = as_utils_vercmp (version, priv->version) < 0;
break;
case AS_REQUIRE_COMPARE_GT:
- ret = tmp > 0;
+ ret = as_utils_vercmp (version, priv->version) > 0;
break;
case AS_REQUIRE_COMPARE_LE:
- ret = tmp <= 0;
+ ret = as_utils_vercmp (version, priv->version) <= 0;
break;
case AS_REQUIRE_COMPARE_GE:
- ret = tmp >= 0;
+ ret = as_utils_vercmp (version, priv->version) >= 0;
+ break;
+ case AS_REQUIRE_COMPARE_GLOB:
+ ret = fnmatch (version, priv->version, 0) == 0;
+ break;
+ case AS_REQUIRE_COMPARE_REGEX:
+ ret = g_regex_match_simple (version, priv->version, 0, 0);
break;
default:
break;
diff --git a/libappstream-glib/as-require.h b/libappstream-glib/as-require.h
index 92a48b5..8dc16ec 100644
--- a/libappstream-glib/as-require.h
+++ b/libappstream-glib/as-require.h
@@ -83,6 +83,8 @@ typedef enum {
AS_REQUIRE_COMPARE_GT,
AS_REQUIRE_COMPARE_LE,
AS_REQUIRE_COMPARE_GE,
+ AS_REQUIRE_COMPARE_GLOB,
+ AS_REQUIRE_COMPARE_REGEX,
/*< private >*/
AS_REQUIRE_COMPARE_LAST
} AsRequireCompare;
diff --git a/libappstream-glib/as-self-test.c b/libappstream-glib/as-self-test.c
index 4429b0f..d54ec54 100644
--- a/libappstream-glib/as-self-test.c
+++ b/libappstream-glib/as-self-test.c
@@ -1313,6 +1313,10 @@ as_test_require_func (void)
g_assert (as_require_version_compare (require, "0.1.1", NULL));
as_require_set_compare (require, AS_REQUIRE_COMPARE_LE);
g_assert (as_require_version_compare (require, "0.1.2", NULL));
+ as_require_set_compare (require, AS_REQUIRE_COMPARE_GLOB);
+ g_assert (as_require_version_compare (require, "0.?.*", NULL));
+ as_require_set_compare (require, AS_REQUIRE_COMPARE_REGEX);
+ g_assert (as_require_version_compare (require, "0.1.[0-9]", NULL));
}
static void