|
rpm-build |
3ee90c |
#!/bin/sh
|
|
rpm-build |
3ee90c |
#
|
|
rpm-build |
3ee90c |
# Find the (sub-)schema that best matches a desired version.
|
|
rpm-build |
3ee90c |
#
|
|
rpm-build |
3ee90c |
# Version numbers are assumed to be in the format X.Y,
|
|
rpm-build |
3ee90c |
# where X and Y are integers, and Y is no more than 3 digits,
|
|
rpm-build |
3ee90c |
# or the special value "next".
|
|
rpm-build |
3ee90c |
#
|
|
rpm-build |
3ee90c |
|
|
rpm-build |
3ee90c |
# (Sub-)schema name (e.g. "resources")
|
|
rpm-build |
3ee90c |
base="$1"; shift
|
|
rpm-build |
3ee90c |
|
|
rpm-build |
3ee90c |
# Desired version (e.g. "1.0" or "next")
|
|
rpm-build |
3ee90c |
target="$1"; shift
|
|
rpm-build |
3ee90c |
|
|
rpm-build |
3ee90c |
# If not empty, append the best match as an XML externalRef to this file
|
|
rpm-build |
3ee90c |
# (otherwise, just echo the best match). Using readlink allows building
|
|
rpm-build |
3ee90c |
# from a different directory.
|
|
rpm-build |
3ee90c |
destination="$(readlink -f "$1")"; shift
|
|
rpm-build |
3ee90c |
|
|
rpm-build |
3ee90c |
# Arbitrary text to print before XML (generally spaces to indent)
|
|
rpm-build |
3ee90c |
prefix="$1"; shift
|
|
rpm-build |
3ee90c |
|
|
rpm-build |
3ee90c |
# Allow building from a different directory
|
|
rpm-build |
3ee90c |
cd "$(dirname $0)"
|
|
rpm-build |
3ee90c |
|
|
rpm-build |
3ee90c |
list_candidates() {
|
|
rpm-build |
3ee90c |
ls -1 "${1}.rng" "${1}"-*.rng 2>/dev/null
|
|
rpm-build |
3ee90c |
}
|
|
rpm-build |
3ee90c |
|
|
rpm-build |
3ee90c |
version_from_filename() {
|
|
rpm-build |
3ee90c |
vff_filename="$1"
|
|
rpm-build |
3ee90c |
|
|
rpm-build |
3ee90c |
case "$vff_filename" in
|
|
rpm-build |
3ee90c |
*-*.rng)
|
|
rpm-build |
3ee90c |
echo "$vff_filename" | sed -e 's/.*-\(.*\).rng/\1/'
|
|
rpm-build |
3ee90c |
;;
|
|
rpm-build |
3ee90c |
*)
|
|
rpm-build |
3ee90c |
# special case for bare ${base}.rng, no -0.1's around anyway
|
|
rpm-build |
3ee90c |
echo 0.1
|
|
rpm-build |
3ee90c |
;;
|
|
rpm-build |
3ee90c |
esac
|
|
rpm-build |
3ee90c |
}
|
|
rpm-build |
3ee90c |
|
|
rpm-build |
3ee90c |
filename_from_version() {
|
|
rpm-build |
3ee90c |
ffv_version="$1"
|
|
rpm-build |
3ee90c |
ffv_base="$2"
|
|
rpm-build |
3ee90c |
|
|
rpm-build |
3ee90c |
if [ "$ffv_version" = "0.1" ]; then
|
|
rpm-build |
3ee90c |
echo "${ffv_base}.rng"
|
|
rpm-build |
3ee90c |
else
|
|
rpm-build |
3ee90c |
echo "${ffv_base}-${ffv_version}.rng"
|
|
rpm-build |
3ee90c |
fi
|
|
rpm-build |
3ee90c |
}
|
|
rpm-build |
3ee90c |
|
|
rpm-build |
3ee90c |
# Convert version string (e.g. 2.10) into integer (e.g. 2010) for comparisons
|
|
rpm-build |
3ee90c |
int_version() {
|
|
rpm-build |
3ee90c |
echo "$1" | awk -F. '{ printf("%d%03d\n", $1,$2); }';
|
|
rpm-build |
3ee90c |
}
|
|
rpm-build |
3ee90c |
|
|
rpm-build |
3ee90c |
best="0.0"
|
|
rpm-build |
3ee90c |
for rng in $(list_candidates "${base}"); do
|
|
rpm-build |
3ee90c |
case ${rng} in
|
|
rpm-build |
3ee90c |
${base}-${target}.rng)
|
|
rpm-build |
3ee90c |
# We found exactly what was requested
|
|
rpm-build |
3ee90c |
best=${target}
|
|
rpm-build |
3ee90c |
break
|
|
rpm-build |
3ee90c |
;;
|
|
rpm-build |
3ee90c |
*-next.rng)
|
|
rpm-build |
3ee90c |
# "Next" schemas cannot be a best match unless directly requested
|
|
rpm-build |
3ee90c |
;;
|
|
rpm-build |
3ee90c |
*)
|
|
rpm-build |
3ee90c |
v=$(version_from_filename "${rng}")
|
|
rpm-build |
3ee90c |
if [ $(int_version "${v}") -gt $(int_version "${best}") ]; then
|
|
rpm-build |
3ee90c |
# This version beats the previous best match
|
|
rpm-build |
3ee90c |
|
|
rpm-build |
3ee90c |
if [ "${target}" = "next" ]; then
|
|
rpm-build |
3ee90c |
best=${v}
|
|
rpm-build |
3ee90c |
elif [ $(int_version "${v}") -lt $(int_version "${target}") ]; then
|
|
rpm-build |
3ee90c |
# This value is best only if it's still less than the target
|
|
rpm-build |
3ee90c |
best=${v}
|
|
rpm-build |
3ee90c |
fi
|
|
rpm-build |
3ee90c |
fi
|
|
rpm-build |
3ee90c |
;;
|
|
rpm-build |
3ee90c |
esac
|
|
rpm-build |
3ee90c |
done
|
|
rpm-build |
3ee90c |
|
|
rpm-build |
3ee90c |
if [ "$best" != "0.0" ]; then
|
|
rpm-build |
3ee90c |
found=$(filename_from_version "$best" "$base")
|
|
rpm-build |
3ee90c |
if [ -z "$destination" ]; then
|
|
rpm-build |
3ee90c |
echo "$(basename $found)"
|
|
rpm-build |
3ee90c |
else
|
|
rpm-build |
3ee90c |
echo "${prefix}<externalRef href=\"$(basename $found)\"/>" >> "$destination"
|
|
rpm-build |
3ee90c |
fi
|
|
rpm-build |
3ee90c |
exit 0
|
|
rpm-build |
3ee90c |
fi
|
|
rpm-build |
3ee90c |
|
|
rpm-build |
3ee90c |
exit 1
|