##@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_check_version() { [ -z "${1//[a-zA-Z0-9.+-]/}" ]; } function __semver_check_prelease() { [ -z "${1//[a-zA-Z0-9.-]/}" ]; } function __semver_check_metadata() { [ -z "${1//[a-zA-Z0-9.-]/}" ]; } function semver_parse() { local __p_ver="$1" local __p_ma="${2:-major}" __p_mi="${3:-minor}" __p_pl="${4:-patchlevel}" local __p_pr="${5:-prelease}" __p_md="${6:-metadata}" __p_va="${7:-valid}" local __p_tmp set_var "$__p_ma" "" set_var "$__p_mi" "" set_var "$__p_pl" "" array_new "$__p_pr" array_new "$__p_md" set_var "$__p_va" "" # vérifier les caractères valides __semver_check_version "$__p_ver" || return 1 # extraire major __p_tmp= while [ "${__p_ver/#[0-9]/}" != "$__p_ver" ]; do __p_tmp="$__p_tmp${__p_ver:0:1}" __p_ver="${__p_ver:1}" done [ "${__p_ver:0:1}" == . ] || return 1 __p_ver="${__p_ver:1}" set_var "$__p_ma" "$__p_tmp" # extraire minor __p_tmp= while [ "${__p_ver/#[0-9]/}" != "$__p_ver" ]; do __p_tmp="$__p_tmp${__p_ver:0:1}" __p_ver="${__p_ver:1}" done [ "${__p_ver:0:1}" == . ] || return 1 __p_ver="${__p_ver:1}" set_var "$__p_mi" "$__p_tmp" # extraire patchlevel __p_tmp= while [ "${__p_ver/#[0-9]/}" != "$__p_ver" ]; do __p_tmp="$__p_tmp${__p_ver:0:1}" __p_ver="${__p_ver:1}" done [ -z "$__p_ver" -o "${__p_ver:0:1}" == - -o "${__p_ver:0:1}" == + ] || return 1 set_var "$__p_pl" "$__p_tmp" # extraire prelease if [ "${__p_ver:0:1}" == - ]; then __p_ver="${__p_ver:1}" if [[ "$__p_ver" == *+* ]]; then __p_tmp="${__p_ver%%+*}" __p_ver="+${__p_ver##*+}" else __p_tmp="$__p_ver" __p_ver= fi __semver_check_prelease "$__p_tmp" || return 1 array_split "$__p_pr" "$__p_tmp" . fi # extraire metadata if [ "${__p_ver:0:1}" == + ]; then __p_ver="${__p_ver:1}" __p_tmp="$__p_ver" __p_ver= __semver_check_metadata "$__p_tmp" || return 1 array_split "$__p_md" "$__p_tmp" . fi # on doit avoir tout analysé [ -z "$__p_ver" ] || return 1 set_var "$__p_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_setversion() { local __sv_ma __sv_mi __sv_svl __sv_svr __sv_md __sv_va semver_parse "$1" __sv_ma __sv_mi __sv_pl __sv_pr __sv_md __sv_va [ -n "$__sv_va" ] || return 1 set_var "$2" "$__sv_ma" set_var "$3" "$__sv_mi" set_var "$4" "$__sv_pl" return 0 } function semver_setprelease() { if [ -n "$1" ]; then __semver_check_prelease "$1" || return 1 array_split "$5" "$1" . else array_new "$5" fi return 0 } function semver_compare_prelease() { echo err } function semver_setmetadata() { if [ -n "$1" ]; then __semver_check_metadata "$1" || return 1 array_split "$6" "$1" . else array_new "$5" fi return 0 } function semver_compare_metadata() { echo err } function semver_copy() { set_var "$1" "${!6}" set_var "$2" "${!7}" set_var "$3" "${!8}" array_copy "$4" "$9" array_copy "$5" "${10}" } 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")" } ################################################################################ # Les fonctions psemver_* sont comme semver_* mais les noms de variables sont # standardisés (major, minor, pathchlevel, prelease, metadata) et l'on spécifie # uniquement un préfixe pour les noms de variable function psemver_parse() { semver_parse "$1" "${2}major" "${2}minor" "${2}patchlevel" "${2}prelease" "${2}metadata" "${2}valid"; } function psemver_incmajor() { semver_incmajor "${1}major" "${1}minor" "${1}patchlevel" "${1}prelease" "${1}metadata"; } function psemver_incminor() { semver_incminor "${1}major" "${1}minor" "${1}patchlevel" "${1}prelease" "${1}metadata"; } function psemver_incpatchlevel() { semver_incpatchlevel "${1}major" "${1}minor" "${1}patchlevel" "${1}prelease" "${1}metadata"; } function psemver_setversion() { semver_setversion "$1" "${2}major" "${2}minor" "${2}patchlevel" "${2}prelease" "${2}metadata"; } function psemver_setprelease() { semver_setprelease "$1" "${2}major" "${2}minor" "${2}patchlevel" "${2}prelease" "${2}metadata"; } function psemver_compare_prelease() { semver_compare_prelease "${1}prelease" "${2}prelease"; } function psemver_setmetadata() { semver_setmetadata "$1" "${2}major" "${2}minor" "${2}patchlevel" "${2}prelease" "${2}metadata"; } function psemver_compare_metadata() { semver_compare_metadata "${1}metadata" "${2}metadata"; } function psemver_copy() { semver_copy "${1}major" "${1}minor" "${1}patchlevel" "${1}prelease" "${1}metadata" "${2}major" "${2}minor" "${2}patchlevel" "${2}prelease" "${2}metadata"; } function psemver_build() { semver_build "${1}major" "${1}minor" "${1}patchlevel" "${1}prelease" "${1}metadata"; } function psemver_setvar() { semver_setvar "$1" "${2}major" "${2}minor" "${2}patchlevel" "${2}prelease" "${2}metadata"; }