今回は "11. Customising the output of Mercurial" を読みます。
同梱済み「スタイル」である "compact" および "changelog" の出力を、 通常の出力様式である "default" と比較することで、 テンプレートエンジンによる出力改変の手軽さを示しています。
普段使用する出力「スタイル」を "default" 以外にするには、
hgrc ファイルで [ui] style を設定します。
"default 以外の「スタイル」に設定"する手順を説明する節なのに、 表題が "Setting a default style" というのも変な話です。
0.9.5 版時点で「スタイル」・テンプレート指定が可能なコマンドは:
- heads
- incoming
- log
- outgoing
- parents
- tip
Mercurial の「テンプレート」では、 波括弧(brace, "{" と "}")で囲まれたキーワードを動的に置換します。
"%" に続く丸括弧(parenthesis: "(" と ")")で囲まれたキーワードを、 閉じ括弧の次に指定された形式で展開する Python の文字列フォーマット機能とは若干勝手が違います。 個人的には Mercurial のテンプレートの方が楽な気がします。
即利用可能なテンプレートキーワードが紹介されています。
例えば全てのコミッタを一覧表示させるには:
% hg log --template '{author}\n' | sort | uniq
また、 特定のコミッタによるチェンジセットのりビジョン番号を一覧表示させるには:
% hg log --template '{rev}: {author}\n' | grep ': コミッタ'
といった応用も可能です。
libc の printf や、 各言語の文字列フォーマット機能の使用経験があれば、 ここでの記述には特に驚くべき事柄は無いでしょう。
fill68
(テキストを 68 桁に収まるように自動的に折り返す)
フィルタの存在から「コミットログにダラダラ長い行を書く奴が居て困る」
というボヤキが聞こえてくるようですが、それはさておき。
表示体裁の指定に「フィルタ」という概念を組み合わせるのは、 汎用性・再利用性の点でなかなか良いモデルだと思います。
hook や extension と同程度に、 独自フィルタの追加が簡単であれば言うこと無しなのですが、 どうやら 0.9.5 版時点では、 「設定ファイルに書けば利用可能」 という程度には簡便化されていない模様です。 機能拡張ネタとしては結構イケるかもしれません。
Unix ライクに "|" での連結によりフィルタの連鎖ができる、 というのは益々もって良い感じです。
こうなると尚のこと、 自前のフィルタを追加したくなります。
「スタイル」化することで、 コマンドラインでのテンプレート指定よりも、 より高度な利用が可能になります。
単純な「スタイル」ファイルの例を示しています。
「スタイル」ファイルの文法は、 所謂プロパティファイルと一緒ですが、 クォートで囲むと即値指定、 それ以外の場合は指定ファイルの読み込みが行われる、 という点が異なります。
「スタイル」記述に問題があった際の、 Mercurial エラーメッセージの読み方が説明されています。
hg clone 等で複製された場合、
リビジョン 0 のチェンジセット ID はリポジトリ間で当然一致しますから、
ここで言う「リポジトリの識別」は、
むしろ「プロジェクトの識別」に近いニュアンスと思われます。
Subversion の svn log 出力の真似をしています。
至極簡単に真似できています。
例えば:
- 各自のコミット回数
- 期間あたりのコミット数推移
といった、ちょっとした集計作業を行いたい場合に、 (CVS や Subversion のログのような)整形済みフォーマットだと、 まずはコミット単位でログを切り分け、そこから必要な情報を抽出、 といった文字列処理を行わなければなりません。 特定の値の時には省略される欄などがあったりすると、 文字列加工の正規表現も複雑になり、面倒でたまりません。
Mercurial のテンプレートを利用すれば、 集計する側で頑張るのではなく、 出力を集計しやすい形式に加工すれば良くなるわけです。 うーん、便利。
"Distributed revision control with Mercurial" 関連エントリの一覧は、BOSBook(Bryan O’Sullivan Book)タグで参照できます。