summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIgor Murzov <e-mail@date.by>2012-01-12 19:30:56 +0400
committerIgor Murzov <e-mail@date.by>2012-01-13 00:19:26 +0400
commitf67818e023f9afbeef8698fdd3c08eb0f90ad468 (patch)
treeb5900496ed0157e90200612df31f4dc4a9a080a2
parentdb53fc77a5349088b24830b490b16dfcc6bee540 (diff)
downloadbash-completion-f67818e023f9afbeef8698fdd3c08eb0f90ad468.tar.gz
modprobe, modinfo, insmod: Move modprobe and modinfo completions to their own files.
Also fix some options handling and errors in unusual usecases (Alioth: #313498). Patch is partially written by Lekensteyn <lekensteyn@gmail.com> Reviewed-by: Sergey V <sftp.mtuci@gmail.com>
-rw-r--r--completions/.gitignore2
-rw-r--r--completions/Makefile.am8
-rw-r--r--completions/insmod32
-rw-r--r--completions/modinfo44
-rw-r--r--completions/modprobe86
-rw-r--r--test/completion/modinfo.exp1
-rw-r--r--test/completion/modprobe.exp1
-rw-r--r--test/lib/completions/insmod.exp2
-rw-r--r--test/lib/completions/modinfo.exp35
-rw-r--r--test/lib/completions/modprobe.exp49
10 files changed, 227 insertions, 33 deletions
diff --git a/completions/.gitignore b/completions/.gitignore
index 0e234def..b2a60e71 100644
--- a/completions/.gitignore
+++ b/completions/.gitignore
@@ -83,8 +83,6 @@ mailsnarf
mdecrypt
mencoder
mkisofs
-modinfo
-modprobe
mogrify
montage
mplayer2
diff --git a/completions/Makefile.am b/completions/Makefile.am
index 6e0f56f1..34f2abdc 100644
--- a/completions/Makefile.am
+++ b/completions/Makefile.am
@@ -193,6 +193,8 @@ bashcomp_DATA = a2x \
mkinitrd \
mktemp \
mmsitepass \
+ modinfo \
+ modprobe \
monodevelop \
mount \
mount.linux \
@@ -433,8 +435,6 @@ CLEANFILES = \
mdecrypt \
mencoder \
mkisofs \
- modinfo \
- modprobe \
mogrify \
montage \
mplayer2 \
@@ -639,10 +639,6 @@ symlinks:
rm -f $(targetdir)/$$file && \
$(LN_S) info $(targetdir)/$$file ; \
done
- for file in modprobe modinfo ; do \
- rm -f $(targetdir)/$$file && \
- $(LN_S) insmod $(targetdir)/$$file ; \
- done
for file in javac javadoc ; do \
rm -f $(targetdir)/$$file && \
$(LN_S) java $(targetdir)/$$file ; \
diff --git a/completions/insmod b/completions/insmod
index 725678e8..20840857 100644
--- a/completions/insmod
+++ b/completions/insmod
@@ -1,34 +1,18 @@
-# Linux insmod(8), modprobe(8) and modinfo(8) completion -*- shell-script -*-
-# This completes on the list of all available modules for the version of the
-# kernel currently running.
-#
+# Linux insmod(8) completion -*- shell-script -*-
+
_insmod()
{
local cur prev words cword
_init_completion || return
- # behave like lsmod for modprobe -r
- if [[ ${1##*/} == modprobe && "${words[1]}" == -r ]]; then
- _installed_modules "$cur"
- return 0
- fi
-
- # do filename completion if we're giving a path to a module
- if [[ "$cur" == @(*/|[.~])* ]]; then
+ # do filename completion for first argument
+ if [[ $cword -eq 1 ]]; then
_filedir '@(?(k)o?(.gz))'
- return 0
+ else # do module parameter completion
+ COMPREPLY=( $( compgen -W "$( /sbin/modinfo -p ${words[1]} \
+ 2>/dev/null | cut -d: -f1 )" -- "$cur" ) )
fi
-
- if [[ $cword -gt 1 && "${words[cword-1]}" != -* ]]; then
- # do module parameter completion
- COMPREPLY=( $( compgen -W "$( /sbin/modinfo -p ${words[1]} | \
- cut -d: -f1 )" -- "$cur" ) )
- else
- _modules $(uname -r)
- fi
-
- return 0
} &&
-complete -F _insmod insmod modprobe modinfo
+complete -F _insmod insmod
# ex: ts=4 sw=4 et filetype=sh
diff --git a/completions/modinfo b/completions/modinfo
new file mode 100644
index 00000000..2a359871
--- /dev/null
+++ b/completions/modinfo
@@ -0,0 +1,44 @@
+# Linux modinfo(8) completion -*- shell-script -*-
+
+_modinfo()
+{
+ local cur prev words cword
+ _init_completion || return
+
+ case "$prev" in
+ -F|--field)
+ COMPREPLY=( $( compgen -W 'alias author depends description
+ filename firmware license parm srcversion staging vermagic
+ version' -- "$(echo "$cur" | tr '[:upper:]' '[:lower:]')" ) )
+ return
+ ;;
+ -k)
+ _kernel_versions
+ return
+ ;;
+ esac
+
+ if [[ "$cur" == -* ]]; then
+ COMPREPLY=( $( compgen -W '-V --version -F --field -k -0 --null -a -d
+ -l -p -n' -- "$cur" ) )
+ return
+ fi
+
+ local i version=$(uname -r)
+ for (( i=${#words[@]}-1; i>0; i-- )); do
+ if [[ ${words[i]} == -k ]]; then
+ version=${words[i+1]}
+ break
+ fi
+ done
+
+ # do filename completion if we're giving a path to a module
+ if [[ "$cur" == @(*/|[.~])* ]]; then
+ _filedir '@(?(k)o?(.gz))'
+ else
+ _modules $version
+ fi
+} &&
+complete -F _modinfo modinfo
+
+# ex: ts=4 sw=4 et filetype=sh
diff --git a/completions/modprobe b/completions/modprobe
new file mode 100644
index 00000000..6db1b351
--- /dev/null
+++ b/completions/modprobe
@@ -0,0 +1,86 @@
+# Linux modprobe(8) completion -*- shell-script -*-
+
+_modprobe()
+{
+ local cur prev words cword
+ _init_completion || return
+
+ case "$prev" in
+ -C|--config)
+ _filedir
+ return
+ ;;
+ -d|--dirname|-t|--type)
+ _filedir -d
+ return
+ ;;
+ -S|--set-version)
+ _kernel_versions
+ return
+ ;;
+ esac
+
+ if [[ "$cur" == -* ]]; then
+ COMPREPLY=( $( compgen -W '-a --all -b --use-blacklist -C --config -c
+ --showconfig --dump-modversions -d --dirname --first-time
+ --force-vermagic --force-modversion -f --force -i --ignore-install
+ --ignore-remove -l --list -n --dry-run -q --quiet -R
+ --resolve-alias -r --remove -S --set-version --show-depends -s
+ --syslog -t --type -V --version -v --verbose' -- "$cur" ) )
+ return
+ fi
+
+ local i mode=insert module= version=$(uname -r)
+ for (( i=1; i < $cword; i++ )); do
+ case "${words[i]}" in
+ -r|--remove)
+ mode=remove
+ ;;
+ -l|--list)
+ mode=list
+ ;;
+ --dump-modversions)
+ mode=file
+ ;;
+ -S|--set-version)
+ version=${words[i+1]} # -S is not $prev and not $cur
+ ;;
+ -C|--config|-d|--dirname|-t|--type)
+ ((i++)) # skip option and its argument
+ ;;
+ -*)
+ # skip all other options
+ ;;
+ *)
+ [ -z "$module" ] && module=${words[i]}
+ ;;
+ esac
+ done
+
+ case $mode in
+ remove)
+ _installed_modules "$cur"
+ ;;
+ list)
+ # no completion available
+ ;;
+ file)
+ _filedir
+ ;;
+ insert)
+ # do filename completion if we're giving a path to a module
+ if [[ "$cur" == @(*/|[.~])* ]]; then
+ _filedir '@(?(k)o?(.gz))'
+ elif [[ -n "$module" ]]; then
+ # do module parameter completion
+ COMPREPLY=( $( compgen -W "$( /sbin/modinfo -p "$module" \
+ 2>/dev/null | cut -d: -f1 )" -- "$cur" ) )
+ else
+ _modules $version
+ fi
+ ;;
+ esac
+} &&
+complete -F _modprobe modprobe
+
+# ex: ts=4 sw=4 et filetype=sh
diff --git a/test/completion/modinfo.exp b/test/completion/modinfo.exp
new file mode 100644
index 00000000..88384543
--- /dev/null
+++ b/test/completion/modinfo.exp
@@ -0,0 +1 @@
+assert_source_completions modinfo
diff --git a/test/completion/modprobe.exp b/test/completion/modprobe.exp
new file mode 100644
index 00000000..405ca8e1
--- /dev/null
+++ b/test/completion/modprobe.exp
@@ -0,0 +1 @@
+assert_source_completions modprobe
diff --git a/test/lib/completions/insmod.exp b/test/lib/completions/insmod.exp
index a312c894..ca7c30f6 100644
--- a/test/lib/completions/insmod.exp
+++ b/test/lib/completions/insmod.exp
@@ -11,7 +11,7 @@ proc teardown {} {
setup
-assert_complete_any "insmod in"
+assert_complete_any "insmod "
sync_after_int
diff --git a/test/lib/completions/modinfo.exp b/test/lib/completions/modinfo.exp
new file mode 100644
index 00000000..2f6e4134
--- /dev/null
+++ b/test/lib/completions/modinfo.exp
@@ -0,0 +1,35 @@
+proc setup {} {
+ save_env
+}
+
+
+proc teardown {} {
+ assert_env_unmodified
+}
+
+
+setup
+
+
+set test "in<TAB> should complete modulename"
+assert_complete_any "modinfo in" $test
+
+
+sync_after_int
+
+
+set test "should not complete anything for non-existent kernel"
+assert_no_complete "modinfo -k you-dont-have-such-kernel in" $test
+
+
+sync_after_int
+
+
+set test "should complete filepaths"
+assert_complete "/lib/" "modinfo /li" $test -nospace
+
+
+sync_after_int
+
+
+teardown
diff --git a/test/lib/completions/modprobe.exp b/test/lib/completions/modprobe.exp
new file mode 100644
index 00000000..5391d4a5
--- /dev/null
+++ b/test/lib/completions/modprobe.exp
@@ -0,0 +1,49 @@
+proc setup {} {
+ save_env
+}
+
+
+proc teardown {} {
+ assert_env_unmodified
+}
+
+
+setup
+
+
+set test "--remov<TAB> should complete \"--remove\""
+assert_complete "--remove" "modprobe --remov" $test
+
+
+sync_after_int
+
+
+set test "in<TAB> should complete modulename"
+assert_complete_any "modprobe in" $test
+
+
+sync_after_int
+
+
+set test "should not complete anything for non-existent kernel"
+assert_no_complete "modprobe -S you-dont-have-such-kernel in" $test
+
+
+sync_after_int
+
+
+set test "should not complete anything for non-existent module"
+assert_no_complete "modprobe you-dont-have-such-module " $test
+
+
+sync_after_int
+
+
+set test "should complete filepaths"
+assert_complete "/lib/" "modprobe /li" $test -nospace
+
+
+sync_after_int
+
+
+teardown