Skip to content

Instantly share code, notes, and snippets.

What would you like to do?
Thor task for easier hotfixes with Capistrano & git (instructions below)
# copy to your Capistrano recipe file
namespace :deploy do
task :clear_cached_assets, :roles => :web do
dir = "#{current_release}/public"
run %(rm #{dir}/javascripts/all.js #{dir}/stylesheets/master.css)
class Cap < Thor
desc "commit [HEAD]", "cap deploy:upload files from one or more commits"
method_options 'no-restart' => :boolean, 'environment' => :optional, 'working' => :optional
def commit(refspec = 'HEAD')
if options['working']
diffmode = true
refspec = String === options['working'] ? (' -- ' + options['working']) : ''
diffmode = refspec.index('..')
msg = sha = nil
log_cmd = diffmode ? 'git diff' : "git show --pretty=format:'%h %s'"
# only select added, copied, modified or renamed files
log_cmd << " --diff-filter=ACMR --name-only #{refspec}"
log = `#{log_cmd}`.split("\n")
unless diffmode
sha, msg = log.shift.split(' ', 2)
# ignore tests, specs and submodules
files = log.reject { |file| file =~ /^(test|spec|features)\// or }
if files.empty?
$stderr.puts "Nothing to deploy"
cmd = %(cap deploy:upload FILES='#{files.join(",")}')
if options['environment']
cmd << %( -S branch=#{options['environment']})
if files.any? { |file| file =~ /^public\/(stylesheets|javascripts)\// }
# uses a custom capistrano task
cmd << ' deploy:clear_cached_assets'
unless options['no-restart']
cmd << ' deploy:restart'
if msg and sha
puts %(Deploying commit [#{sha}]: #{msg})
puts %(Deploying #{files.size} file#{files.size == 1 ? '' : 's'})
system cmd
This is a Thor task that wraps the Capistrano "cap deploy:upload" command.
It uses git that provides a list of files to be uploaded.
After uploading, the web application is restarted so that changes may take effect.
## Usage
thor cap:commit
Deploys files from the last (HEAD) commit.
thor cap:commit HEAD^
Deploys files from the previous commit.
thor cap:commit A..B
Deploys files that have changed in a diff between commits A to B.
thor cap:commit origin/production..
Deploys files that have changed since the last state of "origin/production" branch.
thor cap:commit --working
Deploys files currently modified in your working copy (i.e. not yet commited).
thor cap:commit --working=app/views
Deploy only currently modified files under "app/views/" directory.
thor cap:commit --environment=production
thor cap:commit --e production
Overrides the Capistrano variable "branch" to the value of "environment" parameter.
thor cap:commit --no-restart
Don't restart the web application after uploading files.
## Notes
If any of the files under "public/stylesheets/" or "public/javascripts" are
uploaded, this task also invokes the custom "deploy:clear_cached_assets" Capistrano
task. After the application is restarted, Rails re-generates the cached assets.
Files under "spec/" and "features/" directories are not deployed since they
don't affect the production environment.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.