# by bryan helmkamp with slight modification by chris wanstrath # from http://www.brynary.com/2008/8/3/our-git-deployment-workflow # I DO NOT RECOMMEND USING THIS WORKFLOW - IT DESTROYS HISTORY! - jesse andrews module GitCommands extend self def diff_staging `git fetch` puts `git diff origin/production origin/staging` end def tag_staging(branch_name) verify_safe_and_clean `git branch -f staging origin/#{branch_name}` `git push -f origin staging` `git branch -D staging` end def tag_production verify_safe_and_clean `git branch -f production origin/staging` `git push -f origin production` `git branch -D production` end def branch_production(branch_name) verify_safe_and_clean `git branch -f #{branch_name} origin/production --no-track` `git checkout #{branch_name}` `git push origin #{branch_name}` end protected def verify_safe_and_clean `git fetch` return if `git status` =~ /working directory clean/ raise "Must have clean working directory" end end namespace :tag do desc <<-DESC Update the staging branch to prepare for a staging deploy. Defaults to master. Optionally specify a BRANCH=name DESC task :staging do branch_name = ENV['BRANCH'] || "master" GitCommands.tag_staging(branch_name) end desc "Update the production branch to prepare for a release" task :production => ['diff:staging'] do GitCommands.tag_production end end namespace :diff do desc "Show the differences between the staging branch and the production branch" task :staging do GitCommands.diff_staging end end namespace :branch do desc "Branch from production for tweaks or bug fixes. Specify BRANCH=name" task :production do branch_name = ENV['BRANCH'] raise "You must specify a branch name using BRANCH=name" unless branch_name GitCommands.branch_production end end namespace :deploy do desc "Tag and deploy staging" task :staging => "tag:staging" do `cap staging deploy:long` end end