summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--Completion/Unix/Command/_chsh97
2 files changed, 67 insertions, 35 deletions
diff --git a/ChangeLog b/ChangeLog
index 7908863c1..e1a525c3f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2017-08-18  Oliver Kiddle  <opk@zsh.org>
+
+	* 41560: Completion/Unix/Command/_chsh: cleanup chsh completion
+	for different platforms
+
 2017-08-16  Oliver Kiddle  <opk@zsh.org>
 
 	* Tomasz Pala: users/22834: Completion/Linux/Command/_modutils:
diff --git a/Completion/Unix/Command/_chsh b/Completion/Unix/Command/_chsh
index 97552e3ac..006aa82a1 100644
--- a/Completion/Unix/Command/_chsh
+++ b/Completion/Unix/Command/_chsh
@@ -1,40 +1,67 @@
 #compdef chsh chpass
+
+local variant help=h
+local -a args shells
+
 case $OSTYPE in
-(darwin*|*bsd*)
-  _arguments : \
-      '-s[Specify user login shell]:shell:(${(Z+Cn+)"$(</etc/shells)"})' \
-      "-l[Specify location of user]:node:" \
-      "-u[Specify authentication name]:auth user:" \
-      "1:user name:_users"
+  darwin*|*bsd*)
+    args=( '(-a)-s[specify new login shell]:shell:($shells)' )
+  ;|
+  (free|net|open)bsd*)
+    args+=( '(-s 1)-a[specify user database entry]:passwd entry' )
+  ;|
+  darwin*)
+    args+=(
+      '-l[specify location of user]:location'
+      '-u[specify authentication name]:auth user'
+    )
   ;;
-(linux-gnu)
-  if { =chsh -v } >&/dev/null
-  then
-      local -a opts shells
-      shells=( $(=chsh -l) )
-      _arguments : \
-	  "(-)-s[Specify your login shell]:shell:($shells)" \
-	  "(-)--shell[Specify your login shell]:shell:($shells)" \
-	  "(-)-l[Print shells in /etc/shells]" \
-	  "(-)--list-shells[Print shells in /etc/shells]" \
-	  "(-)-u[Print a usage message and exit]" \
-	  "(-)--help[Print a usage message and exit]" \
-	  "(-)-v[Print version information and exit]" \
-	  "(-)--version[Print version information and exit]" \
-	  "1:user name:_users"
-      return
-  fi
-  # else fall through
-  ;&
-(*)
-  local s=''
-  # Use $s to cause all options to be treated as mutually exclusive
-  [[ $words[CURRENT-1] = -* ]] && s="(-)$words[CURRENT-1]"
-  # This fiddling with $s is a hack to cause "_arguments  : --" to use
-  # the /etc/shells listing for -s or --shell even when the description
-  # of that option has been pulled from the GNU --help output.
-  [[ $words[CURRENT-1] = (-s|--shell) ]] &&
-    s="$s"'[ ]:shell:(${(Z+Cn+)"$(</etc/shells)"})'
-  _arguments : $s "1:user name:_users" --
+  (free|net)bsd*)
+    args+=(
+      '(-y)-l[update only the local password file]'
+      '(-l)-y[force YP database entry to be changed]'
+    )
+  ;|
+  freebsd*)
+    args+=(
+      '-p[specify encrypted password field]:password hash'
+      '-e[change account expire time]:expiry time'
+      '-d[specify NIS domain]:domain'
+      '-h[specify NIS server to query]:NIS server:_hosts'
+      '-o[force use of RPC-based updates]'
+    )
+  ;;
+  (linux-gnu)
+    _pick_variant -r variant util-linux=util-linux suse=pwdutils debian -v
+    args=( -S : '(-)'{-s+,--shell=}'[specify new login shell]:shell:($shells)' )
+    case $variant in
+      suse|util-linux)
+	shells=( $(_call_program shells $words[1] -l) )
+        args+=(
+	  '(-)'{-l,--list-shells}'[print shells in /etc/shells]'
+	  '(-)'{-v,--version}'[display version information]'
+        )
+	help=u
+      ;|
+      util-linux|debian)
+	args+=( '(-)-'{$help,-help}'[display help information]' )
+      ;|
+      suse)
+        args+=(
+	  '(-)'{-u,--usage}'[display short usage message]'
+	  '(-)--help[display help information]'
+	  '(-D --binddn)'{-D+,--binddn=}'[specify LDAP disingushed name to bind]:binddn'
+	  '(-P --path)'{-P+,--path=}'[specify path to search for passwd and shadow files]:path:_directories'
+	  '(-q --quiet)'{-q,--quiet}"[don't be verbose]"
+	  '--service=[use specified name service]:service:(files nis nisplus ldap)'
+	)
+      ;;
+      debian)
+	args+=( '(-R --root)'{-R+,--root=}'[specify directory to chroot into]:directory:_directories' )
+      ;;
+    esac
   ;;
 esac
+
+(( $#shells )) || shells=( ${(Z+Cn+)"$(</etc/shells)"} )
+_arguments $args '1:user name:_users'