util: Replace virt_viewer_compare_version with _compare_buildid

This allows us to do a more accurate version check if the .vv file
producer wants to allow builds newer than x.y-z because they contain an
important bug fix.
This commit is contained in:
Christophe Fergeau 2015-04-21 18:09:14 +02:00
parent 809d097cfd
commit e2df5a739a
4 changed files with 61 additions and 20 deletions

View File

@ -141,7 +141,8 @@ protocol:
If remote-viewer version number isn't greater or equal to the required If remote-viewer version number isn't greater or equal to the required
version, an error is raised with the expected version. version, an error is raised with the expected version.
The version format accepted is a list of integers separated by '.'. The version format accepted is a list of integers separated by '.'. It can
be followed by a dash '-' and an additional build number with the same format.
Version comparison is done by comparing each integer from the list one by Version comparison is done by comparing each integer from the list one by
one. If any of the component is not a number, the version comparison will fail one. If any of the component is not a number, the version comparison will fail

View File

@ -796,8 +796,7 @@ virt_viewer_file_check_min_version(VirtViewerFile *self, GError **error)
if (min_version == NULL) { if (min_version == NULL) {
return TRUE; return TRUE;
} }
version_cmp = virt_viewer_compare_buildid(min_version, PACKAGE_VERSION BUILDID);
version_cmp = virt_viewer_compare_version(min_version, PACKAGE_VERSION);
if (version_cmp > 0) { if (version_cmp > 0) {
g_set_error(error, g_set_error(error,

View File

@ -1,7 +1,7 @@
/* /*
* Virt Viewer: A virtual machine console viewer * Virt Viewer: A virtual machine console viewer
* *
* Copyright (C) 2007-2012 Red Hat, Inc. * Copyright (C) 2007-2015 Red Hat, Inc.
* Copyright (C) 2009-2012 Daniel P. Berrange * Copyright (C) 2009-2012 Daniel P. Berrange
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
@ -439,25 +439,24 @@ spice_hotkey_to_gtk_accelerator(const gchar *key)
return accel; return accel;
} }
/** static gboolean str_is_empty(const gchar *str)
* virt_viewer_compare_version: {
* @s1: a version-like string return ((str == NULL) || (str[0] == '\0'));
* @s2: a version-like string }
*
* Compare two version-like strings: 1.1 > 1.0, 1.0.1 > 1.0, 1.10 > 1.7... static gint
*
* String suffix (1.0rc1 etc) are not accepted, and will return 0.
*
* Returns: negative value if s1 < s2; zero if s1 = s2; positive value if s1 > s2.
**/
gint
virt_viewer_compare_version(const gchar *s1, const gchar *s2) virt_viewer_compare_version(const gchar *s1, const gchar *s2)
{ {
gint i, retval = 0; gint i, retval = 0;
gchar **v1, **v2; gchar **v1, **v2;
g_return_val_if_fail(s1 != NULL, 0); if (str_is_empty(s1) && str_is_empty(s2)) {
g_return_val_if_fail(s2 != NULL, 0); return 0;
} else if (str_is_empty(s1)) {
return -1;
} else if (str_is_empty(s2)) {
return 1;
}
v1 = g_strsplit(s1, ".", -1); v1 = g_strsplit(s1, ".", -1);
v2 = g_strsplit(s2, ".", -1); v2 = g_strsplit(s2, ".", -1);
@ -473,7 +472,7 @@ virt_viewer_compare_version(const gchar *s1, const gchar *s2)
g_return_val_if_fail(e1 && e2, 0); g_return_val_if_fail(e1 && e2, 0);
if (*e1 || *e2) { if (*e1 || *e2) {
g_warning("the version string contains suffix"); g_warning("the version string contains a suffix");
goto end; goto end;
} }
} }
@ -489,6 +488,48 @@ end:
return retval; return retval;
} }
/**
* virt_viewer_compare_buildid:
* @s1: a version-like string
* @s2: a version-like string
*
* Compare two buildid strings: 1.1-1 > 1.0-1, 1.0-2 > 1.0-1, 1.10 > 1.7...
*
* String suffix (1.0rc1 etc) are not accepted, and will return 0.
*
* Returns: negative value if s1 < s2; zero if s1 = s2; positive value if s1 > s2.
**/
gint
virt_viewer_compare_buildid(const gchar *s1, const gchar *s2)
{
int ret = 0;
GStrv split1 = NULL;
GStrv split2 = NULL;
split1 = g_strsplit(s1, "-", 2);
split2 = g_strsplit(s2, "-", 2);
if ((split1 == NULL) || (split2 == NULL)) {
goto end;
}
/* Compare versions */
ret = virt_viewer_compare_version(split1[0], split2[0]);
if (ret != 0) {
goto end;
}
if ((split1[0] == NULL) || (split2[0] == NULL)) {
goto end;
}
/* Compare -release */
ret = virt_viewer_compare_version(split1[1], split2[1]);
end:
g_strfreev(split1);
g_strfreev(split2);
return ret;
}
/* simple sorting of monitors. Primary sort left-to-right, secondary sort from /* simple sorting of monitors. Primary sort left-to-right, secondary sort from
* top-to-bottom, finally by monitor id */ * top-to-bottom, finally by monitor id */
static int static int

View File

@ -54,7 +54,7 @@ gulong virt_viewer_signal_connect_object(gpointer instance,
GConnectFlags connect_flags); GConnectFlags connect_flags);
gchar* spice_hotkey_to_gtk_accelerator(const gchar *key); gchar* spice_hotkey_to_gtk_accelerator(const gchar *key);
gint virt_viewer_compare_version(const gchar *s1, const gchar *s2); gint virt_viewer_compare_buildid(const gchar *s1, const gchar *s2);
/* monitor alignment */ /* monitor alignment */
void virt_viewer_align_monitors_linear(GdkRectangle *displays, guint ndisplays); void virt_viewer_align_monitors_linear(GdkRectangle *displays, guint ndisplays);