8
8
perform actions before or after certain Bazaar operations. The operations
9
9
include ``commit``, ``push``, ``pull``, and ``uncommit``.
10
10
For a complete list of hooks and their parameters, see `Hooks
11
<../user-reference/hooks-help.html>`_ in the User Reference.
11
<../user-reference/bzr_man.html#hooks>`_ in the User Reference.
13
13
Most hooks are run on the client, but a few are run on the server. (Also
14
see the `push-and-update plugin`_ that handles one special case of
14
see the `bzr-push-and-update`_ plugin that handles one special case of
15
15
server-side operations.)
17
.. _push-and-update plugin: http://doc.bazaar.canonical.com/plugins/en/push-and-update-plugin.html
17
.. _bzr-push-and-update: https://launchpad.net/bzr-push-and-update/
22
To use a hook, you should `write a plugin`_. Instead of
22
To use a hook, you should `write a plugin <#writing-a-plugin>`_. Instead of
23
23
creating a new command, this plugin will define and install the hook. Here's
33
33
branch.Branch.hooks.install_named_hook('post_push', post_push_hook,
34
34
'My post_push hook')
36
.. _write a plugin: http://doc.bazaar.canonical.com/plugins/en/plugin-development.html
38
36
To use this example, create a file named ``push_hook.py``, and stick it in
39
37
``plugins`` subdirectory of your configuration directory. (If you have never
40
38
installed any plugins, you may need to create the ``plugins`` directory).
60
To get a list of installed hooks (and available hook points), use the hidden
58
To get a list of installed hooks, use the hidden ``hooks`` command::
66
Example: a merge plugin
67
-----------------------
69
Here's a complete plugin that demonstrates the ``Merger.merge_file_content``
70
hook. It installs a hook that forces any merge of a file named ``*.xml``
71
to be a conflict, even if Bazaar thinks it can merge it cleanly.
75
"""Custom 'merge' logic for *.xml files.
77
Always conflicts if both branches have changed the file.
80
from bzrlib.merge import PerFileMerger, Merger
82
def merge_xml_files_hook(merger):
83
"""Hook to merge *.xml files"""
84
return AlwaysConflictXMLMerger(merger)
86
class AlwaysConflictXMLMerger(PerFileMerger):
88
def file_matches(self, params):
89
filename = self.get_filename(params, self.merger.this_tree)
90
return filename.endswith('.xml')
92
def merge_matching(self, params):
93
return 'conflicted', params.this_lines
95
Merger.hooks.install_named_hook(
96
'merge_file_content', merge_xml_files_hook, '*.xml file merge')
98
``merge_file_content`` hooks are executed for each file to be merged. For
99
a more a complex example look at the ``news_merge`` plugin that's bundled with
100
Bazaar in the ``bzrlib/plugins`` directory.