Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Add as_utils_vercmp_full() for gnome-software
Sometimes we don't want to do the firmware-style heuristics.
  • Loading branch information
hughsie committed Oct 24, 2018
1 parent 75a7af1 commit d651281
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 9 deletions.
42 changes: 33 additions & 9 deletions libappstream-glib/as-utils.c
Expand Up @@ -1388,22 +1388,23 @@ as_utils_vercmp_chunk (const gchar *str1, const gchar *str2)
}

/**
* as_utils_vercmp:
* as_utils_vercmp_full:
* @version_a: the release version, e.g. 1.2.3
* @version_b: the release version, e.g. 1.2.3.1
* @flags: some #AsVersionCompareFlag
*
* Compares version numbers for sorting.
*
* Returns: -1 if a < b, +1 if a > b, 0 if they are equal, and %G_MAXINT on error
*
* Since: 0.3.5
* Since: 0.7.14
*/
gint
as_utils_vercmp (const gchar *version_a, const gchar *version_b)
as_utils_vercmp_full (const gchar *version_a,
const gchar *version_b,
AsVersionCompareFlag flags)
{
guint longest_split;
g_autofree gchar *str_a = NULL;
g_autofree gchar *str_b = NULL;
g_auto(GStrv) split_a = NULL;
g_auto(GStrv) split_b = NULL;

Expand All @@ -1416,10 +1417,15 @@ as_utils_vercmp (const gchar *version_a, const gchar *version_b)
return 0;

/* split into sections, and try to parse */
str_a = as_utils_version_parse (version_a);
str_b = as_utils_version_parse (version_b);
split_a = g_strsplit (str_a, ".", -1);
split_b = g_strsplit (str_b, ".", -1);
if (flags & AS_VERSION_COMPARE_FLAG_USE_HEURISTICS) {
g_autofree gchar *str_a = as_utils_version_parse (version_a);
g_autofree gchar *str_b = as_utils_version_parse (version_b);
split_a = g_strsplit (str_a, ".", -1);
split_b = g_strsplit (str_b, ".", -1);
} else {
split_a = g_strsplit (version_a, ".", -1);
split_b = g_strsplit (version_b, ".", -1);
}
longest_split = MAX (g_strv_length (split_a), g_strv_length (split_b));
for (guint i = 0; i < longest_split; i++) {
gchar *endptr_a = NULL;
Expand Down Expand Up @@ -1456,6 +1462,24 @@ as_utils_vercmp (const gchar *version_a, const gchar *version_b)
return 0;
}

/**
* as_utils_vercmp:
* @version_a: the release version, e.g. 1.2.3
* @version_b: the release version, e.g. 1.2.3.1
*
* Compares version numbers for sorting.
*
* Returns: -1 if a < b, +1 if a > b, 0 if they are equal, and %G_MAXINT on error
*
* Since: 0.3.5
*/
gint
as_utils_vercmp (const gchar *version_a, const gchar *version_b)
{
return as_utils_vercmp_full (version_a, version_b,
AS_VERSION_COMPARE_FLAG_USE_HEURISTICS);
}

/**
* as_ptr_array_find_string:
* @array: gchar* array
Expand Down
14 changes: 14 additions & 0 deletions libappstream-glib/as-utils.h
Expand Up @@ -95,6 +95,20 @@ typedef enum {
AS_VERSION_PARSE_FLAG_LAST
} AsVersionParseFlag;

/**
* AsVersionCompareFlag:
* @AS_VERSION_COMPARE_FLAG_NONE: No flags set
* @AS_VERSION_COMPARE_FLAG_USE_HEURISTICS: Use a heuristic to parse version numbers
*
* The flags used when comparing version numbers.
**/
typedef enum {
AS_VERSION_COMPARE_FLAG_NONE = 0,
AS_VERSION_COMPARE_FLAG_USE_HEURISTICS = 1 << 0,
/*< private >*/
AS_VERSION_COMPARE_FLAG_LAST
} AsVersionCompareFlag;

/**
* AsUniqueIdMatchFlags:
* @AS_UNIQUE_ID_MATCH_FLAG_NONE: No flags set
Expand Down

0 comments on commit d651281

Please sign in to comment.