310
309
tree_a.commit('commit 2')
311
310
tree_b = tree_a.bzrdir.sprout('b').open_workingtree()
312
311
tree_b.rename_one('file_1', 'renamed')
313
merger = _mod_merge.Merger.from_uncommitted(tree_a, tree_b,
314
progress.DummyProgress())
312
merger = _mod_merge.Merger.from_uncommitted(tree_a, tree_b)
315
313
merger.merge_type = _mod_merge.WeaveMerger
316
314
merger.do_merge()
317
315
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)
324
317
def prepare_cherrypick(self):
325
318
"""Prepare a pair of trees for cherrypicking tests.
356
349
def test_weave_cannot_reverse_cherrypick(self):
357
350
this_tree, other_tree = self.prepare_cherrypick()
358
merger = _mod_merge.Merger.from_revision_ids(progress.DummyProgress(),
351
merger = _mod_merge.Merger.from_revision_ids(None,
359
352
this_tree, 'rev2b', 'rev3b', other_tree.branch)
360
353
merger.merge_type = _mod_merge.WeaveMerger
361
354
self.assertRaises(errors.CannotReverseCherrypick, merger.do_merge)
363
356
def test_merge3_can_reverse_cherrypick(self):
364
357
this_tree, other_tree = self.prepare_cherrypick()
365
merger = _mod_merge.Merger.from_revision_ids(progress.DummyProgress(),
358
merger = _mod_merge.Merger.from_revision_ids(None,
366
359
this_tree, 'rev2b', 'rev3b', other_tree.branch)
367
360
merger.merge_type = _mod_merge.Merge3Merger
368
361
merger.do_merge()
2842
2835
class TestConfigurableFileMerger(tests.TestCaseWithTransport):
2844
def test_affected_files_cached(self):
2845
"""Ensures that the config variable is cached"""
2846
class SimplePlan(_mod_merge.ConfigurableFileMerger):
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):
2847
2846
name_prefix = "foo"
2848
default_files = ["my default"]
2847
default_files = ['bar']
2849
2849
def merge_text(self, params):
2850
return ('not applicable', None)
2850
test.calls.append('merge_text')
2851
return ('not_applicable', None)
2851
2853
def factory(merger):
2852
result = SimplePlan(merger)
2854
result = FooMerger(merger)
2855
# Make sure we start with a clean slate
2853
2856
self.assertEqual(None, result.affected_files)
2857
# Track the original merger
2854
2858
self.merger = result
2863
def _install_hook(self, factory):
2856
2864
_mod_merge.Merger.hooks.install_named_hook('merge_file_content',
2857
factory, 'test factory')
2865
factory, 'test factory')
2867
def make_builder(self):
2858
2868
builder = test_merge_core.MergeBuilder(self.test_base_dir)
2859
2869
self.addCleanup(builder.cleanup)
2860
builder.add_file('NEWS', builder.tree_root, 'name1', 'text1', True)
2861
builder.change_contents('NEWS', other='text4', this='text3')
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()
2862
2893
conflicts = builder.merge()
2863
2894
# The hook should set the variable
2864
self.assertEqual(["my default"], self.merger.affected_files)
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)