summaryrefslogtreecommitdiffstats
path: root/dkms.zsh-completion.in
diff options
context:
space:
mode:
Diffstat (limited to 'dkms.zsh-completion.in')
-rw-r--r--dkms.zsh-completion.in142
1 files changed, 142 insertions, 0 deletions
diff --git a/dkms.zsh-completion.in b/dkms.zsh-completion.in
new file mode 100644
index 0000000..32e9091
--- /dev/null
+++ b/dkms.zsh-completion.in
@@ -0,0 +1,142 @@
+#compdef dkms
+# Based on the completion from the zsh-users/zsh repository.
+
+local curcontext="$curcontext" ign cmds opts ret=1
+local -a state line expl args subcmds dirs
+local -A opt_args
+
+subcmds=(
+ 'add:add a module/version combination to the tree for builds and installs'
+ 'remove:remove a module from the tree'
+ 'build:compile a module for a kernel'
+ 'unbuild:undoes the build of a module'
+ "install:install a build module for it's corresponding kernel"
+ 'uninstall:uninstall a module for a kernel'
+ 'autoinstall:try to install the latest revision of all modules that have been installed for other kernel revisions'
+ 'match:install every module that is installed for a template kernel for another kernel'
+ 'mktarball:tar up files in the DKMS tree for a specific module'
+ 'ldtarball:extract a tarball created with mktarball into the DKMS tree'
+ 'status:display the current status of modules, versions and kernels within the tree'
+)
+
+args=(
+ '(--all)*'{-a,--arch}'[specify system architecture]:architecture:->architectures'
+ '(1)-m[specify module]:module:->modules'
+ '(1)-v[specify module version]:version'
+ {-q,--quiet}'[suppress output]'
+ '*--directive=:directive'
+ '--dkmstree=:path:_directories'
+ '--installtree=:path:_directories'
+ '--sourcetree=:path:_directories'
+ '--force-version-override'
+ '1: : _describe -t commands command subcmds'
+)
+
+cmd=${${${subcmds%%:*}:*words}[1]}
+if [[ -n $cmd ]]; then
+ curcontext="${curcontext%:*}-$cmd:"
+else
+ # Exclude sub-commands based on any options specified so far.
+ for cmds opts in \
+ '(remove|build|install|uninstall|match|status|mktarball)' 'k' \
+ '(add|remove)' '-_safe_upgrade' \
+ 'mktarball' '-(source|binary)-only' \
+ '(match|build)' '(k|-no-(prepare|clean)-kernel|-kernelsourcedir)' \
+ '(|un)install' '-no-(depmod|initrd)' \
+ '(add|build|install|ldtarball)' '-force' \
+ 'match' '-templatekernel' \
+ '(mktarball|ldtarball)' '-archive' \
+ '(match|build)' '(j*|-no-(prepare|clean)-kernel|-kernelsourcedir)' \
+ '(remove|build|install|status|mktarball)' '-all' \
+ 'build' '-config'
+ do
+ [[ -n ${(M)words:#-${~opts}*} ]] &&
+ subcmds=( ${(M)subcmds:#${~cmds}:*} )
+ done
+ args+=( '(1 -)'{-V,--version}'[display version information]' )
+ ign='!' # hide some uncommon options but handle their arguments
+fi
+
+case $cmd in
+ remove|build|install|uninstall|mktarball|status)
+ args+=( ': :->modules' )
+ ;|
+ |remove|(un|)build|install|uninstall|match|status|mktarball)
+ args+=( '(--all)*-k[specify kernel version]:kernel:->kernels' )
+ ;|
+ |add|remove) args+=( "${ign}--rpm_safe_upgrade" ) ;|
+ |(mk|ld)tarball)
+ args+=( "${ign}--archive=:tarball:_files -g '*.tar(-.)'" )
+ ;|
+ |mktarball) args+=( "${ign}(--source-only --binaries-only)--"{source,binaries}-only ) ;|
+ |match|build)
+ args+=( # TODO: check ignore needed in absence of parameters
+ "${ign}--no-prepare-kernel"
+ "${ign}--no-clean-kernel"
+ '--kernelsourcedir=:directory:_directories'
+ "${ign}-j+[specify maximum number of jobs to use when building]:jobs"
+ )
+ ;|
+ |(|un)install)
+ args+=(
+ "${ign}--no-depmod"
+ "${ign}--no-initrd"
+ )
+ ;|
+ |add)
+ args+=(
+ '-c[specify location of dkms.conf file]:location:_files'
+ )
+ ;|
+ |remove|(un|)build|install|status)
+ args+=( '(-a --arch -k)--all[specify all relevant kernels/arches]' )
+ ;|
+ |build)
+ args+=( "${ign}--config=:kernel config file:_files" )
+ ;|
+ |add|build|install|ldtarball)
+ args+=( '--force[force overwriting of extant files]' )
+ ;|
+ |match)
+ args+=( "${ign}--templatekernel=:kernel:->kernels" )
+ ;|
+ add)
+ args+=(
+ '3:path:_directories'
+ '4:tarball:_files -g "*.tar(-.)"'
+ )
+ ;;
+ install)
+ args+=(
+ '3:rpm file:_files -g "*.rpm(-.)"'
+ )
+ ;;
+esac
+
+_arguments -C $args && ret=0
+
+case $state in
+ modules)
+ dirs=( ${(e)opt_args[--dkmstree]:-/var/lib/dkms}/*/*(/) )
+ dirs=( ${${(M)dirs%/*/*}#/} )
+ _description modules expl module
+ _multi_parts -i "$expl[@]" / dirs && ret=0
+ ;;
+ kernels)
+ if compset -P 1 '*/'; then
+ _description architectures expl architecture
+ compadd "$expl[@]" @MODDIR@/$IPREFIX/build/arch/*(/:t) && ret=0
+ else
+ compset -S '/*'
+ dirs=( @MODDIR@/*(/:t) )
+ _description -V kernels expl kernel
+ compadd "$expl[@]" -r "/ \t\n\-" ${(on)dirs} && ret=0
+ fi
+ ;;
+ architectures)
+ _description architectures expl architecture
+ compadd "$expl[@]" /lib/modules/$(uname -r)/build/arch/*(/:t) && ret=0
+ ;;
+esac
+
+return ret