diff options
author | Dave Reisner <dreisner@archlinux.org> | 2017-07-08 09:29:19 -0400 |
---|---|---|
committer | Dave Reisner <dreisner@archlinux.org> | 2017-07-08 13:25:43 -0400 |
commit | 19dcc3111174284babb30742539bdef4fa8808c9 (patch) | |
tree | 74b1b13a2cf1d10a14ad18a21888e17138c05c28 | |
parent | 8d504c6bb58f04ab0b600851ca0c22afc2245173 (diff) | |
download | asp32-19dcc3111174284babb30742539bdef4fa8808c9.tar.xz |
avoid the need to maintain a separate list of actions
We have our nice action__ prefix on all of our action disspatchers, so
let's just use that to our advantage.
While we're here, fix the return code when we encounter an ambiguous
action
-rw-r--r-- | asp.in | 42 |
1 files changed, 13 insertions, 29 deletions
@@ -289,50 +289,34 @@ action__ls-files() { } dispatch_action() { - local a candidates=() - local actions=( - checkout - difflog - disk-usage - export - gc - help - list-all - list-arches - list-local - list-repos - log - ls-files - shortlog - show - untrack - update - ) + local candidates [[ $1 ]] || log_fatal 'no action specified (use -h for help)' - for a in "${actions[@]}"; do - if [[ $a = "$1" ]]; then - candidates=("$a") - break - fi - - [[ $a = "$1"* ]] && candidates+=("$a") - done + # exact match + if declare -F "action__$1" &>/dev/null; then + "action__$@" + return + fi + # prefix match + mapfile -t candidates < <(compgen -A function "action__$1") case ${#candidates[*]} in 0) log_fatal 'unknown action: %s' "$1" ;; 1) - "action__${candidates[0]}" "${@:2}" + "${candidates[0]}" "${@:2}" + return ;; *) { printf "error: verb '%s' is ambiguous; possibilities:" "$1" - printf " '%s'" "${candidates[@]}" + printf " '%s'" "${candidates[@]#action__}" echo } >&2 + return 1 + ;; esac } |