4634.99.1
by Naoki INADA
import doc-ja rev90 |
1 |
フックを利用する |
2 |
================ |
|
3 |
||
4 |
フックとは? |
|
5 |
------------ |
|
6 |
||
7 |
Bazaarのふるまいをカスタマイズする1つの方法は *フック(hook)* です。 |
|
8 |
フックによって特定のBazaarの特定のオペレーションの前後でアクションを実行できます。 |
|
5875.1.1
by INADA Naoki
Update Japanese docs. |
9 |
オペレーションは ``commit``, ``push``, ``pull`` と ``uncommit`` を含みます。 |
4634.99.1
by Naoki INADA
import doc-ja rev90 |
10 |
フックとパラメータの完全なリストに関しては、ユーザーリファレンスの |
5875.1.1
by INADA Naoki
Update Japanese docs. |
11 |
`フック <../user-reference/index.html#hooks>`_ を参照してください。 |
12 |
||
13 |
大抵のフックはクライアントで実行されますが、サーバーで実行されるものもわずかに |
|
14 |
あります。 |
|
15 |
(サーバーサイドのオペレーションの特殊なケースを扱うものは |
|
16 |
`push-and-update plugin`_ も参照。) |
|
17 |
||
18 |
.. _push-and-update plugin: http://doc.bazaar.canonical.com/plugins/en/push-and-update-plugin.html |
|
4634.99.1
by Naoki INADA
import doc-ja rev90 |
19 |
|
20 |
||
21 |
フックを使用する |
|
22 |
----------------- |
|
23 |
||
5875.1.1
by INADA Naoki
Update Japanese docs. |
24 |
フックを使用するには、 `プラグインを書きます`_ 。 |
4634.99.1
by Naoki INADA
import doc-ja rev90 |
25 |
新しいコマンドを作成する代わりに、このプラグインはフックを定義してインストールします。例です:: |
26 |
||
27 |
from bzrlib import branch |
|
28 |
||
29 |
||
30 |
def post_push_hook(push_result): |
|
31 |
print "The new revno is %d" % push_result.new_revno |
|
32 |
||
33 |
||
34 |
branch.Branch.hooks.install_named_hook('post_push', post_push_hook, |
|
35 |
'My post_push hook') |
|
36 |
||
5875.1.1
by INADA Naoki
Update Japanese docs. |
37 |
.. _プラグインを書きます: http://doc.bazaar.canonical.com/plugins/en/plugin-development.html |
38 |
||
4634.99.1
by Naoki INADA
import doc-ja rev90 |
39 |
この例を使用するには、 ``push_hook.py`` という名前のファイルを作り |
40 |
``plugins`` サブディレクトリに設置します。 |
|
41 |
(プラグインをインストールしていなければ、 ``plugins`` ディレクトリを作る必要があります)。 |
|
42 |
||
43 |
以上です!次回にpushすると、"The new revno is..."が表示されます。 |
|
44 |
もちろん、Pythonのフルパワーを思いとおりにできるので、フックはこれよりもはるかに手が込んでいます。 |
|
45 |
これでフックの使い方を理解したので、それらで何をするかはあなたしだいです。 |
|
46 |
||
47 |
プラグインのコードは2つのことを行います。 |
|
48 |
最初に、これは ``push`` が完了した後に実行する関数を定義します。 |
|
49 |
(代わりにインスタンスメソッドもしくは呼び出し可能なオブジェクトを使用することもできます。) |
|
50 |
すべてのpushフックは単独の引数 ``push_result`` をとります。 |
|
51 |
||
52 |
2番目に、プラグインはフックをインストールします。 |
|
53 |
最初の引数 ``'post_push'`` はフックがインストールされている場所を特定します。 |
|
54 |
2番目の引数はフック自身です。3番目の引数は ``'My post_push hook'`` という名前で、 |
|
55 |
これは進行メッセージとエラーメッセージで使用されます。 |
|
56 |
||
5875.1.1
by INADA Naoki
Update Japanese docs. |
57 |
To reduce the start-up time of Bazaar it is also possible to "lazily" install hooks, |
58 |
using the ``bzrlib.hooks.install_lazy_named_hook`` function. This removes the need |
|
59 |
to load the module that contains the hook point just to install the hook. Here's lazy |
|
60 |
version of the example above: |
|
61 |
||
62 |
Bazaar のスタートアップ時間を短縮するために、フックを "遅延" インストールすることができます。 |
|
63 |
遅延インストールには ``bzrlib.hooks.install_lazy_named_hook`` 関数を使います。 |
|
64 |
遅延インストールを使えば、フックをインストールするためだけにフックポイントを含むモジュールを |
|
65 |
ロードする必要がなくなります。 |
|
66 |
次の例は、上の例の遅延バージョンです。 :: |
|
67 |
||
68 |
from bzrlib import hooks |
|
69 |
||
70 |
def post_push_hook(push_result): |
|
71 |
print "The new revno is %d" % push_result.new_revno |
|
72 |
||
73 |
||
74 |
hooks.install_lazy_named_hook('bzrlib.branch', 'Branch.hooks', |
|
75 |
'post_push', post_push_hook, 'My post_push hook') |
|
76 |
||
4634.99.1
by Naoki INADA
import doc-ja rev90 |
77 |
|
78 |
フックをデバッグする |
|
79 |
--------------------- |
|
80 |
||
5875.1.1
by INADA Naoki
Update Japanese docs. |
81 |
インストールされたフックの一覧 (と、利用可能なフックポイントの一覧) を表示するには、 |
82 |
隠しコマンドである ``hooks`` コマンドを使います:: |
|
4634.99.1
by Naoki INADA
import doc-ja rev90 |
83 |
|
84 |
bzr hooks |
|
5875.1.1
by INADA Naoki
Update Japanese docs. |
85 |
|
86 |
||
87 |
例: マージプラグイン |
|
88 |
----------------------- |
|
89 |
||
90 |
次の例は ``Merger.merge_file_content`` フックのデモのための、完全なプラグインです。 |
|
91 |
このプラグインは、 ``*.xml`` の名前のファイルに対する全てのマージに着いて、 |
|
92 |
Bazaar がそのマージがクリーンだと判断しても必ず「衝突」状態にします。 |
|
93 |
||
94 |
``merge_xml.py``:: |
|
95 |
||
96 |
"""Custom 'merge' logic for *.xml files. |
|
97 |
||
98 |
Always conflicts if both branches have changed the file. |
|
99 |
""" |
|
100 |
||
101 |
from bzrlib.merge import PerFileMerger, Merger |
|
102 |
||
103 |
def merge_xml_files_hook(merger): |
|
104 |
"""Hook to merge *.xml files""" |
|
105 |
return AlwaysConflictXMLMerger(merger) |
|
106 |
||
107 |
class AlwaysConflictXMLMerger(PerFileMerger): |
|
108 |
||
109 |
def file_matches(self, params): |
|
110 |
filename = self.get_filename(params, self.merger.this_tree) |
|
111 |
return filename.endswith('.xml') |
|
112 |
||
113 |
def merge_matching(self, params): |
|
114 |
return 'conflicted', params.this_lines |
|
115 |
||
116 |
Merger.hooks.install_named_hook( |
|
117 |
'merge_file_content', merge_xml_files_hook, '*.xml file merge') |
|
118 |
||
119 |
``merge_file_content`` hooks are executed for each file to be merged. For |
|
120 |
a more a complex example look at the ``news_merge`` plugin that's bundled with |
|
121 |
Bazaar in the ``bzrlib/plugins`` directory. |
|
122 |
||
123 |
``merge_file_content`` フックは各ファイルがマージされるたびに呼ばれます。 |
|
124 |
もっと複雑な例として、 Bazaar の ``bzrlib/plugins`` ディレクトリに同梱されている |
|
125 |
``news_merge`` プラグインも参照してください。 |