/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.py

  • Committer: Vincent Ladeuil
  • Date: 2010-01-25 15:55:48 UTC
  • mto: (4985.1.4 add-attr-cleanup)
  • mto: This revision was merged to the branch mainline in revision 4988.
  • Revision ID: v.ladeuil+lp@free.fr-20100125155548-0l352pujvt5bzl5e
Deploy addAttrCleanup on the whole test suite.

Several use case worth mentioning:

- setting a module or any other object attribute is the majority
by far. In some cases the setting itself is deferred but most of
the time we want to set at the same time we add the cleanup.

- there multiple occurrences of protecting hooks or ui factory
which are now useless (the test framework takes care of that now),

- there was some lambda uses that can now be avoided.

That first cleanup already simplifies things a lot.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005-2010 Canonical Ltd
 
1
# Copyright (C) 2005, 2006, 2007 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
33
33
from bzrlib.errors import UnrelatedBranches, NoCommits
34
34
from bzrlib.merge import transform_tree, merge_inner, _PlanMerge
35
35
from bzrlib.osutils import pathjoin, file_kind
36
 
from bzrlib.tests import (
37
 
    TestCaseWithMemoryTransport,
38
 
    TestCaseWithTransport,
39
 
    test_merge_core,
40
 
    )
 
36
from bzrlib.tests import TestCaseWithTransport, TestCaseWithMemoryTransport
41
37
from bzrlib.workingtree import WorkingTree
42
38
 
43
39
 
295
291
        tree_a.commit('commit 2')
296
292
        tree_b = tree_a.bzrdir.sprout('b').open_workingtree()
297
293
        tree_b.rename_one('file_1', 'renamed')
298
 
        merger = _mod_merge.Merger.from_uncommitted(tree_a, tree_b)
 
294
        merger = _mod_merge.Merger.from_uncommitted(tree_a, tree_b,
 
295
                                                    progress.DummyProgress())
299
296
        merger.merge_type = _mod_merge.Merge3Merger
300
297
        merger.do_merge()
301
298
        self.assertEqual(tree_a.get_parent_ids(), [tree_b.last_revision()])
309
306
        tree_a.commit('commit 2')
310
307
        tree_b = tree_a.bzrdir.sprout('b').open_workingtree()
311
308
        tree_b.rename_one('file_1', 'renamed')
312
 
        merger = _mod_merge.Merger.from_uncommitted(tree_a, tree_b)
 
309
        merger = _mod_merge.Merger.from_uncommitted(tree_a, tree_b,
 
310
                                                    progress.DummyProgress())
313
311
        merger.merge_type = _mod_merge.WeaveMerger
314
312
        merger.do_merge()
315
313
        self.assertEqual(tree_a.get_parent_ids(), [tree_b.last_revision()])
316
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
 
317
320
    def prepare_cherrypick(self):
