From 19dcc3111174284babb30742539bdef4fa8808c9 Mon Sep 17 00:00:00 2001 From: Dave Reisner Date: Sat, 8 Jul 2017 09:29:19 -0400 Subject: 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 --- asp.in | 42 +++++++++++++----------------------------- 1 file changed, 13 insertions(+), 29 deletions(-) diff --git a/asp.in b/asp.in index 418f8ea..e2dd60d 100644 --- a/asp.in +++ b/asp.in @@ -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 } -- cgit v1.2.3-70-g09d2