フックを利用する
================

フックとは？
------------

Bazaarのふるまいをカスタマイズする1つの方法は *フック(hook)* です。
フックによって特定のBazaarの特定のオペレーションの前後でアクションを実行できます。
オペレーションは ``commit`` 、 ``push`` 、 ``pull`` 、と ``uncommit`` を含みます。
フックとパラメータの完全なリストに関しては、ユーザーリファレンスの
`フック <../user-reference/bzr_man.html#hooks>`_ を参照してください。

大抵のフックはクライアントで実行されますが、サーバーで実行されるものもわずかにあります。
(サーバーサイドのオペレーションの特殊なケースを扱うものは `bzr-push-and-update`_ プラグインも参照。)

.. _bzr-push-and-update: https://launchpad.net/bzr-push-and-update/


フックを使用する
-----------------

フックを使用するには、 `プラグインを書きます <#writing-a-plugin>`_ 。
新しいコマンドを作成する代わりに、このプラグインはフックを定義してインストールします。例です::

    from bzrlib import branch


    def post_push_hook(push_result):
        print "The new revno is %d" % push_result.new_revno


    branch.Branch.hooks.install_named_hook('post_push', post_push_hook,
                                     'My post_push hook')

この例を使用するには、 ``push_hook.py`` という名前のファイルを作り
``plugins`` サブディレクトリに設置します。
(プラグインをインストールしていなければ、 ``plugins`` ディレクトリを作る必要があります)。

以上です！次回にpushすると、"The new revno is..."が表示されます。
もちろん、Pythonのフルパワーを思いとおりにできるので、フックはこれよりもはるかに手が込んでいます。
これでフックの使い方を理解したので、それらで何をするかはあなたしだいです。

プラグインのコードは2つのことを行います。
最初に、これは ``push`` が完了した後に実行する関数を定義します。
(代わりにインスタンスメソッドもしくは呼び出し可能なオブジェクトを使用することもできます。)
すべてのpushフックは単独の引数 ``push_result`` をとります。

2番目に、プラグインはフックをインストールします。
最初の引数 ``'post_push'`` はフックがインストールされている場所を特定します。
2番目の引数はフック自身です。3番目の引数は ``'My post_push hook'`` という名前で、
これは進行メッセージとエラーメッセージで使用されます。


フックをデバッグする
---------------------

インストールされたフックの一覧を表示するには、 ``hooks`` コマンドを使います::

    bzr hooks