318
321
        """Prepare a pair of trees for cherrypicking tests.
319
322
 
340
343
 
341
344
    def test_weave_cherrypick(self):
342
345
        this_tree, other_tree = self.prepare_cherrypick()
343
 
        merger = _mod_merge.Merger.from_revision_ids(None,
 
346
        merger = _mod_merge.Merger.from_revision_ids(progress.DummyProgress(),
344
347
            this_tree, 'rev3b', 'rev2b', other_tree.branch)
345
348
        merger.merge_type = _mod_merge.WeaveMerger
346
349
        merger.do_merge()
348
351
 
349
352
    def test_weave_cannot_reverse_cherrypick(self):
350
353
        this_tree, other_tree = self.prepare_cherrypick()
351
 
        merger = _mod_merge.Merger.from_revision_ids(None,
 
354
        merger = _mod_merge.Merger.from_revision_ids(progress.DummyProgress(),
352
355
            this_tree, 'rev2b', 'rev3b', other_tree.branch)
353
356
        merger.merge_type = _mod_merge.WeaveMerger
354
357
        self.assertRaises(errors.CannotReverseCherrypick, merger.do_merge)
355
358
 
356
359
    def test_merge3_can_reverse_cherrypick(self):
357
360
        this_tree, other_tree = self.prepare_cherrypick()
358
 
        merger = _mod_merge.Merger.from_revision_ids(None,
 
361
        merger = _mod_merge.Merger.from_revision_ids(progress.DummyProgress(),
359
362
            this_tree, 'rev2b', 'rev3b', other_tree.branch)
360
363
        merger.merge_type = _mod_merge.Merge3Merger
361
364
        merger.do_merge()
373
376
        this_tree.lock_write()
374
377
        self.addCleanup(this_tree.unlock)
375
378
 
376
 
        merger = _mod_merge.Merger.from_revision_ids(None,
 
379
        merger = _mod_merge.Merger.from_revision_ids(progress.DummyProgress(),
377
380
            this_tree, 'rev3b', 'rev2b', other_tree.branch)
378
381
        merger.merge_type = _mod_merge.Merge3Merger
379
382
        merger.do_merge()
392
395
        other_tree.commit('rev2', rev_id='rev2b')
393
396
        this_tree.lock_write()
394
397
        self.addCleanup(this_tree.unlock)
395
 
        merger = _mod_merge.Merger.from_revision_ids(None,
 
398
        merger = _mod_merge.Merger.from_revision_ids(progress.DummyProgress,
396
399
            this_tree, 'rev2b', other_branch=other_tree.branch)
397
400
        merger.merge_type = _mod_merge.Merge3Merger
398
401
        tree_merger = merger.make_merger()
412
415
        other_tree.commit('rev2', rev_id='rev2b')
413
416
        this_tree.lock_write()
414
417
        self.addCleanup(this_tree.unlock)
415
 
        merger = _mod_merge.Merger.from_revision_ids(None,
 
418
        merger = _mod_merge.Merger.from_revision_ids(progress.DummyProgress(),
416
419
            this_tree, 'rev2b', other_branch=other_tree.branch)
417
420
        merger.merge_type = _mod_merge.Merge3Merger
418
421
        tree_merger = merger.make_merger()
442
445
        other_tree.commit('rev2', rev_id='rev2b')
443
446
        this_tree.lock_write()
444
447
        self.addCleanup(this_tree.unlock)
445
 
        merger = _mod_merge.Merger.from_revision_ids(None,
 
448
        merger = _mod_merge.Merger.from_revision_ids(progress.DummyProgress(),
446
449
            this_tree, 'rev2b', other_branch=other_tree.branch)
447
450
        merger.merge_type = _mod_merge.Merge3Merger
448
451
        tree_merger = merger.make_merger()
1198
1201
        mem_tree = memorytree.MemoryTree.create_on_branch(builder.get_branch())
1199
1202
        mem_tree.lock_write()
1200
1203
        self.addCleanup(mem_tree.unlock)
1201
 
        merger = _mod_merge.Merger.from_revision_ids(None,
 
1204
        merger = _mod_merge.Merger.from_revision_ids(progress.DummyProgress(),
1202
1205
            mem_tree, other_revision_id)
1203
1206
        merger.set_interesting_files(interesting_files)
1204
1207
        # It seems there is no matching function for set_interesting_ids
1978
1981
 
1979
1982
    def do_merge(self, builder, other_revision_id):
1980
1983
        wt = self.get_wt_from_builder(builder)
1981
 
        merger = _mod_merge.Merger.from_revision_ids(None,
 
1984
        merger = _mod_merge.Merger.from_revision_ids(progress.DummyProgress(),
1982
1985
            wt, other_revision_id)
1983
1986
        merger.merge_type = _mod_merge.Merge3Merger
1984
1987
        return wt, merger.do_merge()
2244
2247
        wt.commit('D merges B & C', rev_id='D-id')
2245
2248
        self.assertEqual('barry', wt.id2path('foo-id'))
2246
2249
        # Check the output of the Merger object directly
2247
 
        merger = _mod_merge.Merger.from_revision_ids(None,
 
2250
        merger = _mod_merge.Merger.from_revision_ids(progress.DummyProgress(),
2248
2251
            wt, 'F-id')
2249
2252
        merger.merge_type = _mod_merge.Merge3Merger
2250
2253
        merge_obj = merger.make_merger()
2300
2303
        wt.commit('F foo => bing', rev_id='F-id')
2301
2304
 
2302
2305
        # Check the output of the Merger object directly
2303
 
        merger = _mod_merge.Merger.from_revision_ids(None,
 
2306
        merger = _mod_merge.Merger.from_revision_ids(progress.DummyProgress(),
2304
2307
            wt, 'E-id')
2305
2308
        merger.merge_type = _mod_merge.Merge3Merger
2306
2309
        merge_obj = merger.make_merger()
2351
2354
        list(wt.iter_changes(wt.basis_tree()))
2352
2355
        wt.commit('D merges B & C, makes it a file', rev_id='D-id')
2353
2356
 
2354
 
        merger = _mod_merge.Merger.from_revision_ids(None,
 
2357
        merger = _mod_merge.Merger.from_revision_ids(progress.DummyProgress(),
2355
2358
            wt, 'E-id')
2356
2359
        merger.merge_type = _mod_merge.Merge3Merger
2357
2360
        merge_obj = merger.make_merger()
2566
2569
        wt.branch.set_last_revision_info(2, 'B-id')
2567
2570
        wt.commit('D', rev_id='D-id', recursive=None)
2568
2571
 
2569
 
        merger = _mod_merge.Merger.from_revision_ids(None,
 
2572
        merger = _mod_merge.Merger.from_revision_ids(progress.DummyProgress(),
2570
2573
            wt, 'E-id')
2571
2574
        merger.merge_type = _mod_merge.Merge3Merger
2572
2575
        merge_obj = merger.make_merger()
2603
2606
        wt.branch.set_last_revision_info(2, 'B-id')
2604
2607
        wt.commit('D', rev_id='D-id', recursive=None)
2605
2608
 
2606
 
        merger = _mod_merge.Merger.from_revision_ids(None,
 
2609
        merger = _mod_merge.Merger.from_revision_ids(progress.DummyProgress(),
2607
2610
            wt, 'E-id')
2608
2611
        merger.merge_type = _mod_merge.Merge3Merger
2609
2612
        merge_obj = merger.make_merger()
2643
2646
        wt.branch.set_last_revision_info(2, 'B-id')
2644
2647
        wt.commit('D', rev_id='D-id', recursive=None)
2645
2648
 
2646
 
        merger = _mod_merge.Merger.from_revision_ids(None,
 
2649
        merger = _mod_merge.Merger.from_revision_ids(progress.DummyProgress(),
2647
2650
            wt, 'E-id')
2648
2651
        merger.merge_type = _mod_merge.Merge3Merger
2649
2652
        merge_obj = merger.make_merger()
2688
2691
        wt.branch.set_last_revision_info(2, 'B-id')
2689
2692
        wt.commit('D', rev_id='D-id', recursive=None)
2690
2693
 
2691
 
        merger = _mod_merge.Merger.from_revision_ids(None,
 
2694
        merger = _mod_merge.Merger.from_revision_ids(progress.DummyProgress(),
2692
2695
            wt, 'E-id')
2693
2696
        merger.merge_type = _mod_merge.Merge3Merger
2694
2697
        merge_obj = merger.make_merger()
2830
2833
            'bval', ['lca1val', 'lca2val', 'lca2val'], 'oval', 'tval')
2831
2834
        self.assertLCAMultiWay('conflict',
2832
2835
            'bval', ['lca1val', 'lca2val', 'lca3val'], 'oval', 'tval')
2833
 
 
2834
 
 
2835
 
class TestConfigurableFileMerger(tests.TestCaseWithTransport):
2836
 
 
2837
 
    def setUp(self):
2838
 
        super(TestConfigurableFileMerger, self).setUp()
2839
 
        self.calls = []
2840
 
 
2841
 
    def get_merger_factory(self):
2842
 
        # Allows  the inner methods to access the test attributes
2843
 
        test = self
2844
 
 
2845
 
        class FooMerger(_mod_merge.ConfigurableFileMerger):
2846
 
            name_prefix = "foo"
2847
 
            default_files = ['bar']
2848
 
 
2849
 
            def merge_text(self, params):
2850
 
                test.calls.append('merge_text')
2851
 
                return ('not_applicable', None)
2852
 
 
2853
 
        def factory(merger):
2854
 
            result = FooMerger(merger)
2855
 
            # Make sure we start with a clean slate
2856
 
            self.assertEqual(None, result.affected_files)
2857
 
            # Track the original merger
2858
 
            self.merger = result
2859
 
            return result
2860
 
 
2861
 
        return factory
2862
 
 
2863
 
    def _install_hook(self, factory):
2864
 
        _mod_merge.Merger.hooks.install_named_hook('merge_file_content',
2865
 
                                                   factory, 'test factory')
2866
 
 
2867
 
    def make_builder(self):
2868
 
        builder = test_merge_core.MergeBuilder(self.test_base_dir)
2869
 
        self.addCleanup(builder.cleanup)
2870
 
        return builder
2871
 
 
2872
 
    def make_text_conflict(self, file_name='bar'):
2873
 
        factory = self.get_merger_factory()
2874
 
        self._install_hook(factory)
2875
 
        builder = self.make_builder()
2876
 
        builder.add_file('bar-id', builder.tree_root, file_name, 'text1', True)
2877
 
        builder.change_contents('bar-id', other='text4', this='text3')
2878
 
        return builder
2879
 
 
2880
 
    def make_kind_change(self):
2881
 
        factory = self.get_merger_factory()
2882
 
        self._install_hook(factory)
2883
 
        builder = self.make_builder()
2884
 
        builder.add_file('bar-id', builder.tree_root, 'bar', 'text1', True,
2885
 
                         this=False)
2886
 
        builder.add_dir('bar-dir', builder.tree_root, 'bar-id',
2887
 
                        base=False, other=False)
2888
 
        return builder
2889
 
 
2890
 
    def test_uses_this_branch(self):
2891
 
        builder = self.make_text_conflict()
2892
 
        tt = builder.make_preview_transform()
2893
 
        self.addCleanup(tt.finalize)
2894
 
 
2895
 
    def test_affected_files_cached(self):
2896
 
        """Ensures that the config variable is cached"""
2897
 
        builder = self.make_text_conflict()
2898
 
        conflicts = builder.merge()
2899
 
        # The hook should set the variable
2900
 
        self.assertEqual(['bar'], self.merger.affected_files)
2901
 
        self.assertEqual(1, len(conflicts))
2902
 
 
2903
 
    def test_hook_called_for_text_conflicts(self):
2904
 
        builder = self.make_text_conflict()
2905
 
        conflicts = builder.merge()
2906
 
        # The hook should call the merge_text() method
2907
 
        self.assertEqual(['merge_text'], self.calls)
2908
 
 
2909
 
    def test_hook_not_called_for_kind_change(self):
2910
 
        builder = self.make_kind_change()
2911
 
        conflicts = builder.merge()
2912
 
        # The hook should not call the merge_text() method
2913
 
        self.assertEqual([], self.calls)
2914
 
 
2915
 
    def test_hook_not_called_for_other_files(self):
2916
 
        builder = self.make_text_conflict('foobar')
2917
 
        conflicts = builder.merge()
2918
 
        # The hook should not call the merge_text() method
2919
 
        self.assertEqual([], self.calls)