qulogic/gplugin

87b2d20bb128
Merged in feature/runtime-version-check (pull request #59)

Feature/runtime version check

Approved-by: Richard Laager
Approved-by: Elliott Sales de Andrade
--- a/gplugin/gplugin-version.c Fri Feb 21 00:11:31 2020 -0600
+++ b/gplugin/gplugin-version.c Sun Feb 23 04:35:25 2020 +0000
@@ -160,6 +160,49 @@
*/
/**
+ * gplugin_version_check:
+ * @major: The required major version.
+ * @minro: The required minor version.
+ * @micro: The required micro version.
+ *
+ * Checks that the GPlugin library in use is compatible with the given version.
+ * Generally you would pass in the constants #GPLUGIN_MAJOR_VERSION,
+ * #GPLUGIN_MINOR_VERSION, #GPLUGIN_MICRO_VERSION as the three arguments to
+ * this function; that produces a check that the library in use is compatible
+ * with the version of GPlugin the application or module was compiled against.
+ *
+ * Compatibility is defined by two things: first the version of the running
+ * library is newer than the version @major.@minor.@micro. Second the running
+ * library must be binary compatible with the version @major.@minor.@micro
+ * (same major version).
+ *
+ * Returns: %NULL if the GPlugin library is compatible with the given version,
+ * or a string describing the version mismatch. The returned string
+ * is owned by GPlugin and must not be modified or freed.
+ */
+const gchar *
+gplugin_version_check(guint major, guint minor, guint micro) {
+ if(major > GPLUGIN_MAJOR_VERSION) {
+ return "gplugin version too old (major mismatch)";
+ }
+
+ /* disable the pvs-studio suppression after 1.0.0 is released */
+ if(major < GPLUGIN_MAJOR_VERSION) { //-V547
+ return "gplugin version too new (major mismatch)";
+ }
+
+ if(minor > GPLUGIN_MINOR_VERSION) {
+ return "gplugin version too old (minor mismatch)";
+ }
+
+ if(minor == GPLUGIN_MINOR_VERSION && micro > GPLUGIN_MICRO_VERSION) {
+ return "gplugin version too old (micro mismatch)";
+ }
+
+ return NULL;
+}
+
+/**
* gplugin_version_compare:
* @v1: The first version to compare.
* @v2: The second version to compare.
--- a/gplugin/gplugin-version.h.in Fri Feb 21 00:11:31 2020 -0600
+++ b/gplugin/gplugin-version.h.in Sun Feb 23 04:35:25 2020 +0000
@@ -38,6 +38,8 @@
G_BEGIN_DECLS
+const gchar *gplugin_version_check(guint major, guint minor, guint micro);
+
gint gplugin_version_compare(const gchar *v1, const gchar *v2, GError **error);
G_END_DECLS
--- a/gplugin/tests/test-version-compare.c Fri Feb 21 00:11:31 2020 -0600
+++ b/gplugin/tests/test-version-compare.c Sun Feb 23 04:35:25 2020 +0000
@@ -28,7 +28,7 @@
static void
test_gplugin_version_null__null(void) {
- g_test_trap_subprocess("/version-check/null__null/subprocess", 0, 0);
+ g_test_trap_subprocess("/version-compare/null__null/subprocess", 0, 0);
g_test_trap_assert_failed();
g_test_trap_assert_stderr("*gplugin_version_compare*assertion*");
@@ -41,7 +41,7 @@
static void
test_gplugin_version_null__1_2_3(void) {
- g_test_trap_subprocess("/version-check/null__1_2_3/subprocess", 0, 0);
+ g_test_trap_subprocess("/version-compare/null__1_2_3/subprocess", 0, 0);
g_test_trap_assert_failed();
g_test_trap_assert_stderr("*gplugin_version_compare*assertion*");
@@ -54,7 +54,7 @@
static void
test_gplugin_version_1_2_3__null(void) {
- g_test_trap_subprocess("/version-check/1_2_3__null/subprocess", 0, 0);
+ g_test_trap_subprocess("/version-compare/1_2_3__null/subprocess", 0, 0);
g_test_trap_assert_failed();
g_test_trap_assert_stderr("*gplugin_version_compare*assertion*");
@@ -73,7 +73,7 @@
static void
test_gplugin_version_abc__1_2_3(void) {
- g_test_trap_subprocess("/version-check/abc__1_2_3/subprocess", 0, 0);
+ g_test_trap_subprocess("/version-compare/abc__1_2_3/subprocess", 0, 0);
g_test_trap_assert_failed();
g_test_trap_assert_stderr("*assertion*");
@@ -92,7 +92,7 @@
static void
test_gplugin_version_1_2_3__abc(void) {
- g_test_trap_subprocess("/version-check/1_2_3__abc/subprocess", 0, 0);
+ g_test_trap_subprocess("/version-compare/1_2_3__abc/subprocess", 0, 0);
g_test_trap_assert_failed();
g_test_trap_assert_stderr("*assertion*");
@@ -182,65 +182,65 @@
gplugin_init();
/* bad versions */
- g_test_add_func("/version-check/null__null",
+ g_test_add_func("/version-compare/null__null",
test_gplugin_version_null__null);
- g_test_add_func("/version-check/null__1_2_3",
+ g_test_add_func("/version-compare/null__1_2_3",
test_gplugin_version_null__1_2_3);
- g_test_add_func("/version-check/1_2_3__null",
+ g_test_add_func("/version-compare/1_2_3__null",
test_gplugin_version_1_2_3__null);
- g_test_add_func("/version-check/abc__1_2_3",
+ g_test_add_func("/version-compare/abc__1_2_3",
test_gplugin_version_abc__1_2_3);
- g_test_add_func("/version-check/1_2_3__abc",
+ g_test_add_func("/version-compare/1_2_3__abc",
test_gplugin_version_1_2_3__abc);
- g_test_add_func("/version-check/null__null/subprocess",
+ g_test_add_func("/version-compare/null__null/subprocess",
test_gplugin_version_null__null_subprocess);
- g_test_add_func("/version-check/null__1_2_3/subprocess",
+ g_test_add_func("/version-compare/null__1_2_3/subprocess",
test_gplugin_version_null__1_2_3_subprocess);
- g_test_add_func("/version-check/1_2_3__null/subprocess",
+ g_test_add_func("/version-compare/1_2_3__null/subprocess",
test_gplugin_version_1_2_3__null_subprocess);
- g_test_add_func("/version-check/abc__1_2_3/subprocess",
+ g_test_add_func("/version-compare/abc__1_2_3/subprocess",
test_gplugin_version_abc__1_2_3_subprocess);
- g_test_add_func("/version-check/1_2_3__abc/subprocess",
+ g_test_add_func("/version-compare/1_2_3__abc/subprocess",
test_gplugin_version_1_2_3__abc_subprocess);
/* major version */
- g_test_add_func("/version-check/1_0_0__0_0_0",
+ g_test_add_func("/version-compare/1_0_0__0_0_0",
test_gplugin_version_1_0_0__0_0_0);
- g_test_add_func("/version-check/1_0_0__1_0_0",
+ g_test_add_func("/version-compare/1_0_0__1_0_0",
test_gplugin_version_1_0_0__1_0_0);
- g_test_add_func("/version-check/0_0_0__1_0_0",
+ g_test_add_func("/version-compare/0_0_0__1_0_0",
test_gplugin_version_0_0_0__1_0_0);
/* minor version */
- g_test_add_func("/version-check/0_1_0__0_0_0",
+ g_test_add_func("/version-compare/0_1_0__0_0_0",
test_gplugin_version_0_1_0__0_0_0);
- g_test_add_func("/version-check/0_1_0__0_1_0",
+ g_test_add_func("/version-compare/0_1_0__0_1_0",
test_gplugin_version_0_1_0__0_1_0);
- g_test_add_func("/version-check/0_0_0__0_1_0",
+ g_test_add_func("/version-compare/0_0_0__0_1_0",
test_gplugin_version_0_0_0__0_1_0);
/* micro version */
- g_test_add_func("/version-check/0_0_1__0_0_0",
+ g_test_add_func("/version-compare/0_0_1__0_0_0",
test_gplugin_version_0_0_1__0_0_0);
- g_test_add_func("/version-check/0_0_1__0_0_1",
+ g_test_add_func("/version-compare/0_0_1__0_0_1",
test_gplugin_version_0_0_1__0_0_1);
- g_test_add_func("/version-check/0_0_0__0_0_1",
+ g_test_add_func("/version-compare/0_0_0__0_0_1",
test_gplugin_version_0_0_0__0_0_1);
/* major-minor */
- g_test_add_func("/version-check/1_0__0_1",
+ g_test_add_func("/version-compare/1_0__0_1",
test_gplugin_version_1_0__0_1);
- g_test_add_func("/version-check/1_0__1_0",
+ g_test_add_func("/version-compare/1_0__1_0",
test_gplugin_version_1_0__1_0);
- g_test_add_func("/version-check/0_1__1_0",
+ g_test_add_func("/version-compare/0_1__1_0",
test_gplugin_version_0_1__1_0);
/* major */
- g_test_add_func("/version-check/1__0",
+ g_test_add_func("/version-compare/1__0",
test_gplugin_version_1__0);
- g_test_add_func("/version-check/1__1",
+ g_test_add_func("/version-compare/1__1",
test_gplugin_version_1__1);
- g_test_add_func("/version-check/0__1",
+ g_test_add_func("/version-compare/0__1",
test_gplugin_version_0__1);
return g_test_run();