What’s new?
- Rake tasks are cached (thanks to turadb).
- If there is no Rakefile in the current directory, ancestor directories are searched in the way Rake itself does.
Installation
Copy the file to /etc/bash_completion.d
or possibly /usr/share/bash-completion/completions
or to another place where it is loaded when your Bash shell is started.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
case "$COMP_WORDBREAKS" in | |
*:*) : great ;; | |
*) COMP_WORDBREAKS="$COMP_WORDBREAKS:" | |
esac | |
__rakefile_path() { | |
( | |
while [ "$PWD" != / ]; do | |
if [ -f "Rakefile" ]; then | |
echo "$PWD/Rakefile" | |
break | |
fi | |
cd .. | |
done | |
) | |
} | |
__rake_cache_path() { | |
local rakefile="${1:-$(__rakefile_path)}" | |
test -n "$rakefile" || return | |
echo "$(dirname "$rakefile")/.rake_t_cache" | |
} | |
rake_cache_store() { | |
local rakef=${1:-Rakefile} | |
rake --rakefile="$rakef" --tasks --silent > "$(__rake_cache_path "$rakef")" | |
} | |
rake_cache_clear() { | |
local cache=$(__rake_cache_path) | |
test -n "$cache" && rm -f "$cache" | |
} | |
_rake() | |
{ | |
local cur prev rakef i | |
COMPREPLY=() | |
cur=${COMP_WORDS[COMP_CWORD]} | |
prev=${COMP_WORDS[COMP_CWORD-1]} | |
rakef="$(__rakefile_path)" | |
if [[ "$prev" == "-f" ]]; then | |
_filedir | |
return 0 | |
fi | |
if [[ "$cur" == *=* ]]; then | |
prev=${cur/=*/} | |
cur=${cur/*=/} | |
if [[ "$prev" == "--rakefile=" ]]; then | |
_filedir -o nospace | |
return 0 | |
fi | |
fi | |
if [[ "$cur" == -* ]]; then | |
COMPREPLY=( $( compgen -W '-n -H -I -N -P -q -f\ | |
-r -s -T -t -h -v -V\ | |
--dry-run --help '--libdir=' --nosearch --prereqs --quiet\ | |
'--rakefile=' '--require=' --silent --tasks --trace --usage\ | |
--verbose --version'\ | |
-- $cur )) | |
else | |
for (( i=0; i < ${#COMP_WORDS[@]}; i++)); do | |
case "${COMP_WORDS[i]}" in | |
-f) | |
eval rakef=${COMP_WORDS[i+1]} | |
break | |
;; | |
--rakefile=*|--rakefile\=*) | |
eval rakef=${COMP_WORDS[i]/*=/} | |
break | |
;; | |
esac | |
done | |
[ ! -f "$rakef" ] && return 0 | |
local cachef="$(__rake_cache_path "$rakef")" | |
if [ ! -f "$cachef" -o "$rakef" -nt "$cachef" ]; then | |
rake_cache_store "$rakef" | |
fi | |
local tasks=$(awk -F ' ' '/^rake / { print $2 }' "$cachef") | |
COMPREPLY=($(compgen -W "${tasks}" -- ${COMP_WORDS[COMP_CWORD]})) | |
fi | |
} | |
# FIXME have rake && complete -F _rake $filenames rake | |
complete -F _rake $filenames rake |