~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

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

(lifeless) When writing temporary files for external diff do not set the file utime if we don't know when the in-tree file was last modified. (Martin [gz])

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 (and available hook points), use the hidden
61
 
``hooks`` command::
 
60
To get a list of installed hooks, use the hidden ``hooks`` command::
62
61
 
63
62
    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