about summary refs log tree commit diff
path: root/Completion/Unix/Command
diff options
context:
space:
mode:
Diffstat (limited to 'Completion/Unix/Command')
-rw-r--r--Completion/Unix/Command/_ant79
1 files changed, 68 insertions, 11 deletions
diff --git a/Completion/Unix/Command/_ant b/Completion/Unix/Command/_ant
index c1baf6f69..717fa9ea4 100644
--- a/Completion/Unix/Command/_ant
+++ b/Completion/Unix/Command/_ant
@@ -1,8 +1,9 @@
 #compdef ant -value-,ANT_ARGS,-default-
 
 typeset -A opt_args
-local state line curcontext="$curcontext"
+local buildfile tmp state line curcontext="$curcontext"
 local target='*:target:->target'
+#local CLASSPATH="$ANT_HOME/lib/*.jar"
 
 if [[ $service = *ANT_ARGS* ]]; then
   compset -q
@@ -22,17 +23,73 @@ _arguments -C \
   '-emacs[produce logging information without adornments]' \
   '(-l -logfile)'{-l,-logfile}'[use specified file for log]:logfile:_files' \
   '-logger[the class which is to perform logging]:classname:_java_class' \
-  '-listener[add an instance of class as a project listener]:classname:_java_class' \
-  '(-f -file -buildfile)'{-f,-file,-buildfile}'[use specified build file]:build file:_files' \
-  '*-D[specify property with value to use]:property' \
+  '*-listener[add an instance of class as a project listener]:classname:_java_class' \
+  '(-f -file -buildfile -find)'{-f,-file,-buildfile}'[use specified build file]:build file:_files' \
+  '*-D[specify property with value to use]:property:->property' \
   '-propertyfile[load properties from specfied file]:property file:_files' \
   '-inputhandler[specify class which will handle input requests]:class:_java_class' \
-  '-find[search for buildfile]:file:_files' \
+  '(-f -file -buildfile)-find[search for build file towards the root of filesystem]:build file:(build.xml)' \
   $target && return
 
-if [[ -n $state ]]; then
-  targets=( $(sed -n 's/ *<target name="\([^"]*\)".*/\1/p' < build.xml) )
-  # ant can be used to get a list of targets for us like this but it is slow
-  # targets=( ${${(M)${(f)"$(_call_program targets $words[1] -projecthelp)"}:# *}# } )
-  _wanted targets expl target compadd -a targets
-fi
+case $state in
+  property)
+    if compset -P '*='; then
+      _default
+    else
+      _message -e properties 'property name'
+    fi
+  ;;
+  target)
+    if zstyle -t ":completion:${curcontext}:targets" call-command; then
+      # Run ant -projecthelp also passing any of -find, -buildfile or -f options.
+      # Parse output into an array of the format "target:description".
+      # For the array to be set with correct argument boundaries, the entire
+      # set statement needs to be eval'd.  On Cygwin, need to kill \r's output
+      # from Java or parsing will fail.
+      eval set -A tmp "${$(_call_program targets "$words[1]" $buildxml -projecthelp |
+	while read target desc
+	do
+          # This loop reads ant -projecthelp output from versions 1.3 to 1.5
+          ln="${target}${desc:+:$desc}"
+          [[ $target = "" ]] && continue  # skip blank lines
+          case $ln in
+              (Buildfile:*)
+                  buildfile=$desc
+              ;;
+              (Default:target:*)
+                  # with version 1.5, target is on the same line
+                  default_target="${${desc/target:/}# }"
+                  # versions 1.3 and 1.4 with default target on a separate line
+                  if [[ -z $default_target ]]; then
+                      read junk
+                      read default_target junk
+                  fi
+                  # Output target again indicating its the default one.
+                  print -n "'${default_target}:(Default target) ' "
+              ;;
+              (Searching:*|Main:targets:|Subtargets:|BUILD:SUCCESSFUL|Total:time:
+	      *)
+              ;;
+              (*)
+                  # Return target and description
+                  print -n "'$ln' "
+              ;;
+          esac
+	done
+      )//$'\015'}"
+      _describe 'target' tmp
+    else
+      if [[ -n $opt_args[-find] ]]; then
+	buildfile=( (../)#${opt_args[-find]:-build.xml}(N[-1]) )
+      else
+	buildfile=${(v)opt_args[(I)(-f|-file|-buildfile)]:-build.xml}
+      fi
+      if [[ -f $buildfile ]]; then
+	targets=( $(sed -n 's/ *<target name="\([^"]*\)".*/\1/p' < $buildfile) )
+	_wanted targets expl target compadd -a targets
+      else
+	_message -e targets target
+      fi
+    fi
+  ;;
+esac