Mercurial’s onsub and mixed sub-repos
If you’re using Mercurial with mixed sub-repositories (i.e. sub-repositories handled by different revision control systems), you may be interested in this: I just got a patch accepted into the
The extension lets you run commands on your sub-repositories. For example, with my own
dotfiles repository, running on Windows:
> hg onsub "echo I'm in %HG_SUBPATH%" I'm in libhghg-git I'm in libhgonsub I'm in vimbundlebadwolf I'm in vim/bundle/colorschemes I'm in vim/bundle/commentary I'm in vim/bundle/ctrlp I'm in vim/bundle/easymotion I'm in vim/bundle/fugitive I'm in vimbundlegundo I'm in vim/bundle/haml I'm in vimbundlelawrencium I'm in vim/bundle/markdown I'm in vim/bundle/nerdtree I'm in vimbundlepiecrust I'm in vim/bundle/powerline I'm in vim/bundle/ragtag I'm in vim/bundle/repeat I'm in vim/bundle/solarized I'm in vim/bundle/supertab I'm in vim/bundle/surround I'm in vim/bundle/syntastic I'm in vim/bundle/vimroom
As you can see, I’ve got quite a few sub-repos. However, some are Mercurial sub-repos, while others are Git sub-repos (that’s one of the nice features of Mercurial: it has decent interop with other RCSes). Which ones are which, though? That’s easy, there’s a new
HG_SUBTYPE environment variable now:
> hg onsub "echo I'm in [%HG_SUBTYPE%]%HG_SUBPATH%" I'm in [hg]libhghg-git I'm in [hg]libhgonsub I'm in [hg]vimbundlebadwolf I'm in [git]vim/bundle/colorschemes I'm in [git]vim/bundle/commentary I'm in [git]vim/bundle/ctrlp I'm in [git]vim/bundle/easymotion I'm in [git]vim/bundle/fugitive I'm in [hg]vimbundlegundo I'm in [git]vim/bundle/haml I'm in [hg]vimbundlelawrencium I'm in [git]vim/bundle/markdown I'm in [git]vim/bundle/nerdtree I'm in [hg]vimbundlepiecrust I'm in [git]vim/bundle/powerline I'm in [git]vim/bundle/ragtag I'm in [git]vim/bundle/repeat I'm in [git]vim/bundle/solarized I'm in [git]vim/bundle/supertab I'm in [git]vim/bundle/surround I'm in [git]vim/bundle/syntastic I'm in [git]vim/bundle/vimroom
That makes it possible to do something slightly different depending on the sub-repo type, but it’s still tedious. For example, the most common operation for me is to pull and update all those sub-repos. The commands are different (
hg pull -u vs.
git pull) and doing an
if statement in Bash or Cmd is cumbersome, especially as a one-liner argument.
That’s where the other new feature comes in: there’s a new
--type option that filters sub-repos based on their type:
> hg onsub -t hg "echo Mercurial subrepo: %HG_SUBPATH%" Mercurial subrepo: libhghg-git Mercurial subrepo: libhgonsub Mercurial subrepo: vimbundlebadwolf Mercurial subrepo: vimbundlegundo Mercurial subrepo: vimbundlelawrencium Mercurial subrepo: vimbundlepiecrust
This makes it easy to bring all the sub-repos up to date:
> hg onsub -t hg "hg pull -u" > hg onsub -t git "git pull"
Hopefully it makes life easier for a few other people out there… it sure does for me!