summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Reisner <dreisner@archlinux.org>2017-07-08 09:29:19 -0400
committerDave Reisner <dreisner@archlinux.org>2017-07-08 13:25:43 -0400
commit19dcc3111174284babb30742539bdef4fa8808c9 (patch)
tree74b1b13a2cf1d10a14ad18a21888e17138c05c28
parent8d504c6bb58f04ab0b600851ca0c22afc2245173 (diff)
downloadasp32-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.in42
1 files 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
}