467
468
self.assertEqual("Mary\n", open("original/file2", "rt").read())
469
470
def test_conflicts(self):
471
471
wta = self.make_branch_and_tree('a')
473
file('a/file', 'wb').write('contents\n')
472
self.build_tree_contents([('a/file', 'contents\n')])
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')
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')
493
def test_weave_conflicts_not_in_base(self):
494
builder = self.make_branch_builder('source')
495
builder.start_series()
497
# A base revision (before criss-cross)
499
# B C B does nothing, C adds 'foo'
501
# D E D and E modify foo in incompatible ways
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,
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')
495
527
def test_merge_unrelated(self):
496
528
"""Sucessfully merges unrelated branches with no common names"""