14
15
from bzrlib import changeset
15
16
from bzrlib.merge_core import (ApplyMerge3, make_merge_changeset,
16
17
BackupBeforeChange, ExecFlagMerge, WeaveMerge)
17
from bzrlib.changeset import Inventory, apply_changeset, invert_dict
18
from bzrlib.changeset import get_contents, ReplaceContents
18
from bzrlib.changeset import Inventory, apply_changeset, invert_dict, \
19
get_contents, ReplaceContents, ChangeExecFlag
19
20
from bzrlib.clone import copy_branch
20
21
from bzrlib.merge import merge
21
22
from bzrlib.workingtree import WorkingTree
468
469
builder.apply_changeset(cset)
469
470
self.assert_(file(builder.this.full_path("1"), "rb").read() == "text4" )
470
471
self.assert_(file(builder.this.full_path("2"), "rb").read() == "text2" )
471
self.assert_(os.stat(builder.this.full_path("1")).st_mode &0777 == 0755)
472
self.assert_(os.stat(builder.this.full_path("2")).st_mode &0777 == 0655)
473
self.assert_(os.stat(builder.this.full_path("3")).st_mode &0777 == 0744)
472
if sys.platform != "win32":
473
self.assert_(os.stat(builder.this.full_path("1")).st_mode &0777 == 0755)
474
self.assert_(os.stat(builder.this.full_path("2")).st_mode &0777 == 0655)
475
self.assert_(os.stat(builder.this.full_path("3")).st_mode &0777 == 0744)
476
478
def contents_test_conflicts(self, merge_factory):
483
485
builder.cleanup()
485
487
def test_symlink_conflicts(self):
486
builder = MergeBuilder()
487
builder.add_symlink("2", "0", "name2", "target1")
488
builder.change_target("2", other="target4", base="text3")
489
self.assertRaises(changeset.ThreewayContentsConflict,
490
builder.merge_changeset, ApplyMerge3)
488
if sys.platform != "win32":
489
builder = MergeBuilder()
490
builder.add_symlink("2", "0", "name2", "target1")
491
builder.change_target("2", other="target4", base="text3")
492
self.assertRaises(changeset.ThreewayContentsConflict,
493
builder.merge_changeset, ApplyMerge3)
493
496
def test_symlink_merge(self):
494
builder = MergeBuilder()
495
builder.add_symlink("1", "0", "name1", "target1")
496
builder.add_symlink("2", "0", "name2", "target1")
497
builder.add_symlink("3", "0", "name3", "target1")
498
builder.change_target("1", this="target2")
499
builder.change_target("2", base="target2")
500
builder.change_target("3", other="target2")
501
self.assertNotEqual(builder.cset.entries['2'].contents_change,
502
builder.cset.entries['3'].contents_change)
503
cset = builder.merge_changeset(ApplyMerge3)
504
builder.apply_changeset(cset)
505
self.assertEqual(builder.this.get_symlink_target("1"), "target2")
506
self.assertEqual(builder.this.get_symlink_target("2"), "target1")
507
self.assertEqual(builder.this.get_symlink_target("3"), "target2")
497
if sys.platform != "win32":
498
builder = MergeBuilder()
499
builder.add_symlink("1", "0", "name1", "target1")
500
builder.add_symlink("2", "0", "name2", "target1")
501
builder.add_symlink("3", "0", "name3", "target1")
502
builder.change_target("1", this="target2")
503
builder.change_target("2", base="target2")
504
builder.change_target("3", other="target2")
505
self.assertNotEqual(builder.cset.entries['2'].contents_change,
506
builder.cset.entries['3'].contents_change)
507
cset = builder.merge_changeset(ApplyMerge3)
508
builder.apply_changeset(cset)
509
self.assertEqual(builder.this.get_symlink_target("1"), "target2")
510
self.assertEqual(builder.this.get_symlink_target("2"), "target1")
511
self.assertEqual(builder.this.get_symlink_target("3"), "target2")
510
514
def test_perms_merge(self):
511
515
builder = MergeBuilder()
521
525
self.assert_(isinstance(cset.entries["2"].metadata_change, ExecFlagMerge))
522
526
self.assert_(cset.entries["3"].is_boring())
523
527
builder.apply_changeset(cset)
524
self.assert_(os.lstat(builder.this.full_path("1")).st_mode &0100 == 0000)
525
self.assert_(os.lstat(builder.this.full_path("2")).st_mode &0100 == 0100)
526
self.assert_(os.lstat(builder.this.full_path("3")).st_mode &0100 == 0000)
528
if sys.platform != "win32":
529
self.assert_(os.lstat(builder.this.full_path("1")).st_mode &0100 == 0000)
530
self.assert_(os.lstat(builder.this.full_path("2")).st_mode &0100 == 0100)
531
self.assert_(os.lstat(builder.this.full_path("3")).st_mode &0100 == 0000)
527
532
builder.cleanup();
628
633
self.assert_(os.path.lexists('a/file'))
629
634
self.assert_(os.path.lexists('a/file.moved'))
630
635
self.assertEqual(a.working_tree().pending_merges(), [b.last_revision()])
637
def test_merge_metadata_vs_deletion(self):
638
"""Conflict deletion vs metadata change"""
640
a = Branch.initialize('a')
641
file('a/file', 'wb').write('contents\n')
642
a_wt = a.working_tree()
647
b_wt = b.working_tree()
648
os.chmod('b/file', 0755)
650
a_wt.commit('removed a')
651
self.assertEqual(a.revno(), 2)
652
self.assertFalse(os.path.exists('a/file'))
653
b_wt.commit('exec a')
654
merge(['b', -1], ['b', 0], this_dir='a')
655
self.assert_(os.path.exists('a/file'))