diff options
Diffstat (limited to 'share/just_complete.bash')
-rw-r--r-- | share/just_complete.bash | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/share/just_complete.bash b/share/just_complete.bash index 41f8f5aa..c62d446a 100644 --- a/share/just_complete.bash +++ b/share/just_complete.bash @@ -55,3 +55,75 @@ _just_completion(){ } complete -F _just_completion just +_just-mr_options(){ + local cmd=$1 + for w in $($cmd --help 2>/dev/null) + do + [[ $w =~ ^-. ]] && printf "%s\n" ${w//,/" "} + done +} + +_just-mr_parse_subcommand() { + local readonly FLAGS=("--help\n-h\n--norc\ndo") # treat 'do' as flag + local readonly OPTIONS=("--distdir\n--just\n--local-build-root\n--main\n--rc\n-C\n-L") + shift + while [ -n "$1" ]; do + if echo -e "$FLAGS" | grep -q -- "^$1$"; then shift; continue; fi + if echo -e "$OPTIONS" | grep -q -- "^$1$"; then shift; shift; continue; fi + if [ "$1" = "--" ]; then shift; fi + break + done + echo "$1" +} + +_just-mr_repos(){ + command -v python3 &>/dev/null || return + local CONF=$(just-mr setup --all 2>/dev/null) + if [ ! -f "$CONF" ]; then return; fi + python3 - <<EOF +from json import load +from os import path + +if path.exists("$CONF"): + with open("$CONF") as f: + repos = load(f).get("repositories", {}) + for r in repos.keys(): + print(r) +EOF +} + +_just-mr_completion(){ + local readonly SUBCOMMANDS=(setup setup-env fetch update "do" version build analyse describe install-cas install rebuild) + local word=${COMP_WORDS[$COMP_CWORD]} + local prev=${COMP_WORDS[$((COMP_CWORD-1))]} + local cmd=$(_just-mr_parse_subcommand "${COMP_WORDS[@]}") + # first check if the current word matches a subcommand + # if we check directly with cmd, we fail to autocomplete setup to setup-env and install to install-cas + if [[ $word =~ ^(setup|setup-env|install-cas|install) ]] + then + COMPREPLY=($(compgen -W "${SUBCOMMANDS[*]}" -- $word)) + elif [ "$prev" = "--main" ] + then + local _repos=($(_just-mr_repos $prev)) + COMPREPLY=($(compgen -W "${_repos[*]}}" -- $word)) + elif [ "$prev" = "--distdir" ] || [ "$prev" = "--just" ] || [ "$prev" = "--local-build-root" ] || [ "$prev" = "--rc" ] || [ "$prev" = "-C" ] || [ "$prev" = "-L" ] + then + compopt -o bashdefault -o default + elif [[ "$cmd" =~ ^(setup|setup-env|fetch|update) ]] + then + # just-mr subcommand options and repository names + local _opts=($(_just-mr_options "just-mr $cmd")) + local _repos=($(_just-mr_repos $prev)) + COMPREPLY=($(compgen -f -W "${_opts[*]} ${_repos[*]}" -- $word )) + elif [[ "$cmd" =~ ^(version|build|analyse|describe|install-cas|install|rebuild) ]] + then + # just subcommand options and modules/targets + _just_completion + else + # just-mr top-level options + local _opts=($(_just-mr_options "just-mr")) + COMPREPLY=($(compgen -W "${_opts[*]} ${SUBCOMMANDS[*]}" -- $word)) + fi +} + +complete -F _just-mr_completion just-mr |