Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

PATCH: new dkms completion



This adds completion for dkms.

dkms takes subcommands but options can be specified either before or
after the subcommands. This takes the approach of marking some of the
more obscure options with ! if a subcommand has yet to be specified.
Subcommands are also filtered based on earlier options.

For module/version, I used _multi_parts -i. The documented effect of
-i is to allow it to insert multiple separators. So you might assume
that it has no effect when there can only be one separator. However, it
seems to allow it to insert the full match in one go: z<tab> completes
directly to 'zfs/0.7.9' rather than stopping at the / which is useful
because it is common to only have one version of the modules installed.

Oliver

diff --git a/Completion/Linux/Command/_dkms b/Completion/Linux/Command/_dkms
new file mode 100644
index 000000000..7ea34aa2e
--- /dev/null
+++ b/Completion/Linux/Command/_dkms
@@ -0,0 +1,162 @@
+#compdef dkms
+
+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'
+  "install:install a build module for it's corresponding kernel"
+  'uninstall:uninstall a module for a kernel'
+  'match:install every module that is installed for a template kernel for another kernel'
+  'mkdriverdisk:create a floppy driver disk image for use when updated drivers are needed to install an OS'
+  'mktarball:tar up files in the DKMS tree for a specific module'
+  'ldtarball:extract a tarball created with mktarball into the DKMS tree'
+  'mkrpm:create an RPM package for a module'
+  'mkdeb:create a debian binary package for a module'
+  'mkdsc:create a debian source package for a module'
+  'mkkmp:create a Kernel Module Package source RPM for a module'
+  'status:display the current status of modules, versions and kernels within the tree'
+  'autoinstall:try to install the latest revision of all modules that have been installed for other kernel revisions'
+)
+
+args=(
+  '(1)-m[specify module]:module:->modules'
+  '(1)-v[specify module version]:version'
+  '(-q --quiet)'{-q,--quiet}'[suppress output]'
+  '(--all)*'{-a,--arch}'[specify system architecture]:architecture:->architectures'
+  '*--directive=:directive'
+  '--dkmstree=:path:_directories'
+  '--installtree=:path:_directories'
+  '--sourcetree=:path:_directories'
+  '--dkmsframework=:path:_directories'
+  '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|mk(^kmp))' 'k' \
+    '(add|remove)' '-rpm_safe_upgrade' \
+    'mk(driverdisk|kmp)' '-spec' \
+    'mk(deb|dsc|rpm)' '-legacy-postinst' \
+    'mk(tarball|rpm|deb|dsc)' '-(source|binary)-only' \
+    '(match|build|mkkmp)' '(k|-no-(prepare|clean)-kernel|-kernelsourcedir)' \
+    '(|un)install' '-no-(depmod|initrd)' \
+    'mkdriverdisk' '([dr]|-distro|-release|-size|-media)' \
+    '(add|build|install|ldtarball)' '-force' \
+    'match' '-templatekernel' \
+    '*tarball' '-archive' \
+    '(match|build|mkkmp)' '(j*|-no-(prepare|clean)-kernel|-kernelsourcedir)' \
+    '(remove|build|install|status|mk(^kmp))' '-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|mk*|status)
+    args+=( ': :->modules' )
+  ;|
+  |remove|build|install|uninstall|match|status|mk(^kmp))
+    args+=( '(--all)*-k[specify kernel version]:kernel:->kernels' )
+  ;|
+  |add|remove) args+=( "${ign}--rpm_safe_upgrade" ) ;|
+  |mk(driverdisk|kmp))
+    args+=( "${ign}--spec=:spec file:_files -g '*.spec(-.)'" )
+  ;|
+  |(mk|ld)tarball)
+    args+=( "${ign}--archive=:tarball:_files -g '*.tar(-.)'" )
+  ;|
+  |mk(deb|dsc|rpm))
+    args+=( "${ign}--legacy-postinst=:value [1]:(0 1)" )
+  ;|
+  |mk(tarball|rpm|deb|dsc)) args+=( "${ign}(--source-only --binaries-only)--"{source,binaries}-only ) ;|
+  |match|build|mkkmp)
+    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|build|install|status|mk(^kmp))
+    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" )
+  ;|
+  |mkdriverdisk)
+    args+=(
+      "${ign}(-d --distro)"{-d,--distro=}':distribution:(redhat'{,1,2,3}' suse unitedlinux)'
+      "${ign}(-r --release)"{-r,--release=}':release'
+      "${ign}--size=:size (kb) [1440]"
+      "${ign}--media=:media type [floppy]:(floppy iso tar)"
+    )
+  ;|
+  add)
+    args+=(
+      '2:path:_directories'
+      '3:tarball:_files -g "*.tar(-.)"'
+    )
+  ;;
+  install)
+    args+=(
+      '2: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[@]" /lib/modules/$IPREFIX/build/arch/*(/:t) && ret=0
+    else
+      compset -S '/*'
+      dirs=( /lib/modules/*(/: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



Messages sorted by: Reverse Date, Date, Thread, Author