/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

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

  • Committer: Andrew Bennetts
  • Date: 2010-04-21 07:52:31 UTC
  • mto: This revision was merged to the branch mainline in revision 5176.
  • Revision ID: andrew.bennetts@canonical.com-20100421075231-2n8pfxbhlhqxic6w
Add example merge_file_content hook based on my answer to <https://answers.edge.launchpad.net/bzr/+question/103163>.

Show diffs side-by-side

added added

removed removed

Lines of Context:
57
57
Debugging hooks
58
58
---------------
59
59
 
60
 
To get a list of installed hooks, use the hidden ``hooks`` command::
 
60
To get a list of installed hooks (and available hook points), use the hidden
 
61
``hooks`` command::
61
62
 
62
63
    bzr hooks
 
64
 
 
65
 
 
66
Example: a merge plugin
 
67
-----------------------
 
68
 
 
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.
 
72
 
 
73
``merge_xml.py``::
 
74
 
 
75
  """Custom 'merge' logic for *.xml files.
 
76
  
 
77
  Always conflicts if both branches have changed the file.
 
78
  """
 
79
  
 
80
  from bzrlib.merge import AbstractPerFileMerger, Merger
 
81
  
 
82
  def merge_xml_files_hook(merger):
 
83
      """Hook to merge *.xml files"""
 
84
      return MergeXMLFiles(merger)
 
85
  
 
86
  class MergeXMLFiles(AbstractPerFileMerger):
 
87
  
 
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'):
 
92
              return filename
 
93
  
 
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.
 
98
          if (
 
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
 
107
  
 
108
  Merger.hooks.install_named_hook(
 
109
      'merge_file_content', merge_xml_files_hook, '*.xml file merge')
 
110
 
 
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.
 
114