simplify bash completion for kernel-install
authorHarald Hoyer <harald@redhat.com>
Mon, 29 Jul 2013 15:48:29 +0000 (17:48 +0200)
committerHarald Hoyer <harald@redhat.com>
Tue, 30 Jul 2013 07:46:06 +0000 (09:46 +0200)
shell-completion/bash/kernel-install

index 1832d4a..7cd2494 100644 (file)
@@ -3,6 +3,7 @@
 # This file is part of systemd.
 #
 # Copyright 2013 Kay Sievers
+# Copyright 2013 Harald Hoyer
 #
 # systemd is free software; you can redistribute it and/or modify it
 # under the terms of the GNU Lesser General Public License as published by
 # You should have received a copy of the GNU Lesser General Public License
 # 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
-}
-
 _kernel_install() {
-        local i verb comps
-        local cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]}
-        local OPTS='-h --help'
-
-        local -A VERBS=(
-                [ADD]='add'
-                [REMOVE]='remove'
-        )
-
-        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]}
-                        break
-                fi
-        done
-
-        if [[ -z $verb  && $cur = -* ]]; then
-                COMPREPLY=( $(compgen -W '${OPTS[*]}' -- "$cur") )
-                return 0
-        fi
-
-        if [[ -z $verb ]]; then
-                comps=${VERBS[*]}
-
-        elif __contains_word "$verb" ${VERBS[ADD]}; then
-                if [[ $prev = "$verb" ]]; then
-                        comps=$(cd /lib/modules; echo [0-9]*)
-                elif [[ $prev = [0-9]* ]]; then
-                        comps=$(echo /boot/vmlinuz-$prev*)
-                fi
-
-        elif __contains_word "$verb" ${VERBS[REMOVE]}; then
+        local comps
+        local MACHINE_ID
+        local cur=${COMP_WORDS[COMP_CWORD]}
+
+        case $COMP_CWORD in
+            1)
+                comps="add remove"
+                ;;
+            2)
                 comps=$(cd /lib/modules; echo [0-9]*)
-
-        fi
+                if [[ ${COMP_WORDS[1]} == "remove" ]] && [[ -f /etc/machine-id ]]; then
+                    read MACHINE_ID < /etc/machine-id
+                    if [[ $MACHINE_ID ]] && ( [[ -d /boot/$MACHINE_ID ]] || [[ -L /boot/$MACHINE_ID ]] ); then
+                        comps=$(cd "/boot/$MACHINE_ID"; echo [0-9]*)
+                    fi
+                fi
+                ;;
+            3)
+                [[ "$cur" ]] || cur=/boot/vmlinuz-${COMP_WORDS[2]}
+                comps=$(compgen -f -- "$cur")
+                compopt -o filenames
+                ;;
+        esac
 
         COMPREPLY=( $(compgen -W '$comps' -- "$cur") )
         return 0