Size: 6297
Comment:
|
← Revision 8 as of 2009-05-19 19:31:00 ⇥
Size: 13456
Comment: converted to 1.6 markup
|
Deletions are marked like this. | Additions are marked like this. |
Line 1: | Line 1: |
このページは ["GraphvizExtension"] の翻訳です。 | #language ja このページは [[GraphvizExtension]] の翻訳です。 |
Line 4: | Line 6: |
'''この拡張は、Mercurial と共には配布されません。''' |
|
Line 11: | Line 15: |
([http://www.graphviz.org/ Graphviz] の) DOT 言語ソースを生成します。 | ([[http://www.graphviz.org/|Graphviz]] の) DOT 言語ソースを生成します。 |
Line 18: | Line 22: |
この拡張は Mercurial 0.9.3(おそらくそれ以降でも)で機能します。 | Mercurial 0.9.3 ~ 0.9.5 上で動作確認済みの Graphviz 拡張は、 http://www.lares.dti.ne.jp/~foozy/fujiguruma/scm/graphviz.py から入手可能です (2008-02-19 に更新されました)。 描画例を http://www.lares.dti.ne.jp/~foozy/fujiguruma/scm/hg-visualize.html で見ることができます。 |
Line 48: | Line 57: |
'''リビジョン範囲'''(''-r'' オプション参照) ないし '''日時範囲'''(''-d'' オプション参照)の何れかで制限できます。 |
'''リビジョン範囲'''(''-r'' オプション参照) 、 '''日時範囲'''(''-d'' オプション参照)ないし '''間隔範囲'''(''-i'' オプション参照)の何れかで制限できます。 |
Line 52: | Line 62: |
'リビジョン番号'、'tip への相対番号' | 'リビジョン番号'、'tip への相対番号'、 |
Line 62: | Line 72: |
'''間隔範囲'''に対しては、 コマンド起動時刻からの間隔を'''秒'''で指定する必要があります。 |
|
Line 80: | Line 93: |
-r --revision use revision to limit targets(default) -d --datetime use datetime to limit targets -u --urlbase url base for client side image map -a --aliases file with user name aliases -f --format format of changeset label (default: r) --hook hook module to render node attribute }}} === ラベルのフォーマット === 可視化されたグラフ中でチェンジセットに相当するノードに描画されるラベルは、 フォーマットを指定可能です。 ''-f'' オプションに指定される文字列は、 以下の文字から構成されていなければなりません。 * u: username(may be aliased) * U: username * r: revision number * s: short-form changeset hash * h: changeset hash * d: datetime of changeset * t: first line of changeset description text 例えば {{{-f rUd}}} を指定した場合、 {{{123/who committed <mail@address>/2007-01-01T00:00:00}}} がラベルとして描画されます。 |
-r --revision use revision to limit targets(default) -d --datetime use datetime to limit targets -i --interval use interval from NOW to limit targets -a --aliases file with user name aliases --show-tags show tags in graph -u --urlbase url base for client side image map --format-label format of changeset label (default: %(r)s) --format-tooltip format of changeset tooltip (default: %(U)s/%(t)s) --group-by-date group changesets per date --group-by-branch group changesets per branch --node-attr-hook hook to render node attribute --edge-attr-hook hook to render edge attribute --cluster-attr-hook hook to render cluster attribute }}} |
Line 110: | Line 110: |
ユーザ名がラベルの要素として使用された場合にその長さを低減させるために、 エイリアス設定ファイルを指定できます。 このファイルは、以下のフォーマットの行か、 '#' で始まるコメント行から構成されていなければなりません。 |
ユーザ名がラベルの一部として使用された際にラベル長を低減するために、 エイリアス設定ファイルを指定することができます。 このファイルは、以下の形式の行か、 ''#'' で始まるコメント行で構成されていなければなりません。 |
Line 119: | Line 119: |
エイリアス変換は、 {{{u}}}(小文字の u)をラベルフォーマットとして指定した場合に有効になります。 === クライアントサイドイメージマップ === 例えば、 以下の手順を踏むことで、 ローカルホストのポート 8000 で稼動している {{{hg serve}}} と連携する HTML ページ {{{imagemap.html}}} を生成できます。 {{{ % hg graphviz ... -u http://localhost:8000 ... > imagemap.dot % dot -Tjpg -o imagemap.jpg imagemap.dot % cat <<END > imagemap.html <html> <head><title>Changeset graph between .... </title></head> <body> <image src="imagemap.jpg" usemap="_anonymous_0"> END % dot -Tcmapx imagemap.dot >> imagemap.html % cat <<END >> imagemap.html </body> </html> END }}} |
=== ラベル/ツールチップのフォーマット === 描画されるチェンジセットのラベルとツールチップ (例えば、クライアントサイドイメージマップで使用されます) のフォーマットの両方を指定することができます。 フォーマット文字列は、 Python スタイルのフォーマット形式で、 以下のキーワードを使用することができます。 全てのキーワードは文字列と置換されます。 * u: ユーザ名(エイリアスで置換され得ます) * U: ユーザ名(エイリアス置換されません) * r: チェンジセットリビジョン番号 * s: 短縮形式のチェンジセットハッシュ値(12 桁の 16 進) * h: チェンジセットハッシュ値(40 桁の 16 進) * d: チェンジセットの日付 * t: チェンジセットコメント文の最初の一行 例えば、'{{{%(u)s|%(r)s}}}' というフォーマット文字列は '{{{commiter|revision#}}}' という結果になります。 === グループ化 === グループ化、とりわけ''日付による''グループ化は、 感覚的に適切な位置にチェンジセットを描画するかもしれません。 {{{group-by-date}}} オプションを指定した場合、 graphviz 拡張はチェンジセットを日付ごとにグループ化します。 このグループ化により、日付ごとの矩形が描画されるようになります。 {{{group-by-branch}}} オプションを指定した場合、 graphviz 拡張はチェンジセットを、 '{{{default}}}' ブランチを除くブランチごとにグループ化します。 このグループ化により、ブランチごとの矩形が描画されるようになります。 上記の矩形を隠蔽したい場合、 '''描画のカスタマイズ'''を参照してください。 |
Line 151: | Line 163: |
'node' の属性をカスタマイズしたい場合、 {{{--hook}}} オプションでモジュール名を指定してください。 指定されるモジュールは、 以下のような関数定義 (関数名は厳密に {{{attrhook}}} でなければなりません) が含まれていなければなりません。 {{{ def attrhook(repository, revision, node, changes): }}} 引数は: * {{{repository}}}: 対象リビジョンが属するリポジトリ * {{{revision}}}: リビジョン番号 * {{{node}}}: {{{repository.lookup(revision)}}} で得られたもの * {{{changes}}}: {{{repository.changelog.rev(node)}}} で得られたもの 空でない文字列が {{{attrhook}}} から返却された場合、 その文字列は 'node' の属性に結合されますので、 例えば以下のようなコードにより、 特定のユーザが生成したチェンジセットに対応する 'node' を強調することができます。 {{{ def attrhook(repository, revision, node, changes): return ((changes[1] == 'someone highlighted') and 'style = "filled", color = "black", fontcolor = "white"' |
グラフ描画を制御するフックオプションが3つあります。 それぞれのオプションは2つの形式を受け付けます。 * '{{{lambda }}}' で始まる文字列は、即席の関数定義とみなされます - *.py ファイルをロードするための完全修飾された Python 関数名 (例: {{{module.name.function}}}) フックが空文字列か None を返した場合、 graphviz 拡張は描画対象に対して属性を付加しません。 ==== (1) ノード(node)属性フック ==== このフックは各ノードに属性を追加でき、 以下に示すシグネチャを持っている必要があります。 {{{ def hook(repository, revision, node, changes, getalias): }}} 各引数は: * repo : 対象リビジョンが属するリポジトリ * rev : リビジョン番号 * node : '{{{repo.lookup(rev)}}}' で得られたもの * changes : '{{{repo.changelog.rev(node)}}}' で得られたもの * getalias : 名前からエイリアス変換するための '{{{lambda name:}}}' 例えば、以下のようなコードにより、 特定のユーザによるチェンジセットを強調することができます。 {{{ def hook(repo, rev, node, changes, getalias): return ((getalias(changes[1]) == 'someone') and 'style = "filled", fontcolor = "white"' |
Line 181: | Line 201: |
=== (2) エッジ(edge)属性フック === このフックは各エッジに属性を追加でき、 以下に示すシグネチャを持っている必要があります。 {{{ def hook(repo, parent, child, first, getalias): }}} 各引数は: * repo : 対象リビジョンが属するリポジトリ * parent : エッジの描画元 * child : エッジの描画先 * first : parent が child にとって第一親か否か * getalias : 名前からエイリアス変換するための '{{{lambda name:}}}' {{{parent}}} および {{{child}}} は共に {{{(rev, node, changes)}}} というタプルなので、 エッジ属性フックを以下のように定義することもできます。 {{{ def hook(repo, (pr, pn, pc), (cr, cn, cc), first, getalias): }}} ==== (3) クラスタ(cluster)属性フック ==== このフックは各クラスタ(=グループ化矩形)に属性を追加でき、 以下に示すシグネチャを持っている必要があります。 {{{ def hook(repo, branch, date) }}} 各引数は: * repo : 対象リビジョンが属するリポジトリ * branch : ブランチ名 * date : 日付文字列({{{YYYYMMDD}}} 形式)ないし {{{""}}} {{{group-by-branch}}} オプションを指定した場合、 '{{{default}}}' 以外の各ブランチごとにこのフックが起動されます。 起動時には、{{{""}}} が日付として指定されます。 {{{group-by-date}}} オプションを指定した場合、 各日付ごとにブランチ名付き ('{{{default}}}' の場合も)でこのフックが起動されます。 '{{{group-by-date}}}' と '{{{group-by-branch}}}' のいずれのオプションも指定されない場合、 このフックは起動されません。 例えば、以下のようなコードにより、 全てのグループ化矩形を非表示にすることができます。 {{{ def hook(repo, branch, date): return 'style=invis' }}} あるいは、ブランチのグループ化矩形のみを表示するには: {{{ def hook(repo, branch, date): return (date and 'style=invis') }}} Graphviz DOT 言語仕様に適合するために、 他のフックが '{{{,}}}' で区切られた値を返すのと異なり、 このフックは '{{{;}}}' で区切られた値を返す必要があります。 === Mercurial 向けフック === 画像ファイルを自動的に更新するために、 graphviz 拡張は {{{hook}}} 関数も提供しています。 このフックはフック種別に依存した引数を使用していないので、 任意のフックに指定することができます。 しかし、 最も有用なのは {{{changegroup}}}/{{{commit}}} フックに使用した場合でしょう。 {{{ [hooks] changegroup = python:graphviz.hook commit = python:graphviz.hook }}} {{{hgrc}}} ファイルの {{{graphviz}}} セクションによって、 フックの挙動を制御できます。 {{{ [graphviz] # REQUIRED: 画像ファイル出力先 imagefile=%%(hgroot)s/.hg/revtree.jpg # opt.* は対応するコマンドラインオプションの指定と等価です opt.revision= #opt.datetime= #opt.interval= opt.aliases=%%(hgroot)s/aliases opt.show-tags= opt.urlbase=http://localhsot:8000 opt.format-label=%%(r)s opt.format-tooltip=%%(U)s/%%(t)s opt.group-by-date= opt.group-by-branch= #opt.node-attr-hook= opt.edge-attr-hook=fully.qualified.python.function opt.cluster-attr-hook=lambda repo, branch, date: 'style=invis' # 制限指定リスト limitspecs=-50, # Graphviz DOT コマンドのコマンドラインオプション dot_opts=-Nfontsize=9 -Grankdir=BT # 指定した場合、DOT 言語ソースを保存。 # 'imagefile' ファイルと同じ場所に '*.dot' サフィックスで保存 dot_source= # 指定した場合、クライアントサイドイメージマップを生成。 # 'imagefile' と同じ場所に '*.html' サフィックスで保存 imagemap= # イメージマップ HTML ファイルの導入(= '<img> タグ'の前)部分 prologue=<html><head><title>last updated by %%(r)s</title>.... # イメージマップ HTML ファイルの結び(= '<area> タグ'の後)部分 epilogue=....</html> }}} 上記の例からわかるように、 幾つかの設定中にはキーワード置換を指定することができます。 しかし、 設定ファイル読み込みにおける Python ライブラリの自動置換を抑止するために、 通常の Python 記述における {{{%}}} の代わりに {{{%%}}} を用いる必要があります。 {{{format-label}}} および {{{format-tooltip}}} 向けの全てのキーワードが利用可能ですが、 それらの値は tip チェンジセットのものが使用されます。 それに加えて、以下のキーワードも使用可能です。 * now: フック起動日時 * hgroot: 対象リポジトリのルート位置 キーワード置換は以下のものに適用されます。 * imagefile * opt.aliases * prologue * epilogue === フックの手動起動 === {{{graphviz-hook}}} コマンドにより、 graphviz 拡張のフックを手動で起動できます。 これにより、commit/pull すること無しに、 フック設定を確認することができます。 ---- CategoryJapanese |
このページは GraphvizExtension の翻訳です。
Graphviz 拡張
この拡張は、Mercurial と共には配布されません。
著者: Katsunori FUJIWARA
概要
この拡張は、 チェンジセットツリーを可視化するための (Graphviz の) DOT 言語ソースを生成します。
Graphviz は、 画像(例:*.jpg)ファイルだけでなく、 クライアントサイドのイメージマップも生成できますので、 hg serve と連携する HTML ページを得ることもできます。
Mercurial 0.9.3 ~ 0.9.5 上で動作確認済みの Graphviz 拡張は、 http://www.lares.dti.ne.jp/~foozy/fujiguruma/scm/graphviz.py から入手可能です (2008-02-19 に更新されました)。 描画例を http://www.lares.dti.ne.jp/~foozy/fujiguruma/scm/hg-visualize.html で見ることができます。
設定
graphviz.py を python が認識しているディレクトリ配下に配置した場合、 以下の行を設定ファイル(hgrc)に追加することで、 この拡張を有効にすることができます。
[extensions] graphviz =
それ以外の場合は:
[extensions] graphviz = /path/to/graphviz.py
利用方法
hg graphviz [OPTIONS] [limit-spec ...]
limit-spec を指定しない場合、 graphviz は全てのチェンジセットを描画対象とみなします。
描画対象チェンジセットは、 リビジョン範囲(-r オプション参照) 、 日時範囲(-d オプション参照)ないし 間隔範囲(-i オプション参照)の何れかで制限できます。
リビジョン範囲に対しては、 'リビジョン番号'、'tip への相対番号'、 '短縮チェンジセットID'、'チェンジセットID' ないし'タグ名'のいずれも指定可能です。
日付範囲に対しては、 YYYY-MM-DDThh:mm:ss(中間の T は T そのものでなくてはなりません) として知られる XML Schema dateTime フォーマットを使用する必要があります。 しかし、それほど強い制約が掛けられているわけではありませんので、 例えば 2007-99-99T99:99:99 のような指定も可能です。
間隔範囲に対しては、 コマンド起動時刻からの間隔を秒で指定する必要があります。
limit-spec は3つの形式のうちのどれかでなければなりません。
'Start,End' 形式は対象チェンジセットを 'Start' から 'End' の間のものに限定します。
'Start,' 形式は対象チェンジセットを 'Start' 以後のものに限定します。
',End' 形式は対象チェンジセットを 'End' 以前のものに限定します。
注意: End は含むものとみなされますので、 例えば 2007 年より後に生成されたチェンジセットを無視する場合は、 2007-12-31T24:00:00 のようなものを指定する必要があります。
graphviz は以下のオプションを認識します。
-r --revision use revision to limit targets(default) -d --datetime use datetime to limit targets -i --interval use interval from NOW to limit targets -a --aliases file with user name aliases --show-tags show tags in graph -u --urlbase url base for client side image map --format-label format of changeset label (default: %(r)s) --format-tooltip format of changeset tooltip (default: %(U)s/%(t)s) --group-by-date group changesets per date --group-by-branch group changesets per branch --node-attr-hook hook to render node attribute --edge-attr-hook hook to render edge attribute --cluster-attr-hook hook to render cluster attribute
ユーザ名エイリアス
ユーザ名がラベルの一部として使用された際にラベル長を低減するために、 エイリアス設定ファイルを指定することができます。 このファイルは、以下の形式の行か、 # で始まるコメント行で構成されていなければなりません。
AliasName=ActualName
ラベル/ツールチップのフォーマット
描画されるチェンジセットのラベルとツールチップ (例えば、クライアントサイドイメージマップで使用されます) のフォーマットの両方を指定することができます。
フォーマット文字列は、 Python スタイルのフォーマット形式で、 以下のキーワードを使用することができます。 全てのキーワードは文字列と置換されます。
- u: ユーザ名(エイリアスで置換され得ます)
- U: ユーザ名(エイリアス置換されません)
- r: チェンジセットリビジョン番号
- s: 短縮形式のチェンジセットハッシュ値(12 桁の 16 進)
- h: チェンジセットハッシュ値(40 桁の 16 進)
- d: チェンジセットの日付
- t: チェンジセットコメント文の最初の一行
例えば、'%(u)s|%(r)s' というフォーマット文字列は 'commiter|revision#' という結果になります。
グループ化
グループ化、とりわけ日付によるグループ化は、 感覚的に適切な位置にチェンジセットを描画するかもしれません。
group-by-date オプションを指定した場合、 graphviz 拡張はチェンジセットを日付ごとにグループ化します。 このグループ化により、日付ごとの矩形が描画されるようになります。
group-by-branch オプションを指定した場合、 graphviz 拡張はチェンジセットを、 'default' ブランチを除くブランチごとにグループ化します。 このグループ化により、ブランチごとの矩形が描画されるようになります。
上記の矩形を隠蔽したい場合、 描画のカスタマイズを参照してください。
描画のカスタマイズ
グラフ描画を制御するフックオプションが3つあります。
それぞれのオプションは2つの形式を受け付けます。
'lambda ' で始まる文字列は、即席の関数定義とみなされます - *.py ファイルをロードするための完全修飾された Python 関数名
(例: module.name.function)
フックが空文字列か None を返した場合、 graphviz 拡張は描画対象に対して属性を付加しません。
(1) ノード(node)属性フック
このフックは各ノードに属性を追加でき、 以下に示すシグネチャを持っている必要があります。
def hook(repository, revision, node, changes, getalias):
各引数は:
- repo : 対象リビジョンが属するリポジトリ
- rev : リビジョン番号
node : 'repo.lookup(rev)' で得られたもの
changes : 'repo.changelog.rev(node)' で得られたもの
getalias : 名前からエイリアス変換するための 'lambda name:'
例えば、以下のようなコードにより、 特定のユーザによるチェンジセットを強調することができます。
def hook(repo, rev, node, changes, getalias): return ((getalias(changes[1]) == 'someone') and 'style = "filled", fontcolor = "white"' or None)
(2) エッジ(edge)属性フック
このフックは各エッジに属性を追加でき、 以下に示すシグネチャを持っている必要があります。
def hook(repo, parent, child, first, getalias):
各引数は:
- repo : 対象リビジョンが属するリポジトリ
- parent : エッジの描画元
- child : エッジの描画先
- first : parent が child にとって第一親か否か
getalias : 名前からエイリアス変換するための 'lambda name:'
parent および child は共に (rev, node, changes) というタプルなので、 エッジ属性フックを以下のように定義することもできます。
def hook(repo, (pr, pn, pc), (cr, cn, cc), first, getalias):
(3) クラスタ(cluster)属性フック
このフックは各クラスタ(=グループ化矩形)に属性を追加でき、 以下に示すシグネチャを持っている必要があります。
def hook(repo, branch, date)
各引数は:
- repo : 対象リビジョンが属するリポジトリ
- branch : ブランチ名
date : 日付文字列(YYYYMMDD 形式)ないし ""
group-by-branch オプションを指定した場合、 'default' 以外の各ブランチごとにこのフックが起動されます。 起動時には、"" が日付として指定されます。
group-by-date オプションを指定した場合、 各日付ごとにブランチ名付き ('default' の場合も)でこのフックが起動されます。
'group-by-date' と 'group-by-branch' のいずれのオプションも指定されない場合、 このフックは起動されません。
例えば、以下のようなコードにより、 全てのグループ化矩形を非表示にすることができます。
def hook(repo, branch, date): return 'style=invis'
あるいは、ブランチのグループ化矩形のみを表示するには:
def hook(repo, branch, date): return (date and 'style=invis')
Graphviz DOT 言語仕様に適合するために、 他のフックが ',' で区切られた値を返すのと異なり、 このフックは ';' で区切られた値を返す必要があります。
Mercurial 向けフック
画像ファイルを自動的に更新するために、 graphviz 拡張は hook 関数も提供しています。 このフックはフック種別に依存した引数を使用していないので、 任意のフックに指定することができます。 しかし、 最も有用なのは changegroup/commit フックに使用した場合でしょう。
[hooks] changegroup = python:graphviz.hook commit = python:graphviz.hook
hgrc ファイルの graphviz セクションによって、 フックの挙動を制御できます。
[graphviz] # REQUIRED: 画像ファイル出力先 imagefile=%%(hgroot)s/.hg/revtree.jpg # opt.* は対応するコマンドラインオプションの指定と等価です opt.revision= #opt.datetime= #opt.interval= opt.aliases=%%(hgroot)s/aliases opt.show-tags= opt.urlbase=http://localhsot:8000 opt.format-label=%%(r)s opt.format-tooltip=%%(U)s/%%(t)s opt.group-by-date= opt.group-by-branch= #opt.node-attr-hook= opt.edge-attr-hook=fully.qualified.python.function opt.cluster-attr-hook=lambda repo, branch, date: 'style=invis' # 制限指定リスト limitspecs=-50, # Graphviz DOT コマンドのコマンドラインオプション dot_opts=-Nfontsize=9 -Grankdir=BT # 指定した場合、DOT 言語ソースを保存。 # 'imagefile' ファイルと同じ場所に '*.dot' サフィックスで保存 dot_source= # 指定した場合、クライアントサイドイメージマップを生成。 # 'imagefile' と同じ場所に '*.html' サフィックスで保存 imagemap= # イメージマップ HTML ファイルの導入(= '<img> タグ'の前)部分 prologue=<html><head><title>last updated by %%(r)s</title>.... # イメージマップ HTML ファイルの結び(= '<area> タグ'の後)部分 epilogue=....</html>
上記の例からわかるように、 幾つかの設定中にはキーワード置換を指定することができます。 しかし、 設定ファイル読み込みにおける Python ライブラリの自動置換を抑止するために、 通常の Python 記述における % の代わりに %% を用いる必要があります。
format-label および format-tooltip 向けの全てのキーワードが利用可能ですが、 それらの値は tip チェンジセットのものが使用されます。
それに加えて、以下のキーワードも使用可能です。
- now: フック起動日時
- hgroot: 対象リポジトリのルート位置
キーワード置換は以下のものに適用されます。
- imagefile
- opt.aliases
- prologue
- epilogue
フックの手動起動
graphviz-hook コマンドにより、 graphviz 拡張のフックを手動で起動できます。
これにより、commit/pull すること無しに、 フック設定を確認することができます。