# 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