Merge pull request #5343 from mcornella/rake-fast-plugin-refactor

Repost of #5319 and refactor of rake-fast plugin
This commit is contained in:
Marc Cornellà 2016-08-29 10:05:17 +02:00 committed by GitHub
commit 3c8a33364f
2 changed files with 39 additions and 25 deletions

View file

@ -2,22 +2,34 @@
Fast rake autocompletion plugin. Fast rake autocompletion plugin.
This script caches the output for later usage and significantly speeds it up. It generates a .rake_tasks cache file in parallel to the Rakefile. It also checks the file modification dates to see if it needs to regenerate the cache file. This plugin caches the output for later usage and significantly speeds it up.
It generates a `.rake_tasks` cache file in parallel to the Rakefile. It also
checks the file modification time to see if it needs to regenerate the cache
file.
This is entirely based on [this pull request by Ullrich Schäfer](https://github.com/robb/.dotfiles/pull/10/), which is inspired by [this Ruby on Rails trick from 2006](http://weblog.rubyonrails.org/2006/3/9/fast-rake-task-completion-for-zsh/). This is entirely based on [this pull request by Ullrich Schäfer](https://github.com/robb/.dotfiles/pull/10/),
which is inspired by [this Ruby on Rails trick from 2006](http://weblog.rubyonrails.org/2006/3/9/fast-rake-task-completion-for-zsh/).
Think about that. 2006. Think about that. 2006.
----------
Since August of 2016, it also checks if it's in a Rails project and looks at
rake files inside `lib/tasks` and their modification time to know if the
cache file needs to be regenerated.
## Installation ## Installation
Just add the plugin to your `.zshrc`: Just add the plugin to your `.zshrc`:
```bash ```zsh
plugins=(foo bar rake-fast) plugins=(... rake-fast)
``` ```
You might consider adding `.rake_tasks` to your [global .gitignore](https://help.github.com/articles/ignoring-files#global-gitignore) You might consider adding `.rake_tasks` to your [global .gitignore](https://help.github.com/articles/ignoring-files#global-gitignore)
## Usage ## Usage
`rake`, then press tab Type `rake`, then press tab.
If you want to force the regeneration of the `.rake_tasks` file, run `rake_refresh`.

View file

@ -1,26 +1,22 @@
_rake_refresh () {
if [ -f .rake_tasks ]; then
rm .rake_tasks
fi
echo "Generating .rake_tasks..." > /dev/stderr
_rake_generate
cat .rake_tasks
}
_rake_does_task_list_need_generating () { _rake_does_task_list_need_generating () {
[[ ! -f .rake_tasks ]] || [[ Rakefile -nt .rake_tasks ]] || (_is_rails_app && _tasks_changed) [[ ! -f .rake_tasks ]] || [[ Rakefile -nt .rake_tasks ]] || { _is_rails_app && _tasks_changed }
} }
_is_rails_app () { _is_rails_app () {
[[ -e "bin/rails" ]] || [ -e "script/rails" ] [[ -e "bin/rails" ]] || [[ -e "script/rails" ]]
} }
_tasks_changed () { _tasks_changed () {
local is_changed=1 local -a files
for file in lib/tasks/**/*.rake; do files=(lib/tasks lib/tasks/**/*(N))
if [[ $file -nt .rake_tasks ]]; then is_changed=0; fi
for file in $files; do
if [[ "$file" -nt .rake_tasks ]]; then
return 0
fi
done done
return is_changed
return 1
} }
_rake_generate () { _rake_generate () {
@ -28,14 +24,20 @@ _rake_generate () {
} }
_rake () { _rake () {
if [ -f Rakefile ]; then if [[ -f Rakefile ]]; then
if _rake_does_task_list_need_generating; then if _rake_does_task_list_need_generating; then
echo "\nGenerating .rake_tasks..." > /dev/stderr echo "\nGenerating .rake_tasks..." >&2
_rake_generate _rake_generate
fi fi
compadd `cat .rake_tasks` compadd $(cat .rake_tasks)
fi fi
} }
compdef _rake rake compdef _rake rake
alias rake_refresh='_rake_refresh'
rake_refresh () {
[[ -f .rake_tasks ]] && rm -f .rake_tasks
echo "Generating .rake_tasks..." >&2
_rake_generate
cat .rake_tasks
}