Commit 77c4d0f6 authored by Michal Berger's avatar Michal Berger Committed by Tomasz Zawadzki
Browse files

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: default avatarMichal Berger <michalx.berger@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/4808


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarTomasz Zawadzki <tomasz.zawadzki@intel.com>
parent dc45a73d
Loading
Loading
Loading
Loading
+48 −0
Original line number Diff line number Diff line
@@ -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"; }