summaryrefslogtreecommitdiff
path: root/plugins/gradle/gradle.plugin.zsh
blob: 65b9d4685677db96bfe44af1c861d5e939d3da74 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
##############################################################################
# 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]' \
    '--rerun-task [Specifies that any task optimization is ignored.]' \
    '-i[Log at the info level]' \
    '-m[Dry run]' \
    '-P[Set a project property]' \
    '-p[Specifies the start directory]' \
    '--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]' \
    '-b[Specifies the build file.]' \
    '-c[Specifies the settings file.]' \
    '--continue[Continues task execution after a task failure.]' \
    '-g[Specifies the Gradle user home directory.]' \
    '-I[Specifies an initialization script.]' \
    '--refresh-dependencies[Refresh the state of dependencies.]' \
    '-u[Don''t search in parent directories for a settings.gradle file.]' \
    '*::command:->command' \
    && return 0
}


##############################################################################
# Examine the build.gradle file to see if its timestamp has changed;
# and if so, regenerate the .gradle_tasks cache file
############################################################################
_gradle_does_task_list_need_generating () {
  [[ ! -f .gradletasknamecache ]] || [[ build.gradle -nt .gradletasknamecache ]]
}

##############
# Parse the tasks from `gradle(w) tasks --all` and return them to the calling function.
# All lines in the output from gradle(w) that are between /^-+$/ and /^\s*$/
# are considered to be tasks. If and when gradle adds support for listing tasks
# for programmatic parsing, this method can be deprecated.
##############
_gradle_parse_tasks () {
  lines_might_be_tasks=false
  task_name_buffer=""
  while read -r line; do
    if [[ $line =~ ^-+$ ]]; then
      lines_might_be_tasks=true
      # Empty buffer, because it contains items that are not tasks
      task_name_buffer=""
    elif [[ $line =~ ^\s*$ ]]; then
      if [[ "$lines_might_be_tasks" = true ]]; then
        # If a newline is found, echo the buffer to the calling function
        while read -r task; do
          echo $task | awk '/[a-zA-Z0-9:-]+/ {print $1}'
        done <<< "$task_name_buffer"
        # Empty buffer, because we are done with the tasks
        task_name_buffer=""
      fi
      lines_might_be_tasks=false
    elif [[ "$lines_might_be_tasks" = true ]]; then
      task_name_buffer="${task_name_buffer}\n${line}"
    fi
  done <<< "$1"
}


##############
# Gradle tasks from subprojects are allowed to be executed without specifying
# the subproject; that task will then be called on all subprojects.
# gradle(w) tasks --all only lists tasks per subproject, but when autocompleting
# we often want to be able to run a specific task on all subprojects, e.g.
# "gradle clean".
# This function uses the list of tasks from "gradle tasks --all", and for each
# line grabs everything after the last ":" and combines that output with the original
# output. The combined list is returned as the result of this function.
##############
_gradle_parse_and_extract_tasks () {
  # All tasks
  tasks=$(_gradle_parse_tasks "$1")
  # Task name without sub project(s) prefix
  simple_tasks=$(echo $tasks | awk 'BEGIN { FS = ":" } { print $NF }')
  echo "$tasks\n$simple_tasks"
}

##############################################################################
# Discover the gradle tasks by running "gradle tasks --all"
############################################################################
_gradle_tasks () {
  if [[ -f build.gradle ]]; then
    _gradle_arguments
    if _gradle_does_task_list_need_generating; then
      _gradle_parse_and_extract_tasks "$(gradle tasks --all)" > .gradletasknamecache
    fi
    compadd -X "==== Gradle Tasks ====" $(cat .gradletasknamecache)
  fi
}

_gradlew_tasks () {
  if [[ -f build.gradle ]]; then
    _gradle_arguments
    if _gradle_does_task_list_need_generating; then
      _gradle_parse_and_extract_tasks "$(./gradlew tasks --all)" > .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