「入門TortoiseHg+Mercurial」発売中(詳細は「執筆情報」参照)


extension

本節では、 Mercurial の extension を開発/利用する際の、 個人的な覚え書きをまとめてあります。

extension そのものに関する詳細は、 "Using Mercurial extensions" を参照してください。

How to write extension for Mercurial

2009/03/12 に開催された Mercurial 勉強会において、 『How to write extension for Mercurial』 と題して発表させて頂いた際のプレゼン資料を公開します。

発表後に Mercurial のソースを見ていたら、 extension 初期化手順の説明に抜けを見つけましたので、 公開資料を修正してあります。

また、extension によるコマンド作成例として当日お見せしたものを、 (上記初期化手順の追加を考慮した変更を加えて)以下に掲載します。

from mercurial import commands
from mercurial import extensions

# ntp_now() は別途定義が必要

def ntp_commit(orig, ui, repo, *pats, **opts):
    # 明示的な日付指定が無い場合、
    # NTP サーバからの取得値で強制指定
    if not opts.get('date'):
        opts['date'] = ntp_now(ui.config('ui', 'ntpserver'))

    # オリジナルの commit コマンド定義に処理を丸投げ
    orig(ui, repo, *pats, **opts)

def uisetup(ui):
    extensions.wrapcommand(commands.table, 'commit', ntp_commit)
    # オリジナルに対するラッピング処理
"hg commit" に対する強制日付指定

"hg commit" に対するこの改変は:

日付変更を伴う試験を実施する環境では、 変更内容を "hg commit" する際の日付記録がおかしくなってしまう。

"hg commit" の際にユーザに日付指定を強制する運用ルールは、 操作ミス発生の可能性が高いので、 明示的な日時指定が無い場合には、 NTP サーバから取得した時刻情報を利用するようにしたい。

というユースケースを想定しています。

Graphviz extension

チェンジセットの変遷を可視化するために、Graphviz の DOT 言語用ソースを生成する Mercurial 用 extension である graphviz.py を実装しました。

利用方法は JapaneseGraphvizExtension を参照してください。

Mercurial の公式リポジトリにおける 2007/07/01 〜 2007/07/31 (in JST) のチェンジセットの変遷を可視化してみましたので、 実行例としてご覧ください、

描画結果に関してですが、 あくまでチェンジセットログの情報をベースにして描画されていますから、 日付情報が適当な箇所では、 関連性が正しく描画されていないところがあります。

例えば、 5cc184800bf2(出力例では "4822") は 2007/07/05 付けで commit されているので描画対象に含まれていますが、 ここから派生した c10d3bc05a8d は 2007/06/28 付けで commit されているため描画されていません。 おそらく Christian Ebert 氏の PC の日付がおかしかったのではないでしょうか。

改めて見てみると、他にも結構日付がおかしいチェンジセットがありますね。 皆さん、PC の日付には無頓着なのでしょうか?