Archive for the ‘bzr’ Category
If you’re working on a project that bootstraps a development environment (using virtualenv or similar) it can be painful to bootstrap the environment for every bug/feature branch that you work on. There are lots of ways you can avoid this (local cache etc.), but if you’re using bzr to manage your branches, a single working directory for all your branches can solve the problem for you. Most bzr users will be familiar with this, but people new to bzr might benefit.
The one-time setup is pretty straight forward – create a repository with a local copy of trunk, and a branch of trunk for your new feature/bug:
$ cd dev/ $ bzr init-repo myproject $ cd myproject $ bzr branch lp:myproject trunk $ bzr branch trunk myfeaturex
From now on, you can simply `cd trunk && bzr pull` when you want to update your local trunk . Now we’ll create a light-weight checkout and bootstrap our environment there. I tend to call this directory ‘current_work’ but whatever works for you. Also, most of the projects I’m working on are using fabric for setting up the virtualenv and other tidbits, but replace that with your own bootstrap command:
$ bzr checkout --lightweight myfeaturex current_work $ cd current_work && fab bootstrap
Assuming everything went well, you now have your development environment setup and are ready to work on myfeaturex. Make changes, commit etc., push to launchpad – it’ll all be for your myfeaturex branch. But what if half-way through, you need to switch and work on an urgent bug? Easy: commit (or shelve) any changes you’ve got for your current branch, then:
$ cd .. $ bzr branch trunk criticalbugx $ cd current_work $ bzr switch ../criticalbugx 
Edit 2011-05-23: See Ricardo’s comment – the above 4 lines can be replaced by his two.
That’s it – your current_work directory now reflects the criticalbugx branch – and is already bootstrapped , you can work away, commit push etc., and then switch back to your original branch with:
$ bzr switch ../myfeaturex
If you’re working on large branches, once you’ve got the above workflow, you may want to try next keeping large features reviewable with bzr pipelines.
 It’s a good idea to never do any work in your trunk tree… always work in a branch of trunk.
 The ../ is not actually required, but when you’ve lots of branches with long names, it means you can tab-complete the branch name.
 Of course, if one of your branches changes any virtualenv requirements or similar, you’ll need to re-bootstrap, but that isn’t so often in practise. Or sometimes a new version of a dependency is released and you won’t get it until you rebootstrap.
One of the things I love is reviewing smaller targeted branches – 400-500 lines focused on one or two particular points. But you don’t want to be blocked on the review of one branch to start the next dependent branch. Here’s a quick screencast (with text version below) that I made for some colleagues showing how Bzr’s pipeline plugin can help your workflow in this situation:
Assuming you’ve already got a lightweight checkout of your project code, create a new branch for part-1 of your feature and switch to it:
$ bzr branch trunk part-1 $ cd current_work;bzr switch ../part-1
Make your changes, commit and push to Launchpad:
$ bzr commit -m "Finished part 1 of feature-x that does x, y and z";bzr push
While that branch is being reviewed, you can start on the next part of the feature:
$ bzr add-pipe part-2 Created and switched to pipe "part-2" $ bzr pipes part-1 * part-2
Now make your further changes for the feature and commit/push those as above (Launchpad will create a new branch for part-2). Now let’s say that the review for part-1 comes back, requiring a small change, so we switch back to part-1, make the change, commit and pump it (so that our part-2 branch will include the change also):
$ bzr switch part-1 $ bzr pipes * part-1 part-2 (make changes) $ bzr commit -m "Changes from review";bzr pump
Now we can see the changes have been merged into the part-2 branch:
$ bzr switch part-2 $ bzr log --limit 1 --line 102: Michael Nelson 2011-01-13 [merge] Merged part-1 into part-2.
So, let’s say we’re now ready to submit part-2 for review. The handy lp-submit bzr plugin will automatically know to set part-1 as a prerequisite branch, so that the diff shown on the part-2 merge proposal includes only the changes from part-2 (as well as making sure that your branches are pushed up to LP):
$ bzr lp-submit Pushing to lp:~michael.nelson/rnr-server/part-1 Pushing to lp:~michael.nelson/rnr-server/part-2
Nice! Now, what if there have been some changes to trunk in the mean-time that you want to include in your branch? Easy, just:
$ bzr pump --from-submit
and pipelines will automatically merge trunk into part-1, commit, then merge part-1 into part-2.
More info with `bzr help pipeline` (once it’s installed), or more information (including how to get it) on the Bazaar Pipeline wiki page.