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