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

Re: SVN completion problem



Vincent Lefevre wrote:
> 
> BTW, "svn help s<TAB>" doesn't work: it doesn't try to complete to
> anything.

I think there's a few sub commands that could be better handled. The
patch below handles help for svn and svnadmin. I also fixed a bug where
it wasn't picking up svnadmin subcommands that had a `-' in their name.

Patch is big because I rearranged things a bit. sub command completion
wasn't factored out especially helpfully.

Oliver

Index: Completion/Unix/Command/_subversion
===================================================================
RCS file: /cvsroot/zsh/zsh/Completion/Unix/Command/_subversion,v
retrieving revision 1.13
diff -u -r1.13 _subversion
--- Completion/Unix/Command/_subversion	14 Jun 2005 15:16:47 -0000	1.13
+++ Completion/Unix/Command/_subversion	8 Aug 2005 08:34:14 -0000
@@ -1,19 +1,139 @@
 #compdef svn svnadmin svnadmin-static=svnadmin
 
 _svn () {
+  local curcontext="$curcontext" state line expl ret=1
 
-  _arguments -s \
+  _arguments -C \
     '(-)--help[print help information]' \
     '(- *)--version[print client version information]' \
-    '*::svn command:_svn_command'
+    '1: :->cmds' \
+    '*:: :->args' && ret=0
+
+  if [[ -n $state ]] && (( ! $+_svn_cmds )); then
+    typeset -gHA _svn_cmds
+    _svn_cmds=(
+      ${=${(f)${${"$(LC_MESSAGES=C _call_program commands svn help)"#l#*Available subcommands:}%%Subversion is a tool*}}/(#s)[[:space:]]#(#b)([a-z]##)[[:space:]]#(\([a-z, ?]##\))#/$match[1] :$match[1]${match[2]:+:${${match[2]//[(),]}// /:}}:}
+    )
+  fi
+
+  case $state in
+    cmds)
+      _wanted commands expl 'svn command' _svn_commands && ret=0
+    ;;
+    args)
+      local cmd args usage
+      typeset -gHA _cache_svn_status
+
+      cmd="${${(k)_svn_cmds[(R)*:$words[1]:*]}:-${(k)_svn_cmds[(i):$words[1]:]}}"
+      if (( $#cmd )); then
+        curcontext="${curcontext%:*:*}:svn-${cmd}:"
+
+        usage=${${(M)${(f)"$(LC_MESSAGES=C _call_program options svn help $cmd)"}:#usage:*}#usage: $cmd] }
+        args=(
+          ${=${${${(M)${(f)"$(LC_MESSAGES=C _call_program options svn help $cmd)"##*Valid options:}:#* :*}%% #:*}/ arg/:arg:}/(#b)-([[:alpha:]]) \[--([a-z-]##)\](:arg:)#/(--$match[2])-$match[1]$match[3] (-$match[1])--$match[2]$match[3]}
+        )
+
+        case $cmd in;
+          add)
+            args+=(
+              '*:file:_files -g "*(^e:_svn_controlled:)"'
+            )
+          ;;
+          commit)
+            args-+=(
+              '*:file:_files -g "*(e:_svn_status:)"'
+            )
+          ;;
+          delete)
+            args+=(
+              '*:file:_files -g ".svn(/e:_svn_deletedfiles:)"'
+            )
+          ;;
+          help)
+            args+=(
+              '*::sub command:_svn_commands'
+            )
+          ;;
+          log)
+            args+=(
+              '1: : _alternative "files:file:_files -g \*\(e:_svn_controlled:\)" "urls:URL:_svn_urls"'
+	      '*:file:_files -g "*(e:_svn_controlled:)"'
+            )
+          ;;
+          revert)
+            args+=(
+              '*:file:_files -g "(.svn|*)(/e:_svn_deletedfiles:,e:_svn_status:)"'
+            )
+          ;;
+          *)
+            case $_svn_subcmd_usage in
+              *(SRC|DST|TARGET|URL*PATH)*)
+                args+=(
+	          '*: : _alternative "files:file:_files" "urls:URL:_svn_urls"'
+	        )
+	      ;;
+              *URL*) args+=( ':URL:_svn_urls' ) ;;
+              *PATH*) args+=( '*:file:_files' ) ;;
+            esac
+          ;;
+        esac
+
+        _arguments "$args[@]" && ret=0
+
+      else
+        _message "unknown svn command: $words[1]"
+      fi
+    ;;
+  esac
+
+  return ret
 }
 
 _svnadmin () {
+  local curcontext="$curcontext" state line ret=1
 
-  _arguments -s \
+  _arguments -C \
     '(-)--help[print help information]' \
     '(- *)--version[print client version information]' \
-    '*::svnadmin command:_svnadmin_command'
+    '1: :->cmds' \
+    '*:: :->args' && ret=0
+
+  if [[ -n $state ]] && (( ! $+_svnadmin_cmds )); then
+    typeset -gHA _svnadmin_cmds
+    _svnadmin_cmds=(
+      ${=${(f)${${"$(LC_MESSAGES=C _call_program commands svnadmin help)"#l#*Available subcommands:}}}/(#s)[[:space:]]#(#b)([-a-z]##)[[:space:]]#(\([a-z, ?]##\))#/$match[1] :$match[1]${match[2]:+:${${match[2]//[(),]}// /:}}:}
+    )
+  fi
+
+  case $state in
+    cmds)
+      _wanted commands expl 'svnadmin command' _svnadmin_commands && ret=0
+    ;;
+    args)
+      local cmd args usage
+
+      cmd="${${(k)_svnadmin_cmds[(R)*:$words[1]:*]}:-${(k)_svnadmin_cmds[(i):$words[1]:]}}"
+      if (( $#cmd )); then
+        curcontext="${curcontext%:*:*}:svnadmin-${cmd}:"
+
+        usage=${${(M)${(f)"$(LC_MESSAGES=C _call_program options svnadmin help $cmd)"}:#$cmd: usage:*}#$cmd: usage: svnadmin $cmd }
+        args=(
+          ${=${${${(M)${(f)"$(LC_MESSAGES=C _call_program options svnadmin help $cmd)"##*Valid options:}:#*:*}%% #:*}/ arg/:arg:}/(#b)-([[:alpha:]]) \[--([a-z-]##)\](:arg:)#/(--$match[2])-$match[1]$match[3] (-$match[1])--$match[2]$match[3]}
+        )
+        if [[ $_svnadmin_subcmd_usage == *REPOS_PATH* ]]; then
+          args+=( ":path:_files -/" )
+        elif [[ $cmd = help ]]; then
+          args+=( "*:subcommand:_svnadmin_commands" )
+        fi
+
+        _arguments "$args[@]" && ret=0
+      else
+        _message "unknown svnadmin command: $words[1]"
+      fi
+    ;;
+  esac
+
+  return ret
 }
 
 (( $+functions[_svn_controlled] )) ||
@@ -23,7 +143,7 @@
 
 (( $+functions[_svn_deletedfiles] )) ||
 _svn_deletedfiles() {
-  # Typical usage would be _files -g '.svn(/e:_svn_deletedfiles:)' 
+  # Typical usage would be _files -g '.svn(/e:_svn_deletedfiles:)'
   local cont controlled
   reply=( )
   [[ $REPLY = (*/|).svn ]] || return
@@ -54,139 +174,20 @@
   else
     compset -S '[^:]*'
     _wanted url-schemas expl 'URL schema' compadd -S '' - \
-        file:// http:// https:// svn:// svn+ssh:// 
-  fi    
-}
-
-(( $+functions[_svn_command] )) ||
-_svn_command () {
-  local cmd
-
-  if (( ! $+_svn_cmds )); then
-    typeset -gHA _svn_cmds
-    _svn_cmds=(
-      ${=${(f)${${"$(LC_MESSAGES=C _call_program commands svn help)"#l#*Available subcommands:}%%Subversion is a tool*}}/(#s)[[:space:]]#(#b)([a-z]##)[[:space:]]#(\([a-z, ?]##\))#/$match[1] :$match[1]${match[2]:+:${${match[2]//[(),]}// /:}}:}
-    )
-  fi
-
-  if (( CURRENT == 1 )); then
-    _tags commands && { compadd "$@" -k _svn_cmds || compadd "$@" ${(s.:.)_svn_cmds} }
-  else
-    local curcontext="$curcontext"
-
-    cmd="${${(k)_svn_cmds[(R)*:$words[1]:*]}:-${(k)_svn_cmds[(i):$words[1]:]}}"
-    if (( $#cmd )); then
-      curcontext="${curcontext%:*:*}:svn-${cmd}:"
-      _svn_subcommand $cmd
-    else
-      _message "unknown svn command: $words[1]"
-    fi
+        file:// http:// https:// svn:// svn+ssh://
   fi
 }
 
-(( $+functions[_svn_subcommand] )) ||
-_svn_subcommand () {
-  local subcmd _svn_subcmds _svn_subcmd_usage
-  typeset -gHA _cache_svn_status
-
-  _svn_subcmd_usage=${${(M)${(f)"$(LC_MESSAGES=C _call_program options svn help $1)"}:#usage:*}#usage: $1 }
-
-  _svn_subcmds=(
-    ${=${${${(M)${(f)"$(LC_MESSAGES=C _call_program options svn help $1)"##*Valid options:}:#* :*}%% #:*}/ arg/:arg:}/(#b)-([[:alpha:]]) \[--([a-z-]##)\](:arg:)#/(--$match[2])-$match[1]$match[3] (-$match[1])--$match[2]$match[3]}
-  )
-
-  case $1 in;
-    add)
-      _svn_subcmds+=(
-        '*:file:_files -g "*(^e:_svn_controlled:)"'
-      )
-    ;;
-    commit)
-      _svn_subcmds+=(
-        '*:file:_files -g "*(e:_svn_status:)"'
-      )
-    ;;
-    delete)
-      _svn_subcmds+=(
-        '*:file:_files -g ".svn(/e:_svn_deletedfiles:)"'
-      )
-    ;;
-    log)
-      _svn_subcmds+=(
-        '1: : _alternative "files:file:_files -g \*\(e:_svn_controlled:\)" "urls:URL:_svn_urls"'
-	'*:file:_files -g "*(e:_svn_controlled:)"'
-      )
-    ;;
-    revert)
-      _svn_subcmds+=(
-        '*:file:_files -g "(.svn|*)(/e:_svn_deletedfiles:,e:_svn_status:)"'
-      )
-    ;;
-    *)
-      case $_svn_subcmd_usage in
-        *(SRC|DST|TARGET|URL*PATH)*)
-          _svn_subcmds+=( 
-	    '*: : _alternative "files:file:_files" "urls:URL:_svn_urls"'
-	  )
-	;;
-        *URL*) _svn_subcmds+=( ':URL:_svn_urls' ) ;;
-        *PATH*) _svn_subcmds+=( '*:file:_files' ) ;;
-      esac
-    ;;
-  esac
-
-  _arguments "$_svn_subcmds[@]" && ret=0
-
-  return ret
+(( $+functions[_svn_commands] )) ||
+_svn_commands() {
+  compadd "$@" -k _svn_cmds || compadd "$@" ${(s.:.)_svn_cmds}
 }
 
-
 (( $+functions[_svnadmin_command] )) ||
-_svnadmin_command () {
-  local cmd
-
-  if (( ! $+_svnadmin_cmds )); then
-    typeset -gHA _svnadmin_cmds
-    _svnadmin_cmds=(
-      ${=${(f)${${"$(LC_MESSAGES=C _call_program commands svnadmin help)"#l#*Available subcommands:}}}/(#s)[[:space:]]#(#b)([a-z]##)[[:space:]]#(\([a-z, ?]##\))#/$match[1] :$match[1]${match[2]:+:${${match[2]//[(),]}// /:}}:}
-    )
-  fi
-
-  if (( CURRENT == 1 )); then
-    _tags commands && { compadd "$@" -k _svnadmin_cmds || compadd "$@" ${(s.:.)_svnadmin_cmds}  }
-  else
-    local curcontext="$curcontext"
-
-    cmd="${${(k)_svnadmin_cmds[(R)*:$words[1]:*]}:-${(k)_svnadmin_cmds[(i):$words[1]:]}}"
-    if (( $#cmd )); then
-      curcontext="${curcontext%:*:*}:svnadmin-${cmd}:"
-      _svnadmin_subcommand $cmd
-    else
-      _message "unknown svnadmin command: $words[1]"
-    fi
-  fi
+_svnadmin_commands() {
+  compadd "$@" -k _svnadmin_cmds || compadd "$@" ${(s.:.)_svnadmin_cmds}
 }
 
-(( $+functions[_svnadmin_subcommand] )) ||
-_svnadmin_subcommand () {
-  local subcmd _svnadmin_subcmds _svnadmin_subcmd_usage
-
-  _svnadmin_subcmd_usage=${${(M)${(f)"$(LC_MESSAGES=C _call_program options svnadmin help $1)"}:#$1: usage:*}#$1: usage: svnadmin $1 }
-
-  _svnadmin_subcmds=(
-    ${=${${${(M)${(f)"$(LC_MESSAGES=C _call_program options svnadmin help $1)"##*Valid options:}:#*:*}%% #:*}/ arg/:arg:}/(#b)-([[:alpha:]]) \[--([a-z-]##)\](:arg:)#/(--$match[2])-$match[1]$match[3] (-$match[1])--$match[2]$match[3]}
-  )
-
-  [[ "$_svnadmin_subcmd_usage" == *REPOS_PATH* ]] &&
-  _svnadmin_subcmds=($_svnadmin_subcmds ":path:_files -/")
-
-  _arguments "$_svnadmin_subcmds[@]" && ret=0
-
-  return ret
-
-}
-
-
 _subversion () {
   case $service in
     (svn) _svn "$@" ;;


This e-mail and any attachment is for authorised use by the intended recipient(s) only. It may contain proprietary material, confidential information and/or be subject to legal privilege. It should not be copied, disclosed to, retained or used by, any other party. If you are not an intended recipient then please promptly delete this e-mail and any attachment and all copies and inform the sender. Thank you.



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