This is a split version of my earlier patch (sent to ML on July 15, http://selenic.com/pipermail/mercurial-devel/2012-July/042719.html). Hopefully it's now easier to review etc. Thanks to Danek Duvall for syntax review.