~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_merge.py

  • Committer: Martin Pool
  • Date: 2009-07-27 06:28:35 UTC
  • mto: This revision was merged to the branch mainline in revision 4587.
  • Revision ID: mbp@sourcefrog.net-20090727062835-o66p8it658tq1sma
Add CountedLock.get_physical_lock_status

Show diffs side-by-side

added added

removed removed

Lines of Context:
12
12
#
13
13
# You should have received a copy of the GNU General Public License
14
14
# along with this program; if not, write to the Free Software
15
 
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
16
 
17
17
import os
18
18
from StringIO import StringIO
35
35
from bzrlib.merge import transform_tree, merge_inner, _PlanMerge
36
36
from bzrlib.osutils import pathjoin, file_kind
37
37
from bzrlib.tests import TestCaseWithTransport, TestCaseWithMemoryTransport
38
 
from bzrlib.trace import (enable_test_log, disable_test_log)
39
38
from bzrlib.workingtree import WorkingTree
40
39
 
41
40
 
89
88
        self.failIfExists('bar')
90
89
        wt2 = WorkingTree.open('.') # opens branch2
91
90
        self.assertEqual([tip], wt2.get_parent_ids())
92
 
        
 
91
 
93
92
    def test_pending_with_null(self):
94
93
        """When base is forced to revno 0, parent_ids are set"""
95
94
        wt2 = self.test_unrelated()
96
95
        wt1 = WorkingTree.open('.')
97
96
        br1 = wt1.branch
98
97
        br1.fetch(wt2.branch)
99
 
        # merge all of branch 2 into branch 1 even though they 
 
98
        # merge all of branch 2 into branch 1 even though they
100
99
        # are not related.
101
100
        wt1.merge_from_branch(wt2.branch, wt2.last_revision(), 'null:')
102
101
        self.assertEqual([br1.last_revision(), wt2.branch.last_revision()],
150
149
        self.addCleanup(tree_b.unlock)
151
150
        tree_a.commit(message="hello again")
152
151
        log = StringIO()
153
 
        merge_inner(tree_b.branch, tree_a, tree_b.basis_tree(), 
 
152
        merge_inner(tree_b.branch, tree_a, tree_b.basis_tree(),
154
153
                    this_tree=tree_b, ignore_zero=True)
155
154
        log = self._get_log(keep_log_file=True)
156
155
        self.failUnless('All changes applied successfully.\n' not in log)
157
156
        tree_b.revert()
158
 
        merge_inner(tree_b.branch, tree_a, tree_b.basis_tree(), 
 
157
        merge_inner(tree_b.branch, tree_a, tree_b.basis_tree(),
159
158
                    this_tree=tree_b, ignore_zero=False)
160
159
        log = self._get_log(keep_log_file=True)
161
160
        self.failUnless('All changes applied successfully.\n' in log)
248
247
        self.assertEqual(tree_b.conflicts(),
249
248
                         [conflicts.ContentsConflict('file',
250
249
                          file_id='file-id')])
251
 
    
 
250
 
252
251
    def test_merge_type_registry(self):
253
252
        merge_type_option = option.Option.OPTIONS['merge-type']
254
 
        self.assertFalse('merge4' in [x[0] for x in 
 
253
        self.assertFalse('merge4' in [x[0] for x in
255
254
                        merge_type_option.iter_switches()])
256
255
        registry = _mod_merge.get_merge_type_registry()
257
256
        registry.register_lazy('merge4', 'bzrlib.merge', 'Merge4Merger',
258
257
                               'time-travelling merge')
259
 
        self.assertTrue('merge4' in [x[0] for x in 
 
258
        self.assertTrue('merge4' in [x[0] for x in
260
259
                        merge_type_option.iter_switches()])
261
260
        registry.remove('merge4')
262
 
        self.assertFalse('merge4' in [x[0] for x in 
 
261
        self.assertFalse('merge4' in [x[0] for x in
263
262
                        merge_type_option.iter_switches()])
264
263
 
265
264
    def test_merge_other_moves_we_deleted(self):
313
312
        merger.do_merge()
314
313
        self.assertEqual(tree_a.get_parent_ids(), [tree_b.last_revision()])
315
314
 
 
315
    def test_Merger_defaults_to_DummyProgress(self):
 
316
        branch = self.make_branch('branch')
 
317
        merger = _mod_merge.Merger(branch, pb=None)
 
318
        self.assertIsInstance(merger._pb, progress.DummyProgress)
 
319
 
316
320
    def prepare_cherrypick(self):
317
321
        """Prepare a pair of trees for cherrypicking tests.
318
322
 
718
722
 
719
723
    def test_plan_merge_insert_order(self):
720
724
        """Weave merges are sensitive to the order of insertion.
721
 
        
 
725
 
722
726
        Specifically for overlapping regions, it effects which region gets put
723
727
        'first'. And when a user resolves an overlapping merge, if they use the
724
728
        same ordering, then the lines match the parents, if they don't only
1091
1095
            '>>>>>>> MERGE-SOURCE\n'
1092
1096
            'line 4\n', 'this/file1')
1093
1097
 
 
1098
    def test_modify_conflicts_with_delete(self):
 
1099
        # If one side deletes a line, and the other modifies that line, then
 
1100
        # the modification should be considered a conflict
 
1101
        builder = self.make_branch_builder('test')
 
1102
        builder.start_series()
 
1103
        builder.build_snapshot('BASE-id', None,
 
1104
            [('add', ('', None, 'directory', None)),
 
1105
             ('add', ('foo', 'foo-id', 'file', 'a\nb\nc\nd\ne\n')),
 
1106
            ])
 
1107
        # Delete 'b\n'
 
1108
        builder.build_snapshot('OTHER-id', ['BASE-id'],
 
1109
            [('modify', ('foo-id', 'a\nc\nd\ne\n'))])
 
1110
        # Modify 'b\n', add 'X\n'
 
1111
        builder.build_snapshot('THIS-id', ['BASE-id'],
 
1112
            [('modify', ('foo-id', 'a\nb2\nc\nd\nX\ne\n'))])
 
1113
        builder.finish_series()
 
1114
        branch = builder.get_branch()
 
1115
        this_tree = branch.bzrdir.create_workingtree()
 
1116
        this_tree.lock_write()
 
1117
        self.addCleanup(this_tree.unlock)
 
1118
        other_tree = this_tree.bzrdir.sprout('other', 'OTHER-id').open_workingtree()
 
1119
        self.do_merge(this_tree, other_tree)
 
1120
        if self.merge_type is _mod_merge.LCAMerger:
 
1121
            self.expectFailure("lca merge doesn't track deleted lines",
 
1122
                self.assertFileEqual,
 
1123
                    'a\n'
 
1124
                    '<<<<<<< TREE\n'
 
1125
                    'b2\n'
 
1126
                    '=======\n'
 
1127
                    '>>>>>>> MERGE-SOURCE\n'
 
1128
                    'c\n'
 
1129
                    'd\n'
 
1130
                    'X\n'
 
1131
                    'e\n', 'test/foo')
 
1132
        else:
 
1133
            self.assertFileEqual(
 
1134
                'a\n'
 
1135
                '<<<<<<< TREE\n'
 
1136
                'b2\n'
 
1137
                '=======\n'
 
1138
                '>>>>>>> MERGE-SOURCE\n'
 
1139
                'c\n'
 
1140
                'd\n'
 
1141
                'X\n'
 
1142
                'e\n', 'test/foo')
 
1143
 
1094
1144
 
1095
1145
class TestMerge3Merge(TestCaseWithTransport, TestMergeImplementation):
1096
1146