From 77c4d0f673a941c0ee552a1d196b52a1798c3f98 Mon Sep 17 00:00:00 2001 From: Michal Berger Date: Wed, 21 Oct 2020 18:59:14 +0200 Subject: [PATCH] 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 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/4808 Tested-by: SPDK CI Jenkins Reviewed-by: Jim Harris Reviewed-by: Tomasz Zawadzki --- scripts/common.sh | 48 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/scripts/common.sh b/scripts/common.sh index 10dcd4d62..1c475954d 100644 --- a/scripts/common.sh +++ b/scripts/common.sh @@ -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"; }