From 16672127b85ff07b5ee0c54bfa2fe55b900a6e7c Mon Sep 17 00:00:00 2001 From: mateon1 Date: Sat, 27 Aug 2016 20:42:25 +0200 Subject: [PATCH 1/2] Fixes #3133: Properly handle release candidates in version comparison MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Deduplicate version checking code across scripts License: MIT Signed-off-by: Mateusz Naƛciszewski --- bin/check_go_version | 54 +++---------------------------- bin/check_gx_program | 54 +++---------------------------- bin/check_version | 77 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 87 insertions(+), 98 deletions(-) create mode 100755 bin/check_version diff --git a/bin/check_go_version b/bin/check_go_version index 20fae7df5..ae789f9b6 100755 --- a/bin/check_go_version +++ b/bin/check_go_version @@ -23,55 +23,11 @@ GO_MIN_VERSION="$1" UPGRADE_MSG="Please take a look at https://golang.org/doc/install to install or upgrade go." -die_upgrade() { - printf >&2 "fatal: %s\n" "$@" - printf >&2 "=> %s\n" "$UPGRADE_MSG" - exit 1 -} - -major_number() { - vers="$1" - - # Hack around 'expr' exiting with code 1 when it outputs 0 - case "$vers" in - 0) echo "0" ;; - 0.*) echo "0" ;; - *) expr "$vers" : "\([^.]*\).*" || return 1 - esac -} - -check_at_least_version() { - MIN_VERS="$1" - CUR_VERS="$2" - PROG_NAME="$3" - - # Get major, minor and fix numbers for each version - MIN_MAJ=$(major_number "$MIN_VERS") || die "No major version number in '$MIN_VERS' for '$PROG_NAME'" - CUR_MAJ=$(major_number "$CUR_VERS") || die "No major version number in '$CUR_VERS' for '$PROG_NAME'" - - if MIN_MIN=$(expr "$MIN_VERS" : "[^.]*\.\([^.]*\).*"); then - MIN_FIX=$(expr "$MIN_VERS" : "[^.]*\.[^.]*\.\([^.]*\).*") || MIN_FIX="0" - else - MIN_MIN="0" - MIN_FIX="0" - fi - if CUR_MIN=$(expr "$CUR_VERS" : "[^.]*\.\([^.]*\).*"); then - CUR_FIX=$(expr "$CUR_VERS" : "[^.]*\.[^.]*\.\([^.]*\).*") || CUR_FIX="0" - else - CUR_MIN="0" - CUR_FIX="0" - fi - - # Compare versions - VERS_LEAST="$PROG_NAME version '$CUR_VERS' should be at least '$MIN_VERS'" - test "$CUR_MAJ" -gt $(expr "$MIN_MAJ" - 1) || die_upgrade "$VERS_LEAST" - test "$CUR_MAJ" -gt "$MIN_MAJ" || { - test "$CUR_MIN" -gt $(expr "$MIN_MIN" - 1) || die_upgrade "$VERS_LEAST" - test "$CUR_MIN" -gt "$MIN_MIN" || { - test "$CUR_FIX" -ge "$MIN_FIX" || die_upgrade "$VERS_LEAST" - } - } -} +# Get path to the directory containing this file +# If $0 has no slashes, uses "./" +PREFIX=$(expr $0 : "\(.*\/\)") || PREFIX='./' +# Include the 'check_at_least_version' function +. ${PREFIX}check_version # Check that the go binary exist and is in the path diff --git a/bin/check_gx_program b/bin/check_gx_program index 37ada6edc..0c1b1f816 100755 --- a/bin/check_gx_program +++ b/bin/check_gx_program @@ -27,55 +27,11 @@ GX_PROGRAM_NAME="$1" GX_MIN_VERSION="$2" UPGRADE_MSG="$3" -die_upgrade() { - printf >&2 "fatal: %s\n" "$@" - printf >&2 "=> %s\n" "$UPGRADE_MSG" - exit 1 -} - -major_number() { - vers="$1" - - # Hack around 'expr' exiting with code 1 when it outputs 0 - case "$vers" in - 0) echo "0" ;; - 0.*) echo "0" ;; - *) expr "$vers" : "\([^.]*\).*" || return 1 - esac -} - -check_at_least_version() { - MIN_VERS="$1" - CUR_VERS="$2" - PROG_NAME="$3" - - # Get major, minor and fix numbers for each version - MIN_MAJ=$(major_number "$MIN_VERS") || die "No major version number in '$MIN_VERS' for '$PROG_NAME'" - CUR_MAJ=$(major_number "$CUR_VERS") || die "No major version number in '$CUR_VERS' for '$PROG_NAME'" - - if MIN_MIN=$(expr "$MIN_VERS" : "[^.]*\.\([^.]*\).*"); then - MIN_FIX=$(expr "$MIN_VERS" : "[^.]*\.[^.]*\.\([^.]*\).*") || MIN_FIX="0" - else - MIN_MIN="0" - MIN_FIX="0" - fi - if CUR_MIN=$(expr "$CUR_VERS" : "[^.]*\.\([^.]*\).*"); then - CUR_FIX=$(expr "$CUR_VERS" : "[^.]*\.[^.]*\.\([^.]*\).*") || CUR_FIX="0" - else - CUR_MIN="0" - CUR_FIX="0" - fi - - # Compare versions - VERS_LEAST="$PROG_NAME version '$CUR_VERS' should be at least '$MIN_VERS'" - test "$CUR_MAJ" -gt $(expr "$MIN_MAJ" - 1) || die_upgrade "$VERS_LEAST" - test "$CUR_MAJ" -gt "$MIN_MAJ" || { - test "$CUR_MIN" -gt $(expr "$MIN_MIN" - 1) || die_upgrade "$VERS_LEAST" - test "$CUR_MIN" -gt "$MIN_MIN" || { - test "$CUR_FIX" -ge "$MIN_FIX" || die_upgrade "$VERS_LEAST" - } - } -} +# Get path to the directory containing this file +# If $0 has no slashes, uses "./" +PREFIX=$(expr $0 : "\(.*\/\)") || PREFIX='./' +# Include the 'check_at_least_version' function +. ${PREFIX}check_version # Check that the gx program exists diff --git a/bin/check_version b/bin/check_version new file mode 100755 index 000000000..401471c31 --- /dev/null +++ b/bin/check_version @@ -0,0 +1,77 @@ +#!/bin/sh + +if test "x$UPGRADE_MSG" = "x"; then + printf >&2 "fatal: Please set '"'$UPGRADE_MSG'"' before sourcing this script\n" + exit 1 +fi + +die_upgrade() { + printf >&2 "fatal: %s\n" "$@" + printf >&2 "=> %s\n" "$UPGRADE_MSG" + exit 1 +} + +major_number() { + vers="$1" + + # Hack around 'expr' exiting with code 1 when it outputs 0 + case "$vers" in + 0) echo "0" ;; + 0.*) echo "0" ;; + *) expr "$vers" : "\([^.]*\).*" || return 1 + esac +} + +check_at_least_version() { + MIN_VERS="$1" + CUR_VERS="$2" + PROG_NAME="$3" + + # Get major, minor and fix numbers for each version + MIN_MAJ=$(major_number "$MIN_VERS") || die "No major version number in '$MIN_VERS' for '$PROG_NAME'" + CUR_MAJ=$(major_number "$CUR_VERS") || die "No major version number in '$CUR_VERS' for '$PROG_NAME'" + + # We expect a version to be of form X.X.X + # if the second dot doesn't match, we consider it a prerelease + + if MIN_MIN=$(expr "$MIN_VERS" : "[^.]*\.\([0-9]\+\)"); then + # this captured digit is neccessary, since expr returns code 1 if the output is empty + if expr "$MIN_VERS" : "[^.]*\.[0-9]*\([0-9]\.\|[0-9]\$\)" >/dev/null; then + MIN_PRERELEASE="0" + else + MIN_PRERELEASE="1" + fi + MIN_FIX=$(expr "$MIN_VERS" : "[^.]*\.[0-9]\+[^0-9]\+\([0-9]\+\)") || MIN_FIX="0" + else + MIN_MIN="0" + MIN_PRERELEASE="0" + MIN_FIX="0" + fi + if CUR_MIN=$(expr "$CUR_VERS" : "[^.]*\.\([0-9]\+\)"); then + # this captured digit is neccessary, since expr returns code 1 if the output is empty + if expr "$CUR_VERS" : "[^.]*\.[0-9]*\([0-9]\.\|[0-9]\$\)" >/dev/null; then + CUR_PRERELEASE="0" + else + CUR_PRERELEASE="1" + fi + CUR_FIX=$(expr "$CUR_VERS" : "[^.]*\.[0-9]\+[^0-9]\+\([0-9]\+\)") || CUR_FIX="0" + else + CUR_MIN="0" + CUR_PRERELEASE="0" + CUR_FIX="0" + fi + + # Compare versions + VERS_LEAST="$PROG_NAME version '$CUR_VERS' should be at least '$MIN_VERS'" + test "$CUR_MAJ" -lt "$MIN_MAJ" && die_upgrade "$VERS_LEAST" + test "$CUR_MAJ" -gt "$MIN_MAJ" || { + test "$CUR_MIN" -lt "$MIN_MIN" && die_upgrade "$VERS_LEAST" + test "$CUR_MIN" -gt "$MIN_MIN" || { + test "$CUR_PRERELEASE" -gt "$MIN_PRERELEASE" && die_upgrade "$VERS_LEAST" + test "$CUR_PRERELEASE" -lt "$MIN_PRERELEASE" || { + test "$CUR_FIX" -lt "$MIN_FIX" && die_upgrade "$VERS_LEAST" + true + } + } + } +} From f9dcc8abb1767e03b6aa578596a224ced05e14e4 Mon Sep 17 00:00:00 2001 From: mateon1 Date: Fri, 2 Sep 2016 21:13:34 +0200 Subject: [PATCH 2/2] Quote `$0` in case it contains spaces MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Mateusz Naƛciszewski --- bin/check_go_version | 2 +- bin/check_gx_program | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/check_go_version b/bin/check_go_version index ae789f9b6..557c9d974 100755 --- a/bin/check_go_version +++ b/bin/check_go_version @@ -25,7 +25,7 @@ UPGRADE_MSG="Please take a look at https://golang.org/doc/install to install or # Get path to the directory containing this file # If $0 has no slashes, uses "./" -PREFIX=$(expr $0 : "\(.*\/\)") || PREFIX='./' +PREFIX=$(expr "$0" : "\(.*\/\)") || PREFIX='./' # Include the 'check_at_least_version' function . ${PREFIX}check_version diff --git a/bin/check_gx_program b/bin/check_gx_program index 0c1b1f816..a1e7770ab 100755 --- a/bin/check_gx_program +++ b/bin/check_gx_program @@ -29,7 +29,7 @@ UPGRADE_MSG="$3" # Get path to the directory containing this file # If $0 has no slashes, uses "./" -PREFIX=$(expr $0 : "\(.*\/\)") || PREFIX='./' +PREFIX=$(expr "$0" : "\(.*\/\)") || PREFIX='./' # Include the 'check_at_least_version' function . ${PREFIX}check_version