~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to doc/ja/user-guide/hooks.txt

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2007-03-28 06:58:22 UTC
  • mfrom: (2379.2.3 hpss-chroot)
  • Revision ID: pqm@pqm.ubuntu.com-20070328065822-999550a858a3ced3
(robertc) Fix chroot urls to not expose the url of the transport they are protecting, allowing regular url operations to work on them. (Robert Collins, Andrew Bennetts)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
フックを利用する
2
 
================
3
 
 
4
 
フックとは?
5
 
------------
6
 
 
7
 
Bazaarのふるまいをカスタマイズする1つの方法は *フック(hook)* です。
8
 
フックによって特定のBazaarの特定のオペレーションの前後でアクションを実行できます。
9
 
オペレーションは ``commit``, ``push``, ``pull`` と ``uncommit`` を含みます。
10
 
フックとパラメータの完全なリストに関しては、ユーザーリファレンスの
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
19
 
 
20
 
 
21
 
フックを使用する
22
 
-----------------
23
 
 
24
 
フックを使用するには、 `プラグインを書きます`_ 。
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
 
 
37
 
.. _プラグインを書きます: http://doc.bazaar.canonical.com/plugins/en/plugin-development.html
38
 
 
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
 
 
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
 
 
77
 
 
78
 
フックをデバッグする
79
 
---------------------
80
 
 
81
 
インストールされたフックの一覧 (と、利用可能なフックポイントの一覧) を表示するには、
82
 
隠しコマンドである ``hooks`` コマンドを使います::
83
 
 
84
 
    bzr hooks
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`` プラグインも参照してください。