diff options
author | Richard Hughes <richard@hughsie.com> | 2015-07-22 11:06:09 +0100 |
---|---|---|
committer | Richard Hughes <richard@hughsie.com> | 2015-07-22 11:06:11 +0100 |
commit | 3f226b6a62d630d1aad43f13254292ef2564f617 (patch) | |
tree | 4687dbd28dc5d24fb59a425a63cd0441793bcee2 | |
parent | 15cb3c86bc1967a388702122fe7a9a610d25a189 (diff) | |
download | appstream-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.c | 22 | ||||
-rw-r--r-- | libappstream-glib/as-release.c | 31 | ||||
-rw-r--r-- | libappstream-glib/as-release.h | 2 | ||||
-rw-r--r-- | libappstream-glib/as-self-test.c | 9 |
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); |