~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_merge.py

  • Committer: Andrew Bennetts
  • Date: 2010-08-17 06:45:33 UTC
  • mfrom: (5050.17.9 2.2)
  • mto: This revision was merged to the branch mainline in revision 5379.
  • Revision ID: andrew.bennetts@canonical.com-20100817064533-kof2i2f3r6mr4ayb
Merge lp:bzr/2.2 into lp:bzr, including fixes for #192859, #224373, #300062, #585667, #614404, #617503.

Show diffs side-by-side

added added

removed removed

Lines of Context:
90
90
        os.chdir('branch2')
91
91
        self.run_bzr('merge ../branch1/baz', retcode=3)
92
92
        self.run_bzr('merge ../branch1/foo')
93
 
        self.assertPathExists('foo')
94
 
        self.assertPathDoesNotExist('bar')
 
93
        self.failUnlessExists('foo')
 
94
        self.failIfExists('bar')
95
95
        wt2 = WorkingTree.open('.') # opens branch2
96
96
        self.assertEqual([tip], wt2.get_parent_ids())
97
97
 
121
121
        finally:
122
122
            wt1.unlock()
123
123
 
124
 
    def test_merge_into_null_tree(self):
125
 
        wt = self.make_branch_and_tree('tree')
126
 
        null_tree = wt.basis_tree()
127
 
        self.build_tree(['tree/file'])
128
 
        wt.add('file')
129
 
        wt.commit('tree with root')
130
 
        merger = _mod_merge.Merge3Merger(null_tree, null_tree, null_tree, wt,
131
 
                                         this_branch=wt.branch,
132
 
                                         do_merge=False)
133
 
        with merger.make_preview_transform() as tt:
134
 
            self.assertEqual([], tt.find_conflicts())
135
 
            preview = tt.get_preview_tree()
136
 
            self.assertEqual(wt.get_root_id(), preview.get_root_id())
137
 
 
138
 
    def test_merge_unrelated_retains_root(self):
139
 
        wt = self.make_branch_and_tree('tree')
140
 
        root_id_before_merge = wt.get_root_id()
141
 
        other_tree = self.make_branch_and_tree('other')
142
 
        # Do a commit so there is something to merge
143
 
        other_tree.commit('commit other')
144
 
        self.assertNotEquals(root_id_before_merge, other_tree.get_root_id())
145
 
        wt.merge_from_branch(other_tree.branch,
146
 
                             from_revision=_mod_revision.NULL_REVISION)
147
 
        self.assertEqual(root_id_before_merge, wt.get_root_id())
148
 
 
149
 
    def test_merge_preview_unrelated_retains_root(self):
150
 
        wt = self.make_branch_and_tree('tree')
151
 
        other_tree = self.make_branch_and_tree('other')
152
 
        # Do a commit so there is something to merge
153
 
        other_tree.commit('commit other')
154
 
        merger = _mod_merge.Merge3Merger(wt, wt, wt.basis_tree(), other_tree,
155
 
                                         this_branch=wt.branch,
156
 
                                         do_merge=False)
157
 
        with merger.make_preview_transform() as tt:
158
 
            preview = tt.get_preview_tree()
159
 
            self.assertEqual(wt.get_root_id(), preview.get_root_id())
160
 
 
161
124
    def test_create_rename(self):
162
125
        """Rename an inventory entry while creating the file"""
163
126
        tree =self.make_branch_and_tree('.')
194
157
        log = StringIO()
195
158
        merge_inner(tree_b.branch, tree_a, tree_b.basis_tree(),
196
159
                    this_tree=tree_b, ignore_zero=True)
197
 
        self.assertTrue('All changes applied successfully.\n' not in
 
160
        self.failUnless('All changes applied successfully.\n' not in
198
161
            self.get_log())
199
162
        tree_b.revert()
200
163
        merge_inner(tree_b.branch, tree_a, tree_b.basis_tree(),
201
164
                    this_tree=tree_b, ignore_zero=False)
202
 
        self.assertTrue('All changes applied successfully.\n' in self.get_log())
 
165
        self.failUnless('All changes applied successfully.\n' in self.get_log())
203
166
 
204
167
    def test_merge_inner_conflicts(self):
205
168
        tree_a = self.make_branch_and_tree('a')
424
387
                             '>>>>>>> MERGE-SOURCE\n',
425
388
                             'this/file')
426
389
 
427
 
    def test_merge_reverse_revision_range(self):
428
 
        tree = self.make_branch_and_tree(".")
429
 
        tree.lock_write()
430
 
        self.addCleanup(tree.unlock)
431
 
        self.build_tree(['a'])
432
 
        tree.add('a')
433
 
        tree.commit("added a")
434
 
        first_rev = tree.branch.revision_history()[0]
435
 
        merger = _mod_merge.Merger.from_revision_ids(None, tree,
436
 
                                          _mod_revision.NULL_REVISION,
437
 
                                          first_rev)
