diff options
author | bill-auger <mr.j.spam.me@gmail.com> | 2023-07-11 20:46:59 -0400 |
---|---|---|
committer | bill-auger <mr.j.spam.me@gmail.com> | 2023-07-13 21:22:45 -0400 |
commit | 3c6d0e3246cff98e9c1a81c4d5cba900df8fb71a (patch) | |
tree | 5251e259592e8b83e1616aacdd872b3f69af5c9f | |
parent | 1ef558f39bbf80e285b1e7c0cf0a3fd7260ae470 (diff) |
[scripts/version_constraint.sh]: add reference script with tests
-rwxr-xr-x | scripts/version_constraint.sh | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/scripts/version_constraint.sh b/scripts/version_constraint.sh new file mode 100755 index 000000000..53db47dc8 --- /dev/null +++ b/scripts/version_constraint.sh @@ -0,0 +1,116 @@ +#!/bin/bash + +_version_constraint() # (dep_pkgname [precision]) +{ + Log() { [[ "${FUNCNAME[2]}" == package ]] && echo "$@" >&2 || : ; } + + + local dep_pkgname=$1 + declare -i req_precision=$2 + local full_version=$(pacman -S --print-format='%v' ${dep_pkgname} | tail -n 1) + local n_dots=$(tmp=${full_version%-*} ; tmp=${tmp//[^\.]} ; echo "${#tmp}" ;) + local def_precision=$(( n_dots + 1 )) + local is_prec_valid=$(( req_precision > 0 && req_precision <= def_precision )) + local precision=$( (( is_prec_valid )) && echo ${req_precision} || echo ${def_precision} ) + local pkgver_rx='[^-\.\ ]+' + local subver_rx='\.'${pkgver_rx} + local pkgrel_rx='[^-\ ]+' + local capture_rx=${pkgver_rx} + for (( n_dots=1 ; n_dots < precision ; ++n_dots )) ; do capture_rx+=${subver_rx} ; done ; + local version pkgrel subver_inc pkgrel_inc version_min version_max constraint_string + + if [[ "${full_version}" =~ ^(${capture_rx})(${subver_rx})*-(${pkgrel_rx})$ ]] + then version=${BASH_REMATCH[1]} + pkgrel=${BASH_REMATCH[3]%%.*} + subver_inc=$(( ${version##*.} + 1 )) # NOTE: this right-trims from any non-numeric + pkgrel_inc=$(( pkgrel + 1 )) + version_min=$( (( ! is_prec_valid )) && echo ${full_version%-*}-${pkgrel} || \ + echo ${version} ) + version_max=$( ( (( ! is_prec_valid )) && echo ${full_version%-*}-${pkgrel_inc} ) || \ + ( [[ "${version}" =~ \. ]] && echo ${version%.*}.${subver_inc} ) || \ + echo ${subver_inc} ) + constraint_string="${dep_pkgname}>=${version_min} ${dep_pkgname}<${version_max}" + + Log "Applied version constraint: '${constraint_string}'" + else Log "ERROR: in _version_constraint() parsing: dep_pkgname='${dep_pkgname}' full_version='${full_version}'" + exit 1 + fi + + echo -n "${constraint_string}" +} + + +## tests ## + +# NOTE: test data versions are extremely brittle - these will need adjustments routinely +# usually, these values will be the reported failed 'actual' - `pacman -Syu` first! +readonly OPENEXR_VER_MIN_PR_1=3 ; OPENEXR_VER_MAX_PR_1=4 ; +readonly OPENEXR_VER_MIN_PR_2=3.1 ; OPENEXR_VER_MAX_PR_2=3.2 ; +readonly OPENEXR_VER_MIN_PR_3=3.1.9 ; OPENEXR_VER_MAX_PR_3=3.1.10 ; +readonly OPENEXR_VER_MIN_FULL=3.1.9-1 ; OPENEXR_VER_MAX_FULL=3.1.9-2 ; +readonly OPENSHADINGLANGUAGE_VER_MIN_PR_1=1 ; OPENSHADINGLANGUAGE_VER_MAX_PR_1=2 ; +readonly OPENSHADINGLANGUAGE_VER_MIN_PR_2=1.12 ; OPENSHADINGLANGUAGE_VER_MAX_PR_2=1.13 ; +readonly OPENSHADINGLANGUAGE_VER_MIN_PR_3=1.12.13 ; OPENSHADINGLANGUAGE_VER_MAX_PR_3=1.12.14 ; +readonly OPENSHADINGLANGUAGE_VER_MIN_PR_4=1.12.13.0 ; OPENSHADINGLANGUAGE_VER_MAX_PR_4=1.12.13.1 ; +readonly OPENSHADINGLANGUAGE_VER_MIN_FULL=1.12.13.0-1 ; OPENSHADINGLANGUAGE_VER_MAX_FULL=1.12.13.0-2 ; +readonly WEBKIT2GTK_VER_MIN=2.40.3-1 ; WEBKIT2GTK_VER_MAX=2.40.3-2 ; +readonly QT5BASE_VER_MIN=5.15.10+kde+r130 ; QT5BASE_VER_MAX=5.15.11 ; + +readonly RED='\033[01;31m' +readonly GREEN='\033[00;32m' +readonly AQUA='\033[00;36m' +readonly CEND='\033[00m' + + +TestVersionConstraint() # ("pkgname" "precision" "expected_res") +{ + local pkgname="$1" + local precision="$2" + local expected_res="$3" + + local actual_res="$(_version_constraint "${pkgname}" "${precision}" 2> /dev/null)" +# local actual_res="$(_version_constraint "${pkgname}" "${precision}")" + + if [[ "${actual_res}" == "${expected_res}" ]] + then echo -e "${GREEN}PASS <- ${pkgname}${CEND}" ; return 0 ; + else echo -e "${RED}FAIL <- ${pkgname}${CEND}" + echo -e "${AQUA} expected='${expected_res}'\n actual ='${actual_res}'${CEND}" ; return 1 ; + fi +} + +RunTests() +{ + set -e + + precision=1 ; echo -e "\n=== precision='${precision}' ===" ; + TestVersionConstraint 'openexr' "${precision}" "openexr>=${OPENEXR_VER_MIN_PR_1} openexr<${OPENEXR_VER_MAX_PR_1}" + TestVersionConstraint 'openshadinglanguage' "${precision}" "openshadinglanguage>=${OPENSHADINGLANGUAGE_VER_MIN_PR_1} openshadinglanguage<${OPENSHADINGLANGUAGE_VER_MAX_PR_1}" + + precision=2 ; echo -e "\n=== precision='${precision}' ===" ; + TestVersionConstraint 'openexr' "${precision}" "openexr>=${OPENEXR_VER_MIN_PR_2} openexr<${OPENEXR_VER_MAX_PR_2}" + TestVersionConstraint 'openshadinglanguage' "${precision}" "openshadinglanguage>=${OPENSHADINGLANGUAGE_VER_MIN_PR_2} openshadinglanguage<${OPENSHADINGLANGUAGE_VER_MAX_PR_2}" + + precision=3 ; echo -e "\n=== precision='${precision}' ===" ; + TestVersionConstraint 'openexr' "${precision}" "openexr>=${OPENEXR_VER_MIN_PR_3} openexr<${OPENEXR_VER_MAX_PR_3}" + TestVersionConstraint 'openshadinglanguage' "${precision}" "openshadinglanguage>=${OPENSHADINGLANGUAGE_VER_MIN_PR_3} openshadinglanguage<${OPENSHADINGLANGUAGE_VER_MAX_PR_3}" + + precision=4 ; echo -e "\n=== precision='${precision}' ===" ; + TestVersionConstraint 'openexr' "${precision}" "openexr>=${OPENEXR_VER_MIN_FULL} openexr<${OPENEXR_VER_MAX_FULL}" + TestVersionConstraint 'openshadinglanguage' "${precision}" "openshadinglanguage>=${OPENSHADINGLANGUAGE_VER_MIN_PR_4} openshadinglanguage<${OPENSHADINGLANGUAGE_VER_MAX_PR_4}" + + precision= ; echo -e "\n=== full precision (default) ===" ; + TestVersionConstraint 'openexr' "${precision}" "openexr>=${OPENEXR_VER_MIN_FULL} openexr<${OPENEXR_VER_MAX_FULL}" + TestVersionConstraint 'openshadinglanguage' "${precision}" "openshadinglanguage>=${OPENSHADINGLANGUAGE_VER_MIN_FULL} openshadinglanguage<${OPENSHADINGLANGUAGE_VER_MAX_FULL}" + + precision= ; echo -e "\n=== non-existent-package ===" ; + TestVersionConstraint 'non-existent-package' "${precision}" '' + + precision= ; echo -e "\n=== specific repo ===" ; + TestVersionConstraint 'extra/webkit2gtk' "${precision}" "extra/webkit2gtk>=${WEBKIT2GTK_VER_MIN} extra/webkit2gtk<${WEBKIT2GTK_VER_MAX}" + + precision=3 ; echo -e "\n=== non-numeric version ===" ; + TestVersionConstraint 'qt5-base' "${precision}" "qt5-base>=${QT5BASE_VER_MIN} qt5-base<${QT5BASE_VER_MAX}" +} + + +RunTests |