46
47
def transform_tree(from_tree, to_tree, interesting_ids=None):
47
48
from_tree.lock_tree_write()
49
merge_inner(from_tree.branch, to_tree, from_tree, ignore_zero=True,
50
interesting_ids=interesting_ids, this_tree=from_tree)
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)
55
55
class MergeHooks(hooks.Hooks):
455
455
def _add_parent(self):
456
456
new_parents = self.this_tree.get_parent_ids() + [self.other_rev_id]
457
457
new_parent_trees = []
458
operation = OperationWithCleanups(self.this_tree.set_parent_trees)
458
459
for revision_id in new_parents:
460
461
tree = self.revision_tree(revision_id)
466
operation.add_cleanup(tree.unlock)
465
467
new_parent_trees.append((revision_id, tree))
467
self.this_tree.set_parent_trees(new_parent_trees,
468
allow_leftmost_as_ghost=True)
470
for _revision_id, tree in new_parent_trees:
468
operation.run_simple(new_parent_trees, allow_leftmost_as_ghost=True)
474
470
def set_other(self, other_revision, possible_transports=None):
475
471
"""Set the revision and tree to merge from.
626
622
change_reporter=self.change_reporter,
629
def _do_merge_to(self, merge):
625
def _do_merge_to(self):
626
merge = self.make_merger()
630
627
if self.other_branch is not None:
631
628
self.other_branch.update_references(self.this_branch)
646
643
sub_tree.branch.repository.revision_tree(base_revision)
647
644
sub_merge.base_rev_id = base_revision
648
645
sub_merge.do_merge()
650
648
def do_merge(self):
649
operation = OperationWithCleanups(self._do_merge_to)
651
650
self.this_tree.lock_tree_write()
653
if self.base_tree is not None:
654
self.base_tree.lock_read()
656
if self.other_tree is not None:
657
self.other_tree.lock_read()
659
merge = self.make_merger()
660
self._do_merge_to(merge)
662
if self.other_tree is not None:
663
self.other_tree.unlock()
665
if self.base_tree is not None:
666
self.base_tree.unlock()
668
self.this_tree.unlock()
651
operation.add_cleanup(self.this_tree.unlock)
652
if self.base_tree is not None:
653
self.base_tree.lock_read()
654
operation.add_cleanup(self.base_tree.unlock)
655
if self.other_tree is not None:
656
self.other_tree.lock_read()
657
operation.add_cleanup(self.other_tree.unlock)
658
merge = operation.run_simple()
669
659
if len(merge.cooked_conflicts) == 0:
670
660
if not self.ignore_zero and not trace.is_quiet():
671
661
trace.note("All changes applied successfully.")
767
757
def do_merge(self):
758
operation = OperationWithCleanups(self._do_merge)
759
operation.add_cleanup(self.pb.clear)
768
760
self.this_tree.lock_tree_write()
761
operation.add_cleanup(self.this_tree.unlock)
769
762
self.base_tree.lock_read()
763
operation.add_cleanup(self.base_tree.unlock)
770
764
self.other_tree.lock_read()
765
operation.add_cleanup(self.other_tree.unlock)
768
def _do_merge(self, operation):
769
self.tt = transform.TreeTransform(self.this_tree, self.pb)
770
operation.add_cleanup(self.tt.finalize)
772
self._compute_transform()
774
results = self.tt.apply(no_conflicts=True)
775
self.write_modified(results)
772
self.tt = transform.TreeTransform(self.this_tree, self.pb)
775
self._compute_transform()
777
results = self.tt.apply(no_conflicts=True)
778
self.write_modified(results)
780
self.this_tree.add_conflicts(self.cooked_conflicts)
781
except errors.UnsupportedOperation:
786
self.other_tree.unlock()
787
self.base_tree.unlock()
788
self.this_tree.unlock()
777
self.this_tree.add_conflicts(self.cooked_conflicts)
778
except errors.UnsupportedOperation:
791
781
def make_preview_transform(self):
782
operation = OperationWithCleanups(self._make_preview_transform)
783
operation.add_cleanup(self.pb.clear)
792
784
self.base_tree.lock_read()
785
operation.add_cleanup(self.base_tree.unlock)
793
786
self.other_tree.lock_read()
787
operation.add_cleanup(self.other_tree.unlock)
788
return operation.run_simple()
790
def _make_preview_transform(self):
794
791
self.tt = transform.TransformPreview(self.this_tree)
797
self._compute_transform()
800
self.other_tree.unlock()
801
self.base_tree.unlock()
793
self._compute_transform()
805
797
def _compute_transform(self):