14 Jun 2008

Rethinking annotate: I was recently reminded of Bonsai for querying vcs history. GNOME runs a bonsai instance. This got me thinking about ‘bzr annotate’, and more generally about the problem of figuring out code.

It seems to me that ‘bzr annotate’, is, like all annotates I’ve seen pretty poor at really understanding how things came to be – you have to annotate several versions, cross reference revision history and so on. ‘bzr gannotate’ is helpful, but still not awesome.

I wondered whether searching might be a better metaphor for getting some sort of handle on what is going on. Of course, we don’t have a fast enough search for bzr to make this plausible.

So I wrote one: bzr-search in my hobby time (my work time is entirely devoted to landing shallow-branches for bzr, which will make a huge difference to pushing new branches to hosting sites like Launchpad). bzr-search is alpha quality at the moment (though there are no bugs that I’m aware of). Its mainly missing optimisation, features and capabilities that would be useful, like meaningful phrase searching/stemming/optional case insensitivity on individual searches.

That said, I’ve tried it on some fairly big projects – like my copy of python here:

 time bzr search socket inet_pton (about 30 hits, first one up in 1 second)... real    0m2.957s user    0m2.768s sys     0m0.180s 

The index run takes some time (as you might expect, though like I noted – it hasn’t been optimised as such). Once indexed, a branch will be kept up to date automatically on push/pull/commit operations.

I realise search is a long slope to get good results on, but hey – I’m not trying to compete with Google :). I wanted something that had the following key characteristics: * Worked when offline * Simple to use * Easy to install

Which I’ve achieved – I’m extremely happy with this plugin.

Whats really cool though, is that other developers have picked it up and already integrated it into loggerhead and bzr-eclipse. I don’t have a screen shot for loggerhead yet, but heres an old one. This old one does not show the path of a hit, nor the content summaries, which current bzr-search versions create.