diff options
author | Alberto Sartori <alberto.sartori@huawei.com> | 2022-11-29 09:56:27 +0100 |
---|---|---|
committer | Alberto Sartori <alberto.sartori@huawei.com> | 2022-11-29 11:43:59 +0100 |
commit | d5a5dc62737084e263f9ca629d4a1744f702007b (patch) | |
tree | e99c69966a3a57950bf5dfea13f3d6d66cabb515 /share | |
parent | e1dca6641a7cb29424c2352d2cf7611162d8e86e (diff) | |
download | justbuild-d5a5dc62737084e263f9ca629d4a1744f702007b.tar.gz |
bash completion: to avoid code duplication, implement tab-completion
for just and just-mr within only one file
Co-authored-by: Oliver Reiche <oliver.reiche@huawei.com>
Diffstat (limited to 'share')
-rw-r--r-- | share/just-mr_complete.bash | 77 | ||||
-rw-r--r-- | share/just_complete.bash | 72 |
2 files changed, 72 insertions, 77 deletions
diff --git a/share/just-mr_complete.bash b/share/just-mr_complete.bash deleted file mode 100644 index 4fc69f33..00000000 --- a/share/just-mr_complete.bash +++ /dev/null @@ -1,77 +0,0 @@ -_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 -} - -source "${BASH_SOURCE%/*}"/just_complete.bash - -_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 - local _opts=($(_just-mr_options "just $cmd")) - local _targets=($(_just_targets $prev 2>/dev/null)) - COMPREPLY=($(compgen -f -W "${_opts[*]} ${_targets[*]}" -- $word )) - compopt -o plusdirs -o bashdefault -o default - 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 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 |