Mercurial-2.6から追加されたunionスキームについて調べてみた。

Mercurial-2.6から追加されたunionスキームについて調べてみた。

Mercurial-2.6からリポジトリ指定時にunionというスキームが指定できるようになりました。 unionを利用すると、次の形式で指定した2つのローカルリポジトリの履歴をミックスして閲覧できるようになります。

union:repo1+repo2 # repo1とrepo2の履歴を合算して閲覧する

この機能を利用すれば、crew+main*1を手元で模倣できます。

$ hg clone http://hg.intevation.org/mercurial/ main
$ hg clone http://hg.intevation.org/mercurial/crew/ crew
$ MAIN_REV=$(hg -R main log -b default -l 1 --template "{node}")
$ CREW_REV=$(hg -R crew log -b default -l 1 --template "{node}")
$ hg -R union:crew+main heads
$ hg -R union:crew+main log -r $CREW_REV -r $MAIN_REV
$ hg -R union:crew+main log -r "::$CREW_REV-::$MAIN_REV"
$ hg -R union:crew+main log -r "ancestor($CREW_REV,$MAIN_REV)"
$ hg -R union:crew+main diff -r $CREW_REV -r $MAIN_REV

mercurial/unionrepo.pyのコミットコメントも使い方が書いてあります。参照してみてください。

なんでこんなものが追加されたの?

コミットコメントにある通り、RhodecodeやBitbucketなどのホスティングサービスで利用するような機能がCoreにあると便利だよね!ってことでRhodeCodeで利用されていたコードをMercurial本体に導入したみたいです。該当のコードはこちら。

Rhodecodeではリポジトリ同士の比較(rhodecode/controller/compare.py)やプルリクエスト(rhodecode/model/pull_request.py)などで利用されているようです。

*1:コミッターリポジトリ(crew)とメインリポジトリ(main)を自動的にミックスしているリポジトリ