bin: add check-gx-program
License: MIT Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
Christian Couder committed
Feb 14, 2016 at 22:30 UTC
694f22a4c8b7c9cbcb9f853f8857e4f3ceffaf93
1 file changed
+91
bin/check_gx_program
new
+91
@@ -0,0 +1,91 @@
1
+#!/bin/sh
2
+#
3
+# Check if a gx program is installed and if its version is at least
4
+# equal to a minimum version number.
5
+#
6
+# Call it for example like this:
7
+#
8
+# $ check_gx_program "gx-go" "0.2.0" "Use 'make gx_upgrade' to install or upgrade gx-go."
9
+#
10
+# or:
11
+#
12
+# $ check_gx_program "gx" "0.3" "Use 'make gx_upgrade' to install or upgrade gx."
13
+#
14
+
15
+USAGE="$0 GX_PROGRAM_NAME GX_MIN_VERSION UPGRADE_MSG"
16
+
17
+die() {
18
+ printf >&2 "fatal: %s\n" "$@"
19
+ exit 1
20
+}
21
+
22
+# Get arguments
23
+
24
+test "$#" -eq "3" || die "This program must be passed exactly 3 arguments" "Usage: $USAGE"
25
+
26
+GX_PROGRAM_NAME="$1"
27
+GX_MIN_VERSION="$2"
28
+UPGRADE_MSG="$3"
29
+
30
+die_upgrade() {
31
+ printf >&2 "fatal: %s\n" "$@"
32
+ printf >&2 "=> %s\n" "$UPGRADE_MSG"
33
+ exit 1
34
+}
35
+
36
+major_number() {
37
+ vers="$1"
38
+
39
+ # Hack around 'expr' exiting with code 1 when it outputs 0
40
+ case "$vers" in
41
+ 0) echo "0" ;;
42
+ 0.*) echo "0" ;;
43
+ *) expr "$vers" : "\([^.]*\).*" || return 1
44
+ esac
45
+}
46
+
47
+check_at_least_version() {
48
+ MIN_VERS="$1"
49
+ CUR_VERS="$2"
50
+ PROG_NAME="$3"
51
+
52
+ # Get major, minor and fix numbers for each version
53
+ MIN_MAJ=$(major_number "$MIN_VERS") || die "No major version number in '$MIN_VERS' for '$PROG_NAME'"
54
+ CUR_MAJ=$(major_number "$CUR_VERS") || die "No major version number in '$CUR_VERS' for '$PROG_NAME'"
55
+ if MIN_MIN=$(expr "$MIN_VERS" : "[^.]*\.\([^.]*\).*")
56
+ then
57
+ MIN_FIX=$(expr "$MIN_VERS" : "[^.]*\.[^.]*\.\([^.]*\).*") || MIN_FIX="0"
58
+ else
59
+ MIN_MIN="0"
60
+ MIN_FIX="0"
61
+ fi
62
+ if CUR_MIN=$(expr "$CUR_VERS" : "[^.]*\.\([^.]*\).*")
63
+ then
64
+ CUR_FIX=$(expr "$CUR_VERS" : "[^.]*\.[^.]*\.\([^.]*\).*") || CUR_FIX="0"
65
+ else
66
+ CUR_MIN="0"
67
+ CUR_FIX="0"
68
+ fi
69
+
70
+ # Compare versions
71
+ VERS_LEAST="$PROG_NAME version '$CUR_VERS' should be at least '$MIN_VERS'"
72
+ test "$CUR_MAJ" -gt $(expr "$MIN_MAJ" - 1) || die_upgrade "$VERS_LEAST"
73
+ test "$CUR_MAJ" -gt "$MIN_MAJ" || {
74
+ test "$CUR_MIN" -gt $(expr "$MIN_MIN" - 1) || die_upgrade "$VERS_LEAST"
75
+ test "$CUR_MIN" -gt "$MIN_MIN" || {
76
+ test "$CUR_FIX" -ge "$MIN_FIX" || die_upgrade "$VERS_LEAST"
77
+ }
78
+ }
79
+}
80
+
81
+# Check that the gx program exists
82
+
83
+type "$GX_PROGRAM_NAME" >/dev/null || die_upgrade "Program $GX_PROGRAM_NAME is not installed!"
84
+
85
+# Check the gx program version
86
+
87
+VERS_STR=$($GX_PROGRAM_NAME -v 2>&1) || die "'$GX_PROGRAM_NAME -v' failed with output: $VERS_STR"
88
+
89
+GX_CUR_VERSION=$(expr "$VERS_STR" : "$GX_PROGRAM_NAME version \(.*\)") || die "Invalid '$GX_PROGRAM_NAME -v' output: $VERS_STR"
90
+
91
+check_at_least_version "$GX_MIN_VERSION" "$GX_CUR_VERSION" "$GX_PROGRAM_NAME"