<?xml version='1.0' encoding='UTF-8'?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/'><id>tag:blogger.com,1999:blog-5733547231775030285</id><updated>2008-07-13T11:10:05.837+10:00</updated><title type='text'>Mere Code</title><link rel='alternate' type='text/html' href='http://code.mumak.net/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default?start-index=26&amp;max-results=25'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default'/><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://code.mumak.net/atom.xml'/><author><name>jml</name><uri>http://www.blogger.com/profile/11400080716012026985</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>33</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5733547231775030285.post-4536070818872098294</id><published>2008-07-07T17:00:00.003+10:00</published><updated>2008-07-07T18:22:37.506+10:00</updated><title type='text'>I Love Data</title><content type='html'>At work, we recently started to graph the time it takes to access a branch in Launchpad via SSH, both on our staging and production servers.&lt;br /&gt;&lt;br /&gt;I love this so much. Having this data is &lt;span style="font-style: italic;"&gt;liberating&lt;/span&gt;. It's like turning on a light in a dark room: suddenly I can go from uncertain, careful, hesitant steps to bold, confident strides.&lt;br /&gt;&lt;br /&gt;In fact, the metaphor stretches further. This new light has revealed objects of interest (that is, spikes in the time taken) that I wasn't aware of before. I need to know how long these spikes last, how they correlate with load on the system and so forth. Soon there'll be more graphs, and I'll be able to correlate them and analyze them and suck on their delicious, numerical marrow (the light metaphor long abandoned).&lt;br /&gt;&lt;br /&gt;Regardless of whether it's liberating illumination or nourishing, savoury meat, this new graph makes me wonder why I don't chart other things I care about. Having such graphs would help me see the &lt;span style="font-style: italic;"&gt;impact&lt;/span&gt; of my actions. I could chart things like my bank balance, my waistline or the number of Latin words I learned this week. Then I could answer questions like "do I spend more on Tuesdays?" or "can I afford this iPod/cake/gerund?". This is important, because when I am tempted with a sleek/delicious/perplexing iPod/cake/gerund, I fall back on my own judgment. I think it's time to confess, dear reader, that my own judgment isn't very good. And yet I continue to trust it.&lt;br /&gt;&lt;br /&gt;The reason I don't have such graphs is that they are inconvenient to maintain. A graph of branch access times is &lt;span style="font-style: italic;"&gt;easy&lt;/span&gt;. All you need to do is describe how to get the measurement, and then do a bit of once-off set up. If you want to graph your body weight, you need to get on the scales at a fixed time and then look at the dial and adjust for parallax and then write a number down somewhere and maybe note down whether this is before or after a meal and then take the number and then add it to a spreadsheet. Most online banking sites I've seen are even &lt;span style="font-style: italic;"&gt;less&lt;/span&gt; convenient than this.&lt;br /&gt;&lt;br /&gt;Getting data on life is hard, but for programming it's easy. What things do you care about on your project? Features, user experience, how fast bugs get fixed? Can you quantify these things? Can you make a pretty picture out of it? If so, do it now! Post your answers here, set up something like&lt;span style="text-decoration: underline;"&gt;&lt;/span&gt; &lt;a href="http://cricket.sourceforge.net/"&gt;Cricket&lt;/a&gt; and then profit!&lt;br /&gt;&lt;br /&gt;P.S. I can't believe I got to the end of this post without saying how awesome the Canonical sysadmins are. Let me correct that now. The Canonical sysadmins are heck of awesome. They could &lt;a href="http://cdn-www.i-am-bored.com/media/95709_mordoranim8.gif"&gt;simply walk into Mortor&lt;/a&gt;.</content><link rel='alternate' type='text/html' href='http://code.mumak.net/2008/07/i-love-data.html' title='I Love Data'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733547231775030285&amp;postID=4536070818872098294' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://code.mumak.net/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/4536070818872098294'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/4536070818872098294'/><author><name>jml</name><uri>http://www.blogger.com/profile/11400080716012026985</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-5733547231775030285.post-6225331854382219297</id><published>2008-07-03T16:17:00.004+10:00</published><updated>2008-07-05T20:39:55.980+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Uncategorized'/><title type='text'>Somebody Do This Please</title><content type='html'> &amp;lt;jml&amp;gt; What's the difference between &lt;a href="http://gobby.0x539.de/trac/"&gt;Gobby&lt;/a&gt; and a &lt;a href="http://moinmo.in/" title="Moin Moin"&gt;wiki&lt;/a&gt;?&lt;br /&gt;&amp;lt;mwh&amp;gt; NAT</content><link rel='alternate' type='text/html' href='http://code.mumak.net/2008/07/somebody-do-this-please_9690.html' title='Somebody Do This Please'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733547231775030285&amp;postID=6225331854382219297' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://code.mumak.net/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/6225331854382219297'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/6225331854382219297'/><author><name>jml</name><uri>http://www.blogger.com/profile/11400080716012026985</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-5733547231775030285.post-8089889730512879183</id><published>2008-07-01T09:09:00.000+10:00</published><updated>2008-07-05T19:24:05.478+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Uncategorized'/><title type='text'>GMail feature request</title><content type='html'>First, where should I make these requests?&lt;br /&gt;&lt;br /&gt;Second, I'd like to be able to open my GMail without seeing all the new mail in my inbox. Very often, I open up GMail just to look up some fact that I've forgotten, or to put a date to a particular event. Seeing new mail and an unempty inbox distracts me, leading me down a rabbit hole of processing.&lt;br /&gt;&lt;br /&gt;I guess a GreaseMonkey hack wouldn't be &lt;em&gt;too&lt;/em&gt; hard.</content><link rel='alternate' type='text/html' href='http://code.mumak.net/2008/06/gmail-feature-request.html' title='GMail feature request'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733547231775030285&amp;postID=8089889730512879183' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://code.mumak.net/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/8089889730512879183'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/8089889730512879183'/><author><name>jml</name><uri>http://www.blogger.com/profile/11400080716012026985</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-5733547231775030285.post-6587088400853659934</id><published>2008-06-23T20:12:00.000+10:00</published><updated>2008-07-05T19:24:06.516+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Uncategorized'/><title type='text'>2008</title><content type='html'>&lt;h1 color="#ff0000"&gt;&lt;blink&gt;Firefox 3 is awesome!&lt;/blink&gt;&lt;/h1&gt;</content><link rel='alternate' type='text/html' href='http://code.mumak.net/2008/06/2008.html' title='2008'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733547231775030285&amp;postID=6587088400853659934' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://code.mumak.net/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/6587088400853659934'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/6587088400853659934'/><author><name>jml</name><uri>http://www.blogger.com/profile/11400080716012026985</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-5733547231775030285.post-2877195152772565777</id><published>2008-06-13T15:23:00.000+10:00</published><updated>2008-07-05T19:24:07.559+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Uncategorized'/><title type='text'>Really Satisfying</title><content type='html'>I have just returned from the shops with a Snickers bar. The packet says that one out of every six Snickers bars will instantly win me a free Snickers bar.&lt;br /&gt;&lt;br /&gt;So, &lt;em&gt;statistically speaking&lt;/em&gt;, how many Snickers bars do I have? Show working.</content><link rel='alternate' type='text/html' href='http://code.mumak.net/2008/06/really-satisfying.html' title='Really Satisfying'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733547231775030285&amp;postID=2877195152772565777' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://code.mumak.net/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/2877195152772565777'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/2877195152772565777'/><author><name>jml</name><uri>http://www.blogger.com/profile/11400080716012026985</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-5733547231775030285.post-7643804025471441798</id><published>2008-06-13T14:37:00.000+10:00</published><updated>2008-07-05T19:24:08.610+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Uncategorized'/><title type='text'>Aren't code reviews great?</title><content type='html'>Ben Sussman-Collins writes about &lt;a href="http://blog.red-bean.com/sussman/?p=96"&gt;programmer insecurity&lt;/a&gt; and how a lot of programmers dread having others see their code.&lt;br /&gt;&lt;br /&gt;Some of the &lt;a href="http://jcalderone.livejournal.com"&gt;best&lt;/a&gt; &lt;a href="http://robertcollins.net"&gt;programmers&lt;/a&gt; &lt;a href="http://radix.twistedmatrix.com"&gt;I've&lt;/a&gt; &lt;a href="http://sourcefrog.net"&gt;worked&lt;/a&gt; &lt;a href="http://glyph.twistedmatrix.com"&gt;with&lt;/a&gt; &lt;a href="http://python.net/crew/mwh/"&gt;are&lt;/a&gt; in love with code reviews, and all great writers have editors. (The "linked list" is in no way exhaustive.)  Personally, I see reviews as being a great opportunity to learn.&lt;br /&gt;&lt;br /&gt;Sussman-Collins also writes about how distributed version control can exacerbate the "isolated genius" problem by shielding ones code from the public eye. This is definitely a big potential drawback of DVCS, but one that's largely mitigated by a culture of short-lived branches and &lt;a href="https://code.launchpad.net"&gt;an easy-to-use public registry of all branches for a project&lt;/a&gt;.</content><link rel='alternate' type='text/html' href='http://code.mumak.net/2008/06/aren-code-reviews-great.html' title='Aren&amp;#39;t code reviews great?'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733547231775030285&amp;postID=7643804025471441798' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://code.mumak.net/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/7643804025471441798'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/7643804025471441798'/><author><name>jml</name><uri>http://www.blogger.com/profile/11400080716012026985</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-5733547231775030285.post-622417601081979853</id><published>2008-06-13T11:29:00.000+10:00</published><updated>2008-07-05T20:09:04.829+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Bazaar'/><title type='text'>Another Bazaar story</title><content type='html'>I'm currently hacking away on Launchpad's support for "&lt;a href="http://jam-bazaar.blogspot.com/2008/05/this-week-in-bazaar_29.html"&gt;stacked branches&lt;/a&gt;", something that will really make Launchpad's codehosting a joy to use.&lt;br /&gt;&lt;br /&gt;At the moment, I'm writing some tests that require a user to login. This was becoming a bit cumbersome, until I remembered something: Tim has recently landed some code to make this easy. But how do I get these changes without messing up all of the work I'm doing now? bzr shelve to the rescue!&lt;br /&gt;&lt;br /&gt;'shelve' interactively goes through each change you've made to your current working tree and allows you to decide whether to keep a change or shelve it. It comes with a twin command 'unshelve', which lets you interactively restore your changes.&lt;br /&gt;&lt;br /&gt;In this case, I don't even care about the interactivity, so here's what I did:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# Shelve my changes&lt;br /&gt;bzr shelve --all&lt;br /&gt;# Fetch the latest trunk&lt;br /&gt;cd ../trunk&lt;br /&gt;bzr pull&lt;br /&gt;# Merge it into my branch&lt;br /&gt;cd ../stacking&lt;br /&gt;bzr merge ../trunk&lt;br /&gt;bzr ci -m "Merge in changes from trunk to get login testing improvements."&lt;br /&gt;# Restore my changes&lt;br /&gt;bzr unshelve --all&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The 'shelve' command comes with the &lt;a href="http://launchpad.net/bzrtools"&gt;bzrtools&lt;/a&gt; plugin, and I am basically in love with it.&lt;br /&gt;&lt;br /&gt;As a parting shot, I should mention that things like bzrtools aren't accidents. They are natural and inevitable when you have &lt;a href="http://starship.python.net/crew/mwh/bzrlibapi/bzrlib.html"&gt;good APIs&lt;/a&gt; in a &lt;a href="http://python.org"&gt;high-level language&lt;/a&gt; and a &lt;a href="http://bazaar-vcs.org/WritingPlugins"&gt;very nice plugin system&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;And now I'm off to keep working on this branch.&lt;br /&gt;&lt;br /&gt;</content><link rel='alternate' type='text/html' href='http://code.mumak.net/2008/06/another-bazaar-story.html' title='Another Bazaar story'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733547231775030285&amp;postID=622417601081979853' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://code.mumak.net/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/622417601081979853'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/622417601081979853'/><author><name>jml</name><uri>http://www.blogger.com/profile/11400080716012026985</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-5733547231775030285.post-7465383142016112088</id><published>2008-06-05T11:17:00.000+10:00</published><updated>2008-07-05T20:09:10.945+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Uncategorized'/><title type='text'>Real Life</title><content type='html'>Inspired by &lt;a href="http://mikeylynch.blogspot.com"&gt;Mikey&lt;/a&gt;, I've set up my own &lt;a href="http://life.mumak.net"&gt;real-life blog&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I've done this one using Blogger's "upload to remote server" feature. It looks nice, has the features I need and means less WordPress &amp;amp; PHP. I'm hoping to migrate this sucker to the same technology.</content><link rel='alternate' type='text/html' href='http://code.mumak.net/2008/06/real-life.html' title='Real Life'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733547231775030285&amp;postID=7465383142016112088' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://code.mumak.net/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/7465383142016112088'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/7465383142016112088'/><author><name>jml</name><uri>http://www.blogger.com/profile/11400080716012026985</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-5733547231775030285.post-3847165362970608763</id><published>2008-06-02T13:28:00.001+10:00</published><updated>2008-07-05T20:40:04.743+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Uncategorized'/><title type='text'>Neat Bazaar feature</title><content type='html'>Ever find yourself working away on a branch, enjoying yourself and getting just a little carried away? Maybe you're working on a feature and you notice and fix a bug that's not strictly related to that feature.&lt;br /&gt;&lt;br /&gt;If you catch yourself in time, there's a nice little feature in Bazaar that can help with this: &lt;code&gt;bzr merge --uncommitted&lt;/code&gt;. It will merge in the changes that you've made to your working tree but haven't committed yet.&lt;br /&gt;&lt;br /&gt;e.g.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ cd some-feature-branch&lt;br /&gt;&lt;br /&gt;... hack hack hack ... oops!&lt;br /&gt;&lt;br /&gt;$ cd ..&lt;br /&gt;&lt;br /&gt;$ bzr branch trunk bug-fix-2357&lt;br /&gt;&lt;br /&gt;$ cd bug-fix-2357&lt;br /&gt;&lt;br /&gt;$ bzr merge --uncommitted ../some-feature-branch&lt;br /&gt;&lt;br /&gt;$ bzr ci -m "Fix up bug 2357. Found this while working on some-feature."&lt;br /&gt;&lt;br /&gt;$ bzr send&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Don't know what &lt;code&gt;bzr send&lt;/code&gt; does? Trust me, you want to find out.</content><link rel='alternate' type='text/html' href='http://code.mumak.net/2008/06/neat-bazaar-feature_9205.html' title='Neat Bazaar feature'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733547231775030285&amp;postID=3847165362970608763' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://code.mumak.net/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/3847165362970608763'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/3847165362970608763'/><author><name>jml</name><uri>http://www.blogger.com/profile/11400080716012026985</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-5733547231775030285.post-1749283964198347471</id><published>2008-04-21T11:39:00.000+10:00</published><updated>2008-07-05T20:09:13.534+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Uncategorized'/><title type='text'>What I meant</title><content type='html'>&lt;a href="http://z3p.tumblr.com/"&gt;z3p&lt;/a&gt; recently &lt;a href="http://z3p.tumblr.com/post/32324725"&gt;blogged about&lt;/a&gt; a comment I made in &lt;a href="http://twistedmatrix.com/trac/ticket/2710"&gt;a code review&lt;/a&gt;. In the review, I linked to:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://74.54.212.169/2ERcULhJC81alpg64P4WN7Of_400.jpg" alt="The only measure of code quality is WTFs / minute" /&gt;&lt;br /&gt;&lt;br /&gt;That's a negative and grumpy way of phrasing an idea that I've come to value a lot: &lt;em&gt;good code expresses its intent clearly.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;When looking at a patch, the reviewer needs to understand two things: the intent of the code and the intent of each &lt;em&gt;change&lt;/em&gt; to the code. To be clear on the former, you need:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;	&lt;li&gt;intent-revealing names.&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;good abstractions / interfaces.&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;good, small tests.&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;simple implementations where possible.[1]&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;docstrings where appropriate&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;comments where appropriate.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;That's not exhaustive, but it's in a rough order.&lt;br /&gt;&lt;br /&gt;To be clear on the intent of your change to code, you need:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;	&lt;li&gt;Small patches.&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;A good bug / spec with a good, short summary.&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;A review request letter, summarizing your implementation strategy, any compromises you made, gaps in testing, future work etc.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;That's not exhaustive either. In #2037, I didn't understand the motivation for lots of the code, nor for some of the changes to the code.&lt;br /&gt;&lt;br /&gt;I'm indebted to &lt;a href="http://andrew.puzzling.org"&gt;Andrew Bennetts&lt;/a&gt; for teaching me that the first duty of a reviewer is to ensure that the code is clear and to &lt;a href="http://intellectronica.net/"&gt;Tom Berger&lt;/a&gt; for reminding me that compromises are worth noting.&lt;br /&gt;&lt;br /&gt;----&lt;br /&gt;&lt;br /&gt;[1] Actually, this reminds me of something I heard &lt;a href="http://en.wikipedia.org/wiki/Don_Carson"&gt;a preacher&lt;/a&gt; say, "before I give a sermon, I go through it, find everything clever, and take it out" (I paraphrase, not having a reference on hand).&lt;br /&gt;&lt;br /&gt;In as much as sermons and code should both be ego-free communications of ideas, I think this is sound advice for hackers.</content><link rel='alternate' type='text/html' href='http://code.mumak.net/2008/04/what-i-meant_20.html' title='What I meant'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733547231775030285&amp;postID=1749283964198347471' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://code.mumak.net/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/1749283964198347471'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/1749283964198347471'/><author><name>jml</name><uri>http://www.blogger.com/profile/11400080716012026985</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-5733547231775030285.post-8216437880894786544</id><published>2008-04-21T11:04:00.000+10:00</published><updated>2008-07-05T20:40:06.940+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Uncategorized'/><title type='text'>bzr-removable</title><content type='html'>The plugin I talked about in a previous post is now at https://launchpad.net/bzr-removable. Please file bugs.&lt;br /&gt;&lt;br /&gt;Thanks to Michael Hudson and Daniel Watkins for submitting patches.&lt;br /&gt;&lt;br /&gt;You can get the plugin by typing 'bzr branch lp:bzr-removable' on the command line.</content><link rel='alternate' type='text/html' href='http://code.mumak.net/2008/04/bzr-removable_20.html' title='bzr-removable'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733547231775030285&amp;postID=8216437880894786544' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://code.mumak.net/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/8216437880894786544'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/8216437880894786544'/><author><name>jml</name><uri>http://www.blogger.com/profile/11400080716012026985</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-5733547231775030285.post-8180273067340546851</id><published>2008-03-18T14:36:00.000+11:00</published><updated>2008-07-05T20:09:16.091+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Uncategorized'/><title type='text'>OK I lied</title><content type='html'>The next post is actually about a Bazaar plugin that I've now got ready to share. To get it, 'bzr branch lp:~jml/+junk/merged-branches'.&lt;br /&gt;&lt;br /&gt;Once you've got it, run 'bzr merged-branches' in the trunk of your project. It will then show you all branches in sibling directories that are safe to delete.  That is,&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;	&lt;li&gt;They have no uncommitted changes.&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;They have no "unknown" files. (Files outside of version control that haven't been explicitly ignored.)&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;They have no shelved changes. The plugin will only check for this if it can find bzrtools.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;The branch is now at the point where it works for me, but it still belongs in '+junk' — here's why:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;	&lt;li&gt;It assumes that you have a trunk branch in the same directory as all of your other branches.&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;It assumes that branches and working trees are the same thing.&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;It's called 'merged-branches' when it really means 'safe-to-delete'.&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;It doesn't make it easy to see why a branch is &lt;em&gt;not&lt;/em&gt; safe to delete.&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;It doesn't let you customize the conditions of the search. Maybe you want to see all branches with uncommitted changes.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;Still, if you are like me and make a lot of branches, it's quite useful. I'll tolerate bugs, accept patches and welcome encouragement.</content><link rel='alternate' type='text/html' href='http://code.mumak.net/2008/03/ok-i-lied_17.html' title='OK I lied'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733547231775030285&amp;postID=8180273067340546851' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://code.mumak.net/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/8180273067340546851'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/8180273067340546851'/><author><name>jml</name><uri>http://www.blogger.com/profile/11400080716012026985</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-5733547231775030285.post-856842426077382069</id><published>2008-03-13T10:24:00.000+11:00</published><updated>2008-07-05T21:07:50.192+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Bazaar'/><category scheme='http://www.blogger.com/atom/ns#' term='Hacking'/><category scheme='http://www.blogger.com/atom/ns#' term='UI'/><title type='text'>User Experience — When Reality Attacks</title><content type='html'>I've just got back from a hectic week in London, where members of the Bazaar community got together and thrashed out a bunch of important topics.&lt;br /&gt;&lt;br /&gt;We talked about "user experience" and how we all want Bazaar to be a joy to use. More than one person said that we have been focusing too much on features and performance instead of user experience. The term was never really pinned down, but it's fair to say that there are things other than convenience and speed that affect how users feel while using Bazaar and that we need to work on those things, once we figure out what they are.&lt;br /&gt;&lt;br /&gt;I think I might know the name of one of them: &lt;em&gt;errors&lt;/em&gt;. Next post: "Notes on error".</content><link rel='alternate' type='text/html' href='http://code.mumak.net/2008/03/user-experience-when-reality-attacks_12.html' title='User Experience — When Reality Attacks'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733547231775030285&amp;postID=856842426077382069' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://code.mumak.net/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/856842426077382069'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/856842426077382069'/><author><name>jml</name><uri>http://www.blogger.com/profile/11400080716012026985</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-5733547231775030285.post-3364492924699447727</id><published>2008-02-18T10:04:00.000+11:00</published><updated>2008-07-05T21:21:29.244+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Uncategorized'/><title type='text'>Three-ways on Pidgin?</title><content type='html'>Dear Lazyweb,&lt;br /&gt;&lt;br /&gt;How do I initiate a three-way chat with Pidgin 2.2.1?&lt;br /&gt;&lt;br /&gt;jml</content><link rel='alternate' type='text/html' href='http://code.mumak.net/2008/02/three-ways-on-pidgin.html' title='Three-ways on Pidgin?'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733547231775030285&amp;postID=3364492924699447727' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://code.mumak.net/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/3364492924699447727'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/3364492924699447727'/><author><name>jml</name><uri>http://www.blogger.com/profile/11400080716012026985</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-5733547231775030285.post-6629816907072968862</id><published>2008-02-15T16:57:00.000+11:00</published><updated>2008-07-05T21:07:52.018+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Uncategorized'/><title type='text'>What I do all day</title><content type='html'>Kick-arse summary here: &lt;a href="http://news.launchpad.net/general/the-great-source-code-supermarket"&gt;The great source code supermarket. &lt;/a&gt;</content><link rel='alternate' type='text/html' href='http://code.mumak.net/2008/02/what-i-do-all-day_14.html' title='What I do all day'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733547231775030285&amp;postID=6629816907072968862' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://code.mumak.net/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/6629816907072968862'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/6629816907072968862'/><author><name>jml</name><uri>http://www.blogger.com/profile/11400080716012026985</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-5733547231775030285.post-4242706117573763571</id><published>2008-02-11T15:10:00.000+11:00</published><updated>2008-07-05T21:21:30.169+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Uncategorized'/><title type='text'>The Economist Index</title><content type='html'>&lt;em&gt;The Economist&lt;/em&gt; occasionally publishes a "Big Mac Index" — how much the world's favorite "burger" costs in each country, translated into a common currency.&lt;br /&gt;&lt;br /&gt;Why they don't publish an index of how much an issue of the Economist costs?  All of my issues have the price of the newspaper in lots of Asia-Pacific currencies. A small sample:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;	&lt;li&gt;Australia, 9.39855 USD&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;Cambodia, 6.00 USD&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;China, 10.43655 USD&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;Hong Kong, 7.6917 USD&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;India, 5.0522 USD&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;Japan, 10.70535 USD&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;New Zealand, 8.6669 USD&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;Can anyone tell me why the price varies so much?</content><link rel='alternate' type='text/html' href='http://code.mumak.net/2008/02/economist-index_10.html' title='The Economist Index'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733547231775030285&amp;postID=4242706117573763571' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://code.mumak.net/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/4242706117573763571'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/4242706117573763571'/><author><name>jml</name><uri>http://www.blogger.com/profile/11400080716012026985</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-5733547231775030285.post-2664744142478569103</id><published>2007-12-10T12:43:00.000+11:00</published><updated>2008-07-05T21:07:53.865+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Uncategorized'/><title type='text'>WoW account temporarily suspended</title><content type='html'>Howdy Partners,&lt;br /&gt;&lt;br /&gt;My World of Warcraft account is temporarily suspended for silly administrative reasons. I'm not in any rush to clear those up, so don't expect to see me on Khaz'goroth or Frostmourne any time soon.&lt;br /&gt;&lt;br /&gt;Regards,&lt;br /&gt;&lt;br /&gt;jml</content><link rel='alternate' type='text/html' href='http://code.mumak.net/2007/12/wow-account-temporarily-suspended_09.html' title='WoW account temporarily suspended'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733547231775030285&amp;postID=2664744142478569103' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://code.mumak.net/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/2664744142478569103'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/2664744142478569103'/><author><name>jml</name><uri>http://www.blogger.com/profile/11400080716012026985</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-5733547231775030285.post-2253350668000150768</id><published>2007-11-15T02:02:00.000+11:00</published><updated>2008-07-05T21:07:55.625+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Uncategorized'/><title type='text'>Obligatory</title><content type='html'>Not using Facebook anymore.&lt;br /&gt;&lt;br /&gt;Have fun kids.</content><link rel='alternate' type='text/html' href='http://code.mumak.net/2007/11/obligatory_8590.html' title='Obligatory'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733547231775030285&amp;postID=2253350668000150768' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://code.mumak.net/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/2253350668000150768'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/2253350668000150768'/><author><name>jml</name><uri>http://www.blogger.com/profile/11400080716012026985</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-5733547231775030285.post-5546272330234125045</id><published>2007-10-23T12:40:00.000+10:00</published><updated>2008-07-05T21:07:56.934+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Uncategorized'/><title type='text'>Fake Plastic Tests</title><content type='html'>Ever wondered what's the difference between a &lt;code&gt;FakeReactor&lt;/code&gt;, a &lt;code&gt;StubReactor&lt;/code&gt; and a &lt;code&gt;MockReactor&lt;/code&gt;? Find out in this brief article on &lt;a href="http://mumak.net/test-doubles"&gt;test doubles&lt;/a&gt;.&lt;br /&gt;</content><link rel='alternate' type='text/html' href='http://code.mumak.net/2007/10/fake-plastic-tests_22.html' title='Fake Plastic Tests'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733547231775030285&amp;postID=5546272330234125045' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://code.mumak.net/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/5546272330234125045'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/5546272330234125045'/><author><name>jml</name><uri>http://www.blogger.com/profile/11400080716012026985</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-5733547231775030285.post-2851328684107820408</id><published>2007-10-16T18:15:00.000+10:00</published><updated>2008-07-05T21:07:57.826+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Uncategorized'/><title type='text'>The most retentive thing I've done</title><content type='html'>&lt;img src="http://tusk.mumak.net/Blog-20071016/Retentive-Pens-2.jpg" alt="I labelled my pens" title="I'm still not sure about publishing this" width="400" /&gt;</content><link rel='alternate' type='text/html' href='http://code.mumak.net/2007/10/most-retentive-thing-i-done_16.html' title='The most retentive thing I&amp;#39;ve done'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733547231775030285&amp;postID=2851328684107820408' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://code.mumak.net/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/2851328684107820408'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/2851328684107820408'/><author><name>jml</name><uri>http://www.blogger.com/profile/11400080716012026985</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-5733547231775030285.post-7143752197387030539</id><published>2007-10-16T18:09:00.000+10:00</published><updated>2008-07-05T21:07:58.785+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Uncategorized'/><title type='text'>Cracked Mac</title><content type='html'>OK, I've started with this whole &lt;q&gt;photography&lt;/q&gt; thing, I might as well run with it.&lt;br /&gt;&lt;br /&gt;My Mac cracked:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://tusk.mumak.net/Blog-20071016/Cracked-Laptop-2.jpg" alt="Cracked Macbook" title="Designed by Apple in California" /&gt;</content><link rel='alternate' type='text/html' href='http://code.mumak.net/2007/10/cracked-mac.html' title='Cracked Mac'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733547231775030285&amp;postID=7143752197387030539' title='1 Comments'/><link rel='replies' type='application/atom+xml' href='http://code.mumak.net/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/7143752197387030539'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/7143752197387030539'/><author><name>jml</name><uri>http://www.blogger.com/profile/11400080716012026985</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-5733547231775030285.post-5261835241457980208</id><published>2007-10-16T18:06:00.000+10:00</published><updated>2008-07-05T21:07:59.680+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Uncategorized'/><title type='text'>Around like Grover</title><content type='html'>What's up hep-cats?&lt;br /&gt;&lt;br /&gt;I've been travelling around the world, weaving in and out of timezones like Jason Bourne navigates facial expressions. Last week's adventure took me to tropical Dunedin — the southiest outpost of Canonical Ltd. (I'm trying to get a mention on &lt;a href="http://itre.cis.upenn.edu/~myl/languagelog/"&gt;Language Log&lt;/a&gt;.)&lt;br /&gt;&lt;br /&gt;Those few Hobartians who keep reading will notice that Dunedin, well, umm... here's a photo:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://tusk.mumak.net/Blog-20071016/Dunedin-View.jpg" alt="View of Dunedin" title="Dunedin during rush hour" width="600" /&gt;&lt;br /&gt;&lt;br /&gt;Pay careful attention to the hills in the background.</content><link rel='alternate' type='text/html' href='http://code.mumak.net/2007/10/around-like-grover.html' title='Around like Grover'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733547231775030285&amp;postID=5261835241457980208' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://code.mumak.net/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/5261835241457980208'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/5261835241457980208'/><author><name>jml</name><uri>http://www.blogger.com/profile/11400080716012026985</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-5733547231775030285.post-358510319793773286</id><published>2007-09-17T13:35:00.000+10:00</published><updated>2008-07-05T21:21:31.992+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Uncategorized'/><title type='text'>Five Years</title><content type='html'>That's not quite how long it took &lt;a href="glyf.livejournal.com"&gt;Glyph&lt;/a&gt; to write a post explaining what he meant when he told me that &lt;a href="http://glyf.livejournal.com/72505.html"&gt;xUnit should use the visitor pattern instead of the composite pattern&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I'm going to write a more detailed response later, God willing. I just wanted to flag the post and say thanks to Glyph for finally posting it — the &lt;a href="http://mumak.net/2007/08/20/let-the-beat-drop/"&gt;hassling&lt;/a&gt; must have worked.</content><link rel='alternate' type='text/html' href='http://code.mumak.net/2007/09/five-years.html' title='Five Years'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733547231775030285&amp;postID=358510319793773286' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://code.mumak.net/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/358510319793773286'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/358510319793773286'/><author><name>jml</name><uri>http://www.blogger.com/profile/11400080716012026985</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-5733547231775030285.post-5557701058215689402</id><published>2007-09-10T10:07:00.000+10:00</published><updated>2008-07-05T21:08:01.538+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Uncategorized'/><title type='text'>It's a Gibbon</title><content type='html'>Over the weekend I upgraded my laptop to &lt;a href="http://www.ubuntu.com"&gt;Ubuntu 7.10&lt;/a&gt; aka "The Gutsy Gibbon".&lt;br /&gt;&lt;br /&gt;Obvious improvements include having Pidgin installed and a much superior version of Deskbar. There's also a swanky new panel to actually control display settings (dual monitor and all that jazz). Unfortunately, I can't quite get it to work just yet. My 22" 1680x1058 LCD will just have to sit there, gathering dust :(&lt;br /&gt;&lt;br /&gt;In another weirdness, all of my fonts are suddenly much, much bigger. I had to resize everything down to 8 or 9 to make them sane.&lt;br /&gt;&lt;br /&gt;My &lt;a href="http://peadrop.com/blog/2007/01/06/pretty-emacs/"&gt;pretty Emacs&lt;/a&gt; has also stopped working, but that's to be expected. It's a third-party package that hasn't yet been built for Gutsy.&lt;br /&gt;&lt;br /&gt;Other than that, seems to be a fairly routine upgrade. Is there anything exciting that I've missed?</content><link rel='alternate' type='text/html' href='http://code.mumak.net/2007/09/it-gibbon.html' title='It&amp;#39;s a Gibbon'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733547231775030285&amp;postID=5557701058215689402' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://code.mumak.net/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/5557701058215689402'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/5557701058215689402'/><author><name>jml</name><uri>http://www.blogger.com/profile/11400080716012026985</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-5733547231775030285.post-7272353249070931637</id><published>2007-09-05T09:37:00.000+10:00</published><updated>2008-07-05T21:08:02.396+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Uncategorized'/><title type='text'> Merging New trunk Features to a Development Branch (redux)</title><content type='html'>&lt;a href="http://oubiwann.blogspot.com/"&gt;Oubiwann&lt;/a&gt; has &lt;a href="http://oubiwann.blogspot.com/2007/09/merging-new-trunk-features-to.html"&gt;recently posted&lt;/a&gt; about the joys of using &lt;a href="http://divmod.org/trac/wiki/DivmodCombinator"&gt;Combinator&lt;/a&gt; to do branch-based development using Subversion. I thought it'd be fun to do the same post, except this time with Bazaar.&lt;br /&gt;&lt;h3&gt;Background&lt;/h3&gt;&lt;br /&gt;You're working on a project called "Project", you have a copy of the mainline branch (i.e. 'trunk') in your &lt;code&gt;src&lt;/code&gt; directory.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;~$ cd ~/src/Project&lt;br /&gt;~/src/Project$ ls&lt;br /&gt;trunk&lt;/pre&gt;&lt;br /&gt;You want to implement a new feature, so you branch trunk to work on it:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;~/src/Project$ bzr branch trunk viking-feature-836&lt;/pre&gt;&lt;br /&gt;Bazaar is a version control system, not a PYTHONPATH-managing system, so it doesn't maintain a global list of projects and the branches that are currently active for each project.&lt;br /&gt;&lt;br /&gt;Perhaps your company focuses on historical invasions of Britain. You decide to start work on another feature:&lt;br /&gt;lass objects.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;~/src/Project$ bzr branch trunk norman-feature-1066&lt;/pre&gt;&lt;br /&gt;You multi-task for a bit, until you finish 'viking-feature'. You decide to merge 'viking-feature-836' into trunk.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;~/src/Project$ cd trunk&lt;br /&gt;~/src/Project/trunk$ bzr merge ../viking-feature-836&lt;br /&gt;~/src/Project/trunk$ bzr ci&lt;/pre&gt;&lt;br /&gt;At this point, you begin to suspect that Bazaar treats branches as first-class objects. However, at this point, a developer on the obverse side of your continent calls you,&lt;br /&gt;&lt;br /&gt;"Where's your viking feature? I need it to invade Britain!"&lt;br /&gt;&lt;br /&gt;"I've just put it into trunk. Have you got the latest copy?"&lt;br /&gt;&lt;br /&gt;"Yeah, I do, I just pulled from trunk."&lt;br /&gt;&lt;br /&gt;"It's in trunk, you fool! ... Oh, wait, gimme a sec."&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;~/src/Project/trunk$ bzr push&lt;br /&gt;Pushing to bzr+ssh://bzr.example.com/Project/trunk...&lt;br /&gt;~/src/Project/trunk$&lt;/pre&gt;&lt;br /&gt;"Try now."&lt;br /&gt;&lt;h3&gt;Merging&lt;/h3&gt;&lt;br /&gt;OK, enough background, let's merge.&lt;br /&gt;&lt;br /&gt;Say you need some of the changes in trunk in order to finish work on your norman feature. No problems.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;~/src/Project$ bzr merge trunk norman-feature-1066&lt;br /&gt;~/src/Project$ bzr ci -m "Merge from trunk."&lt;/pre&gt;&lt;br /&gt;It's hard not to feel smug at this point.&lt;br /&gt;&lt;br /&gt;Wait a second, you also want to look at the experimental branch that a friend is working on:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;~/src/Project/norman-feature-1066$ bzr merge bzr+ssh://yourfriend.example.com/branches/sealion-1946&lt;br /&gt;~/src/Project/norman-feature-1066$ bzr diff | less # better double check this one&lt;br /&gt;~/src/Project/norman-feature-1066$ bzr revert # nope, doesn't seem like a good idea&lt;/pre&gt;&lt;br /&gt;&lt;h3&gt;Summary&lt;/h3&gt;&lt;br /&gt;Bazaar treats branches as first-class objects and treats trunk just like any other branch. Although Combinator is great for branch-based development in Subversion, it is more complex and less flexible than doing branch-based development in Bazaar.&lt;br /&gt;&lt;br /&gt;With Combinator, you lose history when you merge in changes from trunk, with Bazaar you don't.&lt;br /&gt;&lt;br /&gt;With Combinator, you can only merge in changes from trunk, with Bazaar you can merge from any branch.&lt;br /&gt;&lt;br /&gt;With Combinator, merging from trunk leaves a bunch of changed files in the trunk checkout on your system (this has tripped me up more than once). With Bazaar, this doesn't happen.</content><link rel='alternate' type='text/html' href='http://code.mumak.net/2007/09/merging-new-trunk-features-to.html' title=' Merging New trunk Features to a Development Branch (redux)'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733547231775030285&amp;postID=7272353249070931637' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://code.mumak.net/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/7272353249070931637'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/7272353249070931637'/><author><name>jml</name><uri>http://www.blogger.com/profile/11400080716012026985</uri><email>noreply@blogger.com</email></author></entry></feed>