自分用のRevsetsを定義する。 #mercurialjp

このエントリはMercurial Advent Calendar 2013 の1日目です。

MercurialにはRevsetsというリビジョン郡を指定するための条件を記述するDSLが組み込まれています。Revsetsに関しては過去のAdvent Calendarのエントリにわかりやすい解説があるのでそちらを参照してください。

Revsetsの弱点

Revsetsを利用すると次のようにわかりやすくリビジョン郡を指定できます。

# revsetsの例
# "bug" 又は "issue" に言及したリビジョン群のうち、 タグ付け時点の内容に含まれないもの
$ hg log -r "(keyword(bug) or keyword(issue)) and not ancestors(tag())"

とてもわかりやすいのですが、条件が長くなりがちで、条件が再利用しにくいという弱点があります。

自分用のRevsetsを定義する。

実はこの弱点を補うための機能はMercurialに組み込まれています。Revsetsは[revsetalias]というセクションを利用すると自分用の条件を定義することができるのです。 これにより、「可読性は高いが、再利用性が低い」という弱点を補うことができます。

次の例はhg help revsetsにある例です。

[revsetalias]
h = heads()
d($1) = sort($1, date)
rs($1, $2) = reverse(sort($1, $2))

実用的な例

僕は~/.hgrcに次のような定義をしています。

[revsetalias]
wip = (ancestors(.) and (not public()))
pulled = (tip:. - .)

このwippulledを利用すると、次のようにaliasがわかりやすく作成できます。

[alias]
# browse changesets.
pulled = log -vpr "pulled and (not merge())"
wip = log -vpr "wip"

# import all wip changesets to mq patch.
qimportwip = qimport -r 'wip and (not mq())'
qiwip = qimportwip

定義しているaliasの説明です。

  • hg pulled : hg pullで取り込んだ変更内容を確認する

  • hg wip : 作業中の変更内容を確認する

  • hg qimportwip, hg qiwip : 作業中の変更内容をすべてMQに取り込む

可読性と再利用性が両立していますね!

次回のMercurial Advent Calendarは?

次回の担当は id:cointoss1973 さんです。