~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_merge_core.py

(jam) Teach bzr merge --weave/--lca how to create a .BASE file (bug
        #40412)

Show diffs side-by-side

added added

removed removed

Lines of Context:
434
434
        self.assertEqual('text2', builder.this.get_file('1').read())
435
435
        builder.cleanup()
436
436
 
 
437
 
437
438
class FunctionalMergeTest(TestCaseWithTransport):
438
439
 
439
440
    def test_trivial_star_merge(self):
467
468
        self.assertEqual("Mary\n", open("original/file2", "rt").read())
468
469
 
469
470
    def test_conflicts(self):
470
 
        os.mkdir('a')
471
471
        wta = self.make_branch_and_tree('a')
472
 
        a = wta.branch
473
 
        file('a/file', 'wb').write('contents\n')
 
472
        self.build_tree_contents([('a/file', 'contents\n')])
474
473
        wta.add('file')
475
474
        wta.commit('base revision', allow_pointless=False)
476
 
        d_b = a.bzrdir.clone('b')
477
 
        b = d_b.open_branch()
478
 
        file('a/file', 'wb').write('other contents\n')
 
475
        d_b = wta.branch.bzrdir.clone('b')
 
476
        self.build_tree_contents([('a/file', 'other contents\n')])
479
477
        wta.commit('other revision', allow_pointless=False)
480
 
        file('b/file', 'wb').write('this contents contents\n')
 
478
        self.build_tree_contents([('b/file', 'this contents contents\n')])
481
479
        wtb = d_b.open_workingtree()
482
480
        wtb.commit('this revision', allow_pointless=False)
483
481
        self.assertEqual(1, wtb.merge_from_branch(wta.branch))
484
 
        self.assert_(os.path.lexists('b/file.THIS'))
485
 
        self.assert_(os.path.lexists('b/file.BASE'))
486
 
        self.assert_(os.path.lexists('b/file.OTHER'))
 
482
        self.failUnlessExists('b/file.THIS')
 
483
        self.failUnlessExists('b/file.BASE')
 
484
        self.failUnlessExists('b/file.OTHER')
487
485
        wtb.revert()
488
486
        self.assertEqual(1, wtb.merge_from_branch(wta.branch,
489
487
                                                  merge_type=WeaveMerger))
490
 
        self.assert_(os.path.lexists('b/file'))
491
 
        self.assert_(os.path.lexists('b/file.THIS'))
492
 
        self.assert_(not os.path.lexists('b/file.BASE'))
493
 
        self.assert_(os.path.lexists('b/file.OTHER'))
 
488
        self.failUnlessExists('b/file')
 
489
        self.failUnlessExists('b/file.THIS')
 
490
        self.failUnlessExists('b/file.BASE')
 
491
        self.failUnlessExists('b/file.OTHER')
 
492
 
 
493
    def test_weave_conflicts_not_in_base(self):
 
494
        builder = self.make_branch_builder('source')
 
495
        builder.start_series()
 
496
        # See bug #494197
 
497
        #  A        base revision (before criss-cross)
 
498
        #  |\
 
499
        #  B C      B does nothing, C adds 'foo'
 
500
        #  |X|
 
501
        #  D E      D and E modify foo in incompatible ways
 
502
        #
 
503
        # Merging will conflict, with C as a clean base text. However, the
 
504
        # current code uses A as the global base and 'foo' doesn't exist there.
 
505
        # It isn't trivial to create foo.BASE because it tries to look up
 
506
        # attributes like 'executable' in A.
 
507
        builder.build_snapshot('A-id', None, [
 
508
            ('add', ('', 'TREE_ROOT', 'directory', None))])
 
509
        builder.build_snapshot('B-id', ['A-id'], [])
 
510
        builder.build_snapshot('C-id', ['A-id'], [
 
511
            ('add', ('foo', 'foo-id', 'file', 'orig\ncontents\n'))])
 
512
        builder.build_snapshot('D-id', ['B-id', 'C-id'], [
 
513
            ('add', ('foo', 'foo-id', 'file', 'orig\ncontents\nand D\n'))])
 
514
        builder.build_snapshot('E-id', ['C-id', 'B-id'], [
 
515
            ('modify', ('foo-id', 'orig\ncontents\nand E\n'))])
 
516
        builder.finish_series()
 
517
        tree = builder.get_branch().create_checkout('tree', lightweight=True)
 
518
        self.assertEqual(1, tree.merge_from_branch(tree.branch,
 
519
                                                   to_revision='D-id',
 
520
                                                   merge_type=WeaveMerger))
 
521
        self.failUnlessExists('tree/foo.THIS')
 
522
        self.failUnlessExists('tree/foo.OTHER')
 
523
        self.expectFailure('fail to create .BASE in some criss-cross merges',
 
524
            self.failUnlessExists, 'tree/foo.BASE')
 
525
        self.failUnlessExists('tree/foo.BASE')
494
526
 
495
527
    def test_merge_unrelated(self):
496
528
        """Sucessfully merges unrelated branches with no common names"""