# Rails recipes namespace :rails do desc <<-DESC Create database yaml in shared path. Note: If both @:db_host@ and @:db_socket@ are used, @db_socket@ wins.
db_name
Database name (rails).
@set :db_name, "app_db_name"@
db_user
Database user (rails).
@set :db_user, "app_db_user"@
db_pass
Database password (rails).
@set :db_pass, "the_password"@
db_host
Database host (can be nil, if you are using socket).
Defaults to @nil@
db_socket
Database socket (can be nil, if you are using host).
Defaults to @nil@
@set :db_socket, "/var/lib/mysql/mysql.sock"@
database_yml_template
Path to database yml erb template.
Defaults to @rails/database.yml.erb@ (in this GEM)
"Source":#{link_to_source(__FILE__)} DESC task :setup, :roles => :app do # Settings fetch(:db_name) fetch(:db_user) fetch(:db_pass) fetch_or_default(:db_host, nil) fetch_or_default(:db_socket, nil) fetch_or_default(:database_yml_template, "rails/database.yml.erb") unless db_host.blank? set :db_connect_type, "host" set :db_connect, db_host end unless db_socket.blank? set :db_connect_type, "socket" set :db_connect, db_socket end run "mkdir -p #{shared_path}/config" put template.load(database_yml_template), "#{shared_path}/config/database.yml" end desc "Make symlink for database yaml" task :update_code do run "ln -nfs #{shared_path}/config/database.yml #{release_path}/config/database.yml" end # Log tasks namespace :logs do desc <<-DESC Tail production log files. "From errtheblog":http://errtheblog.com/posts/19-streaming-capistrano "Source":#{link_to_source(__FILE__)} DESC task :tail, :roles => :web do run "tail -f #{shared_path}/log/production.log" do |channel, stream, data| puts # for an extra line break before the host name puts "#{channel[:host]}: #{data}" break if stream == :err end end desc <<-DESC Check production log files in TextMate. "From errtheblog":http://errtheblog.com/posts/19-streaming-capistrano "Source":#{link_to_source(__FILE__)} DESC task :mate, :roles => :app do require 'tempfile' tmp = Tempfile.open('w') logs = Hash.new { |h,k| h[k] = '' } run "tail -n500 #{shared_path}/log/production.log" do |channel, stream, data| logs[channel[:host]] << data break if stream == :err end logs.each do |host, log| tmp.write("--- #{host} ---\n\n") tmp.write(log + "\n") end exec "mate -w #{tmp.path}" tmp.close end end desc <<-DESC Remotely console. "From errtheblog":http://errtheblog.com/posts/19-streaming-capistrano "Source":#{link_to_source(__FILE__)} DESC task :console, :roles => :app do input = '' run "cd #{current_path} && ./script/console #{ENV['RAILS_ENV']}" do |channel, stream, data| next if data.chomp == input.chomp || data.chomp == '' print data channel.send_data(input = $stdin.gets) if data =~ /^(>|\?)>/ end end end