Skip to content

Instantly share code, notes, and snippets.

@mschuerig
Created June 7, 2012 22:30
Show Gist options
  • Save mschuerig/2892103 to your computer and use it in GitHub Desktop.
Save mschuerig/2892103 to your computer and use it in GitHub Desktop.
Better Bash Completion for Rake
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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment