|
@@ -0,0 +1,253 @@
|
|
|
+#compdef grunt
|
|
|
+# -----------------------------------------------------------------------------
|
|
|
+# _grunt
|
|
|
+#
|
|
|
+# Completion script for grunt.
|
|
|
+# - https://github.com/gruntjs/grunt
|
|
|
+# - https://github.com/gruntjs/grunt-cli
|
|
|
+#
|
|
|
+# -----------------------------------------------------------------------------
|
|
|
+#
|
|
|
+# Version : 0.1.0
|
|
|
+# Author : Yonchu <yuyuchu3333@gmail.com>
|
|
|
+# License : MIT License
|
|
|
+# Repository : https://github.com/yonchu/grunt-zsh-completion
|
|
|
+# Last Change : 22 Jul 2013.
|
|
|
+#
|
|
|
+# Copyright (c) 2013 Yonchu.
|
|
|
+#
|
|
|
+# -----------------------------------------------------------------------------
|
|
|
+# USAGE
|
|
|
+# -----
|
|
|
+#
|
|
|
+# Enable caching:
|
|
|
+#
|
|
|
+# If you want to use the cache, set the followings in your .zshrc:
|
|
|
+#
|
|
|
+# zstyle ':completion:*' use-cache yes
|
|
|
+#
|
|
|
+#
|
|
|
+# Settings:
|
|
|
+#
|
|
|
+# - Show grunt file path:
|
|
|
+# zstyle ':completion::complete:grunt::options:' show_grunt_path yes
|
|
|
+#
|
|
|
+# - Cache expiration days (default: 7):
|
|
|
+# zstyle ':completion::complete:grunt::options:' expire 1
|
|
|
+#
|
|
|
+# - Not update options cache if target gruntfile is changed.
|
|
|
+# zstyle ':completion::complete:grunt::options:' no_update_options yes
|
|
|
+#
|
|
|
+# Note that if you change the zstyle settings,
|
|
|
+# you should delete the cache file and restart zsh.
|
|
|
+#
|
|
|
+# $ rm ~/.zcompcache/grunt
|
|
|
+# $ exec zsh
|
|
|
+#
|
|
|
+# -----------------------------------------------------------------------------
|
|
|
+
|
|
|
+function _grunt() {
|
|
|
+ local curcontext="$curcontext" update_policy state
|
|
|
+ local show_grunt_path update_msg gruntfile opts tasks
|
|
|
+
|
|
|
+ # Setup cache-policy.
|
|
|
+ zstyle -s ":completion:${curcontext}:" cache-policy update_policy
|
|
|
+ if [[ -z $update_policy ]]; then
|
|
|
+ zstyle ":completion:${curcontext}:" cache-policy __grunt_caching_policy
|
|
|
+ fi
|
|
|
+
|
|
|
+ # Check show_path option.
|
|
|
+ zstyle -b ":completion:${curcontext}:options:" show_grunt_path show_grunt_path
|
|
|
+
|
|
|
+ # Get current gruntfile.
|
|
|
+ gruntfile=$(__grunt_get_gruntfile)
|
|
|
+
|
|
|
+ # Initialize opts and tasks.
|
|
|
+ opts=()
|
|
|
+ tasks=()
|
|
|
+
|
|
|
+ # Add help options.
|
|
|
+ opts+=('(- 1 *)'{-h,--help}'[Display this help text.]')
|
|
|
+
|
|
|
+ ## Complete without gruntfile.
|
|
|
+ if [[ ! -f $gruntfile ]]; then
|
|
|
+ _arguments "${opts[@]}"
|
|
|
+ return
|
|
|
+ fi
|
|
|
+
|
|
|
+ ## Complete with gruntfile.
|
|
|
+ # Retrieve cache.
|
|
|
+ if ! __grunt_update_cache "$gruntfile"; then
|
|
|
+ update_msg=' (cache updated)'
|
|
|
+ fi
|
|
|
+
|
|
|
+ # Make optioins completion.
|
|
|
+ if [[ ${#__grunt_opts} -gt 0 ]]; then
|
|
|
+ opts+=("${__grunt_opts[@]}")
|
|
|
+ fi
|
|
|
+
|
|
|
+ # Complete arguments.
|
|
|
+ _arguments \
|
|
|
+ "${opts[@]}" \
|
|
|
+ '*: :->tasks' \
|
|
|
+ && return
|
|
|
+
|
|
|
+ case $state in
|
|
|
+ tasks)
|
|
|
+ if [[ $show_grunt_path == 'yes' ]]; then
|
|
|
+ update_msg="$update_msg: ${${gruntfile/#$HOME/~}%/}"
|
|
|
+ fi
|
|
|
+ # Make tasks completion.
|
|
|
+ if [[ ${#__grunt_tasks} -gt 0 ]]; then
|
|
|
+ tasks+=("${__grunt_tasks[@]}")
|
|
|
+ _describe -t grunt-task "$verbose grunt task$update_msg" tasks || return 1
|
|
|
+ fi
|
|
|
+ ;;
|
|
|
+ esac
|
|
|
+
|
|
|
+ return 0
|
|
|
+}
|
|
|
+
|
|
|
+# Cache policy:
|
|
|
+# The cache file name: grunt
|
|
|
+# The cache variable name: __grunt_version __grunt_gruntfile __grunt_opts __grunt_tasks
|
|
|
+function __grunt_update_cache() {
|
|
|
+ # TODO
|
|
|
+ local version='0.1.0'
|
|
|
+ local is_updating=0
|
|
|
+ local gruntfile="$1"
|
|
|
+ local grunt_info no_update_options cache_path
|
|
|
+
|
|
|
+ # Check no_update_options option.
|
|
|
+ zstyle -b ":completion:${curcontext}:options:" no_update_options no_update_options
|
|
|
+
|
|
|
+
|
|
|
+ if ! ( (( $+__grunt_gruntfile )) \
|
|
|
+ && (( $+__grunt_opts )) \
|
|
|
+ && (( $+__grunt_tasks )) ) \
|
|
|
+ && ! _retrieve_cache 'grunt'; then
|
|
|
+ is_updating=1
|
|
|
+ fi
|
|
|
+
|
|
|
+ if [[ $gruntfile != $__grunt_gruntfile ]]; then
|
|
|
+ # Except for --help options.
|
|
|
+ __grunt_gruntfile=$gruntfile
|
|
|
+ if [[ $no_update_options == 'yes' ]]; then
|
|
|
+ if [[ $PREFIX == ${PREFIX#-} ]]; then
|
|
|
+ # Not options completions.
|
|
|
+ is_updating=1
|
|
|
+ elif [[ ${#__grunt_opts} -lt 2 ]]; then
|
|
|
+ is_updating=1
|
|
|
+ else
|
|
|
+ unset __grunt_gruntfile
|
|
|
+ fi
|
|
|
+ else
|
|
|
+ is_updating=1
|
|
|
+ fi
|
|
|
+ else
|
|
|
+ if [[ $PREFIX != ${PREFIX#-} && ${#__grunt_opts} -gt 1 ]]; then
|
|
|
+ unset __grunt_gruntfile
|
|
|
+ fi
|
|
|
+ fi
|
|
|
+
|
|
|
+ if _cache_invalid 'grunt'; then
|
|
|
+ is_updating=1
|
|
|
+ fi
|
|
|
+
|
|
|
+ # Check _grunt version.
|
|
|
+ if [[ $__grunt_version != $version ]]; then
|
|
|
+ is_updating=1
|
|
|
+ fi
|
|
|
+
|
|
|
+ if [[ $is_updating -ne 0 ]]; then
|
|
|
+ # Update caceh.
|
|
|
+ __grunt_version=$version
|
|
|
+ __grunt_gruntfile=$gruntfile
|
|
|
+ is_updating=1
|
|
|
+ grunt_info=$(grunt --help --no-color --gruntfile "$__grunt_gruntfile" 2>/dev/null)
|
|
|
+ __grunt_opts=(${(f)"$(__grunt_get_opts "$grunt_info")"})
|
|
|
+ __grunt_tasks=(${(f)"$(__grunt_get_tasks "$grunt_info")"})
|
|
|
+ _store_cache 'grunt' __grunt_version __grunt_gruntfile __grunt_opts __grunt_tasks
|
|
|
+ fi
|
|
|
+ return $is_updating
|
|
|
+}
|
|
|
+
|
|
|
+function __grunt_get_tasks() {
|
|
|
+ echo -E "$1" \
|
|
|
+ | grep 'Available tasks' -A 100 \
|
|
|
+ | grep '^ ' \
|
|
|
+ | sed -e 's/^[[:blank:]]*//' -e 's/[[:blank:]]*$//' \
|
|
|
+ | sed -e 's/ /:/'
|
|
|
+}
|
|
|
+
|
|
|
+function __grunt_get_opts() {
|
|
|
+ local opt_hunk opt_sep opt_num line opt
|
|
|
+ opt_hunk=$(echo -E "$1" \
|
|
|
+ | grep 'Options$' -A 100 \
|
|
|
+ | sed '1 d' \
|
|
|
+ | sed -e 's/[[:blank:]]*$//' \
|
|
|
+ )
|
|
|
+
|
|
|
+ opt_sep=()
|
|
|
+ opt_hunk=(${(f)opt_hunk})
|
|
|
+ opt_num=0
|
|
|
+ for line in "$opt_hunk[@]"; do
|
|
|
+ opt=$(echo -E "$line" | sed -e 's/^[[:blank:]]*//')
|
|
|
+ if [[ $line == $opt ]]; then
|
|
|
+ break
|
|
|
+ fi
|
|
|
+ if [[ $opt != ${opt#-} ]]; then
|
|
|
+ # Start with -
|
|
|
+ (( opt_num++ ))
|
|
|
+ opt=$(echo -E "$opt" | sed 's/^\(\(--[^ ]*\)\(, \(-[^ ]*\)\)*\) */\2\\t\4\\\t/')
|
|
|
+ fi
|
|
|
+ opt_sep[$opt_num]=("${opt_sep[$opt_num]}${opt}")
|
|
|
+ done
|
|
|
+
|
|
|
+ for line in "$opt_sep[@]"; do
|
|
|
+ opt=(${(s:\t:)line})
|
|
|
+ if [[ ${opt[1]} == '--help' ]]; then
|
|
|
+ continue
|
|
|
+ fi
|
|
|
+ if [[ ${#opt} -eq 2 ]]; then
|
|
|
+ echo -E "(${opt[1]})${opt[1]}[${opt[2]}]"
|
|
|
+ else
|
|
|
+ echo -E "(${opt[1]},${opt[2]})${opt[1]}[${opt[3]}]"
|
|
|
+ echo -E "(${opt[1]},${opt[2]})${opt[2]}[${opt[3]}]"
|
|
|
+ fi
|
|
|
+ done
|
|
|
+}
|
|
|
+
|
|
|
+function __grunt_get_gruntfile() {
|
|
|
+ local gruntfile
|
|
|
+ local curpath="$PWD"
|
|
|
+ while [ "$curpath" ]; do
|
|
|
+ for gruntfile in "$curpath/"{G,g}runtfile.{js,coffee}; do
|
|
|
+ if [[ -e "$gruntfile" ]]; then
|
|
|
+ echo "$gruntfile"
|
|
|
+ return
|
|
|
+ fi
|
|
|
+ done
|
|
|
+ curpath=${curpath%/*}
|
|
|
+ done
|
|
|
+ return 1
|
|
|
+}
|
|
|
+
|
|
|
+function __grunt_caching_policy() {
|
|
|
+ # Returns status zero if the completions cache needs rebuilding.
|
|
|
+
|
|
|
+ # Rebuild if .agignore more recent than cache.
|
|
|
+ if [[ -f $__grunt_gruntfile && $__grunt_gruntfile -nt $1 ]]; then
|
|
|
+ # Invalid cache because gruntfile is old.
|
|
|
+ return 0
|
|
|
+ fi
|
|
|
+
|
|
|
+ local -a oldp
|
|
|
+ local expire
|
|
|
+ zstyle -s ":completion:${curcontext}:options:" expire expire || expire=7
|
|
|
+ # Rebuild if cache is more than $expire days.
|
|
|
+ oldp=( "$1"(Nm+$expire) )
|
|
|
+ (( $#oldp ))
|
|
|
+}
|
|
|
+
|
|
|
+compdef _grunt grunt
|