summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Hughes <richard@hughsie.com>2015-07-22 11:06:09 +0100
committerRichard Hughes <richard@hughsie.com>2015-07-22 11:06:11 +0100
commit3f226b6a62d630d1aad43f13254292ef2564f617 (patch)
tree4687dbd28dc5d24fb59a425a63cd0441793bcee2
parent15cb3c86bc1967a388702122fe7a9a610d25a189 (diff)
downloadappstream-glib-3f226b6a62d630d1aad43f13254292ef2564f617.tar.gz
Add as_release_vercmp()
We need to do the proper fallback when getting the newest release for an app.
-rw-r--r--libappstream-glib/as-app.c22
-rw-r--r--libappstream-glib/as-release.c31
-rw-r--r--libappstream-glib/as-release.h2
-rw-r--r--libappstream-glib/as-self-test.c9
4 files changed, 43 insertions, 21 deletions
diff --git a/libappstream-glib/as-app.c b/libappstream-glib/as-app.c
index 2d26834..3e3b6ef 100644
--- a/libappstream-glib/as-app.c
+++ b/libappstream-glib/as-app.c
@@ -659,8 +659,7 @@ as_app_get_release_default (AsApp *app)
for (i = 0; i < priv->releases->len; i++) {
release_tmp = g_ptr_array_index (priv->releases, i);
if (release_newest == NULL ||
- as_release_get_timestamp (release_tmp) >
- as_release_get_timestamp (release_newest))
+ as_release_vercmp (release_tmp, release_newest) < 1)
release_newest = release_tmp;
}
return release_newest;
@@ -2957,24 +2956,7 @@ as_app_releases_sort_cb (gconstpointer a, gconstpointer b)
{
AsRelease **rel1 = (AsRelease **) a;
AsRelease **rel2 = (AsRelease **) b;
- gint64 ts_a;
- gint64 ts_b;
- gint val;
-
- /* prefer the version strings */
- val = as_utils_vercmp (as_release_get_version (*rel2),
- as_release_get_version (*rel1));
- if (val != G_MAXINT)
- return val;
-
- /* fall back to the timestamp */
- ts_a = as_release_get_timestamp (*rel1);
- ts_b = as_release_get_timestamp (*rel2);
- if (ts_a > ts_b)
- return -1;
- if (ts_a < ts_b)
- return 1;
- return 0;
+ return as_release_vercmp (*rel1, *rel2);
}
/**
diff --git a/libappstream-glib/as-release.c b/libappstream-glib/as-release.c
index b39e50b..de78f26 100644
--- a/libappstream-glib/as-release.c
+++ b/libappstream-glib/as-release.c
@@ -101,6 +101,37 @@ as_release_class_init (AsReleaseClass *klass)
}
/**
+ * as_release_vercmp:
+ * @rel1: a #AsRelease instance.
+ * @rel2: a #AsRelease instance.
+ *
+ * Compares two release.
+ *
+ * Returns: -1 if rel1 > rel2, +1 if rel1 < rel2, 0 otherwise
+ *
+ * Since: 0.4.2
+ **/
+gint
+as_release_vercmp (AsRelease *rel1, AsRelease *rel2)
+{
+ AsReleasePrivate *priv1 = GET_PRIVATE (rel1);
+ AsReleasePrivate *priv2 = GET_PRIVATE (rel2);
+ gint val;
+
+ /* prefer the version strings */
+ val = as_utils_vercmp (priv2->version, priv1->version);
+ if (val != G_MAXINT)
+ return val;
+
+ /* fall back to the timestamp */
+ if (priv1->timestamp > priv2->timestamp)
+ return -1;
+ if (priv1->timestamp < priv2->timestamp)
+ return 1;
+ return 0;
+}
+
+/**
* as_release_get_version:
* @release: a #AsRelease instance.
*
diff --git a/libappstream-glib/as-release.h b/libappstream-glib/as-release.h
index 6daa1cd..64c5b45 100644
--- a/libappstream-glib/as-release.h
+++ b/libappstream-glib/as-release.h
@@ -61,6 +61,8 @@ struct _AsReleaseClass
GType as_release_get_type (void);
AsRelease *as_release_new (void);
+gint as_release_vercmp (AsRelease *rel1,
+ AsRelease *rel2);
/* getters */
const gchar *as_release_get_version (AsRelease *release);
diff --git a/libappstream-glib/as-self-test.c b/libappstream-glib/as-self-test.c
index d4663fd..e55a808 100644
--- a/libappstream-glib/as-self-test.c
+++ b/libappstream-glib/as-self-test.c
@@ -834,6 +834,7 @@ as_test_app_func (void)
{
AsIcon *ic;
AsBundle *bu;
+ AsRelease *rel;
GError *error = NULL;
GNode *n;
GNode *root;
@@ -888,6 +889,7 @@ as_test_app_func (void)
"</screenshot>\n"
"</screenshots>\n"
"<releases>\n"
+ "<release version=\"3.11.91\" timestamp=\"1392724801\"/>\n"
"<release version=\"3.11.90\" timestamp=\"1392724800\"/>\n"
"</releases>\n"
"<provides>\n"
@@ -934,7 +936,7 @@ as_test_app_func (void)
g_assert_cmpint (as_app_get_categories(app)->len, ==, 1);
g_assert_cmpint (as_app_get_priority (app), ==, -4);
g_assert_cmpint (as_app_get_screenshots(app)->len, ==, 2);
- g_assert_cmpint (as_app_get_releases(app)->len, ==, 1);
+ g_assert_cmpint (as_app_get_releases(app)->len, ==, 2);
g_assert_cmpint (as_app_get_provides(app)->len, ==, 3);
g_assert_cmpint (as_app_get_kudos(app)->len, ==, 1);
g_assert_cmpint (as_app_get_permissions(app)->len, ==, 1);
@@ -949,6 +951,11 @@ as_test_app_func (void)
g_assert (!as_app_has_kudo_kind (app, AS_KUDO_KIND_USER_DOCS));
as_node_unref (root);
+ /* check newest release */
+ rel = as_app_get_release_default (app);
+ g_assert (rel != NULL);
+ g_assert_cmpstr (as_release_get_version (rel), ==, "3.11.91");
+
/* check icons */
icons = as_app_get_icons (app);
g_assert (icons != NULL);