~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/selftest/test_merge_core.py

Merge from mpool.

Show diffs side-by-side

added added

removed removed

Lines of Context:
3
3
import tempfile
4
4
import unittest
5
5
import stat
 
6
import sys
6
7
 
7
8
from bzrlib.selftest import TestCaseInTempDir, TestCase
8
9
from bzrlib.branch import ScratchBranch, Branch
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)
474
476
        return builder
475
477
 
476
478
    def contents_test_conflicts(self, merge_factory):
483
485
        builder.cleanup()
484
486
 
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)
491
 
        builder.cleanup()
 
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)
 
494
            builder.cleanup()
492
495
 
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")
508
 
        builder.cleanup()
 
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")
 
512
            builder.cleanup()
509
513
 
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();
528
533
 
529
534
 
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()])
 
636
 
 
637
    def test_merge_metadata_vs_deletion(self):
 
638
        """Conflict deletion vs metadata change"""
 
639
        os.mkdir('a')
 
640
        a = Branch.initialize('a')
 
641
        file('a/file', 'wb').write('contents\n')
 
642
        a_wt = a.working_tree()
 
643
        a_wt.add('file')
 
644
        a_wt.commit('r0')
 
645
        copy_branch(a, 'b')
 
646
        b = Branch.open('b')
 
647
        b_wt = b.working_tree()
 
648
        os.chmod('b/file', 0755)
 
649
        os.remove('a/file')
 
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'))