32
32
from bzrlib.errors import UnrelatedBranches, NoCommits, BzrCommandError
33
33
from bzrlib.merge import transform_tree, merge_inner, _PlanMerge
34
34
from bzrlib.osutils import pathjoin, file_kind
35
from bzrlib.revision import common_ancestor
36
35
from bzrlib.tests import TestCaseWithTransport, TestCaseWithMemoryTransport
37
36
from bzrlib.trace import (enable_test_log, disable_test_log)
38
37
from bzrlib.workingtree import WorkingTree
106
105
"""Merge base is sane when two unrelated branches are merged"""
107
106
wt1, br2 = self.test_pending_with_null()
108
107
wt1.commit("blah")
109
last = wt1.branch.last_revision()
110
self.assertEqual(common_ancestor(last, last, wt1.branch.repository), last)
110
last = wt1.branch.last_revision()
111
last2 = br2.last_revision()
112
graph = wt1.branch.repository.get_graph()
113
self.assertEqual(last2, graph.find_unique_lca(last, last2))
112
117
def test_create_rename(self):
113
118
"""Rename an inventory entry while creating the file"""
352
357
merger.merge_type = _mod_merge.Merge3Merger
353
358
merger.do_merge()
360
def test_merge3_will_detect_cherrypick(self):
361
this_tree = self.make_branch_and_tree('this')
362
self.build_tree_contents([('this/file', "a\n")])
363
this_tree.add('file')
364
this_tree.commit('rev1')
365
other_tree = this_tree.bzrdir.sprout('other').open_workingtree()
366
self.build_tree_contents([('other/file', "a\nb\n")])
367
other_tree.commit('rev2b', rev_id='rev2b')
368
self.build_tree_contents([('other/file', "a\nb\nc\n")])
369
other_tree.commit('rev3b', rev_id='rev3b')
370
this_tree.lock_write()
371
self.addCleanup(this_tree.unlock)
373
merger = _mod_merge.Merger.from_revision_ids(progress.DummyProgress(),
374
this_tree, 'rev3b', 'rev2b', other_tree.branch)
375
merger.merge_type = _mod_merge.Merge3Merger
377
self.assertFileEqual('a\n'
381
'>>>>>>> MERGE-SOURCE\n',
355
384
def test_make_merger(self):
356
385
this_tree = self.make_branch_and_tree('this')
357
386
this_tree.commit('rev1', rev_id='rev1')
591
620
self.add_version('REV2', ['ROOT'], 'abce')
592
621
# both sides merge, discarding others' changes
593
622
self.add_version('LCA1', ['REV1', 'REV2'], 'abcd')
594
self.add_version('LCA2', ['REV1', 'REV2'], 'abce')
623
self.add_version('LCA2', ['REV1', 'REV2'], 'fabce')
595
624
plan = self.plan_merge_vf.plan_lca_merge('LCA1', 'LCA2')
596
self.assertEqual([('unchanged', 'a\n'),
625
self.assertEqual([('new-b', 'f\n'),
626
('unchanged', 'a\n'),
597
627
('unchanged', 'b\n'),
598
628
('unchanged', 'c\n'),
599
629
('conflicted-a', 'd\n'),
600
630
('conflicted-b', 'e\n'),
634
class TestMergeImplementation(object):
636
def do_merge(self, target_tree, source_tree, **kwargs):
637
merger = _mod_merge.Merger.from_revision_ids(progress.DummyProgress(),
638
target_tree, source_tree.last_revision(),
639
other_branch=source_tree.branch)
640
merger.merge_type=self.merge_type
641
for name, value in kwargs.items():
642
setattr(merger, name, value)
645
def test_merge_specific_file(self):
646
this_tree = self.make_branch_and_tree('this')
647
this_tree.lock_write()
648
self.addCleanup(this_tree.unlock)
649
self.build_tree_contents([
650
('this/file1', 'a\nb\n'),
651
('this/file2', 'a\nb\n')
653
this_tree.add(['file1', 'file2'])
654
this_tree.commit('Added files')
655
other_tree = this_tree.bzrdir.sprout('other').open_workingtree()
656
self.build_tree_contents([
657
('other/file1', 'a\nb\nc\n'),
658
('other/file2', 'a\nb\nc\n')
660
other_tree.commit('modified both')
661
self.build_tree_contents([
662
('this/file1', 'd\na\nb\n'),
663
('this/file2', 'd\na\nb\n')
665
this_tree.commit('modified both')
666
self.do_merge(this_tree, other_tree, interesting_files=['file1'])
667
self.assertFileEqual('d\na\nb\nc\n', 'this/file1')
668
self.assertFileEqual('d\na\nb\n', 'this/file2')
671
class TestMerge3Merge(TestCaseWithTransport, TestMergeImplementation):
673
merge_type = _mod_merge.Merge3Merger
676
class TestWeaveMerge(TestCaseWithTransport, TestMergeImplementation):
678
merge_type = _mod_merge.WeaveMerger
681
class TestLCAMerge(TestCaseWithTransport, TestMergeImplementation):
683
merge_type = _mod_merge.LCAMerger