##@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")" }