yadm/completion/yadm.bash_completion

92 lines
2.5 KiB
Plaintext

# test if git completion is missing, but loader exists, attempt to load
if ! declare -F _git > /dev/null && declare -F _completion_loader > /dev/null; then
_completion_loader git
fi
# only operate if git completion is present
if declare -F _git > /dev/null; then
_yadm() {
local current=${COMP_WORDS[COMP_CWORD]}
local penultimate
if [ "$((COMP_CWORD-1))" -ge "0" ]; then
penultimate=${COMP_WORDS[COMP_CWORD-1]}
fi
local antepenultimate
if [ "$((COMP_CWORD-2))" -ge "0" ]; then
antepenultimate=${COMP_WORDS[COMP_CWORD-2]}
fi
local GIT_DIR
# shellcheck disable=SC2034
GIT_DIR="$(yadm introspect repo 2>/dev/null)"
case "$penultimate" in
bootstrap)
COMPREPLY=()
return 0
;;
config)
COMPREPLY=( $(compgen -W "$(yadm introspect configs 2>/dev/null)") )
return 0
;;
decrypt)
COMPREPLY=( $(compgen -W "-l" -- "$current") )
return 0
;;
init)
COMPREPLY=( $(compgen -W "-f -w" -- "$current") )
return 0
;;
introspect)
COMPREPLY=( $(compgen -W "commands configs repo switches" -- "$current") )
return 0
;;
help)
COMPREPLY=() # no specific help yet
return 0
;;
list)
COMPREPLY=( $(compgen -W "-a" -- "$current") )
return 0
;;
esac
case "$antepenultimate" in
clone)
COMPREPLY=( $(compgen -W "-f -w --bootstrap --no-bootstrap" -- "$current") )
return 0
;;
esac
# this condition is so files are completed properly for --yadm-xxx options
if [[ ! "$penultimate" =~ ^- ]]; then
# TODO: somehow solve the problem with [--yadm-xxx option] being
# incompatible with what git expects, namely [--arg=option]
_git
fi
if [[ "$current" =~ ^- ]]; then
local matching
matching=$(compgen -W "$(yadm introspect switches 2>/dev/null)" -- "$current")
__gitcompappend "$matching"
fi
if [ "$COMP_CWORD" == 1 ] || [[ "$antepenultimate" =~ ^- ]] ; then
local matching
matching=$(compgen -W "$(yadm introspect commands 2>/dev/null)" -- "$current")
__gitcompappend "$matching"
fi
# remove duplicates found in COMPREPLY (a native bash way could be better)
if [ -n "${COMPREPLY[*]}" ]; then
COMPREPLY=($(echo "${COMPREPLY[@]}" | sort -u))
fi
}
complete -o bashdefault -o default -F _yadm yadm 2>/dev/null \
|| complete -o default -F _yadm yadm
fi