summaryrefslogtreecommitdiff
path: root/share
diff options
context:
space:
mode:
authorAlberto Sartori <alberto.sartori@huawei.com>2022-11-29 09:56:27 +0100
committerAlberto Sartori <alberto.sartori@huawei.com>2022-11-29 11:43:59 +0100
commitd5a5dc62737084e263f9ca629d4a1744f702007b (patch)
treee99c69966a3a57950bf5dfea13f3d6d66cabb515 /share
parente1dca6641a7cb29424c2352d2cf7611162d8e86e (diff)
downloadjustbuild-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.bash77
-rw-r--r--share/just_complete.bash72
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