309
310
tree_a.commit('commit 2')
310
311
tree_b = tree_a.bzrdir.sprout('b').open_workingtree()
311
312
tree_b.rename_one('file_1', 'renamed')
312
merger = _mod_merge.Merger.from_uncommitted(tree_a, tree_b)
313
merger = _mod_merge.Merger.from_uncommitted(tree_a, tree_b,
314
progress.DummyProgress())
313
315
merger.merge_type = _mod_merge.WeaveMerger
314
316
merger.do_merge()
315
317
self.assertEqual(tree_a.get_parent_ids(), [tree_b.last_revision()])
319
def test_Merger_defaults_to_DummyProgress(self):
320
branch = self.make_branch('branch')
321
merger = _mod_merge.Merger(branch, pb=None)
322
self.assertIsInstance(merger._pb, progress.DummyProgress)
317
324
def prepare_cherrypick(self):
318
325
"""Prepare a pair of trees for cherrypicking tests.
349
356
def test_weave_cannot_reverse_cherrypick(self):
350
357
this_tree, other_tree = self.prepare_cherrypick()
351
merger = _mod_merge.Merger.from_revision_ids(None,
358
merger = _mod_merge.Merger.from_revision_ids(progress.DummyProgress(),
352
359
this_tree, 'rev2b', 'rev3b', other_tree.branch)
353
360
merger.merge_type = _mod_merge.WeaveMerger
354
361
self.assertRaises(errors.CannotReverseCherrypick, merger.do_merge)
356
363
def test_merge3_can_reverse_cherrypick(self):
357
364
this_tree, other_tree = self.prepare_cherrypick()
358
merger = _mod_merge.Merger.from_revision_ids(None,
365
merger = _mod_merge.Merger.from_revision_ids(progress.DummyProgress(),
359
366
this_tree, 'rev2b', 'rev3b', other_tree.branch)
360
367
merger.merge_type = _mod_merge.Merge3Merger
361
368
merger.do_merge()
2835
2842
class TestConfigurableFileMerger(tests.TestCaseWithTransport):
2838
super(TestConfigurableFileMerger, self).setUp()
2841
def get_merger_factory(self):
2842
# Allows the inner methods to access the test attributes
2845
class FooMerger(_mod_merge.ConfigurableFileMerger):
2844
def test_affected_files_cached(self):
2845
"""Ensures that the config variable is cached"""
2846
class SimplePlan(_mod_merge.ConfigurableFileMerger):
2846
2847
name_prefix = "foo"
2847
default_files = ['bar']
2848
default_files = ["my default"]
2849
2849
def merge_text(self, params):
2850
test.calls.append('merge_text')
2851
return ('not_applicable', None)
2850
return ('not applicable', None)
2853
2851
def factory(merger):
2854
result = FooMerger(merger)
2855
# Make sure we start with a clean slate
2852
result = SimplePlan(merger)
2856
2853
self.assertEqual(None, result.affected_files)
2857
# Track the original merger
2858
2854
self.merger = result
2863
def _install_hook(self, factory):
2864
2856
_mod_merge.Merger.hooks.install_named_hook('merge_file_content',
2865
factory, 'test factory')
2867
def make_builder(self):
2857
factory, 'test factory')
2868
2858
builder = test_merge_core.MergeBuilder(self.test_base_dir)
2869
2859
self.addCleanup(builder.cleanup)
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')
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,
2886
builder.add_dir('bar-dir', builder.tree_root, 'bar-id',
2887
base=False, other=False)
2890
def test_affected_files_cached(self):
2891
"""Ensures that the config variable is cached"""
2892
builder = self.make_text_conflict()
2860
builder.add_file('NEWS', builder.tree_root, 'name1', 'text1', True)
2861
builder.change_contents('NEWS', other='text4', this='text3')
2893
2862
conflicts = builder.merge()
2894
2863
# The hook should set the variable
2895
self.assertEqual(['bar'], self.merger.affected_files)
2896
self.assertEqual(1, len(conflicts))
2898
def test_hook_called_for_text_conflicts(self):
2899
builder = self.make_text_conflict()
2900
conflicts = builder.merge()
2901
# The hook should call the merge_text() method
2902
self.assertEqual(['merge_text'], self.calls)
2904
def test_hook_not_called_for_kind_change(self):
2905
builder = self.make_kind_change()
2906
conflicts = builder.merge()
2907
# The hook should not call the merge_text() method
2908
self.assertEqual([], self.calls)
2910
def test_hook_not_called_for_other_files(self):
2911
builder = self.make_text_conflict('foobar')
2912
conflicts = builder.merge()
2913
# The hook should not call the merge_text() method
2914
self.assertEqual([], self.calls)
2864
self.assertEqual(["my default"], self.merger.affected_files)