_gradle() { local cur=${COMP_WORDS[COMP_CWORD]} local gradle_cmd='gradle' if [[ -x ./gradlew ]]; then gradle_cmd='./gradlew' fi if [[ -x ../gradlew ]]; then gradle_cmd='../gradlew' fi local commands='' local cache_dir="$HOME/.gradle_tabcompletion" mkdir -p $cache_dir # TODO: include the gradle version in the checksum? It's kinda slow #local gradle_version=$($gradle_cmd --version --quiet --no-color | grep '^Gradle ' | sed 's/Gradle //g') local gradle_files_checksum=''; if [[ -f build.gradle ]]; then # top-level gradle file if [[ -x `which md5 2> /dev/null` ]]; then # mac local all_gradle_files=$(find . -name build.gradle 2>/dev/null) gradle_files_checksum=$(md5 -q -s "$(md5 -q $all_gradle_files)") else # linux gradle_files_checksum=($(find . -name build.gradle | xargs md5sum | md5sum)) fi else # no top-level gradle file gradle_files_checksum='no_gradle_files' fi if [[ -f $cache_dir/$gradle_files_checksum ]]; then # cached! yay! oldest_gradle_file=($(find . -type f -name build.gradle -print0 | xargs -0 stat -f "%m %N" | sort -rn | head -1 | cut -f2- -d" ")) if [ "$oldest_gradle_file" -nt "$cache_dir/$gradle_files_checksum" ]; then commands=$($gradle_cmd --no-color --quiet tasks --all | grep ' - ' | awk '{print $1}' | tr '\n' ' ') if [[ ! -z $commands ]]; then echo $commands > $cache_dir/$gradle_files_checksum fi else # commands=$(cat $cache_dir/$gradle_files_checksum) commands=$(cat $cache_dir/$gradle_files_checksum) touch echo $cache_dir/$gradle_files_checksum fi else # not cached! boo-urns! commands=$($gradle_cmd --no-color --quiet tasks --all | grep ' - ' | awk '{print $1}' | tr '\n' ' ') if [[ ! -z $commands ]]; then echo $commands > $cache_dir/$gradle_files_checksum fi fi COMPREPLY=( $(compgen -W "$commands" -- $cur) ) } clear_gradle_cache() { local cache_dir="$HOME/.gradle_tabcompletion" if [[ -d $cache_dir ]]; then find $cache_dir -type f -mtime +7 -exec rm -f {} \; fi } clear_gradle_cache complete -F _gradle gradle complete -F _gradle gradlew complete -F _gradle ./gradlew