60
To get a list of installed hooks (and available hook points), use the hidden
60
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 AbstractPerFileMerger, Merger
82
def merge_xml_files_hook(merger):
83
"""Hook to merge *.xml files"""
84
return MergeXMLFiles(merger)
86
class MergeXMLFiles(AbstractPerFileMerger):
88
def filename_matches(self, params):
89
inventory = self.merger.this_tree.inventory
90
filename = inventory[params.file_id].name
91
if filename.endswith('.xml'):
94
def merge_contents(self, params):
95
"""Merge the contents of a single file."""
96
# First, check whether this custom merge logic should be used. We
97
# expect most files should not be merged by this handler.
99
# OTHER is a straight winner, rely on default merge.
100
params.winner == 'other' or
101
# THIS and OTHER aren't both files.
102
not params.is_file_merge() or
103
# The filename doesn't match *.xml
104
not self.filename_matches(params)):
105
return 'not_applicable', None
106
return 'conflicted', params.this_lines
108
Merger.hooks.install_named_hook(
109
'merge_file_content', merge_xml_files_hook, '*.xml file merge')
111
``merge_file_content`` hooks are executed for each file to be merged. For
112
a more a complex example look at the ``news_merge`` plugin that's bundled with
113
Bazaar in the ``bzrlib/plugins`` directory.