diff --git a/bash/src/base.args.sh b/bash/src/base.args.sh index a81f5a3..868e084 100644 --- a/bash/src/base.args.sh +++ b/bash/src/base.args.sh @@ -65,12 +65,20 @@ usage -o, --longopt : option sans argument --a:, --mandarg +-a:, --mandarg: : option avec argument obligatoire + l'option peut être suivi d'une valeur qui décrit l'argument attendu e.g + -a:file pour un fichier. cette valeur est mise en majuscule lors de + l'affichage de l'aide. pour le moment, cette valeur n'est pas signifiante. + -b::, --optarg:: : option avec argument facultatif + l'option peut être suivi d'une valeur qui décrit l'argument attendu e.g + -b::file pour un fichier. cette valeur est mise en majuscule lors de + l'affichage de l'aide. pour le moment, cette valeur n'est pas signifiante. + action : action à effectuer si cette option est utilisée. plusieurs syntaxes sont valides: * 'NAME' met à jour la variable en fonction du type d'argument: l'incrémenter @@ -159,7 +167,7 @@ function __parse_args() { *) eerror "Invalid arg definition: expected option, got '$1'"; eval "$__DIE";; esac # est-ce que l'option prend un argument? - local __def __witharg= + local __def __witharg __valdesc for __def in "${__defs[@]}"; do if [ "${__def%::*}" != "$__def" ]; then [ "$__witharg" != : ] && __witharg=:: @@ -300,11 +308,14 @@ $prefix$usage" fi # est-ce que l'option prend un argument? __witharg= + __valdesc=value for __def in "${__defs[@]}"; do if [ "${__def%::*}" != "$__def" ]; then [ "$__witharg" != : ] && __witharg=:: + [ -n "${__def#*::}" ] && __valdesc="[${__def#*::}]" elif [ "${__def%:*}" != "$__def" ]; then __witharg=: + [ -n "${__def#*:}" ] && __valdesc="${__def#*:}" fi done # description de l'option @@ -327,7 +338,7 @@ $prefix$usage" fi thelp="$thelp$__def" done - [ -n "$__witharg" ] && thelp="$thelp VALUE" + [ -n "$__witharg" ] && thelp="$thelp ${__valdesc^^}" # sauter l'action shift # prendre la description le cas échéant @@ -349,7 +360,7 @@ $prefix$usage" uecho "$help" exit 0 } - if [ "$__popt" != + ]; then + if [ "$__popt" != - ]; then while [ $# -gt 0 ]; do if [ "$1" == -- ]; then shift diff --git a/bash/src/donk.build.sh b/bash/src/donk.build.sh new file mode 100644 index 0000000..a88daa0 --- /dev/null +++ b/bash/src/donk.build.sh @@ -0,0 +1,4 @@ +# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@cooked nocomments +module: donk.build "construire des images docker" +require: donk.common diff --git a/bash/src/donk.common.sh b/bash/src/donk.common.sh new file mode 100644 index 0000000..79a5efb --- /dev/null +++ b/bash/src/donk.common.sh @@ -0,0 +1,3 @@ +# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@cooked nocomments +module: donk.common "fonctions communes" diff --git a/bash/src/donk.help.sh b/bash/src/donk.help.sh new file mode 100644 index 0000000..2e0a21b --- /dev/null +++ b/bash/src/donk.help.sh @@ -0,0 +1,41 @@ +# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@cooked nocomments +module: donk.help "aide de donk" + +DONK_VALID_ACTIONS=( + dump:d + build:b + clean:k +) +dump_SUMMARY="afficher les valeurs des variables et ce que ferait l'action build" +build_SUMMARY="construire les images" +clean_SUMMARY="nettoyer le projet des fichiers créés avec 'copy gitignore=', en utilisant la commande 'git clean -dX'" + +DONK_HELP_SECTIONS=( + base:b + reference:ref:r +) + +function donk_help() { + : +} + +function _donk_show_actions() { + local action summary + echo " +ACTIONS" + for action in "${DONK_VALID_ACTIONS[@]}"; do + IFS=: read -a action <<<"$action"; action="${action[0]}" + summary="${action}_SUMMARY"; summary="${!summary}" + echo "\ + $action + $summary" + done +} + +function _donk_show_help() { + if [ -z "$value_" ]; then showhelp@ + else donk_help "$value_" + fi + exit $? +} diff --git a/bin/donk b/bin/donk new file mode 100755 index 0000000..b93ad81 --- /dev/null +++ b/bin/donk @@ -0,0 +1,25 @@ +#!/bin/bash +# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +source "$(dirname -- "$0")/../load.sh" || exit 1 +require: donk.help + +# par défaut, c'est l'action build +case "$1" in +-h*|--help|--help=*|--help++) ;; +-*) set -- build "$@";; +esac + +args=( + "construire des images docker" + "ACTION [options] +$(_donk_show_actions)" + + + -h::section,--help '$_donk_show_help' "Afficher l'aide de la section spécifiée. +Les sections valides sont: ${DONK_HELP_SECTIONS[*]%%:*}" + --help++ '$_donk_show_help' "++Afficher l'aide" +) +parse_args "$@"; set -- "${args[@]}" + +action="$1"; shift +require: "donk.$action" || die +"donk_$action" "$@"