zsh-workers
 help / color / mirror / code / Atom feed
From: Oliver Kiddle <okiddle@yahoo.co.uk>
To: Zsh workers <zsh-workers@zsh.org>
Subject: PATCH: new dkms completion
Date: Sun, 03 Jun 2018 00:53:32 +0200	[thread overview]
Message-ID: <13102.1527980012@thecus> (raw)

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


                 reply	other threads:[~2018-06-03  0:12 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=13102.1527980012@thecus \
    --to=okiddle@yahoo.co.uk \
    --cc=zsh-workers@zsh.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).