#!/bin/bash # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 source "$(dirname "$0")/ulib/ulib" || exit 1; urequire DEFAULTS semver function display_help() { uecho "$scriptname: gérer des numéros de version USAGE $scriptname [options] OPTIONS -f, --file VERSIONFILE Gérer le numéro de version se trouvant dans le fichier spécifié. Le fichier est créé si nécessaire. C'est l'option par défaut si un fichier nommé VERSION.txt se trouve dans le répertoire courant. -s, --string VERSION Prendre pour valeur de départ le numéro de version spécifié --show Afficher le numéro de version. C'est l'action par défaut --check Vérifier que le numéro de version est conforme aux règles des versions sémantiques (http://semver.org/) --eq VERSION --ne VERSION --lt VERSION --le VERSION --gt VERSION --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 -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 parce qu'elle ne respecte pas les règles du versionnage sémantique. -u, --update Mettre à jour le numéro de version. --menu Afficher un menu permettant de choisir le composant de la version à incrémenter -x, --major Augmenter le numéro de version majeure -z, --minor Augmenter le numéro de version mineure. C'est la valeur par défaut. -p, --patchlevel Augmenter le numéro de patch -l, --prelease ID Spécifier un identifiant de prérelease, à ajouter au numéro de version. -a, --alpha -b, --beta -r, --rc Spécifier une pré-release de type alpha, beta, ou rc. Si la version est déjà dans ce type, augmenter la dernière valeur numérique des composants de l'identifiant, e.g. alpha deviant alpha.1, beta-1.2 devient beta-1.3, rc1 devient rc2 -R, --final, --release Supprimer l'identifiant de prérelease -m, --metadata ID Spécifier un identifiant de build, à ajouter au numéro de version." } action=auto source=auto file= version= operator= oversion= setversion= incversion= setprelease= setalpha= setbeta= setrc= setfinal= setmetadata= parse_opts "${PRETTYOPTS[@]}" \ --help '$exit_with display_help' \ -f:,--file: '$set@ file; source=' \ -s:,--string: '$set@ version; source=' \ --show action=show \ --check action=check \ --eq: '$action=compare; operator=eq; set@ oversion' \ --ne: '$action=compare; operator=ne; set@ oversion' \ --lt: '$action=compare; operator=lt; set@ oversion' \ --le: '$action=compare; operator=le; set@ oversion' \ --gt: '$action=compare; operator=gt; set@ oversion' \ --ge: '$action=compare; operator=ge; set@ oversion' \ -v:,--set-version: '$action=update; set@ setversion; incversion=' \ -u,--update '$action=update; [ -z "$incversion" ] && incversion=auto' \ --menu '$action=update; incversion=menu' \ -x,--major '$action=update; incversion=major' \ -z,--minor '$action=update; incversion=minor' \ -p,--patchlevel '$action=update; incversion=patchlevel' \ -l:,--prelease:,--prerelease: '$action=update; set@ setprelease' \ -a,--alpha '$action=update; setalpha=1; setbeta=; setrc=; setfinal=' \ -b,--beta '$action=update; setalpha=; setbeta=1; setrc=; setfinal=' \ -r,--rc '$action=update; setalpha=; setbeta=; setrc=1; setfinal=' \ -R,--release,--final '$action=update; setalpha=; setbeta=; setrc=; setfinal=1' \ -m:,--metadata: '$action=update; set@ setmetadata' \ @ args -- "$@" && set -- "${args[@]}" || die "$args" # Calculer la source if [ "$source" == auto ]; then for i in VERSION.txt version.txt; do if [ -f "$i" ]; then file="$i" break fi done [ -n "$file" ] || file=VERSION.txt elif [ -n "$file" ]; then [ "$action" == auto ] && action=update fi [ "$action" == auto ] && action=show # Lire la version if [ -n "$file" ]; then [ -f "$file" ] && version="$(<"$file")" [ -n "$version" ] || version=0.0.0 fi # Actions estepi "La version actuelle est $version" [ "$action" == show ] && exit 0 # forcer le numéro de version # XXX implémenter semver_setversion qui change juste la partie # major.minor.patchlevel et ne touche pas au reste. une fois que cela sera fait, # la ligne suivante doit être supprimée et le code de setversion doit être # mis dans la partie "update" [ -n "$setversion" ] && version="$setversion" semver_parse "$version" major minor patchlevel prelease metadata valid if [ "$action" == check ]; then [ -n "$valid" ] || die "Numéro de version invalide: $version" elif [ "$action" == compare ]; then semver_parse "$oversion" omajor ominor opatchlevel oprelease ometadata ovalid case "$operator" in eq|same) for var in valid major minor patchlevel; do ovar="o$var" [ "${!var}" == "${!ovar}" ] || exit 1 done array_eq prelease oprelease || exit 1 if [ "$operator" == same ]; then array_eq metadata ometadata || exit 1 fi exit 0 ;; ne|diff) for var in valid major minor patchlevel; do ovar="o$var" [ "${!var}" != "${!ovar}" ] && exit 0 done ! array_eq prelease oprelease && exit 0 if [ "$operator" == diff ]; then ! array_eq metadata ometadata && exit 0 fi exit 1 ;; lt) [ -z "$valid" -a -z "$ovalid" ] && exit 1 [ "$major" -lt "$omajor" ] && exit 0 [ "$major" -gt "$omajor" ] && exit 1 [ "$minor" -lt "$ominor" ] && exit 0 [ "$minor" -gt "$ominor" ] && exit 1 [ "$patchlevel" -lt "$opatchlevel" ] && exit 0 [ "$patchlevel" -gt "$opatchlevel" ] && exit 1 # XXX tester prelease exit 1 ;; le) [ -z "$valid" -a -z "$ovalid" ] && exit 1 [ "$major" -lt "$omajor" ] && exit 0 [ "$major" -gt "$omajor" ] && exit 1 [ "$minor" -lt "$ominor" ] && exit 0 [ "$minor" -gt "$ominor" ] && exit 1 [ "$patchlevel" -lt "$opatchlevel" ] && exit 0 [ "$patchlevel" -gt "$opatchlevel" ] && exit 1 # XXX tester prelease exit 0 ;; gt) [ -z "$valid" -a -z "$ovalid" ] && exit 1 [ "$major" -lt "$omajor" ] && exit 1 [ "$major" -gt "$omajor" ] && exit 0 [ "$minor" -lt "$ominor" ] && exit 1 [ "$minor" -gt "$ominor" ] && exit 0 [ "$patchlevel" -lt "$opatchlevel" ] && exit 1 [ "$patchlevel" -gt "$opatchlevel" ] && exit 0 # XXX tester prelease exit 1 ;; ge) [ -z "$valid" -a -z "$ovalid" ] && exit 1 [ "$major" -lt "$omajor" ] && exit 1 [ "$major" -gt "$omajor" ] && exit 0 [ "$minor" -lt "$ominor" ] && exit 1 [ "$minor" -gt "$ominor" ] && exit 0 [ "$patchlevel" -lt "$opatchlevel" ] && exit 1 [ "$patchlevel" -gt "$opatchlevel" ] && exit 0 # XXX tester prelease exit 0 ;; esac elif [ "$action" == update ]; then if [ -n "$file" -a ! -f "$file" ]; then ask_yesno "Le fichier $(ppath "$file") n'existe pas. Faut-il le créer?" O || die fi # incrémenter les numéros de version [ "$incversion" == auto ] && incversion=minor #menu case "$incversion" in menu) eerror "non implémenté";; #XXX major) semver_incmajor major minor patchlevel prelease metadata;; minor) semver_incminor major minor patchlevel prelease metadata;; patchlevel) semver_incpatchlevel major minor patchlevel prelease metadata;; esac # spécifier prerelease if [ -n "$setfinal" ]; then semver_setprelease "" major minor patchlevel prelease metadata elif [ -n "$setprelease" ]; then semver_setprelease "$setprelease" major minor patchlevel prelease metadata fi if [ -n "$setalpha" ]; then : elif [ -n "$setbeta" ]; then : elif [ -n "$setrc" ]; then : fi # spécifier metadata [ -n "$setmetadata" ] && semver_setmetadata "$setmetadata" major minor patchlevel prelease metadata semver_setvar version major minor patchlevel prelease metadata if [ -n "$file" ]; then echo "$version" >"$file" fi estepn "La nouvelle version est $version" fi exit 0