diff --git a/xml/best-match.sh b/xml/best-match.sh index 02c41f085f..68d79b0ff1 100755 --- a/xml/best-match.sh +++ b/xml/best-match.sh @@ -1,105 +1,108 @@ #!/bin/sh # # Copyright 2014-2024 the Pacemaker project contributors # # The version control history for this file may have further details. # # This source code is licensed under the GNU General Public License version 2 # or later (GPLv2+) WITHOUT ANY WARRANTY. # # Find the (sub-)schema that best matches a desired version. # # Version numbers are assumed to be in the format X.Y, # where X and Y are integers, and Y is no more than 3 digits, # or the special value "next". # (Sub-)schema name (e.g. "resources") base="$1"; shift # Desired version (e.g. "1.0" or "next") target="$1"; shift # If not empty, append the best match as an XML externalRef to this file # (otherwise, just echo the best match). Using readlink allows building # from a different directory. destination="$(readlink -f "$1")"; shift # Arbitrary text to print before XML (generally spaces to indent) prefix="$1"; shift # Allow building from a different directory cd "$(dirname $0)" list_candidates() { ls -1 "${1}.rng" "${1}"-[0-9]*.rng "${1}"-next.rng 2>/dev/null } version_from_filename() { vff_filename="$1" case "$vff_filename" in *-*.rng) echo "$vff_filename" | sed -e 's/.*-\(.*\).rng/\1/' ;; *) # special case for bare ${base}.rng, no -0.1's around anyway echo 0.1 ;; esac } filename_from_version() { ffv_version="$1" ffv_base="$2" if [ "$ffv_version" = "0.1" ]; then echo "${ffv_base}.rng" else echo "${ffv_base}-${ffv_version}.rng" fi } # Convert version string (e.g. 2.10) into integer (e.g. 2010) for comparisons int_version() { echo "$1" | awk -F. '{ printf("%d%03d\n", $1,$2); }'; } -best="0.0" -for rng in $(list_candidates "${base}"); do - case ${rng} in - ${base}-${target}.rng) - # We found exactly what was requested - best=${target} - break - ;; - *-next.rng) - # "Next" schemas cannot be a best match unless directly requested - ;; - *) - v=$(version_from_filename "${rng}") - if [ $(int_version "${v}") -gt $(int_version "${best}") ]; then - # This version beats the previous best match - - if [ "${target}" = "next" ]; then - best=${v} - elif [ $(int_version "${v}") -lt $(int_version "${target}") ]; then - # This value is best only if it's still less than the target - best=${v} +best_match() { + best="0.0" + for rng in $(list_candidates "${base}"); do + case ${rng} in + ${base}-${target}.rng) + # We found exactly what was requested + best=${target} + break + ;; + *-next.rng) + # "Next" schemas cannot be a best match unless directly requested + ;; + *) + v=$(version_from_filename "${rng}") + if [ $(int_version "${v}") -gt $(int_version "${best}") ]; then + # This version beats the previous best match + + if [ "${target}" = "next" ]; then + best=${v} + elif [ $(int_version "${v}") -lt $(int_version "${target}") ]; then + # This value is best only if it's still less than the target + best=${v} + fi fi - fi - ;; - esac -done - -if [ "$best" != "0.0" ]; then - found=$(filename_from_version "$best" "$base") - if [ -z "$destination" ]; then - echo "$(basename $found)" - else - echo "${prefix}" >> "$destination" + ;; + esac + done + + if [ "$best" != "0.0" ]; then + found=$(filename_from_version "$best" "$base") + if [ -z "$destination" ]; then + echo "$(basename $found)" + else + echo "${prefix}" >> "$destination" + fi + return 0 fi - exit 0 -fi + return 1 +} -exit 1 +best_match