scripts/common: Add functions for comparing version strings

This is introduced mainly for convenience. Examples of supported usage:

eq 0xf.1 15.1 # true
gt 1.1.00 2 # false
le 2.33.4 2.44.02 # true
ge 03.03.03 3.3.01 # true
lt 1 0 # false
ge 4.19.0-6-amd64 4.10.0-6-amd64 # true
neq 0.0 0 # false

Change-Id: Iac05fce03bfe95f85ab1c8a7c24c4553ffc6776a
Signed-off-by: Michal Berger <michalx.berger@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/4808
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Tomasz Zawadzki <tomasz.zawadzki@intel.com>
This commit is contained in:
Michal Berger 2020-10-21 18:59:14 +02:00 committed by Tomasz Zawadzki
parent dc45a73d9e
commit 77c4d0f673

View File

@ -235,3 +235,51 @@ function nvme_in_userspace() {
((${#bdfs[@]})) || return 1
printf '%s\n' "${bdfs[@]}"
}
cmp() {
local ver1 ver1_l
local ver2 ver2_l
IFS=".-:" read -ra ver1 <<< "$1"
IFS=".-:" read -ra ver2 <<< "$3"
local op=$2
ver1_l=${#ver1[@]}
ver2_l=${#ver2[@]}
local lt=0 gt=0 eq=0 v
case "$op" in
"<") : $((eq = gt = 1)) ;;
">") : $((eq = lt = 1)) ;;
"<=") : $((gt = 1)) ;;
">=") : $((lt = 1)) ;;
"==") : $((lt = gt = 1)) ;;
esac
decimal() (
local d=${1,,}
if [[ $d =~ ^[0-9]+$ ]]; then
echo $((10#$d))
elif [[ $d =~ ^0x || $d =~ ^[a-f0-9]+$ ]]; then
d=${d/0x/}
echo $((0x$d))
else
echo 0
fi
)
for ((v = 0; v < (ver1_l > ver2_l ? ver1_l : ver2_l); v++)); do
ver1[v]=$(decimal "${ver1[v]}")
ver2[v]=$(decimal "${ver2[v]}")
((ver1[v] > ver2[v])) && return "$gt"
((ver1[v] < ver2[v])) && return "$lt"
done
[[ ${ver1[*]} == "${ver2[*]}" ]] && return "$eq"
}
lt() { cmp "$1" "<" "$2"; }
gt() { cmp "$1" ">" "$2"; }
le() { cmp "$1" "<=" "$2"; }
ge() { cmp "$1" ">=" "$2"; }
eq() { cmp "$1" "==" "$2"; }
neq() { ! eq "$1" "$2"; }