From c2a95b796b79b4ce4e36b8cb879cb9b0162bc438 Mon Sep 17 00:00:00 2001
From: Matthew Git McCullough <matthewm@ambientideas.com>
Date: Tue, 14 Jun 2011 15:01:28 -0600
Subject: [PATCH] Added a gradle build tool plugin

* Enhanced gradle plugin to parse tasks from a quick execution of the tool
* Added a duplicated function for gradlew completion that uses gradlew internally. Builds like Gradle itself (built with Gradle) are sensitive to being run with a matching gradlew version.
* Fixed broken caching of gradle task names. Added - and -- argument completions.
---
 plugins/gradle/gradle.plugin.zsh | 119 +++++++++++++++++++++++++++++++
 1 file changed, 119 insertions(+)
 create mode 100644 plugins/gradle/gradle.plugin.zsh

diff --git a/plugins/gradle/gradle.plugin.zsh b/plugins/gradle/gradle.plugin.zsh
new file mode 100644
index 000000000..fc4c78c50
--- /dev/null
+++ b/plugins/gradle/gradle.plugin.zsh
@@ -0,0 +1,119 @@
+#!zsh
+##############################################################################
+# A descriptive listing of core Gradle commands 
+############################################################################
+function _gradle_core_commands() {
+    local ret=1 state
+    _arguments ':subcommand:->subcommand' && ret=0
+
+    case $state in
+      subcommand)
+        subcommands=(
+          "properties:Display all project properties"
+          "tasks:Calculate and display all tasks"
+          "dependencies:Calculate and display all dependencies"
+          "projects:Discover and display all sub-projects"
+          "build:Build the project"
+          "help:Display help"
+        )
+        _describe -t subcommands 'gradle subcommands' subcommands && ret=0
+    esac
+
+    return ret
+}
+
+function _gradle_arguments() {
+    _arguments -C \
+    '-a[Do not rebuild project dependencies]' \
+    '-h[Help]' \
+    '-D[System property]' \
+    '-d[Log at the debug level]' \
+    '--gui[Launches the Gradle GUI app]' \
+    '--stop[Stop the Gradle daemon]' \
+    '--daemon[Use the Gradle daemon]' \
+    '--no-daemon[Do not use the Gradle daemon]' \
+    '--no-opt[Do not perform any task optimization]' \
+    '-i[Log at the info level]' \
+    '-m[Dry run]' \
+    '-P[Set a project property]' \
+    '--profile[Profile the build time]' \
+    '-q[Log at the quiet level (only show errors)]' \
+    '-v[Print the Gradle version info]' \
+    '-x[Specify a task to be excluded]' \
+    '*::command:->command' \
+    && return 0
+}
+
+
+##############################################################################
+# Are we in a directory containing a build.gradle file?
+############################################################################
+function in_gradle() {
+    if [[ -f build.gradle ]]; then
+        echo 1
+    fi
+}
+
+############################################################################
+# Define the stat_cmd command based on platform behavior
+##########################################################################
+stat -f%m . > /dev/null 2>&1
+if [ "$?" = 0 ]; then
+	stat_cmd=(stat -f%m)
+else
+	stat_cmd=(stat -L --format=%Y)
+fi
+
+############################################################################## Examine the build.gradle file to see if its
+# timestamp has changed, and if so, regen
+# the .gradle_tasks cache file
+############################################################################
+_gradle_does_task_list_need_generating () {
+  if [ ! -f .gradletasknamecache ]; then return 0;
+  else
+    accurate=$($stat_cmd .gradletasknamecache)
+    changed=$($stat_cmd build.gradle)
+    return $(expr $accurate '>=' $changed)
+  fi
+}
+
+
+##############################################################################
+# Discover the gradle tasks by running "gradle tasks --all"
+############################################################################
+_gradle_tasks () {
+  if [ in_gradle ]; then
+    _gradle_arguments
+    if _gradle_does_task_list_need_generating; then
+     gradle tasks --all | grep "^[ ]*[a-zA-Z0-9]*\ -\ " | sed "s/ - .*$//" | sed "s/[\ ]*//" > .gradletasknamecache
+    fi
+    compadd -X "==== Gradle Tasks ====" `cat .gradletasknamecache`
+  fi
+}
+
+_gradlew_tasks () {
+  if [ in_gradle ]; then
+    _gradle_arguments
+    if _gradle_does_task_list_need_generating; then
+     gradlew tasks --all | grep "^[ ]*[a-zA-Z0-9]*\ -\ " | sed "s/ - .*$//" | sed "s/[\ ]*//" > .gradletasknamecache
+    fi
+    compadd -X "==== Gradlew Tasks ====" `cat .gradletasknamecache`
+  fi
+}
+
+
+##############################################################################
+# Register the completions against the gradle and gradlew commands
+############################################################################
+compdef _gradle_tasks gradle
+compdef _gradlew_tasks gradlew
+
+
+##############################################################################
+# Open questions for future improvements:
+# 1) Should 'gradle tasks' use --all or just the regular set?
+# 2) Should gradlew use the same approach as gradle?
+# 3) Should only the " - " be replaced with a colon so it can work
+#     with the richer descriptive method of _arguments?
+#     gradle tasks | grep "^[a-zA-Z0-9]*\ -\ " | sed "s/ - /\:/"
+#############################################################################