~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/merge.py

  • Committer: Patch Queue Manager
  • Date: 2011-12-21 15:32:34 UTC
  • mfrom: (6388.1.8 merge-hooks)
  • Revision ID: pqm@pqm.ubuntu.com-20111221153234-kbq1axff8pe224vt
(jelmer) Add pre_merge and post_merge hooks in Merger.hooks. (Jelmer
 Vernooij)

Show diffs side-by-side

added added

removed removed

Lines of Context:
78
78
            "See the AbstractPerFileMerger API docs for details on how it is "
79
79
            "used by merge.",
80
80
            (2, 1))
 
81
        self.add_hook('pre_merge',
 
82
            'Called before a merge. '
 
83
            'Receives a Merger object as the single argument.',
 
84
            (2, 5))
 
85
        self.add_hook('post_merge',
 
86
            'Called after a merge. '
 
87
            'Receives a Merger object as the single argument. '
 
88
            'The return value is ignored.',
 
89
            (2, 5))
81
90
 
82
91
 
83
92
class AbstractPerFileMerger(object):
95
104
    def merge_contents(self, merge_params):
96
105
        """Attempt to merge the contents of a single file.
97
106
        
98
 
        :param merge_params: A bzrlib.merge.MergeHookParams
 
107
        :param merge_params: A bzrlib.merge.MergeFileHookParams
99
108
        :return: A tuple of (status, chunks), where status is one of
100
109
            'not_applicable', 'success', 'conflicted', or 'delete'.  If status
101
110
            is 'success' or 'conflicted', then chunks should be an iterable of
122
131
 
123
132
    def get_filename(self, params, tree):
124
133
        """Lookup the filename (i.e. basename, not path), given a Tree (e.g.
125
 
        self.merger.this_tree) and a MergeHookParams.
 
134
        self.merger.this_tree) and a MergeFileHookParams.
126
135
        """
127
136
        return osutils.basename(tree.id2path(params.file_id))
128
137
 
129
138
    def get_filepath(self, params, tree):
130
139
        """Calculate the path to the file in a tree.
131
140
 
132
 
        :param params: A MergeHookParams describing the file to merge
 
141
        :param params: A MergeFileHookParams describing the file to merge
133
142
        :param tree: a Tree, e.g. self.merger.this_tree.
134
143
        """
135
144
        return tree.id2path(params.file_id)
224
233
        raise NotImplementedError(self.merge_text)
225
234
 
226
235
 
227
 
class MergeHookParams(object):
 
236
class MergeFileHookParams(object):
228
237
    """Object holding parameters passed to merge_file_content hooks.
229
238
 
230
239
    There are some fields hooks can access:
603
612
            self._maybe_fetch(base_branch, self.this_branch, self.base_rev_id)
604
613
 
605
614
    def make_merger(self):
606
 
        kwargs = {'working_tree':self.this_tree, 'this_tree': self.this_tree,
 
615
        kwargs = {'working_tree': self.this_tree, 'this_tree': self.this_tree,
607
616
                  'other_tree': self.other_tree,
608
617
                  'interesting_ids': self.interesting_ids,
609
618
                  'interesting_files': self.interesting_files,
639
648
        merge = self.make_merger()
640
649
        if self.other_branch is not None:
641
650
            self.other_branch.update_references(self.this_branch)
 
651
        for hook in Merger.hooks['pre_merge']:
 
652
            hook(merge)
642
653
        merge.do_merge()
 
654
        for hook in Merger.hooks['post_merge']:
 
655
            hook(merge)
643
656
        if self.recurse == 'down':
644
657
            for relpath, file_id in self.this_tree.iter_references():
645
658
                sub_tree = self.this_tree.get_nested_tree(file_id, relpath)
1343
1356
        # We have a hypothetical conflict, but if we have files, then we
1344
1357
        # can try to merge the content
1345
1358
        trans_id = self.tt.trans_id_file_id(file_id)
1346
 
        params = MergeHookParams(self, file_id, trans_id, this_pair[0],
 
1359
        params = MergeFileHookParams(self, file_id, trans_id, this_pair[0],
1347
1360
            other_pair[0], winner)
1348
1361
        hooks = self.active_hooks
1349
1362
        hook_status = 'not_applicable'