Skip to content

Commit

Permalink
Added in capistrano support
Browse files Browse the repository at this point in the history
  • Loading branch information
Lawrence Curtis authored and ryanb committed Jun 21, 2008
1 parent 12ef1e3 commit 5851fcd
Showing 1 changed file with 69 additions and 0 deletions.
69 changes: 69 additions & 0 deletions bash/completion_scripts/capistrano_completion
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
#!/usr/bin/env ruby

# to install, add the following line to your .bash_profile or .bashrc
# complete -C path/to/capistrano_completion -o default capistrano

# Capistrano completion will return matching capistrano tasks given typed text. This
# way you can auto-complete tasks as you are typing them by hitting [tab] or [tab][tab]
# This also caches the capistrano tasks for optimium speed
class CapistranoCompletion
CACHE_FILE_NAME = '.cap_tasks~'

def initialize(command)
@command = command
end

def matches
exit 0 if capfile.nil?
matching_tasks.map do |task|
task.sub(typed_before_colon, '')
end
end

private

def typed
@command[/\s(.+?)$/, 1] || ''
end

def typed_before_colon
typed[/.+\:/] || ''
end

def matching_tasks
all_tasks.select do |task|
task[0, typed.length] == typed
end
end

def all_tasks
cache_current? ? tasks_from_cache : generate_tasks
end

def cache_current?
File.exist?(cache_file) && File.mtime(cache_file) >= File.mtime(capfile)
end

def capfile
['capfile', 'Capfile', 'capfile.rb', 'Capfile.rb'].detect do |file|
File.file? File.join(Dir.pwd, file)
end
end

def cache_file
File.join(Dir.pwd, CACHE_FILE_NAME)
end

def tasks_from_cache
IO.read(cache_file).split
end

def generate_tasks
tasks = `cap --tasks`.split("\n")[1..-8].collect {|line| line.split[1]}
File.open(cache_file, 'w') { |f| f.write tasks.join("\n") }
tasks
end
end

puts CapistranoCompletion.new(ENV["COMP_LINE"]).matches
exit 0

0 comments on commit 5851fcd

Please sign in to comment.