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() { 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() { function semver_setmetadata() {
@ -136,7 +189,8 @@ function semver_setmetadata() {
} }
function semver_compare_metadata() { function semver_compare_metadata() {
echo err # même algo que pour prelease
semver_compare_prelease "$@"
} }
function semver_copy() { function semver_copy() {

View File

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