Better Rake Bash completion

What’s new?

  1. Rake tasks are cached (thanks to turadb).
  2. 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.

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
view raw rake.sh hosted with ❤ by GitHub