aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--meson.build3
-rw-r--r--src/apk_version.h3
-rw-r--r--src/app_vertest.c53
-rw-r--r--src/meson.build1
-rw-r--r--src/version.c34
-rw-r--r--tests/meson.build13
-rw-r--r--tests/test-basic.sh16
-rw-r--r--tests/test-lib.sh27
-rw-r--r--tests/version.data728
9 files changed, 863 insertions, 15 deletions
diff --git a/meson.build b/meson.build
index ebc7648..902854e 100644
--- a/meson.build
+++ b/meson.build
@@ -3,7 +3,7 @@ project(
['c'],
default_options : ['c_std=gnu99', 'optimization=2'],
version: '3.0.0_pre0',
- meson_version: '>=0.51'
+ meson_version: '>=0.52'
)
pkgc = import('pkgconfig')
@@ -32,3 +32,4 @@ subproject = meson.is_subproject()
subdir('doc')
subdir('libfetch')
subdir('src')
+subdir('tests')
diff --git a/src/apk_version.h b/src/apk_version.h
index ac6d50c..0996207 100644
--- a/src/apk_version.h
+++ b/src/apk_version.h
@@ -23,7 +23,8 @@
#define APK_DEPMASK_CHECKSUM (APK_VERSION_LESS|APK_VERSION_GREATER)
const char *apk_version_op_string(int result_mask);
-int apk_version_result_mask(const char *str);
+int apk_version_result_mask(const char *op);
+int apk_version_result_mask_blob(apk_blob_t op);
int apk_version_validate(apk_blob_t ver);
int apk_version_compare_blob_fuzzy(apk_blob_t a, apk_blob_t b, int fuzzy);
int apk_version_compare_blob(apk_blob_t a, apk_blob_t b);
diff --git a/src/app_vertest.c b/src/app_vertest.c
new file mode 100644
index 0000000..54d5f10
--- /dev/null
+++ b/src/app_vertest.c
@@ -0,0 +1,53 @@
+/* app_vertest.c - Alpine Package Keeper (APK)
+ *
+ * Copyright (C) 2005-2008 Natanael Copa <n@tanael.org>
+ * Copyright (C) 2008-2011 Timo Teräs <timo.teras@iki.fi>
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: GPL-2.0-only
+ */
+
+#include <stdio.h>
+#include "apk_defines.h"
+#include "apk_applet.h"
+#include "apk_database.h"
+#include "apk_version.h"
+#include "apk_print.h"
+
+static int vertest_main(void *pctx, struct apk_database *db, struct apk_string_array *args)
+{
+ apk_blob_t arg, ver, op, space = APK_BLOB_STRLIT(" ");
+ char **parg;
+ int errors = 0;
+
+ foreach_array_item(parg, args) {
+ int ok = 0;
+
+ // arguments are either:
+ // "version" -> check validty
+ // "ver1 op ver2" -> check if that the comparison is true
+ arg = APK_BLOB_STR(*parg);
+ if (apk_blob_split(arg, space, &ver, &arg) &&
+ apk_blob_split(arg, space, &op, &arg)) {
+ if (apk_version_compare_blob(ver, arg) & apk_version_result_mask_blob(op))
+ ok = 1;
+ } else {
+ ok = apk_version_validate(arg);
+ }
+ if (!ok) {
+ if (apk_verbosity > 0)
+ printf("%s\n", *parg);
+ errors++;
+ }
+ }
+
+ return errors ? 1 : 0;
+}
+
+static struct apk_applet apk_vertest = {
+ .open_flags = APK_OPENF_READ | APK_OPENF_NO_STATE | APK_OPENF_NO_REPOS,
+ .name = "vertest",
+ .main = vertest_main,
+};
+
+APK_DEFINE_APPLET(apk_vertest);
diff --git a/src/meson.build b/src/meson.build
index 216ce0e..f2b8cc9 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -62,6 +62,7 @@ apk_src = [
'app_stats.c',
'app_verify.c',
'app_version.c',
+ 'app_vertest.c',
'help.c',
]
diff --git a/src/version.c b/src/version.c
index f6fc5af..7c1c0b4 100644
--- a/src/version.c
+++ b/src/version.c
@@ -161,24 +161,32 @@ const char *apk_version_op_string(int mask)
}
}
-int apk_version_result_mask(const char *str)
+int apk_version_result_mask_blob(apk_blob_t op)
{
- int r = 0;
- switch (*str) {
- case '<':
- r = APK_VERSION_LESS;
- str++;
- break;
- case '>':
- r = APK_VERSION_GREATER;
- str++;
- break;
+ int i, r = 0;
+ for (i = 0; i < op.len; i++) {
+ switch (op.ptr[i]) {
+ case '<':
+ r |= APK_VERSION_LESS;
+ break;
+ case '>':
+ r |= APK_VERSION_GREATER;
+ break;
+ case '=':
+ r |= APK_VERSION_EQUAL;
+ break;
+ default:
+ return 0;
+ }
}
- if (*str == '=')
- r |= APK_VERSION_EQUAL;
return r;
}
+int apk_version_result_mask(const char *op)
+{
+ return apk_version_result_mask_blob(APK_BLOB_STR(op));
+}
+
int apk_version_validate(apk_blob_t ver)
{
int t = TOKEN_DIGIT;
diff --git a/tests/meson.build b/tests/meson.build
new file mode 100644
index 0000000..a96a6cc
--- /dev/null
+++ b/tests/meson.build
@@ -0,0 +1,13 @@
+env = environment()
+env.set('APK', apk_exe.full_path())
+env.set('SRC', meson.current_source_dir())
+
+test_program = find_program('test-basic.sh')
+test_list = run_command(test_program, '--list').stdout().split('\n')
+
+foreach test : test_list
+ test = test.strip()
+ if test != ''
+ test(test, test_program, args: ['--test', test], env: env)
+ endif
+endforeach
diff --git a/tests/test-basic.sh b/tests/test-basic.sh
new file mode 100644
index 0000000..3d4fffe
--- /dev/null
+++ b/tests/test-basic.sh
@@ -0,0 +1,16 @@
+#!/bin/sh
+
+source ${SRC:-.}/test-lib.sh
+
+t_case "help" && {
+ help_normal=$($APK version --help 2>/dev/null) || true
+ [ "${#help_normal}" -gt 2000 ]
+ help_invalid=$($APK version --invalid-option 2>/dev/null) || true
+ [ "$help_normal" = "$help_invalid" ]
+}
+
+t_case "version" && {
+ sed 's/[[:blank:]]*#.*//g' < $SRC/version.data | tr '\n' '\0' | xargs -0 $APK vertest
+}
+
+t_end
diff --git a/tests/test-lib.sh b/tests/test-lib.sh
new file mode 100644
index 0000000..d33e443
--- /dev/null
+++ b/tests/test-lib.sh
@@ -0,0 +1,27 @@
+#!/bin/sh
+
+: ${APK=apk} ${SRC=.}
+T_MODE="$1"
+shift 1
+case "$T_MODE" in
+--all)
+ t_case() { true; }
+ t_end() { exit 0; }
+ set -e -o pipefail
+ ;;
+--list)
+ t_case() { echo "$@"; false; }
+ t_end() { exit 0; }
+ ;;
+--test)
+ T_WANTED_CASE="$1"
+ shift
+ t_case() { [ "$@" = "$T_WANTED_CASE" ]; }
+ t_end() { exit 0; }
+ set -e -o pipefail
+ ;;
+*)
+ echo "invalid mode"
+ exit 1
+ ;;
+esac
diff --git a/tests/version.data b/tests/version.data
new file mode 100644
index 0000000..59d93cf
--- /dev/null
+++ b/tests/version.data
@@ -0,0 +1,728 @@
+2.34 > 0.1.0_alpha
+23_foo > 4_beta
+1.0 < 1.0bc # invalid. do string sort
+0.1.0_alpha = 0.1.0_alpha
+0.1.0_alpha < 0.1.3_alpha
+0.1.3_alpha > 0.1.0_alpha
+0.1.0_alpha2 > 0.1.0_alpha
+0.1.0_alpha < 2.2.39-r1
+2.2.39-r1 > 1.0.4-r3
+1.0.4-r3 < 1.0.4-r4
+1.0.4-r4 < 1.6
+1.6 > 1.0.2
+1.0.2 > 0.7-r1
+0.7-r1 < 1.0.0
+1.0.0 < 1.0.1
+1.0.1 < 1.1
+1.1 > 1.1_alpha1
+1.1_alpha1 < 1.2.1
+1.2.1 > 1.2
+1.2 < 1.3_alpha
+1.3_alpha < 1.3_alpha2
+1.3_alpha2 < 1.3_alpha3
+1.3_alpha8 > 0.6.0
+0.6.0 < 0.6.1
+0.6.1 < 0.7.0
+0.7.0 < 0.8_beta1
+0.8_beta1 < 0.8_beta2
+0.8_beta4 < 4.8-r1
+4.8-r1 > 3.10.18-r1
+3.10.18-r1 > 2.3.0b-r1
+2.3.0b-r1 < 2.3.0b-r2
+2.3.0b-r2 < 2.3.0b-r3
+2.3.0b-r3 < 2.3.0b-r4
+2.3.0b-r4 > 0.12.1
+0.12.1 < 0.12.2
+0.12.2 < 0.12.3
+0.12.3 > 0.12
+0.12 < 0.13_beta1
+0.13_beta1 < 0.13_beta2
+0.13_beta2 < 0.13_beta3
+0.13_beta3 < 0.13_beta4
+0.13_beta4 < 0.13_beta5
+0.13_beta5 > 0.9.12
+0.9.12 < 0.9.13
+0.9.13 > 0.9.12
+0.9.12 < 0.9.13
+0.9.13 > 0.0.16
+0.0.16 < 0.6
+0.6 < 2.1.13-r3
+2.1.13-r3 < 2.1.15-r2
+2.1.15-r2 < 2.1.15-r3
+2.1.15-r3 > 1.2.11
+1.2.11 < 1.2.12.1
+1.2.12.1 < 1.2.13
+1.2.13 < 1.2.14-r1
+1.2.14-r1 > 0.7.1
+0.7.1 > 0.5.4
+0.5.4 < 0.7.0
+0.7.0 < 1.2.13
+1.2.13 > 1.0.8
+1.0.8 < 1.2.1
+1.2.1 > 0.7-r1
+0.7-r1 < 2.4.32
+2.4.32 < 2.8-r4
+2.8-r4 > 0.9.6
+0.9.6 > 0.2.0-r1
+0.2.0-r1 = 0.2.0-r1
+0.2.0-r1 < 3.1_p16
+3.1_p16 < 3.1_p17
+3.1_p17 > 1.06-r6
+1.06-r6 < 006
+006 > 1.0.0
+1.0.0 < 1.2.2-r1
+1.2.2-r1 > 1.2.2
+1.2.2 > 0.3-r1
+0.3-r1 < 9.3.2-r4
+9.3.2-r4 < 9.3.4-r2
+9.3.4-r2 > 9.3.4
+9.3.4 > 9.3.2
+9.3.2 < 9.3.4
+9.3.4 > 1.1.3
+1.1.3 < 2.16.1-r3
+2.16.1-r3 = 2.16.1-r3
+2.16.1-r3 > 2.1.0-r2
+2.1.0-r2 < 2.9.3-r1
+2.9.3-r1 > 0.9-r1
+0.9-r1 > 0.8-r1
+0.8-r1 < 1.0.6-r3
+1.0.6-r3 > 0.11
+0.11 < 0.12
+0.12 < 1.2.1-r1
+1.2.1-r1 < 1.2.2.1
+1.2.2.1 < 1.4.1-r1
+1.4.1-r1 < 1.4.1-r2
+1.4.1-r2 > 1.2.2
+1.2.2 < 1.3
+1.3 > 1.0.3-r6
+1.0.3-r6 < 1.0.4
+1.0.4 < 2.59
+2.59 < 20050718-r1
+20050718-r1 < 20050718-r2
+20050718-r2 > 3.9.8-r5
+3.9.8-r5 > 2.01.01_alpha10
+2.01.01_alpha10 > 0.94
+0.94 < 1.0
+1.0 > 0.99.3.20040818
+0.99.3.20040818 > 0.7
+0.7 < 1.21-r1
+1.21-r1 > 0.13
+0.13 < 0.90.1-r1
+0.90.1-r1 > 0.10.2
+0.10.2 < 0.10.3
+0.10.3 < 1.6
+1.6 < 1.39
+1.39 > 1.00_beta2
+1.00_beta2 > 0.9.2
+0.9.2 < 5.94-r1
+5.94-r1 < 6.4
+6.4 > 2.6-r5
+2.6-r5 > 1.4
+1.4 < 2.8.9-r1
+2.8.9-r1 > 2.8.9
+2.8.9 > 1.1
+1.1 > 1.0.3-r2
+1.0.3-r2 < 1.3.4-r3
+1.3.4-r3 < 2.2
+2.2 > 1.2.6
+1.2.6 < 7.15.1-r1
+7.15.1-r1 > 1.02
+1.02 < 1.03-r1
+1.03-r1 < 1.12.12-r2
+1.12.12-r2 < 2.8.0.6-r1
+2.8.0.6-r1 > 0.5.2.7
+0.5.2.7 < 4.2.52_p2-r1
+4.2.52_p2-r1 < 4.2.52_p4-r2
+4.2.52_p4-r2 > 1.02.07
+1.02.07 < 1.02.10-r1
+1.02.10-r1 < 3.0.3-r9
+3.0.3-r9 > 2.0.5-r1
+2.0.5-r1 < 4.5
+4.5 > 2.8.7-r1
+2.8.7-r1 > 1.0.5
+1.0.5 < 8
+8 < 9
+9 > 2.18.3-r10
+2.18.3-r10 > 1.05-r18
+1.05-r18 < 1.05-r19
+1.05-r19 < 2.2.5
+2.2.5 < 2.8
+2.8 < 2.20.1
+2.20.1 < 2.20.3
+2.20.3 < 2.31
+2.31 < 2.34
+2.34 < 2.38
+2.38 < 20050405
+20050405 > 1.8
+1.8 < 2.11-r1
+2.11-r1 > 2.11
+2.11 > 0.1.6-r3
+0.1.6-r3 < 0.47-r1
+0.47-r1 < 0.49
+0.49 < 3.6.8-r2
+3.6.8-r2 > 1.39
+1.39 < 2.43
+2.43 > 2.0.6-r1
+2.0.6-r1 > 0.2-r6
+0.2-r6 < 0.4
+0.4 < 1.0.0
+1.0.0 < 10-r1
+10-r1 > 4
+4 > 0.7.3-r2
+0.7.3-r2 > 0.7.3
+0.7.3 < 1.95.8
+1.95.8 > 1.1.19
+1.1.19 > 1.1.5
+1.1.5 < 6.3.2-r1
+6.3.2-r1 < 6.3.3
+6.3.3 > 4.17-r1
+4.17-r1 < 4.18
+4.18 < 4.19
+4.19 > 4.3.0
+4.3.0 < 4.3.2-r1
+4.3.2-r1 > 4.3.2
+4.3.2 > 0.68-r3
+0.68-r3 < 1.0.0
+1.0.0 < 1.0.1
+1.0.1 > 1.0.0
+1.0.0 = 1.0.0
+1.0.0 < 1.0.1
+1.0.1 < 2.3.2-r1
+2.3.2-r1 < 2.4.2
+2.4.2 < 20060720
+20060720 > 3.0.20060720
+3.0.20060720 < 20060720
+20060720 > 1.1
+1.1 = 1.1
+1.1 < 1.1.1-r1
+1.1.1-r1 < 1.1.3-r1
+1.1.3-r1 < 1.1.3-r2
+1.1.3-r2 < 2.1.10-r2
+2.1.10-r2 > 0.7.18-r2
+0.7.18-r2 < 0.17-r6
+0.17-r6 < 2.6.1
+2.6.1 < 2.6.3
+2.6.3 < 3.1.5-r2
+3.1.5-r2 < 3.4.6-r1
+3.4.6-r1 < 3.4.6-r2
+3.4.6-r2 = 3.4.6-r2
+3.4.6-r2 > 2.0.33
+2.0.33 < 2.0.34
+2.0.34 > 1.8.3-r2
+1.8.3-r2 < 1.8.3-r3
+1.8.3-r3 < 4.1
+4.1 < 8.54
+8.54 > 4.1.4
+4.1.4 > 1.2.10-r5
+1.2.10-r5 < 4.1.4-r3
+4.1.4-r3 = 4.1.4-r3
+4.1.4-r3 < 4.2.1
+4.2.1 > 4.1.0
+4.1.0 < 8.11
+8.11 > 1.4.4-r1
+1.4.4-r1 < 2.1.9.200602141850
+2.1.9.200602141850 > 1.6
+1.6 < 2.5.1-r8
+2.5.1-r8 < 2.5.1a-r1
+2.5.1a-r1 > 1.19.2-r1
+1.19.2-r1 > 0.97-r2
+0.97-r2 < 0.97-r3
+0.97-r3 < 1.3.5-r10
+1.3.5-r10 > 1.3.5-r8
+1.3.5-r8 < 1.3.5-r9
+1.3.5-r9 > 1.0
+1.0 < 1.1
+1.1 > 0.9.11
+0.9.11 < 0.9.12
+0.9.12 < 0.9.13
+0.9.13 < 0.9.14
+0.9.14 < 0.9.15
+0.9.15 < 0.9.16
+0.9.16 > 0.3-r2
+0.3-r2 < 6.3
+6.3 < 6.6
+6.6 < 6.9
+6.9 > 0.7.2-r3
+0.7.2-r3 < 1.2.10
+1.2.10 < 20040923-r2
+20040923-r2 > 20040401
+20040401 > 2.0.0_rc3-r1
+2.0.0_rc3-r1 > 1.5
+1.5 < 4.4
+4.4 > 1.0.1
+1.0.1 < 2.2.0
+2.2.0 > 1.1.0-r2
+1.1.0-r2 > 0.3
+0.3 < 20020207-r2
+20020207-r2 > 1.31-r2
+1.31-r2 < 3.7
+3.7 > 2.0.1
+2.0.1 < 2.0.2
+2.0.2 > 0.99.163
+0.99.163 < 2.6.15.20060110
+2.6.15.20060110 < 2.6.16.20060323
+2.6.16.20060323 < 2.6.19.20061214
+2.6.19.20061214 > 0.6.2-r1
+0.6.2-r1 < 0.6.3
+0.6.3 < 0.6.5
+0.6.5 < 1.3.5-r1
+1.3.5-r1 < 1.3.5-r4
+1.3.5-r4 < 3.0.0-r2
+3.0.0-r2 < 021109-r3
+021109-r3 < 20060512
+20060512 > 1.24
+1.24 > 0.9.16-r1
+0.9.16-r1 < 3.9_pre20060124
+3.9_pre20060124 > 0.01
+0.01 < 0.06
+0.06 < 1.1.7
+1.1.7 < 6b-r7
+6b-r7 > 1.12-r7
+1.12-r7 < 1.12-r8
+1.12-r8 > 1.1.12
+1.1.12 < 1.1.13
+1.1.13 > 0.3
+0.3 < 0.5
+0.5 < 3.96.1
+3.96.1 < 3.97
+3.97 > 0.10.0-r1
+0.10.0-r1 > 0.10.0
+0.10.0 < 0.10.1_rc1
+0.10.1_rc1 > 0.9.11
+0.9.11 < 394
+394 > 2.31
+2.31 > 1.0.1
+1.0.1 = 1.0.1
+1.0.1 < 1.0.3
+1.0.3 > 1.0.2
+1.0.2 = 1.0.2
+1.0.2 > 1.0.1
+1.0.1 = 1.0.1
+1.0.1 < 1.2.2
+1.2.2 < 2.1.10
+2.1.10 > 1.0.1
+1.0.1 < 1.0.2
+1.0.2 < 3.5.5
+3.5.5 > 1.1.1
+1.1.1 > 0.9.1
+0.9.1 < 1.0.2
+1.0.2 > 1.0.1
+1.0.1 < 1.0.2
+1.0.2 > 1.0.1
+1.0.1 = 1.0.1
+1.0.1 < 1.0.5
+1.0.5 > 0.8.5
+0.8.5 < 0.8.6-r3
+0.8.6-r3 < 2.3.17
+2.3.17 > 1.10-r5
+1.10-r5 < 1.10-r9
+1.10-r9 < 2.0.2
+2.0.2 > 1.1a
+1.1a < 1.3a
+1.3a > 1.0.2
+1.0.2 < 1.2.2-r1
+1.2.2-r1 > 1.0-r1
+1.0-r1 > 0.15.1b
+0.15.1b < 1.0.1
+1.0.1 < 1.06-r1
+1.06-r1 < 1.06-r2
+1.06-r2 > 0.15.1b-r2
+0.15.1b-r2 > 0.15.1b
+0.15.1b < 2.5.7
+2.5.7 > 1.1.2.1-r1
+1.1.2.1-r1 > 0.0.31
+0.0.31 < 0.0.50
+0.0.50 > 0.0.16
+0.0.16 < 0.0.25
+0.0.25 < 0.17
+0.17 > 0.5.0
+0.5.0 < 1.1.2
+1.1.2 < 1.1.3
+1.1.3 < 1.1.20
+1.1.20 > 0.9.4
+0.9.4 < 0.9.5
+0.9.5 < 6.3
+6.3 < 6.6
+6.6 > 6.3
+6.3 < 6.6
+6.6 > 1.2.12-r1
+1.2.12-r1 < 1.2.13
+1.2.13 < 1.2.14
+1.2.14 < 1.2.15
+1.2.15 < 8.0.12
+8.0.12 > 8.0.9
+8.0.9 > 1.2.3-r1
+1.2.3-r1 < 1.2.4-r1
+1.2.4-r1 > 0.1
+0.1 < 0.3.5
+0.3.5 < 1.5.22
+1.5.22 > 0.1.11
+0.1.11 < 0.1.12
+0.1.12 < 1.1.4.1
+1.1.4.1 > 1.1.0
+1.1.0 < 1.1.2
+1.1.2 > 1.0.3
+1.0.3 > 1.0.2
+1.0.2 < 2.6.26
+2.6.26 < 2.6.27
+2.6.27 > 1.1.17
+1.1.17 < 1.4.11
+1.4.11 < 22.7-r1
+22.7-r1 < 22.7.3-r1
+22.7.3-r1 > 22.7
+22.7 > 2.1_pre20
+2.1_pre20 < 2.1_pre26
+2.1_pre26 > 0.2.3-r2
+0.2.3-r2 > 0.2.2
+0.2.2 < 2.10.0
+2.10.0 < 2.10.1
+2.10.1 > 02.08.01b
+02.08.01b < 4.77
+4.77 > 0.17
+0.17 < 5.1.1-r1
+5.1.1-r1 < 5.1.1-r2
+5.1.1-r2 > 5.1.1
+5.1.1 > 1.2
+1.2 < 5.1
+5.1 > 2.02.06
+2.02.06 < 2.02.10
+2.02.10 < 2.8.5-r3
+2.8.5-r3 < 2.8.6-r1
+2.8.6-r1 < 2.8.6-r2
+2.8.6-r2 > 2.02-r1
+2.02-r1 > 1.5.0-r1
+1.5.0-r1 > 1.5.0
+1.5.0 > 0.9.2
+0.9.2 < 8.1.2.20040524-r1
+8.1.2.20040524-r1 < 8.1.2.20050715-r1
+8.1.2.20050715-r1 < 20030215
+20030215 > 3.80-r4
+3.80-r4 < 3.81
+3.81 > 1.6d
+1.6d > 1.2.07.8
+1.2.07.8 < 1.2.12.04
+1.2.12.04 < 1.2.12.05
+1.2.12.05 < 1.3.3
+1.3.3 < 2.6.4
+2.6.4 > 2.5.2
+2.5.2 < 2.6.1
+2.6.1 > 2.6
+2.6 < 6.5.1-r1
+6.5.1-r1 > 1.1.35-r1
+1.1.35-r1 < 1.1.35-r2
+1.1.35-r2 > 0.9.2
+0.9.2 < 1.07-r1
+1.07-r1 < 1.07.5
+1.07.5 > 1.07
+1.07 < 1.19
+1.19 < 2.1-r2
+2.1-r2 < 2.2
+2.2 > 1.0.4
+1.0.4 < 20060811
+20060811 < 20061003
+20061003 > 0.1_pre20060810
+0.1_pre20060810 < 0.1_pre20060817
+0.1_pre20060817 < 1.0.3
+1.0.3 > 1.0.2
+1.0.2 > 1.0.1
+1.0.1 < 3.2.2-r1
+3.2.2-r1 < 3.2.2-r2
+3.2.2-r2 < 3.3.17
+3.3.17 > 0.59s-r11
+0.59s-r11 < 0.65
+0.65 > 0.2.10-r2
+0.2.10-r2 < 2.01
+2.01 < 3.9.10
+3.9.10 > 1.2.18
+1.2.18 < 1.5.11-r2
+1.5.11-r2 < 1.5.13-r1
+1.5.13-r1 > 1.3.12-r1
+1.3.12-r1 < 2.0.1
+2.0.1 < 2.0.2
+2.0.2 < 2.0.3
+2.0.3 > 0.2.0
+0.2.0 < 5.5-r2
+5.5-r2 < 5.5-r3
+5.5-r3 > 0.25.3
+0.25.3 < 0.26.1-r1
+0.26.1-r1 < 5.2.1.2-r1
+5.2.1.2-r1 < 5.4
+5.4 > 1.60-r11
+1.60-r11 < 1.60-r12
+1.60-r12 < 110-r8
+110-r8 > 0.17-r2
+0.17-r2 < 1.05-r4
+1.05-r4 < 5.28.0
+5.28.0 > 0.51.6-r1
+0.51.6-r1 < 1.0.6-r6
+1.0.6-r6 > 0.8.3
+0.8.3 < 1.42
+1.42 < 20030719
+20030719 > 4.01
+4.01 < 4.20
+4.20 > 0.20070118
+0.20070118 < 0.20070207_rc1
+0.20070207_rc1 < 1.0
+1.0 < 1.13.0
+1.13.0 < 1.13.1
+1.13.1 > 0.21
+0.21 > 0.3.7-r3
+0.3.7-r3 < 0.4.10
+0.4.10 < 0.5.0
+0.5.0 < 0.5.5
+0.5.5 < 0.5.7
+0.5.7 < 0.6.11-r1
+0.6.11-r1 < 2.3.30-r2
+2.3.30-r2 < 3.7_p1
+3.7_p1 > 1.3
+1.3 > 0.10.1
+0.10.1 < 4.3_p2-r1
+4.3_p2-r1 < 4.3_p2-r5
+4.3_p2-r5 < 4.4_p1-r6
+4.4_p1-r6 < 4.5_p1-r1
+4.5_p1-r1 > 4.5_p1
+4.5_p1 < 4.5_p1-r1
+4.5_p1-r1 > 4.5_p1
+4.5_p1 > 0.9.8c-r1
+0.9.8c-r1 < 0.9.8d
+0.9.8d < 2.4.4
+2.4.4 < 2.4.7
+2.4.7 > 2.0.6
+2.0.6 = 2.0.6
+2.0.6 > 0.78-r3
+0.78-r3 > 0.3.2
+0.3.2 < 1.7.1-r1
+1.7.1-r1 < 2.5.9
+2.5.9 > 0.1.13
+0.1.13 < 0.1.15
+0.1.15 < 0.4
+0.4 < 0.9.6
+0.9.6 < 2.2.0-r1
+2.2.0-r1 < 2.2.3-r2
+2.2.3-r2 < 013
+013 < 014-r1
+014-r1 > 1.3.1-r1
+1.3.1-r1 < 5.8.8-r2
+5.8.8-r2 > 5.1.6-r4
+5.1.6-r4 < 5.1.6-r6
+5.1.6-r6 < 5.2.1-r3
+5.2.1-r3 > 0.11.3
+0.11.3 = 0.11.3
+0.11.3 < 1.10.7
+1.10.7 > 1.7-r1
+1.7-r1 > 0.1.20
+0.1.20 < 0.1.23
+0.1.23 < 5b-r9
+5b-r9 > 2.2.10
+2.2.10 < 2.3.6
+2.3.6 < 8.0.12
+8.0.12 > 2.4.3-r16
+2.4.3-r16 < 2.4.4-r4
+2.4.4-r4 < 3.0.3-r5
+3.0.3-r5 < 3.0.6
+3.0.6 < 3.2.6
+3.2.6 < 3.2.7
+3.2.7 > 0.3.1_rc8
+0.3.1_rc8 < 22.2
+22.2 < 22.3
+22.3 > 1.2.2
+1.2.2 < 2.04
+2.04 < 2.4.3-r1
+2.4.3-r1 < 2.4.3-r4
+2.4.3-r4 > 0.98.6-r1
+0.98.6-r1 < 5.7-r2
+5.7-r2 < 5.7-r3
+5.7-r3 > 5.1_p4
+5.1_p4 > 1.0.5
+1.0.5 < 3.6.19-r1
+3.6.19-r1 > 3.6.19
+3.6.19 > 1.0.1
+1.0.1 < 3.8
+3.8 > 0.2.3
+0.2.3 < 1.2.15-r3
+1.2.15-r3 > 1.2.6-r1
+1.2.6-r1 < 2.6.8-r2
+2.6.8-r2 < 2.6.9-r1
+2.6.9-r1 > 1.7
+1.7 < 1.7b
+1.7b < 1.8.4-r3
+1.8.4-r3 < 1.8.5
+1.8.5 < 1.8.5_p2
+1.8.5_p2 > 1.1.3
+1.1.3 < 3.0.22-r3
+3.0.22-r3 < 3.0.24
+3.0.24 = 3.0.24
+3.0.24 = 3.0.24
+3.0.24 < 4.0.2-r5
+4.0.2-r5 < 4.0.3
+4.0.3 > 0.98
+0.98 < 1.00
+1.00 < 4.1.4-r1
+4.1.4-r1 < 4.1.5
+4.1.5 > 2.3
+2.3 < 2.17-r3
+2.17-r3 > 0.1.7
+0.1.7 < 1.11
+1.11 < 4.2.1-r11
+4.2.1-r11 > 3.2.3
+3.2.3 < 3.2.4
+3.2.4 < 3.2.8
+3.2.8 < 3.2.9
+3.2.9 > 3.2.3
+3.2.3 < 3.2.4
+3.2.4 < 3.2.8
+3.2.8 < 3.2.9
+3.2.9 > 1.4.9-r2
+1.4.9-r2 < 2.9.11_pre20051101-r2
+2.9.11_pre20051101-r2 < 2.9.11_pre20051101-r3
+2.9.11_pre20051101-r3 > 2.9.11_pre20051101
+2.9.11_pre20051101 < 2.9.11_pre20061021-r1
+2.9.11_pre20061021-r1 < 2.9.11_pre20061021-r2
+2.9.11_pre20061021-r2 < 5.36-r1
+5.36-r1 > 1.0.1
+1.0.1 < 7.0-r2
+7.0-r2 > 2.4.5
+2.4.5 < 2.6.1.2
+2.6.1.2 < 2.6.1.3-r1
+2.6.1.3-r1 > 2.6.1.3
+2.6.1.3 < 2.6.1.3-r1
+2.6.1.3-r1 < 12.17.9
+12.17.9 > 1.1.12
+1.1.12 > 1.1.7
+1.1.7 < 2.5.14
+2.5.14 < 2.6.6-r1
+2.6.6-r1 < 2.6.7
+2.6.7 < 2.6.9-r1
+2.6.9-r1 > 2.6.9
+2.6.9 > 1.39
+1.39 > 0.9
+0.9 < 2.61-r2
+2.61-r2 < 4.5.14
+4.5.14 > 4.09-r1
+4.09-r1 > 1.3.1
+1.3.1 < 1.3.2-r3
+1.3.2-r3 < 1.6.8_p12-r1
+1.6.8_p12-r1 > 1.6.8_p9-r2
+1.6.8_p9-r2 > 1.3.0-r1
+1.3.0-r1 < 3.11
+3.11 < 3.20
+3.20 > 1.6.11-r1
+1.6.11-r1 > 1.6.9
+1.6.9 < 5.0.5-r2
+5.0.5-r2 > 2.86-r5
+2.86-r5 < 2.86-r6
+2.86-r6 > 1.15.1-r1
+1.15.1-r1 < 8.4.9
+8.4.9 > 7.6-r8
+7.6-r8 > 3.9.4-r2
+3.9.4-r2 < 3.9.4-r3
+3.9.4-r3 < 3.9.5-r2
+3.9.5-r2 > 1.1.9
+1.1.9 > 1.0.6
+1.0.6 < 5.9
+5.9 < 6.5
+6.5 > 0.40-r1
+0.40-r1 < 2.25b-r5
+2.25b-r5 < 2.25b-r6
+2.25b-r6 > 1.0.4
+1.0.4 < 1.0.5
+1.0.5 < 1.4_p12-r2
+1.4_p12-r2 < 1.4_p12-r5
+1.4_p12-r5 > 1.1
+1.1 > 0.2.0-r1
+0.2.0-r1 < 0.2.1
+0.2.1 < 0.9.28-r1
+0.9.28-r1 < 0.9.28-r2
+0.9.28-r2 < 0.9.28.1
+0.9.28.1 > 0.9.28
+0.9.28 < 0.9.28.1
+0.9.28.1 < 087-r1
+087-r1 < 103
+103 < 104-r11
+104-r11 > 104-r9
+104-r9 > 1.23-r1
+1.23-r1 > 1.23
+1.23 < 1.23-r1
+1.23-r1 > 1.0.2
+1.0.2 < 5.52-r1
+5.52-r1 > 1.2.5_rc2
+1.2.5_rc2 > 0.1
+0.1 < 0.71-r1
+0.71-r1 < 20040406-r1
+20040406-r1 > 2.12r-r4
+2.12r-r4 < 2.12r-r5
+2.12r-r5 > 0.0.7
+0.0.7 < 1.0.3
+1.0.3 < 1.8
+1.8 < 7.0.17
+7.0.17 < 7.0.174
+7.0.174 > 7.0.17
+7.0.17 < 7.0.174
+7.0.174 > 1.0.1
+1.0.1 < 1.1.1-r3
+1.1.1-r3 > 0.3.4_pre20061029
+0.3.4_pre20061029 < 0.4.0
+0.4.0 > 0.1.2
+0.1.2 < 1.10.2
+1.10.2 < 2.16
+2.16 < 28
+28 > 0.99.4
+0.99.4 < 1.13
+1.13 > 1.0.1
+1.0.1 < 1.1.2-r2
+1.1.2-r2 > 1.1.0
+1.1.0 < 1.1.1
+1.1.1 = 1.1.1
+1.1.1 > 0.6.0
+0.6.0 < 6.6.3
+6.6.3 > 1.1.1
+1.1.1 > 1.1.0
+1.1.0 = 1.1.0
+1.1.0 > 0.2.0
+0.2.0 < 0.3.0
+0.3.0 < 1.1.1
+1.1.1 < 1.2.0
+1.2.0 > 1.1.0
+1.1.0 < 1.6.5
+1.6.5 > 1.1.0
+1.1.0 < 1.4.2
+1.4.2 > 1.1.1
+1.1.1 < 2.8.1
+2.8.1 > 1.2.0
+1.2.0 < 4.1.0
+4.1.0 > 0.4.1
+0.4.1 < 1.9.1
+1.9.1 < 2.1.1
+2.1.1 > 1.4.1
+1.4.1 > 0.9.1-r1
+0.9.1-r1 > 0.8.1
+0.8.1 < 1.2.1-r1
+1.2.1-r1 > 1.1.0
+1.1.0 < 1.2.1
+1.2.1 > 1.1.0
+1.1.0 > 0.1.1
+0.1.1 < 1.2.1
+1.2.1 < 4.1.0
+4.1.0 > 0.2.1-r1
+0.2.1-r1 < 1.1.0
+1.1.0 < 2.7.11
+2.7.11 > 1.0.2-r6
+1.0.2-r6 > 1.0.2
+1.0.2 > 0.8
+0.8 < 1.1.1-r4
+1.1.1-r4 < 222
+222 > 1.0.1
+1.0.1 < 1.2.12-r1
+1.2.12-r1 > 1.2.8
+1.2.8 < 1.2.9.1-r1
+1.2.9.1-r1 > 1.2.9.1
+1.2.9.1 < 2.31-r1
+2.31-r1 > 2.31
+2.31 > 1.2.3-r1
+1.2.3-r1 > 1.2.3
+1.2.3 < 4.2.5
+4.2.5 < 4.3.2-r2
+1.3-r0 < 1.3.1-r0
+1.3_pre1-r1 < 1.3.2
+1.0_p10-r0 > 1.0_p9-r0
+0.1.0_alpha_pre2 < 0.1.0_alpha