Fixes #3133: Properly handle release candidates in version comparison
Deduplicate version checking code across scripts License: MIT Signed-off-by: Mateusz Naściszewski <matin1111@wp.pl>
mateon1 committed
Aug 27, 2016 at 20:42 UTC
16672127b85ff07b5ee0c54bfa2fe55b900a6e7c
3 files changed
+87
-98
bin/check_go_version
+5
-49
@@ -23,55 +23,11 @@ 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
-}
26
+# Get path to the directory containing this file
27
+# If $0 has no slashes, uses "./"
28
+PREFIX=$(expr $0 : "\(.*\/\)") || PREFIX='./'
29
+# Include the 'check_at_least_version' function
30
+. ${PREFIX}check_version
31
32
# Check that the go binary exist and is in the path
33
bin/check_gx_program
+5
-49
@@ -27,55 +27,11 @@ 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
-
56
- if MIN_MIN=$(expr "$MIN_VERS" : "[^.]*\.\([^.]*\).*"); 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" : "[^.]*\.\([^.]*\).*"); then
63
- CUR_FIX=$(expr "$CUR_VERS" : "[^.]*\.[^.]*\.\([^.]*\).*") || CUR_FIX="0"
64
- else
65
- CUR_MIN="0"
66
- CUR_FIX="0"
67
- fi
68
-
69
- # Compare versions
70
- VERS_LEAST="$PROG_NAME version '$CUR_VERS' should be at least '$MIN_VERS'"
71
- test "$CUR_MAJ" -gt $(expr "$MIN_MAJ" - 1) || die_upgrade "$VERS_LEAST"
72
- test "$CUR_MAJ" -gt "$MIN_MAJ" || {
73
- test "$CUR_MIN" -gt $(expr "$MIN_MIN" - 1) || die_upgrade "$VERS_LEAST"
74
- test "$CUR_MIN" -gt "$MIN_MIN" || {
75
- test "$CUR_FIX" -ge "$MIN_FIX" || die_upgrade "$VERS_LEAST"
76
- }
77
- }
78
-}
30
+# Get path to the directory containing this file
31
+# If $0 has no slashes, uses "./"
32
+PREFIX=$(expr $0 : "\(.*\/\)") || PREFIX='./'
33
+# Include the 'check_at_least_version' function
34
+. ${PREFIX}check_version
35
36
# Check that the gx program exists
37
bin/check_version
new
+77
@@ -0,0 +1,77 @@
1
+#!/bin/sh
2
+
3
+if test "x$UPGRADE_MSG" = "x"; then
4
+ printf >&2 "fatal: Please set '"'$UPGRADE_MSG'"' before sourcing this script\n"
5
+ exit 1
6
+fi
7
+
8
+die_upgrade() {
9
+ printf >&2 "fatal: %s\n" "$@"
10
+ printf >&2 "=> %s\n" "$UPGRADE_MSG"
11
+ exit 1
12
+}
13
+
14
+major_number() {
15
+ vers="$1"
16
+
17
+ # Hack around 'expr' exiting with code 1 when it outputs 0
18
+ case "$vers" in
19
+ 0) echo "0" ;;
20
+ 0.*) echo "0" ;;
21
+ *) expr "$vers" : "\([^.]*\).*" || return 1
22
+ esac
23
+}
24
+
25
+check_at_least_version() {
26
+ MIN_VERS="$1"
27
+ CUR_VERS="$2"
28
+ PROG_NAME="$3"
29
+
30
+ # Get major, minor and fix numbers for each version
31
+ MIN_MAJ=$(major_number "$MIN_VERS") || die "No major version number in '$MIN_VERS' for '$PROG_NAME'"
32
+ CUR_MAJ=$(major_number "$CUR_VERS") || die "No major version number in '$CUR_VERS' for '$PROG_NAME'"
33
+
34
+ # We expect a version to be of form X.X.X
35
+ # if the second dot doesn't match, we consider it a prerelease
36
+
37
+ if MIN_MIN=$(expr "$MIN_VERS" : "[^.]*\.\([0-9]\+\)"); then
38
+ # this captured digit is neccessary, since expr returns code 1 if the output is empty
39
+ if expr "$MIN_VERS" : "[^.]*\.[0-9]*\([0-9]\.\|[0-9]\$\)" >/dev/null; then
40
+ MIN_PRERELEASE="0"
41
+ else
42
+ MIN_PRERELEASE="1"
43
+ fi
44
+ MIN_FIX=$(expr "$MIN_VERS" : "[^.]*\.[0-9]\+[^0-9]\+\([0-9]\+\)") || MIN_FIX="0"
45
+ else
46
+ MIN_MIN="0"
47
+ MIN_PRERELEASE="0"
48
+ MIN_FIX="0"
49
+ fi
50
+ if CUR_MIN=$(expr "$CUR_VERS" : "[^.]*\.\([0-9]\+\)"); then
51
+ # this captured digit is neccessary, since expr returns code 1 if the output is empty
52
+ if expr "$CUR_VERS" : "[^.]*\.[0-9]*\([0-9]\.\|[0-9]\$\)" >/dev/null; then
53
+ CUR_PRERELEASE="0"
54
+ else
55
+ CUR_PRERELEASE="1"
56
+ fi
57
+ CUR_FIX=$(expr "$CUR_VERS" : "[^.]*\.[0-9]\+[^0-9]\+\([0-9]\+\)") || CUR_FIX="0"
58
+ else
59
+ CUR_MIN="0"
60
+ CUR_PRERELEASE="0"
61
+ CUR_FIX="0"
62
+ fi
63
+
64
+ # Compare versions
65
+ VERS_LEAST="$PROG_NAME version '$CUR_VERS' should be at least '$MIN_VERS'"
66
+ test "$CUR_MAJ" -lt "$MIN_MAJ" && die_upgrade "$VERS_LEAST"
67
+ test "$CUR_MAJ" -gt "$MIN_MAJ" || {
68
+ test "$CUR_MIN" -lt "$MIN_MIN" && die_upgrade "$VERS_LEAST"
69
+ test "$CUR_MIN" -gt "$MIN_MIN" || {
70
+ test "$CUR_PRERELEASE" -gt "$MIN_PRERELEASE" && die_upgrade "$VERS_LEAST"
71
+ test "$CUR_PRERELEASE" -lt "$MIN_PRERELEASE" || {
72
+ test "$CUR_FIX" -lt "$MIN_FIX" && die_upgrade "$VERS_LEAST"
73
+ true
74
+ }
75
+ }
76
+ }
77
+}