diff --git a/completion.sh b/completion.sh index 56d28896..264cafce 100644 --- a/completion.sh +++ b/completion.sh @@ -1,11 +1,37 @@ -_setup_bench_tab_completion () { - if [ -n "$BASH" ] ; then - eval "$(_BENCH_COMPLETE=source bench)" - elif [ -n "$ZSH_VERSION" ]; then - autoload bashcompinit - bashcompinit - eval "$(_BENCH_COMPLETE=source bench)" - fi +_bench_completion() { + # Complete commands using click bashcomplete + COMPREPLY=( $( COMP_WORDS="${COMP_WORDS[*]}" \ + COMP_CWORD=$COMP_CWORD \ + _BENCH_COMPLETE=complete $1 ) ) + if [ -d "sites" ]; then + # Also add frappe commands if present + + # bench_helper.py expects to be executed from "sites" directory + cd sites + + # All frappe commands are subcommands under "bench frappe" + # Frappe is only installed in virtualenv "env" so use appropriate python executable + COMPREPLY+=( $( COMP_WORDS="bench frappe "${COMP_WORDS[@]:1} \ + COMP_CWORD=$(($COMP_CWORD+1)) \ + _BENCH_COMPLETE=complete ../env/bin/python ../apps/frappe/frappe/utils/bench_helper.py ) ) + + # If the word before the current cursor position in command typed so far is "--site" then only list sites + if [ ${COMP_WORDS[COMP_CWORD-1]} == "--site" ]; then + COMPREPLY=( $( ls -d ./*/site_config.json | cut -f 2 -d "/" | xargs echo ) ) + fi + + # Get out of sites directory now + cd .. + fi + return 0 } -_setup_bench_tab_completion +# Only support bash and zsh +if [ -n "$BASH" ] ; then + complete -F _bench_completion -o default bench; +elif [ -n "$ZSH_VERSION" ]; then + # Use zsh in bash compatibility mode + autoload bashcompinit + bashcompinit + complete -F _bench_completion -o default bench; +fi