chiark / gitweb /
timesyncd: also try next server when sendto() fails
[elogind.git] / shell-completion / bash / systemd-analyze
index 8a4453d..5575beb 100644 (file)
 # along with systemd; If not, see <http://www.gnu.org/licenses/>.
 
 __contains_word () {
-        local word=$1; shift
-        for w in $*; do [[ $w = $word ]] && return 0; done
-        return 1
+        local w word=$1; shift
+        for w in "$@"; do
+                [[ $w = "$word" ]] && return
+        done
+}
+
+__get_machines() {
+        local a b
+        machinectl list --no-legend --no-pager | { while read a b; do echo " $a"; done; };
 }
 
 _systemd_analyze() {
         local i verb comps
         local cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]}
-        local OPTS='--help --version --system --user --from-pattern --to-pattern --order --require'
+
+        local -A OPTS=(
+               [STANDALONE]='--help --version --system --user --from-pattern --to-pattern --order --require --no-pager'
+                      [ARG]='-H --host -M --machine'
+        )
 
         local -A VERBS=(
-                [NO_OPTION]='time blame plot'
+                [STANDALONE]='time blame plot dump'
+                [CRITICAL_CHAIN]='critical-chain'
                 [DOT]='dot'
+                [LOG_LEVEL]='set-log-level'
         )
 
         _init_completion || return
 
-        for ((i=0; $i <= $COMP_CWORD; i++)); do
+        for ((i=0; i < COMP_CWORD; i++)); do
                 if __contains_word "${COMP_WORDS[i]}" ${VERBS[*]} &&
                  ! __contains_word "${COMP_WORDS[i-1]}" ${OPTS[ARG]}; then
                         verb=${COMP_WORDS[i]}
@@ -44,6 +56,19 @@ _systemd_analyze() {
                 fi
         done
 
+        if __contains_word "$prev" ${OPTS[ARG]}; then
+                case $prev in
+                        --host|-H)
+                                comps=$(compgen -A hostname)
+                        ;;
+                        --machine|-M)
+                                comps=$( __get_machines )
+                        ;;
+                esac
+                COMPREPLY=( $(compgen -W '$comps' -- "$cur") )
+                return 0
+        fi
+
         if [[ -z $verb  && $cur = -* ]]; then
                 COMPREPLY=( $(compgen -W '${OPTS[*]}' -- "$cur") )
                 return 0
@@ -52,15 +77,28 @@ _systemd_analyze() {
         if [[ -z $verb ]]; then
                 comps=${VERBS[*]}
 
-        elif __contains_word "$verb" ${VERBS[NO_OPTION]}; then
+        elif __contains_word "$verb" ${VERBS[STANDALONE]}; then
                 if [[ $cur = -* ]]; then
                         comps='--help --version --system --user'
                 fi
 
+        elif __contains_word "$verb" ${VERBS[CRITICAL_CHAIN]}; then
+                if [[ $cur = -* ]]; then
+                        comps='--help --version --system --user --fuzz'
+                fi
+
         elif __contains_word "$verb" ${VERBS[DOT]}; then
                 if [[ $cur = -* ]]; then
                         comps='--help --version --system --user --from-pattern --to-pattern --order --require'
                 fi
+
+        elif __contains_word "$verb" ${VERBS[LOG_LEVEL]}; then
+                if [[ $cur = -* ]]; then
+                        comps='--help --version --system --user'
+                else
+                        comps='debug info notice warning err crit alert emerg'
+                fi
+
         fi
 
         COMPREPLY=( $(compgen -W '$comps' -- "$cur") )