このエントリーをはてなブックマークに追加

mercurialで一意なrevision番号を得る

この記事はMercurial Advent Calendar 2012の13日目です。

「mercurialで"このリビジョン"というものを人に伝えたい」という要望がありました。

mercurialではすべてのリビジョンには番号がついています。

チェンジセット:   3814:7ba6a6497694
タグ:             tip
ユーザ:           Jon Waltman <jonathan.waltman@gmail.com>
日付:             Tue Dec 04 21:10:15 2012 -0600
要約:             Add Docutils-native XML and pseudo-XML builders

この例では3814ですね。

ですが、これはあくまで「手元のレポジトリ」のリビジョン番号であり、実際には一意ではなく、他のレポジトリだと異なっている場合があります。

一意なものはその後の 7ba6a6497694 というハッシュです。正確にはこれも一部分だけで

% hg log -r tip --template "{node}"
7ba6a64976948c034bcd21dd6d85a050202320f1

と出てくる、40桁のハッシュが一意なリビジョン識別子となってます。

普通覚えられませんよね。

でも欲しいんだもん!

タグを使用することで、擬似的にリビジョン番号を設定できます。

こう打ってみてください。

% hg log -r tip --template '{latesttag}.{latesttagdistance}'
1.1.3.108

というように表示されます。これは、

tip(最新のリビジョン) の1.1.3 という最新のタグと108 という最新のタグからの距離(リビジョン数)

の組み合わせです。これでリビジョンを一意に指定できると思います。(ちなみに一度もタグを設定していないと null という文字列になります)

仮にrebaseなどでタグからの距離がずれたとしても、再度タグを設定すればもう一度固定化されます。

また、いちいちコマンドを打つのはめんどうなのですが、TortoiseHg2.4からカスタムツールというものが導入されました。これはコマンドを自由に設定できるものです。

「ファイル」->「設定」 で右上の「ファイルを開く」を押し、以下を貼りつけて、「保存」してください。

[tortoisehg-tools]
hgrevision.command = hg log -r {REV} --template
'{latesttag}.{latesttagdistance}'
hgrevision.enable = istrue
hgrevision.label = revision
hgrevision.showoutput = True
hgrevision.tooltip = revision

その後TortoiseHgを再起動します。

以降は、任意のリビジョンを選択し、右クリックメニューの一番下の「ツール」からrevisionを選択すれば、下のコマンドログに表示されます。

例えばTortoiseHgでは

%(latesttag)s+%(latesttagdistance)s-%(node).12s

という形でバージョンをリビジョンごとにつけています。(setup.py参照)

まとめ

ということで、一意っぽいバージョン番号を分散レポジトリなmercurialでも作成する方法を紹介しました。

参考

ここを参考にしました。困ったときのstackoverflow!