~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_merge.py

(gz) Remove bzrlib/util/elementtree/ package (Martin Packman)

Show diffs side-by-side

added added

removed removed

Lines of Context:
37
37
from bzrlib.merge import transform_tree, merge_inner, _PlanMerge
38
38
from bzrlib.osutils import basename, pathjoin, file_kind
39
39
from bzrlib.tests import (
 
40
    features,
40
41
    TestCaseWithMemoryTransport,
41
42
    TestCaseWithTransport,
42
43
    test_merge_core,
121
122
        finally:
122
123
            wt1.unlock()
123
124
 
 
125
    def test_merge_into_null_tree(self):
 
126
        wt = self.make_branch_and_tree('tree')
 
127
        null_tree = wt.basis_tree()
 
128
        self.build_tree(['tree/file'])
 
129
        wt.add('file')
 
130
        wt.commit('tree with root')
 
131
        merger = _mod_merge.Merge3Merger(null_tree, null_tree, null_tree, wt,
 
132
                                         this_branch=wt.branch,
 
133
                                         do_merge=False)
 
134
        with merger.make_preview_transform() as tt:
 
135
            self.assertEqual([], tt.find_conflicts())
 
136
            preview = tt.get_preview_tree()
 
137
            self.assertEqual(wt.get_root_id(), preview.get_root_id())
 
138
 
 
139
    def test_merge_unrelated_retains_root(self):
 
140
        wt = self.make_branch_and_tree('tree')
 
141
        other_tree = self.make_branch_and_tree('other')
 
142
        self.addCleanup(other_tree.lock_read().unlock)
 
143
        merger = _mod_merge.Merge3Merger(wt, wt, wt.basis_tree(), other_tree,
 
144
                                         this_branch=wt.branch,
 
145
                                         do_merge=False)
 
146
        with transform.TransformPreview(wt) as merger.tt:
 
147
            merger._compute_transform()
 
148
            new_root_id = merger.tt.final_file_id(merger.tt.root)
 
149
            self.assertEqual(wt.get_root_id(), new_root_id)
 
150
 
124
151
    def test_create_rename(self):
125
152
        """Rename an inventory entry while creating the file"""
126
153
        tree =self.make_branch_and_tree('.')
387
414
                             '>>>>>>> MERGE-SOURCE\n',
388
415
                             'this/file')
389
416
 
 
417
    def test_merge_reverse_revision_range(self):
 
418
        tree = self.make_branch_and_tree(".")
 
419
        tree.lock_write()
 
420
        self.addCleanup(tree.unlock)
 
421
        self.build_tree(['a'])
 
422
        tree.add('a')
 
423
        first_rev = tree.commit("added a")
 
424
        merger = _mod_merge.Merger.from_revision_ids(None, tree,
 
425
                                          _mod_revision.NULL_REVISION,
 
426
                                          first_rev)
 
427
        merger.merge_type = _mod_merge.Merge3Merger
 
428
        merger.interesting_files = 'a'
 
429
        conflict_count = merger.do_merge()
 
430
        self.assertEqual(0, conflict_count)
 
431
 
 
432
        self.assertPathDoesNotExist("a")
 
433
        tree.revert()
 
434
        self.assertPathExists("a")
 
435
 
390
436
    def test_make_merger(self):
391
437
        this_tree = self.make_branch_and_tree('this')
392
438
        this_tree.commit('rev1', rev_id='rev1')
400
446
        merger.merge_type = _mod_merge.Merge3Merger
401
447
        tree_merger = merger.make_merger()
402
448
        self.assertIs(_mod_merge.Merge3Merger, tree_merger.__class__)
403
 
        self.assertEqual('rev2b', tree_merger.other_tree.get_revision_id())
404
 
        self.assertEqual('rev1', tree_merger.base_tree.get_revision_id())
 
449
        self.assertEqual('rev2b',
 
450
            tree_merger.other_tree.get_revision_id())
 
451
        self.assertEqual('rev1',
 
452
            tree_merger.base_tree.get_revision_id())
 
453
        self.assertEqual(other_tree.branch, tree_merger.other_branch)
405
454
 
406
455
    def test_make_preview_transform(self):
407
456
        this_tree = self.make_branch_and_tree('this')
456
505
        finally:
457
506
            tree_file.close()
458
507
 
 
508
    def test_merge_require_tree_root(self):
 
509
        tree = self.make_branch_and_tree(".")
 
510
        tree.lock_write()
 
511
        self.addCleanup(tree.unlock)
 
512
        self.build_tree(['a'])
 
513
        tree.add('a')
 
514
        first_rev = tree.commit("added a")
 
515
        old_root_id = tree.get_root_id()
 
516
        merger = _mod_merge.Merger.from_revision_ids(None, tree,
 
517
                                          _mod_revision.NULL_REVISION,
 
518
                                          first_rev)
 
519
        merger.merge_type = _mod_merge.Merge3Merger
 
520
        conflict_count = merger.do_merge()
 
521
        self.assertEqual(0, conflict_count)
 
522
        self.assertEquals(set([old_root_id]), tree.all_file_ids())
 
523
        tree.set_parent_ids([])
 
524
 
459
525
    def test_merge_add_into_deleted_root(self):
460
526
        # Yes, people actually do this.  And report bugs if it breaks.
461
527
        source = self.make_branch_and_tree('source', format='rich-root-pack')
1827
1893
        builder.build_snapshot('C-id', ['A-id'], [])
1828
1894
        builder.build_snapshot('E-id', ['C-id', 'B-id'],
1829
1895
            [('unversion', 'a-id'),
 
1896
             ('flush', None),
1830
1897
             ('add', (u'a', 'a-id', 'directory', None))])
