~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: 2010-02-08 12:06:24 UTC
  • mfrom: (5015.1.1 integration)
  • Revision ID: pqm@pqm.ubuntu.com-20100208120624-zqc1nk5x9hltgmiu
(vila)(trivial) Simplify some tests in
        per_workingtree/test_smart_add.py

Show diffs side-by-side

added added

removed removed

Lines of Context:
14
14
# along with this program; if not, write to the Free Software
15
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
16
 
17
 
import warnings
18
17
 
19
18
from bzrlib import (
20
19
    branch as _mod_branch,
27
26
    merge3,
28
27
    osutils,
29
28
    patiencediff,
 
29
    progress,
30
30
    revision as _mod_revision,
31
31
    textfile,
32
32
    trace,
36
36
    ui,
37
37
    versionedfile
38
38
    )
39
 
from bzrlib.cleanup import OperationWithCleanups
40
39
from bzrlib.symbol_versioning import (
41
40
    deprecated_in,
42
41
    deprecated_method,
46
45
 
47
46
def transform_tree(from_tree, to_tree, interesting_ids=None):
48
47
    from_tree.lock_tree_write()
49
 
    operation = OperationWithCleanups(merge_inner)
50
 
    operation.add_cleanup(from_tree.unlock)
51
 
    operation.run_simple(from_tree.branch, to_tree, from_tree,
52
 
        ignore_zero=True, interesting_ids=interesting_ids, this_tree=from_tree)
 
48
    try:
 
49
        merge_inner(from_tree.branch, to_tree, from_tree, ignore_zero=True,
 
50
                    interesting_ids=interesting_ids, this_tree=from_tree)
 
51
    finally:
 
52
        from_tree.unlock()
53
53
 
54
54
 
55
55
class MergeHooks(hooks.Hooks):
237
237
        self.interesting_files = None
238
238
        self.show_base = False
239
239
        self.reprocess = False
240
 
        if pb is not None:
241
 
            warnings.warn("pb parameter to Merger() is deprecated and ignored")
 
240
        if pb is None:
 
241
            pb = progress.DummyProgress()
 
242
        self._pb = pb
242
243
        self.pp = None
243
244
        self.recurse = recurse
244
245
        self.change_reporter = change_reporter
454
455
    def _add_parent(self):
455
456
        new_parents = self.this_tree.get_parent_ids() + [self.other_rev_id]
456
457
        new_parent_trees = []
457
 
        operation = OperationWithCleanups(self.this_tree.set_parent_trees)
458
458
        for revision_id in new_parents:
459
459
            try:
460
460
                tree = self.revision_tree(revision_id)
462
462
                tree = None
463
463
            else:
464
464
                tree.lock_read()
465
 
                operation.add_cleanup(tree.unlock)
466
465
            new_parent_trees.append((revision_id, tree))
467
 
        operation.run_simple(new_parent_trees, allow_leftmost_as_ghost=True)
 
466
        try:
 
467
            self.this_tree.set_parent_trees(new_parent_trees,
 
468
                                            allow_leftmost_as_ghost=True)
 
469
        finally:
 
470
            for _revision_id, tree in new_parent_trees:
 
471
                if tree is not None:
 
472
                    tree.unlock()
468
473
 
469
474
    def set_other(self, other_revision, possible_transports=None):
470
475
        """Set the revision and tree to merge from.
593
598
                  'other_tree': self.other_tree,
594
599
                  'interesting_ids': self.interesting_ids,
595
600
                  'interesting_files': self.interesting_files,
596
 
                  'this_branch': self.this_branch,
 
601
                  'pp': self.pp, 'this_branch': self.this_branch,
597
602
                  'do_merge': False}
598
603
        if self.merge_type.requires_base:
599
604
            kwargs['base_tree'] = self.base_tree
617
622
        if self._is_criss_cross and getattr(self.merge_type,
618
623
                                            'supports_lca_trees', False):
619
624
            kwargs['lca_trees'] = self._lca_trees
620
 
        return self.merge_type(pb=None,
 
625
        return self.merge_type(pb=self._pb,
621
626
                               change_reporter=self.change_reporter,
622
627
                               **kwargs)
623
628
 
624
 
    def _do_merge_to(self):
625
 
        merge = self.make_merger()
 
629
    def _do_merge_to(self, merge):
626
630
        if self.other_branch is not None:
627
631
            self.other_branch.update_references(self.this_branch)
628
632
        merge.do_merge()
642
646
                    sub_tree.branch.repository.revision_tree(base_revision)
643
647
                sub_merge.base_rev_id = base_revision
644
648
                sub_merge.do_merge()
645
 
        return merge
646
649
 
647
650
    def do_merge(self):
648
 
        operation = OperationWithCleanups(self._do_merge_to)
649
651
        self.this_tree.lock_tree_write()
650
 
        operation.add_cleanup(self.this_tree.unlock)
651
 
        if self.base_tree is not None:
652
 
            self.base_tree.lock_read()
653
 
            operation.add_cleanup(self.base_tree.unlock)
654
 
        if self.other_tree is not None:
655
 
            self.other_tree.lock_read()
656
 
            operation.add_cleanup(self.other_tree.unlock)
657
 
        merge = operation.run_simple()
 
652
        try:
 
653
            if self.base_tree is not None:
 
654
                self.base_tree.lock_read()
 
655
            try:
 
656
                if self.other_tree is not None:
 
657
                    self.other_tree.lock_read()
 
658
                try:
 
659
                    merge = self.make_merger()
 
660
                    self._do_merge_to(merge)
 
661
                finally:
 
662
                    if self.other_tree is not None:
 
663
                        self.other_tree.unlock()
 
664
            finally:
 
665
                if self.base_tree is not None:
 
666
                    self.base_tree.unlock()
 
667
        finally:
 
668
            self.this_tree.unlock()
658
669
        if len(merge.cooked_conflicts) == 0:
659
670
            if not self.ignore_zero and not trace.is_quiet():
660
671
                trace.note("All changes applied successfully.")
695
706
 
696
707
    def __init__(self, working_tree, this_tree, base_tree, other_tree,
697
708
                 interesting_ids=None, reprocess=False, show_base=False,
698
 
                 pb=None, pp=None, change_reporter=None,
 
709
                 pb=progress.DummyProgress(), pp=None, change_reporter=None,
699
710
                 interesting_files=None, do_merge=True,
700
711
                 cherrypick=False, lca_trees=None, this_branch=None):
701
712
        """Initialize the merger object and perform the merge.
711
722
        :param: reprocess If True, perform conflict-reduction processing.
712
723
        :param show_base: If True, show the base revision in text conflicts.
713
724
            (incompatible with reprocess)
714
 
        :param pb: ignored
 
725
        :param pb: A Progress bar
715
726
        :param pp: A ProgressPhase object
716
727
        :param change_reporter: An object that should report changes made
717
728
        :param interesting_files: The tree-relative paths of files that should
744
755
        # making sure we haven't missed any corner cases.
745
756
        # if lca_trees is None:
746
757
        #     self._lca_trees = [self.base_tree]
 
758
        self.pb = pb
 
759
        self.pp = pp
747
760
        self.change_reporter = change_reporter
748
761
        self.cherrypick = cherrypick
 
762
        if self.pp is None:
 
763
            self.pp = progress.ProgressPhase("Merge phase", 3, self.pb)
749
764
        if do_merge:
750
765
            self.do_merge()
751
 
        if pp is not None:
752
 
            warnings.warn("pp argument to Merge3Merger is deprecated")
753
 
        if pb is not None:
754
 
            warnings.warn("pb argument to Merge3Merger is deprecated")
755
766
 
756
767
    def do_merge(self):
757
 
        operation = OperationWithCleanups(self._do_merge)
758
768
        self.this_tree.lock_tree_write()
759
 
        operation.add_cleanup(self.this_tree.unlock)
760
769
        self.base_tree.lock_read()
761
 
        operation.add_cleanup(self.base_tree.unlock)
762
770
        self.other_tree.lock_read()
763
 
        operation.add_cleanup(self.other_tree.unlock)
764
 
        operation.run()
765
 
 
766
 
    def _do_merge(self, operation):
767
 
        self.tt = transform.TreeTransform(self.this_tree, None)
768
 
        operation.add_cleanup(self.tt.finalize)
769
 
        self._compute_transform()
770
 
        results = self.tt.apply(no_conflicts=True)
771
 
        self.write_modified(results)
772
771
        try:
773
 
            self.this_tree.add_conflicts(self.cooked_conflicts)
774
 
        except errors.UnsupportedOperation:
775
 
            pass
 
772
            self.tt = transform.TreeTransform(self.this_tree, self.pb)
 
773
            try:
 
774
                self.pp.next_phase()
 
775
                self._compute_transform()
 
776
                self.pp.next_phase()
 
777
                results = self.tt.apply(no_conflicts=True)
 
778
                self.write_modified(results)
 
779
                try:
 
780
                    self.this_tree.add_conflicts(self.cooked_conflicts)
 
781
                except errors.UnsupportedOperation:
 
782
                    pass
 
783
            finally:
 
784
                self.tt.finalize()
 
785
        finally:
 
786
            self.other_tree.unlock()
 
787
            self.base_tree.unlock()
 
788
            self.this_tree.unlock()
 
789
            self.pb.clear()
776
790
 
777
791
    def make_preview_transform(self):
778
 
        operation = OperationWithCleanups(self._make_preview_transform)
779
792
        self.base_tree.lock_read()
780
 
        operation.add_cleanup(self.base_tree.unlock)
781
793
        self.other_tree.lock_read()
782
 
        operation.add_cleanup(self.other_tree.unlock)
783
 
        return operation.run_simple()
784
 
 
785
 
    def _make_preview_transform(self):
786
794
        self.tt = transform.TransformPreview(self.this_tree)
787
 
        self._compute_transform()
 
795
        try:
 
796
            self.pp.next_phase()
 
797
            self._compute_transform()
 
798
            self.pp.next_phase()
 
799
        finally:
 
800
            self.other_tree.unlock()
 
801
            self.base_tree.unlock()
 
802
            self.pb.clear()
788
803
        return self.tt
789
804
 
790
805
    def _compute_transform(self):
812
827
        finally:
813
828
            child_pb.finished()
814
829
        self.fix_root()
 
830
        self.pp.next_phase()
815
831
        child_pb = ui.ui_factory.nested_progress_bar()
816
832
        try:
817
833
            fs_conflicts = transform.resolve_conflicts(self.tt, child_pb,
1710
1726
                other_rev_id=None,
1711
1727
                interesting_files=None,
1712
1728
                this_tree=None,
1713
 
                pb=None,
 
1729
                pb=progress.DummyProgress(),
1714
1730
                change_reporter=None):
1715
1731
    """Primary interface for merging.
1716
1732