nutools/ulib/semver

125 lines
2.8 KiB
Plaintext
Raw Normal View History

##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
## Versionnage sémantique
##@cooked nocomments
##@require base
uprovide semver
urequire base
function semver_parse() {
local _ver="$1" _ma="${2:-major}" _mi="${3:-minor}" _pl="${4:-patchlevel}" _pr="${5:-prelease}" _md="${6:-metadata}" _va="${7:-valid}"
local _tmp
set_var "$_ma" ""
set_var "$_mi" ""
set_var "$_pl" ""
array_new "$_pr"
array_new "$_md"
set_var "$_va" ""
# vérifier les caractères valides
[ -z "${_ver//[a-zA-Z0-9.+-]/}" ] || return 1
# extraire major
_tmp=
while [ "${_ver/#[0-9]/}" != "$_ver" ]; do
_tmp="$_tmp${_ver:0:1}"
_ver="${_ver:1}"
done
[ "${_ver:0:1}" == . ] || return 1
_ver="${_ver:1}"
set_var "$_ma" "$_tmp"
# extraire minor
_tmp=
while [ "${_ver/#[0-9]/}" != "$_ver" ]; do
_tmp="$_tmp${_ver:0:1}"
_ver="${_ver:1}"
done
[ "${_ver:0:1}" == . ] || return 1
_ver="${_ver:1}"
set_var "$_mi" "$_tmp"
# extraire patchlevel
_tmp=
while [ "${_ver/#[0-9]/}" != "$_ver" ]; do
_tmp="$_tmp${_ver:0:1}"
_ver="${_ver:1}"
done
[ -z "$_ver" -o "${_ver:0:1}" == - -o "${_ver:0:1}" == + ] || return 1
set_var "$_pl" "$_tmp"
# extraire prelease
if [ "${_ver:0:1}" == - ]; then
_ver="${_ver:1}"
if [[ "$_ver" == *+* ]]; then
_tmp="${_ver%%+*}"
_ver="+${_ver##*+}"
else
_tmp="$_ver"
_ver=
fi
array_split "$_pr" "$_tmp" .
fi
# extraire metadata
if [ "${_ver:0:1}" == + ]; then
_ver="${_ver:1}"
[[ "$_ver" == *+* ]] && return 1
_tmp="$_ver"
_ver=
array_split "$_md" "$_tmp" .
fi
# on doit avoir tout analysé
[ -z "$_ver" ] || return 1
set_var "$_va" 1
return 0
}
function semver_incmajor() {
set_var "$1" $((${!1} + 1))
set_var "$2" 0
set_var "$3" 0
array_new "$4"
}
function semver_incminor() {
set_var "$2" $((${!2} + 1))
set_var "$3" 0
array_new "$4"
}
function semver_incpatchlevel() {
set_var "$3" $((${!3} + 1))
array_new "$4"
}
function semver_setprelease() {
# XXX analyser $1 et spliter avant de copier dans le tableau $5
if [ "$1" ]; then
set_array "$5" @ "$1"
else
array_new "$5"
fi
}
function semver_setmetadata() {
# XXX analyser $1 et spliter avant de copier dans le tableau $6
if [ "$1" ]; then
set_array "$6" @ "$1"
else
array_new "$5"
fi
}
function semver_build() {
echo_ "${!1}.${!2}.${!3}"
array_isempty "$4" || rawecho_ "-$(array_join "$4" .)"
array_isempty "$5" || rawecho_ "+$(array_join "$5" .)"
echo ""
}
function semver_setvar() {
set_var "$1" "$(semver_build "$2" "$3" "$4" "$5" "$6")"
}