1831
1898
        builder.build_snapshot('D-id', ['B-id', 'C-id'], [])
1832
1899
        merge_obj = self.make_merge_obj(builder, 'E-id')
1850
1917
        builder.build_snapshot('E-id', ['C-id', 'B-id'], [])
1851
1918
        builder.build_snapshot('D-id', ['B-id', 'C-id'],
1852
1919
            [('unversion', 'a-id'),
 
1920
             ('flush', None),
1853
1921
             ('add', (u'a', 'a-id', 'directory', None))])
1854
1922
        merge_obj = self.make_merge_obj(builder, 'E-id')
1855
1923
        entries = list(merge_obj._entries_lca())
2118
2186
        self.assertTrue(wt.is_executable('foo-id'))
2119
2187
 
2120
2188
    def test_create_symlink(self):
2121
 
        self.requireFeature(tests.SymlinkFeature)
 
2189
        self.requireFeature(features.SymlinkFeature)
2122
2190
        #   A
2123
2191
        #  / \
2124
2192
        # B   C
2183
2251
                             wt.get_file_text('foo-id'))
2184
2252
 
2185
2253
    def test_modified_symlink(self):
2186
 
        self.requireFeature(tests.SymlinkFeature)
 
2254
        self.requireFeature(features.SymlinkFeature)
2187
2255
        #   A       Create symlink foo => bar
2188
2256
        #  / \
2189
2257
        # B   C     B relinks foo => baz
2228
2296
        self.assertEqual('bing', wt.get_symlink_target('foo-id'))
2229
2297
 
2230
2298
    def test_renamed_symlink(self):
2231
 
        self.requireFeature(tests.SymlinkFeature)
 
2299
        self.requireFeature(features.SymlinkFeature)
2232
2300
        #   A       Create symlink foo => bar
2233
2301
        #  / \
2234
2302
        # B   C     B renames foo => barry
2284
2352
        self.assertEqual('blah', wt.id2path('foo-id'))
2285
2353
 
2286
2354
    def test_symlink_no_content_change(self):
2287
 
        self.requireFeature(tests.SymlinkFeature)
 
2355
        self.requireFeature(features.SymlinkFeature)
2288
2356
        #   A       Create symlink foo => bar
2289
2357
        #  / \
2290
2358
        # B   C     B relinks foo => baz
2335
2403
        self.assertEqual('bing', wt.get_symlink_target('foo-id'))
2336
2404
 
2337
2405
    def test_symlink_this_changed_kind(self):
2338
 
        self.requireFeature(tests.SymlinkFeature)
 
2406
        self.requireFeature(features.SymlinkFeature)
2339
2407
        #   A       Nothing
2340
2408
        #  / \
2341
2409
        # B   C     B creates symlink foo => bar
2388
2456
 
2389
2457
    def test_symlink_all_wt(self):
2390
2458
        """Check behavior if all trees are Working Trees."""
2391
 
        self.requireFeature(tests.SymlinkFeature)
 
2459
        self.requireFeature(features.SymlinkFeature)
2392
2460
        # The big issue is that entry.symlink_target is None for WorkingTrees.
2393
2461
        # So we need to make sure we handle that case correctly.
2394
2462
        #   A   foo => bar
3177
3245
        # The dest tree is unmodified.
3178
3246
        self.assertEqual(['r1-dest'], dest_wt.get_parent_ids())
3179
3247
        self.assertTreeEntriesEqual([('', 'dest-root-id')], dest_wt)
 
3248
 
 
3249
 
 
3250
class TestMergeHooks(TestCaseWithTransport):
 
3251
 
 
3252
    def setUp(self):
 
3253
        super(TestMergeHooks, self).setUp()
 
3254
        self.tree_a = self.make_branch_and_tree('tree_a')
 
3255
        self.build_tree_contents([('tree_a/file', 'content_1')])
 
3256
        self.tree_a.add('file', 'file-id')
 
3257
        self.tree_a.commit('added file')
 
3258
 
 
3259
        self.tree_b = self.tree_a.bzrdir.sprout('tree_b').open_workingtree()
 
3260
        self.build_tree_contents([('tree_b/file', 'content_2')])
 
3261
        self.tree_b.commit('modify file')
 
3262
 
 
3263
    def test_pre_merge_hook_inject_different_tree(self):
 
3264
        tree_c = self.tree_b.bzrdir.sprout('tree_c').open_workingtree()
 
3265
        self.build_tree_contents([('tree_c/file', 'content_3')])
 
3266
        tree_c.commit("more content")
 
3267
        calls = []
 
3268
        def factory(merger):
 
3269
            self.assertIsInstance(merger, _mod_merge.Merge3Merger)
 
3270
            merger.other_tree = tree_c
 
3271
            calls.append(merger)
 
3272
        _mod_merge.Merger.hooks.install_named_hook('pre_merge',
 
3273
                                                   factory, 'test factory')
 
3274
        self.tree_a.merge_from_branch(self.tree_b.branch)
 
3275
 
 
3276
        self.assertFileEqual("content_3", 'tree_a/file')
 
3277
        self.assertLength(1, calls)
 
3278
 
 
3279
    def test_post_merge_hook_called(self):
 
3280
        calls = []
 
3281
        def factory(merger):
 
3282
            self.assertIsInstance(merger, _mod_merge.Merge3Merger)
 
3283
            calls.append(merger)
 
3284
        _mod_merge.Merger.hooks.install_named_hook('post_merge',
 
3285
                                                   factory, 'test factory')
 
3286
 
 
3287
        self.tree_a.merge_from_branch(self.tree_b.branch)
 
3288
 
 
3289
        self.assertFileEqual("content_2", 'tree_a/file')
 
3290
        self.assertLength(1, calls)