438
 
        merger.merge_type = _mod_merge.Merge3Merger
439
 
        merger.interesting_files = 'a'
440
 
        conflict_count = merger.do_merge()
441
 
        self.assertEqual(0, conflict_count)
442
 
 
443
 
        self.assertPathDoesNotExist("a")
444
 
        tree.revert()
445
 
        self.assertPathExists("a")
446
 
 
447
390
    def test_make_merger(self):
448
391
        this_tree = self.make_branch_and_tree('this')
449
392
        this_tree.commit('rev1', rev_id='rev1')
513
456
        finally:
514
457
            tree_file.close()
515
458
 
516
 
    def test_merge_require_tree_root(self):
517
 
        tree = self.make_branch_and_tree(".")
518
 
        tree.lock_write()
519
 
        self.addCleanup(tree.unlock)
520
 
        self.build_tree(['a'])
521
 
        tree.add('a')
522
 
        tree.commit("added a")
523
 
        old_root_id = tree.get_root_id()
524
 
        first_rev = tree.branch.revision_history()[0]
525
 
        merger = _mod_merge.Merger.from_revision_ids(None, tree,
526
 
                                          _mod_revision.NULL_REVISION,
527
 
                                          first_rev)
528
 
        merger.merge_type = _mod_merge.Merge3Merger
529
 
        conflict_count = merger.do_merge()
530
 
        self.assertEqual(0, conflict_count)
531
 
        self.assertEquals(set([old_root_id]), tree.all_file_ids())
532
 
        tree.set_parent_ids([])
533
 
 
534
459
    def test_merge_add_into_deleted_root(self):
535
460
        # Yes, people actually do this.  And report bugs if it breaks.
536
461
        source = self.make_branch_and_tree('source', format='rich-root-pack')
1345
1270
        self.assertEqual(['B-id', 'C-id', 'F-id'],
1346
1271
                         [t.get_revision_id() for t in merger._lca_trees])
1347
1272
 
1348
 
    def test_find_base_new_root_criss_cross(self):
1349
 
        # A   B
1350
 
        # |\ /|
1351
 
        # | X |
1352
 
        # |/ \|
1353
 
        # C   D
1354
 
        
1355
 
        builder = self.get_builder()
1356
 
        builder.build_snapshot('A-id', None,
1357
 
            [('add', ('', None, 'directory', None))])
1358
 
        builder.build_snapshot('B-id', [],
1359
 
            [('add', ('', None, 'directory', None))])
1360
 
        builder.build_snapshot('D-id', ['A-id', 'B-id'], [])
1361
 
        builder.build_snapshot('C-id', ['A-id', 'B-id'], [])
1362
 
        merger = self.make_Merger(builder, 'D-id')
1363
 
        self.assertEqual('A-id', merger.base_rev_id)
1364
 
        self.assertTrue(merger._is_criss_cross)
1365
 
        self.assertEqual(['A-id', 'B-id'], [t.get_revision_id()
1366
 
                                            for t in merger._lca_trees])
1367
 
 
1368
1273
    def test_no_criss_cross_passed_to_merge_type(self):
1369
1274
        class LCATreesMerger(LoggingMerger):
1370
1275
            supports_lca_trees = True
1902
1807
        builder.build_snapshot('C-id', ['A-id'], [])
1903
1808
        builder.build_snapshot('E-id', ['C-id', 'B-id'],
1904
1809
            [('unversion', 'a-id'),
1905
 
             ('flush', None),
1906
1810
             ('add', (u'a', 'a-id', 'directory', None))])
1907
1811
        builder.build_snapshot('D-id', ['B-id', 'C-id'], [])
1908
1812
        merge_obj = self.make_merge_obj(builder, 'E-id')
1926
1830
        builder.build_snapshot('E-id', ['C-id', 'B-id'], [])
1927
1831
        builder.build_snapshot('D-id', ['B-id', 'C-id'],
1928
1832
            [('unversion', 'a-id'),
1929
 
             ('flush', None),
1930
1833
             ('add', (u'a', 'a-id', 'directory', None))])
1931
1834
        merge_obj = self.make_merge_obj(builder, 'E-id')
1932
1835
        entries = list(merge_obj._entries_lca())
2940
2843
 
2941
2844
    def get_merger_factory(self):
2942
2845
        # Allows  the inner methods to access the test attributes
2943
 
        calls = self.calls
 
2846
        test = self
2944
2847
 
2945
2848
        class FooMerger(_mod_merge.ConfigurableFileMerger):
2946
2849
            name_prefix = "foo"
2947
2850
            default_files = ['bar']
2948
2851
 
2949
2852
            def merge_text(self, params):
2950
 
                calls.append('merge_text')
 
2853
                test.calls.append('merge_text')
2951
2854
                return ('not_applicable', None)
2952
2855
 
2953
2856
        def factory(merger):