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