451
451
tree_file.close()
453
def test_merge_add_into_deleted_root(self):
454
# Yes, people actually do this. And report bugs if it breaks.
455
source = self.make_branch_and_tree('source', format='rich-root-pack')
456
self.build_tree(['source/foo/'])
457
source.add('foo', 'foo-id')
458
source.commit('Add foo')
459
target = source.bzrdir.sprout('target').open_workingtree()
460
subtree = target.extract('foo-id')
461
subtree.commit('Delete root')
462
self.build_tree(['source/bar'])
463
source.add('bar', 'bar-id')
464
source.commit('Add bar')
465
subtree.merge_from_branch(source.branch)
454
468
class TestPlanMerge(TestCaseWithMemoryTransport):
457
471
TestCaseWithMemoryTransport.setUp(self)
458
self.vf = knit.KnitVersionedFile('root', self.get_transport(),
460
self.plan_merge_vf = versionedfile._PlanMergeVersionedFile('root',
463
def add_version(self, version_id, parents, text):
464
self.vf.add_lines(version_id, parents, [c+'\n' for c in text])
466
def add_uncommitted_version(self, version_id, parents, text):
467
self.plan_merge_vf.add_lines(version_id, parents,
472
mapper = versionedfile.PrefixMapper()
473
factory = knit.make_file_factory(True, mapper)
474
self.vf = factory(self.get_transport())
475
self.plan_merge_vf = versionedfile._PlanMergeVersionedFile('root')
476
self.plan_merge_vf.fallback_versionedfiles.append(self.vf)
478
def add_version(self, key, parents, text):
479
self.vf.add_lines(key, parents, [c+'\n' for c in text])
481
def add_uncommitted_version(self, key, parents, text):
482
self.plan_merge_vf.add_lines(key, parents,
468
483
[c+'\n' for c in text])
470
485
def setup_plan_merge(self):
471
self.add_version('A', [], 'abc')
472
self.add_version('B', ['A'], 'acehg')
473
self.add_version('C', ['A'], 'fabg')
474
return _PlanMerge('B', 'C', self.plan_merge_vf)
486
self.add_version(('root', 'A'), [], 'abc')
487
self.add_version(('root', 'B'), [('root', 'A')], 'acehg')
488
self.add_version(('root', 'C'), [('root', 'A')], 'fabg')
489
return _PlanMerge('B', 'C', self.plan_merge_vf, ('root',))
476
491
def setup_plan_merge_uncommitted(self):
477
self.add_version('A', [], 'abc')
478
self.add_uncommitted_version('B:', ['A'], 'acehg')
479
self.add_uncommitted_version('C:', ['A'], 'fabg')
480
return _PlanMerge('B:', 'C:', self.plan_merge_vf)
492
self.add_version(('root', 'A'), [], 'abc')
493
self.add_uncommitted_version(('root', 'B:'), [('root', 'A')], 'acehg')
494
self.add_uncommitted_version(('root', 'C:'), [('root', 'A')], 'fabg')
495
return _PlanMerge('B:', 'C:', self.plan_merge_vf, ('root',))
482
497
def test_unique_lines(self):
483
498
plan = self.setup_plan_merge()
491
506
self.assertEqual(set([0, 3]), plan._find_new('C'))
493
508
def test_find_new2(self):
494
self.add_version('A', [], 'abc')
495
self.add_version('B', ['A'], 'abcde')
496
self.add_version('C', ['A'], 'abcefg')
497
self.add_version('D', ['A', 'B', 'C'], 'abcdegh')
498
my_plan = _PlanMerge('B', 'D', self.plan_merge_vf)
509
self.add_version(('root', 'A'), [], 'abc')
510
self.add_version(('root', 'B'), [('root', 'A')], 'abcde')
511
self.add_version(('root', 'C'), [('root', 'A')], 'abcefg')
512
self.add_version(('root', 'D'),
513
[('root', 'A'), ('root', 'B'), ('root', 'C')], 'abcdegh')
514
my_plan = _PlanMerge('B', 'D', self.plan_merge_vf, ('root',))
499
515
self.assertEqual(set([5, 6]), my_plan._find_new('D'))
500
516
self.assertEqual(set(), my_plan._find_new('A'))
502
518
def test_find_new_no_ancestors(self):
503
self.add_version('A', [], 'abc')
504
self.add_version('B', [], 'xyz')
505
my_plan = _PlanMerge('A', 'B', self.vf)
519
self.add_version(('root', 'A'), [], 'abc')
520
self.add_version(('root', 'B'), [], 'xyz')
521
my_plan = _PlanMerge('A', 'B', self.vf, ('root',))
506
522
self.assertEqual(set([0, 1, 2]), my_plan._find_new('A'))
508
524
def test_plan_merge(self):
562
578
list(_PlanMerge._subtract_plans(old_plan, new_plan)))
564
580
def setup_merge_with_base(self):
565
self.add_version('COMMON', [], 'abc')
566
self.add_version('THIS', ['COMMON'], 'abcd')
567
self.add_version('BASE', ['COMMON'], 'eabc')
568
self.add_version('OTHER', ['BASE'], 'eafb')
581
self.add_version(('root', 'COMMON'), [], 'abc')
582
self.add_version(('root', 'THIS'), [('root', 'COMMON')], 'abcd')
583
self.add_version(('root', 'BASE'), [('root', 'COMMON')], 'eabc')
584
self.add_version(('root', 'OTHER'), [('root', 'BASE')], 'eafb')
570
586
def test_plan_merge_with_base(self):
571
587
self.setup_merge_with_base()
616
632
def test_plan_lca_merge_with_criss_cross(self):
617
self.add_version('ROOT', [], 'abc')
633
self.add_version(('root', 'ROOT'), [], 'abc')
618
634
# each side makes a change
619
self.add_version('REV1', ['ROOT'], 'abcd')
620
self.add_version('REV2', ['ROOT'], 'abce')
635
self.add_version(('root', 'REV1'), [('root', 'ROOT')], 'abcd')
636
self.add_version(('root', 'REV2'), [('root', 'ROOT')], 'abce')
621
637
# both sides merge, discarding others' changes
622
self.add_version('LCA1', ['REV1', 'REV2'], 'abcd')
623
self.add_version('LCA2', ['REV1', 'REV2'], 'fabce')
638
self.add_version(('root', 'LCA1'),
639
[('root', 'REV1'), ('root', 'REV2')], 'abcd')
640
self.add_version(('root', 'LCA2'),
641
[('root', 'REV1'), ('root', 'REV2')], 'fabce')
624
642
plan = self.plan_merge_vf.plan_lca_merge('LCA1', 'LCA2')
625
643
self.assertEqual([('new-b', 'f\n'),
626
644
('unchanged', 'a\n'),