~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/merge.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2006-04-18 05:59:25 UTC
  • mfrom: (1551.6.16 Aaron's mergeable stuff)
  • Revision ID: pqm@pqm.ubuntu.com-20060418055925-0f7129a54583f4d8
implementation of --reprocess for weave merge

Show diffs side-by-side

added added

removed removed

Lines of Context:
45
45
from bzrlib.trace import mutter, warning, note
46
46
from bzrlib.transform import (TreeTransform, resolve_conflicts, cook_conflicts,
47
47
                              FinalPaths, create_by_entry, unique_add)
 
48
from bzrlib.versionedfile import WeaveMerge
48
49
import bzrlib.ui
49
50
 
50
51
# TODO: Report back as changes are merged in
244
245
        if self.merge_type.supports_reprocess:
245
246
            kwargs['reprocess'] = self.reprocess
246
247
        elif self.reprocess:
247
 
            raise BzrError("Reprocess is not supported for this merge"
248
 
                                  " type. %s" % merge_type)
 
248
            raise BzrError("Conflict reduction is not supported for merge"
 
249
                                  " type %s." % self.merge_type)
249
250
        if self.merge_type.supports_show_base:
250
251
            kwargs['show_base'] = self.show_base
251
252
        elif self.show_base:
765
766
 
766
767
class WeaveMerger(Merge3Merger):
767
768
    """Three-way tree merger, text weave merger."""
768
 
    supports_reprocess = False
 
769
    supports_reprocess = True
769
770
    supports_show_base = False
770
771
 
771
772
    def __init__(self, working_tree, this_tree, base_tree, other_tree, 
772
 
                 interesting_ids=None, pb=DummyProgress(), pp=None):
 
773
                 interesting_ids=None, pb=DummyProgress(), pp=None,
 
774
                 reprocess=False):
773
775
        self.this_revision_tree = self._get_revision_tree(this_tree)
774
776
        self.other_revision_tree = self._get_revision_tree(other_tree)
775
777
        super(WeaveMerger, self).__init__(working_tree, this_tree, 
776
778
                                          base_tree, other_tree, 
777
779
                                          interesting_ids=interesting_ids, 
778
 
                                          pb=pb, pp=pp)
 
780
                                          pb=pb, pp=pp, reprocess=reprocess)
779
781
 
780
782
    def _get_revision_tree(self, tree):
781
783
        """Return a revision tree releated to this tree.
805
807
        this_revision_id = self.this_revision_tree.inventory[file_id].revision
806
808
        other_revision_id = \
807
809
            self.other_revision_tree.inventory[file_id].revision
808
 
        plan =  weave.plan_merge(this_revision_id, other_revision_id)
809
 
        return weave.weave_merge(plan, '<<<<<<< TREE\n', 
810
 
                                       '>>>>>>> MERGE-SOURCE\n')
 
810
        wm = WeaveMerge(weave, this_revision_id, other_revision_id, 
 
811
                        '<<<<<<< TREE\n', '>>>>>>> MERGE-SOURCE\n')
 
812
        return wm.merge_lines(self.reprocess)
811
813
 
812
814
    def text_merge(self, file_id, trans_id):
813
815
        """Perform a (weave) text merge for a given file and file-id.
815
817
        and a conflict will be noted.
816
818
        """
817
819
        self._check_file(file_id)
818
 
        lines = list(self._merged_lines(file_id))
819
 
        conflicts = '<<<<<<< TREE\n' in lines
 
820
        lines, conflicts = self._merged_lines(file_id)
820
821
        self.tt.create_file(lines, trans_id)
821
822
        if conflicts:
822
823
            self._raw_conflicts.append(('text conflict', trans_id))