/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_merge_core.py

[merge] update from bzr.dev

Show diffs side-by-side

added added

removed removed

Lines of Context:
3
3
import stat
4
4
import sys
5
5
 
6
 
from bzrlib.tests import TestCaseInTempDir, TestCase
 
6
from bzrlib.add import smart_add_tree
7
7
from bzrlib.branch import ScratchBranch, Branch
 
8
from bzrlib.builtins import merge
8
9
from bzrlib.errors import (NotBranchError, NotVersionedError,
9
10
                           WorkingTreeNotRevision, BzrCommandError)
10
11
from bzrlib.inventory import RootEntry
11
12
import bzrlib.inventory as inventory
12
13
from bzrlib.osutils import file_kind, rename, sha_file, pathjoin, mkdtemp
13
 
from bzrlib import changeset
14
 
from bzrlib.merge_core import (ApplyMerge3, make_merge_changeset,
 
14
from bzrlib import _changeset as changeset
 
15
from bzrlib._merge_core import (ApplyMerge3, make_merge_changeset,
15
16
                               BackupBeforeChange, ExecFlagMerge, WeaveMerge)
16
 
from bzrlib.changeset import Inventory, apply_changeset, invert_dict, \
17
 
    get_contents, ReplaceContents, ChangeExecFlag
18
 
from bzrlib.clone import copy_branch
19
 
from bzrlib.merge import merge
 
17
from bzrlib._changeset import Inventory, apply_changeset, invert_dict, \
 
18
    get_contents, ReplaceContents, ChangeExecFlag, Diff3Merge
 
19
from bzrlib.tests import TestCaseWithTransport, TestCase
20
20
from bzrlib.workingtree import WorkingTree
21
21
 
22
22
 
531
531
            self.assert_(os.lstat(builder.this.full_path("3")).st_mode &0100 == 0000)
532
532
        builder.cleanup();
533
533
 
534
 
 
535
 
class FunctionalMergeTest(TestCaseInTempDir):
 
534
    def test_new_suffix(self):
 
535
        for merge_type in ApplyMerge3, Diff3Merge:
 
536
            builder = MergeBuilder()
 
537
            builder.add_file("1", "0", "name1", "text1", 0755)
 
538
            builder.change_contents("1", other="text3")
 
539
            builder.add_file("2", "0", "name1.new", "text2", 0777)
 
540
            cset = builder.merge_changeset(ApplyMerge3)
 
541
            os.lstat(builder.this.full_path("2"))
 
542
            builder.apply_changeset(cset)
 
543
            os.lstat(builder.this.full_path("2"))
 
544
            builder.cleanup()
 
545
 
 
546
 
 
547
class FunctionalMergeTest(TestCaseWithTransport):
536
548
 
537
549
    def test_trivial_star_merge(self):
538
550
        """Test that merges in a star shape Just Work.""" 
539
 
        from bzrlib.add import smart_add_tree
540
 
        from bzrlib.clone import copy_branch
541
 
        from bzrlib.merge import merge
542
551
        # John starts a branch
543
552
        self.build_tree(("original/", "original/file1", "original/file2"))
544
 
        branch = Branch.initialize("original")
545
 
        tree = WorkingTree('original', branch)
 
553
        tree = WorkingTree.create_standalone('original')
 
554
        branch = tree.branch
546
555
        smart_add_tree(tree, ["original"])
547
556
        tree.commit("start branch.", verbose=False)
548
557
        # Mary branches it.
549
558
        self.build_tree(("mary/",))
550
 
        copy_branch(branch, "mary")
 
559
        branch.clone("mary")
551
560
        # Now John commits a change
552
561
        file = open("original/file1", "wt")
553
562
        file.write("John\n")
554
563
        file.close()
555
 
        branch.working_tree().commit("change file1")
 
564
        tree.commit("change file1")
556
565
        # Mary does too
557
566
        mary_branch = Branch.open("mary")
558
567
        file = open("mary/file2", "wt")
573
582
 
574
583
    def test_conflicts(self):
575
584
        os.mkdir('a')
576
 
        a = Branch.initialize('a')
 
585
        wta = WorkingTree.create_standalone('a')
 
586
        a = wta.branch
577
587
        file('a/file', 'wb').write('contents\n')
578
 
        a.working_tree().add('file')
579
 
        a.working_tree().commit('base revision', allow_pointless=False)
580
 
        b = copy_branch(a, 'b')
 
588
        wta.add('file')
 
589
        wta.commit('base revision', allow_pointless=False)
 
590
        b = a.clone('b')
581
591
        file('a/file', 'wb').write('other contents\n')
582
 
        a.working_tree().commit('other revision', allow_pointless=False)
 
592
        wta.commit('other revision', allow_pointless=False)
583
593
        file('b/file', 'wb').write('this contents contents\n')
584
594
        b.working_tree().commit('this revision', allow_pointless=False)
585
595
        self.assertEqual(merge(['a', -1], [None, None], this_dir='b'), 1)
589
599
        self.assertRaises(WorkingTreeNotRevision, merge, ['a', -1], 
590
600
                          [None, None], this_dir='b', check_clean=False,
591
601
                          merge_type=WeaveMerge)
592
 
        merge(['b', -1], ['b', None], this_dir='b', check_clean=False)
 
602
        b.working_tree().revert([])
593
603
        os.unlink('b/file.THIS')
594
604
        os.unlink('b/file.OTHER')
595
605
        os.unlink('b/file.BASE')
602
612
 
603
613
    def test_merge_unrelated(self):
604
614
        """Sucessfully merges unrelated branches with no common names"""
605
 
        os.mkdir('a')
606
 
        a = Branch.initialize('a')
 
615
        wta = self.make_branch_and_tree('a')
 
616
        a = wta.branch
607
617
        file('a/a_file', 'wb').write('contents\n')
608
 
        a.working_tree().add('a_file')
609
 
        a.working_tree().commit('a_revision', allow_pointless=False)
610
 
        os.mkdir('b')
611
 
        b = Branch.initialize('b')
 
618
        wta.add('a_file')
 
619
        wta.commit('a_revision', allow_pointless=False)
 
620
        wtb = self.make_branch_and_tree('b')
 
621
        b = wtb.branch
612
622
        file('b/b_file', 'wb').write('contents\n')
613
 
        b.working_tree().add('b_file')
614
 
        b.working_tree().commit('b_revision', allow_pointless=False)
 
623
        wtb.add('b_file')
 
624
        wtb.commit('b_revision', allow_pointless=False)
615
625
        merge(['b', -1], ['b', 0], this_dir='a')
616
626
        self.assert_(os.path.lexists('a/b_file'))
617
 
        self.assertEqual(a.working_tree().pending_merges(),
 
627
        self.assertEqual(wta.pending_merges(),
618
628
                         [b.last_revision()]) 
619
629
 
620
630
    def test_merge_unrelated_conflicting(self):
621
631
        """Sucessfully merges unrelated branches with common names"""
622
 
        os.mkdir('a')
623
 
        a = Branch.initialize('a')
 
632
        wta = self.make_branch_and_tree('a')
 
633
        a = wta.branch
624
634
        file('a/file', 'wb').write('contents\n')
625
 
        a.working_tree().add('file')
626
 
        a.working_tree().commit('a_revision', allow_pointless=False)
627
 
        os.mkdir('b')
628
 
        b = Branch.initialize('b')
 
635
        wta.add('file')
 
636
        wta.commit('a_revision', allow_pointless=False)
 
637
        wtb = self.make_branch_and_tree('b')
 
638
        b = wtb.branch
629
639
        file('b/file', 'wb').write('contents\n')
630
 
        b.working_tree().add('file')
631
 
        b.working_tree().commit('b_revision', allow_pointless=False)
 
640
        wtb.add('file')
 
641
        wtb.commit('b_revision', allow_pointless=False)
632
642
        merge(['b', -1], ['b', 0], this_dir='a')
633
643
        self.assert_(os.path.lexists('a/file'))
634
644
        self.assert_(os.path.lexists('a/file.moved'))
635
 
        self.assertEqual(a.working_tree().pending_merges(), [b.last_revision()])
 
645
        self.assertEqual(wta.pending_merges(), [b.last_revision()])
636
646
 
637
647
    def test_merge_deleted_conflicts(self):
638
 
        os.mkdir('a')
639
 
        a = Branch.initialize('a')
 
648
        wta = self.make_branch_and_tree('a')
640
649
        file('a/file', 'wb').write('contents\n')
641
 
        a.working_tree().add('file')
642
 
        a.working_tree().commit('a_revision', allow_pointless=False)
643
 
        del a
 
650
        wta.add('file')
 
651
        wta.commit('a_revision', allow_pointless=False)
644
652
        self.run_bzr('branch', 'a', 'b')
645
 
        a = Branch.open('a')
646
653
        os.remove('a/file')
647
 
        a.working_tree().commit('removed file', allow_pointless=False)
 
654
        wta.commit('removed file', allow_pointless=False)
648
655
        file('b/file', 'wb').write('changed contents\n')
649
 
        b = Branch.open('b')
650
 
        b.working_tree().commit('changed file', allow_pointless=False)
 
656
        wtb = WorkingTree('b')
 
657
        wtb.commit('changed file', allow_pointless=False)
651
658
        merge(['a', -1], ['a', 1], this_dir='b')
652
659
        self.failIf(os.path.lexists('b/file'))
653
660
 
654
661
    def test_merge_metadata_vs_deletion(self):
655
662
        """Conflict deletion vs metadata change"""
656
 
        os.mkdir('a')
657
 
        a = Branch.initialize('a')
 
663
        a_wt = self.make_branch_and_tree('a')
658
664
        file('a/file', 'wb').write('contents\n')
659
 
        a_wt = a.working_tree()
660
665
        a_wt.add('file')
661
666
        a_wt.commit('r0')
662
 
        copy_branch(a, 'b')
663
 
        b = Branch.open('b')
664
 
        b_wt = b.working_tree()
 
667
        self.run_bzr('branch', 'a', 'b')
 
668
        b_wt = WorkingTree('b')
665
669
        os.chmod('b/file', 0755)
666
670
        os.remove('a/file')
667
671
        a_wt.commit('removed a')
668
 
        self.assertEqual(a.revno(), 2)
 
672
        self.assertEqual(a_wt.branch.revno(), 2)
669
673
        self.assertFalse(os.path.exists('a/file'))
670
674
        b_wt.commit('exec a')
671
675
        merge(['b', -1], ['b', 0], this_dir='a')
672
676
        self.assert_(os.path.exists('a/file'))
673
677
 
674
678
    def test_merge_swapping_renames(self):
675
 
        os.mkdir('a')
676
 
        a = Branch.initialize('a')
 
679
        a_wt = self.make_branch_and_tree('a')
677
680
        file('a/un','wb').write('UN')
678
681
        file('a/deux','wb').write('DEUX')
679
 
        a_wt = a.working_tree()
680
682
        a_wt.add('un')
681
683
        a_wt.add('deux')
682
684
        a_wt.commit('r0')
683
 
        copy_branch(a,'b')
684
 
        b = Branch.open('b')
685
 
        b_wt = b.working_tree()
 
685
        self.run_bzr('branch', 'a', 'b')
 
686
        b_wt = WorkingTree('b')
686
687
        b_wt.rename_one('un','tmp')
687
688
        b_wt.rename_one('deux','un')
688
689
        b_wt.rename_one('tmp','deux')
695
696
        self.assertEqual(file('a/deux').read(),'UN')
696
697
 
697
698
    def test_merge_delete_and_add_same(self):
698
 
        os.mkdir('a')
699
 
        a = Branch.initialize('a')
 
699
        a_wt = self.make_branch_and_tree('a')
700
700
        file('a/file', 'wb').write('THIS')
701
 
        a_wt = a.working_tree()
702
701
        a_wt.add('file')
703
702
        a_wt.commit('r0')
704
 
        copy_branch(a, 'b')
705
 
        b = Branch.open('b')
706
 
        b_wt = b.working_tree()
 
703
        self.run_bzr('branch', 'a', 'b')
 
704
        b_wt = WorkingTree('b')
707
705
        os.remove('b/file')
708
706
        b_wt.commit('r1')
709
707
        file('b/file', 'wb').write('THAT')
727
725
        $ bzr add foo
728
726
        $ bzr commit
729
727
        """
730
 
        os.mkdir('a')
731
 
        a = Branch.initialize('a')
 
728
        a_wt = self.make_branch_and_tree('a')
732
729
        file('a/foo', 'wb').write('A/FOO')
733
 
        a_wt = a.working_tree()
734
730
        a_wt.add('foo')
735
731
        a_wt.commit('added foo')
736
 
        copy_branch(a, 'b')
737
 
        b = Branch.open('b')
738
 
        b_wt = b.working_tree()
 
732
        self.run_bzr('branch', 'a', 'b')
 
733
        b_wt = WorkingTree('b')
739
734
        b_wt.rename_one('foo', 'bar')
740
735
        file('b/foo', 'wb').write('B/FOO')
741
736
        b_wt.add('foo')
758
753
        $ bzr commit
759
754
        """
760
755
        os.mkdir('a')
761
 
        a = Branch.initialize('a')
 
756
        a_wt = self.make_branch_and_tree('a')
762
757
        file('a/foo', 'wb').write('A/FOO')
763
 
        a_wt = a.working_tree()
764
758
        a_wt.add('foo')
765
759
        a_wt.commit('added foo')
766
 
        copy_branch(a, 'b')
767
 
        b = Branch.open('b')
768
 
        b_wt = b.working_tree()
 
760
        self.run_bzr('branch', 'a', 'b')
 
761
        b_wt = WorkingTree('b')
769
762
        os.mkdir('b/bar')
770
763
        b_wt.add('bar')
771
764
        b_wt.rename_one('foo', 'bar/foo')
787
780
        $ rmdir foo
788
781
        $ bzr commit
789
782
        """
790
 
        os.mkdir('a')
791
 
        a = Branch.initialize('a')
 
783
        a_wt = self.make_branch_and_tree('a')
792
784
        os.mkdir('a/foo')
793
785
        file('a/foo/bar', 'wb').write('A/FOO/BAR')
794
 
        a_wt = a.working_tree()
795
786
        a_wt.add('foo')
796
787
        a_wt.add('foo/bar')
797
788
        a_wt.commit('added foo/bar')
798
 
        copy_branch(a, 'b')
799
 
        b = Branch.open('b')
800
 
        b_wt = b.working_tree()
 
789
        self.run_bzr('branch', 'a', 'b')
 
790
        b_wt = WorkingTree('b')
801
791
        b_wt.rename_one('foo/bar', 'bar')
802
792
        os.rmdir('b/foo')
803
793
        b_wt.remove('foo')
819
809
        $ bzr mv bar foo
820
810
        $ bzr commit
821
811
        """
822
 
        os.mkdir('a')
823
 
        a = Branch.initialize('a')
 
812
        a_wt = self.make_branch_and_tree('a')
824
813
        file('a/foo', 'wb').write('A/FOO')
825
814
        file('a/bar', 'wb').write('A/BAR')
826
 
        a_wt = a.working_tree()
827
815
        a_wt.add('foo')
828
816
        a_wt.add('bar')
829
817
        a_wt.commit('added foo and bar')
830
 
        copy_branch(a, 'b')
831
 
        b = Branch.open('b')
832
 
        b_wt = b.working_tree()
 
818
        self.run_bzr('branch', 'a', 'b')
 
819
        b_wt = WorkingTree('b')
833
820
        os.unlink('b/foo')
834
821
        b_wt.remove('foo')
835
822
        b_wt.rename_one('bar', 'foo')