~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_merge.py

  • Committer: Aaron Bentley
  • Date: 2008-02-24 16:42:13 UTC
  • mfrom: (3234 +trunk)
  • mto: This revision was merged to the branch mainline in revision 3235.
  • Revision ID: aaron@aaronbentley.com-20080224164213-eza1lzru5bwuwmmj
Merge with bzr.dev

Show diffs side-by-side

added added

removed removed

Lines of Context:
24
24
    merge as _mod_merge,
25
25
    option,
26
26
    progress,
 
27
    transform,
27
28
    versionedfile,
28
29
    )
29
30
from bzrlib.branch import Branch
138
139
        tree_a.commit(message="hello")
139
140
        dir_b = tree_a.bzrdir.sprout('b')
140
141
        tree_b = dir_b.open_workingtree()
 
142
        tree_b.lock_write()
 
143
        self.addCleanup(tree_b.unlock)
141
144
        tree_a.commit(message="hello again")
142
145
        log = StringIO()
143
146
        merge_inner(tree_b.branch, tree_a, tree_b.basis_tree(), 
288
291
        merger.do_merge()
289
292
        self.assertEqual(tree_a.get_parent_ids(), [tree_b.last_revision()])
290
293
 
 
294
    def test_merge_uncommitted_otherbasis_ancestor_of_thisbasis_weave(self):
 
295
        tree_a = self.make_branch_and_tree('a')
 
296
        self.build_tree(['a/file_1', 'a/file_2'])
 
297
        tree_a.add(['file_1'])
 
298
        tree_a.commit('commit 1')
 
299
        tree_a.add(['file_2'])
 
300
        tree_a.commit('commit 2')
 
301
        tree_b = tree_a.bzrdir.sprout('b').open_workingtree()
 
302
        tree_b.rename_one('file_1', 'renamed')
 
303
        merger = _mod_merge.Merger.from_uncommitted(tree_a, tree_b,
 
304
                                                    progress.DummyProgress())
 
305
        merger.merge_type = _mod_merge.WeaveMerger
 
306
        merger.do_merge()
 
307
        self.assertEqual(tree_a.get_parent_ids(), [tree_b.last_revision()])
 
308
 
291
309
    def prepare_cherrypick(self):
292
310
        """Prepare a pair of trees for cherrypicking tests.
293
311
 
334
352
        merger.merge_type = _mod_merge.Merge3Merger
335
353
        merger.do_merge()
336
354
 
 
355
    def test_make_merger(self):
 
356
        this_tree = self.make_branch_and_tree('this')
 
357
        this_tree.commit('rev1', rev_id='rev1')
 
358
        other_tree = this_tree.bzrdir.sprout('other').open_workingtree()
 
359
        this_tree.commit('rev2', rev_id='rev2a')
 
360
        other_tree.commit('rev2', rev_id='rev2b')
 
361
        this_tree.lock_write()
 
362
        self.addCleanup(this_tree.unlock)
 
363
        merger = _mod_merge.Merger.from_revision_ids(progress.DummyProgress,
 
364
            this_tree, 'rev2b', other_branch=other_tree.branch)
 
365
        merger.merge_type = _mod_merge.Merge3Merger
 
366
        tree_merger = merger.make_merger()
 
367
        self.assertIs(_mod_merge.Merge3Merger, tree_merger.__class__)
 
368
        self.assertEqual('rev2b', tree_merger.other_tree.get_revision_id())
 
369
        self.assertEqual('rev1', tree_merger.base_tree.get_revision_id())
 
370
 
 
371
    def test_make_preview_transform(self):
 
372
        this_tree = self.make_branch_and_tree('this')
 
373
        self.build_tree_contents([('this/file', '1\n')])
 
374
        this_tree.add('file', 'file-id')
 
375
        this_tree.commit('rev1', rev_id='rev1')
 
376
        other_tree = this_tree.bzrdir.sprout('other').open_workingtree()
 
377
        self.build_tree_contents([('this/file', '1\n2a\n')])
 
378
        this_tree.commit('rev2', rev_id='rev2a')
 
379
        self.build_tree_contents([('other/file', '2b\n1\n')])
 
380
        other_tree.commit('rev2', rev_id='rev2b')
 
381
        this_tree.lock_write()
 
382
        self.addCleanup(this_tree.unlock)
 
383
        merger = _mod_merge.Merger.from_revision_ids(progress.DummyProgress(),
 
384
            this_tree, 'rev2b', other_branch=other_tree.branch)
 
385
        merger.merge_type = _mod_merge.Merge3Merger
 
386
        tree_merger = merger.make_merger()
 
387
        tt = tree_merger.make_preview_transform()
 
388
        self.addCleanup(tt.finalize)
 
389
        preview_tree = tt.get_preview_tree()
 
390
        tree_file = this_tree.get_file('file-id')
 
391
        try:
 
392
            self.assertEqual('1\n2a\n', tree_file.read())
 
393
        finally:
 
394
            tree_file.close()
 
395
        preview_file = preview_tree.get_file('file-id')
 
396
        try:
 
397
            self.assertEqual('2b\n1\n2a\n', preview_file.read())
 
398
        finally:
 
399
            preview_file.close()
 
400
 
 
401
    def test_do_merge(self):
 
402
        this_tree = self.make_branch_and_tree('this')
 
403
        self.build_tree_contents([('this/file', '1\n')])
 
404
        this_tree.add('file', 'file-id')
 
405
        this_tree.commit('rev1', rev_id='rev1')
 
406
        other_tree = this_tree.bzrdir.sprout('other').open_workingtree()
 
407
        self.build_tree_contents([('this/file', '1\n2a\n')])
 
408
        this_tree.commit('rev2', rev_id='rev2a')
 
409
        self.build_tree_contents([('other/file', '2b\n1\n')])
 
410
        other_tree.commit('rev2', rev_id='rev2b')
 
411
        this_tree.lock_write()
 
412
        self.addCleanup(this_tree.unlock)
 
413
        merger = _mod_merge.Merger.from_revision_ids(progress.DummyProgress(),
 
414
            this_tree, 'rev2b', other_branch=other_tree.branch)
 
415
        merger.merge_type = _mod_merge.Merge3Merger
 
416
        tree_merger = merger.make_merger()
 
417
        tt = tree_merger.do_merge()
 
418
        tree_file = this_tree.get_file('file-id')
 
419
        try:
 
420
            self.assertEqual('2b\n1\n2a\n', tree_file.read())
 
421
        finally:
 
422
            tree_file.close()
 
423
 
337
424
 
338
425
class TestPlanMerge(TestCaseWithMemoryTransport):
339
426
 
445
532
        self.assertEqual(subtracted_plan,
446
533
            list(_PlanMerge._subtract_plans(old_plan, new_plan)))
447
534
 
448
 
    def test_plan_merge_with_base(self):
 
535
    def setup_merge_with_base(self):
449
536
        self.add_version('COMMON', [], 'abc')
450
537
        self.add_version('THIS', ['COMMON'], 'abcd')
451
538
        self.add_version('BASE', ['COMMON'], 'eabc')
452
539
        self.add_version('OTHER', ['BASE'], 'eafb')
 
540
 
 
541
    def test_plan_merge_with_base(self):
 
542
        self.setup_merge_with_base()
453
543
        plan = self.plan_merge_vf.plan_merge('THIS', 'OTHER', 'BASE')
454
544
        self.assertEqual([('unchanged', 'a\n'),
455
545
                          ('new-b', 'f\n'),
457
547
                          ('killed-b', 'c\n'),
458
548
                          ('new-a', 'd\n')
459
549
                         ], list(plan))
 
550
 
 
551
    def test_plan_lca_merge(self):
 
552
        self.setup_plan_merge()
 
553
        plan = self.plan_merge_vf.plan_lca_merge('B', 'C')
 
554
        self.assertEqual([
 
555
                          ('new-b', 'f\n'),
 
556
                          ('unchanged', 'a\n'),
 
557
                          ('killed-b', 'c\n'),
 
558
                          ('new-a', 'e\n'),
 
559
                          ('new-a', 'h\n'),
 
560
                          ('killed-a', 'b\n'),
 
561
                          ('unchanged', 'g\n')],
 
562
                         list(plan))
 
563
 
 
564
    def test_plan_lca_merge_uncommitted_files(self):
 
565
        self.setup_plan_merge_uncommitted()
 
566
        plan = self.plan_merge_vf.plan_lca_merge('B:', 'C:')
 
567
        self.assertEqual([
 
568
                          ('new-b', 'f\n'),
 
569
                          ('unchanged', 'a\n'),
 
570
                          ('killed-b', 'c\n'),
 
571
                          ('new-a', 'e\n'),
 
572
                          ('new-a', 'h\n'),
 
573
                          ('killed-a', 'b\n'),
 
574
                          ('unchanged', 'g\n')],
 
575
                         list(plan))
 
576
 
 
577
    def test_plan_lca_merge_with_base(self):
 
578
        self.setup_merge_with_base()
 
579
        plan = self.plan_merge_vf.plan_lca_merge('THIS', 'OTHER', 'BASE')
 
580
        self.assertEqual([('unchanged', 'a\n'),
 
581
                          ('new-b', 'f\n'),
 
582
                          ('unchanged', 'b\n'),
 
583
                          ('killed-b', 'c\n'),
 
584
                          ('new-a', 'd\n')
 
585
                         ], list(plan))
 
586
 
 
587
    def test_plan_lca_merge_with_criss_cross(self):
 
588
        self.add_version('ROOT', [], 'abc')
 
589
        # each side makes a change
 
590
        self.add_version('REV1', ['ROOT'], 'abcd')
 
591
        self.add_version('REV2', ['ROOT'], 'abce')
 
592
        # both sides merge, discarding others' changes
 
593
        self.add_version('LCA1', ['REV1', 'REV2'], 'abcd')
 
594
        self.add_version('LCA2', ['REV1', 'REV2'], 'abce')
 
595
        plan = self.plan_merge_vf.plan_lca_merge('LCA1', 'LCA2')
 
596
        self.assertEqual([('unchanged', 'a\n'),
 
597
                          ('unchanged', 'b\n'),
 
598
                          ('unchanged', 'c\n'),
 
599
                          ('conflicted-a', 'd\n'),
 
600
                          ('conflicted-b', 'e\n'),
 
601
                         ], list(plan))