Capistrano deploy from any branch

When using capistrano for rails deployment you typically end up with a configuration file per environement in the config/deploy folder. In this file you state what branch you want to deploy from:

set :branch, 'staging'

This may be a good thing if you always want to deploy from a certain branch to a certain environment. At my current gig we always deploy to production from a production branch. Another common approach is to keep master in sync with the production environment. However for test environemnts it may be convenient to be able to deploy from any branch. Luckily config files in Ruby are often written in Ruby (not in XML or something similar unprogammable). So making this little thing happen is as easy as:

set :branch, `git symbolic-ref -q HEAD`.split('/').last.strip

and the current branch will be used when running the deploy. One may think that git branch should have an option for just getting the current branch and nothing else but no luck there….. The symbolic-ref command give us the full name of the branch. E.g. refs/heads/development so we need to the stripping part ourselves.

The way capistrano is normally setup it is possible to deploy the production branch from another branch. This makes it impossible to keep track of what deploy configuration that actually was used for a certain deploy. Dangerous stuff indeed.