I was recently asked to estimate how long I’d been working on a particular project. Unfortunately I hadn’t been keeping track of my time in any organized way.
Fortunately I realized that, since I like to commit frequently (though nothing like Stephen Turnbull’s commit-on-save!), I could come up with an estimate based on my commit dates.
But I quickly realized that bzr log --line puts the author name before the commit date:
$ bzr log --line -r -3.. 150: Max Bowsher 2011-02-12 [merge] Fix invalid version_info. 149: Jelmer Vernooij 2010-12-20 [merge] Fixes most of the remaining test fai... 148: Gary van der Merwe 2010-10-20 [merge] Ignore build folder created by se... 147: Martin 2010-09-09 [merge] Import xml escaping function through local mo...
The spaces could make extracting the date a bit fragile.
Fortunately I remembered the bzr-xmloutput plugin, which makes processing this kind of information really easy. bzr-xmloutput adds an “–xml” option to many of the standard bzr commands that encodes the output as an XML document. Combined with XMLStarlet, a command-line XML tool that provides XSLT/XPath processing (amongst other things), I was able to cook up a recipe in a matter of minutes:
$ bzr log --xml \ | xml sel -t -m '/logs' -m '//log' \ -v 'substring-before(substring-after(timestamp," ")," ")' -n \ | sort -u \ | wc -l
The substring() is required to pull out the date; as bzr-xmloutput prints dates as ‘Day YYYY-MM-DD HH:MM:SS offset’. awk would have worked just as well too.
Too easy, thanks to Guillermo and the other bzr-xmloutput contributors! Now I’m thinking of other questions that can be answered…