implémenter la comparaison

This commit is contained in:
Jephte CLAIN 2014-01-18 23:07:41 +04:00
parent aafca0172d
commit c3243fddb1
2 changed files with 61 additions and 5 deletions

View File

@ -122,7 +122,60 @@ function semver_setprelease() {
}
function semver_compare_prelease() {
echo err
local -a __cp_pr1 __cp_pr2 __cp_len i __cp_v1 __cp_v2
array_copy __cp_pr1 "$1"
array_copy __cp_pr2 "$2"
if [ ${#__cp_pr1[*]} -eq 0 -a ${#__cp_pr2[*]} -eq 0 ]; then
# final == final
echo eq; return
elif [ ${#__cp_pr1[*]} -gt 0 -a ${#__cp_pr2[*]} -eq 0 ]; then
# prelease < final
echo lt; return
elif [ ${#__cp_pr1[*]} -eq 0 -a ${#__cp_pr2[*]} -gt 0 ]; then
# final > prelease
echo gt; return
fi
# calculer le nombre d'éléments à comparer dans les deux tableaux soit
# min(len(__cp_pr1), len(__cp_pr2))
__cp_len=${#__cp_pr1[*]}
[ ${#__cp_pr2[*]} -lt $__cp_len ] && __cp_len=${#__cp_pr2[*]}
# comparer __cp_len éléments
i=0
while [ $i -lt $__cp_len ]; do
__cp_v1="${__cp_pr1[$i]}"
__cp_v2="${__cp_pr2[$i]}"
if [ "$__cp_v1" == "$__cp_v2" ]; then
:
elif isnum "$__cp_v1" && isnum "$__cp_v2"; then
if [ $__cp_v1 -lt $__cp_v2 ]; then
echo lt; return
elif [ $__cp_v1 -gt $__cp_v2 ]; then
echo gt; return
fi
elif isnum "$__cp_v1"; then
echo lt; return
elif isnum "$__cp_v2"; then
echo gt; return
else
# comparaison chaine
if [ "$(echo "$__cp_v1"$'\n'"$__cp_v2" | LANG=C sort | head -n1)" == "$__cp_v1" ]; then
echo lt; return
else
echo gt; return
fi
fi
i=$(($i + 1))
done
# comparer ce qui reste
__cp_pr1=("${__cp_pr1[@]:$__cp_len}")
__cp_pr2=("${__cp_pr2[@]:$__cp_len}")
if [ ${#__cp_pr1[*]} -gt 0 ]; then
echo gt; return
elif [ ${#__cp_pr2[*]} -gt 0 ]; then
echo lt; return
fi
# en définitive, c'est égal
echo eq
}
function semver_setmetadata() {
@ -136,7 +189,8 @@ function semver_setmetadata() {
}
function semver_compare_metadata() {
echo err
# même algo que pour prelease
semver_compare_prelease "$@"
}
function semver_copy() {

View File

@ -35,9 +35,10 @@ OPTIONS
--ge VERSION
--same VERSION
--diff VERSION
Comparer avec la version spécifiée
eq, ne, lt, le, gt, ge ne testent pas la valeur des metadata
same et diff comparent aussi la valeur des metadata
Comparer avec la version spécifiée. Les opérateurs --eq, --ne, --lt,
--le, --gt, et --ge ignorent l'identifiant de build (comme le demande la
règle du versionnage sémantique). Les opérateurs --same et --diff
comparent aussi les identifiants de build.
-v, --set-version VERSION
Spécifier un nouveau numéro de version qui écrase la valeur actuelle.
Cette option ne devrait pas être utilisée en temps normal parce que cela
@ -151,6 +152,7 @@ if [ "$action" == check ]; then
elif [ "$action" == compare ]; then
psemver_parse "$oversion" o
case "$operator" in
eq|same)
for var in valid major minor patchlevel; do