18
18
from StringIO import StringIO
20
from bzrlib import conflicts
25
21
from bzrlib.branch import Branch
26
22
from bzrlib.builtins import merge
27
23
from bzrlib.conflicts import ConflictList, TextConflict
28
24
from bzrlib.errors import UnrelatedBranches, NoCommits, BzrCommandError
29
25
from bzrlib.merge import transform_tree, merge_inner
30
from bzrlib.osutils import pathjoin, file_kind
26
from bzrlib.osutils import pathjoin
31
27
from bzrlib.revision import common_ancestor
32
28
from bzrlib.tests import TestCaseWithTransport
33
29
from bzrlib.trace import (enable_test_log, disable_test_log)
174
167
conflicts.MissingParent('Created directory', 'b', 'b-id'),
175
168
conflicts.UnversionedParent('Versioned directory', 'b', 'b-id')],
176
169
tree_z.conflicts())
177
merge_inner(tree_a.branch, tree_z.basis_tree(), base_tree,
170
merge_inner(tree_a.branch, tree_z.basis_tree(), base_tree,
178
171
this_tree=tree_a)
179
172
self.assertEqual([
180
173
conflicts.DeletingParent('Not deleting', 'b', 'b-id'),
181
174
conflicts.UnversionedParent('Versioned directory', 'b', 'b-id')],
182
175
tree_a.conflicts())
184
def test_nested_merge(self):
185
tree = self.make_branch_and_tree('tree',
186
format='dirstate-with-subtree')
187
sub_tree = self.make_branch_and_tree('tree/sub-tree',
188
format='dirstate-with-subtree')
189
sub_tree.set_root_id('sub-tree-root')
190
self.build_tree_contents([('tree/sub-tree/file', 'text1')])
192
sub_tree.commit('foo')
193
tree.add_reference(sub_tree)
194
tree.commit('set text to 1')
195
tree2 = tree.bzrdir.sprout('tree2').open_workingtree()
196
# modify the file in the subtree
197
self.build_tree_contents([('tree2/sub-tree/file', 'text2')])
198
# and merge the changes from the diverged subtree into the containing
200
tree2.commit('changed file text')
201
tree.merge_from_branch(tree2.branch)
202
self.assertFileEqual('text2', 'tree/sub-tree/file')
204
def test_merge_with_missing(self):
205
tree_a = self.make_branch_and_tree('tree_a')
206
self.build_tree_contents([('tree_a/file', 'content_1')])
208
tree_a.commit('commit base')
209
# basis_tree() is only guaranteed to be valid as long as it is actually
210
# the basis tree. This mutates the tree after grabbing basis, so go to
212
base_tree = tree_a.branch.repository.revision_tree(tree_a.last_revision())
213
tree_b = tree_a.bzrdir.sprout('tree_b').open_workingtree()
214
self.build_tree_contents([('tree_a/file', 'content_2')])
215
tree_a.commit('commit other')
216
other_tree = tree_a.basis_tree()
217
os.unlink('tree_b/file')
218
merge_inner(tree_b.branch, other_tree, base_tree, this_tree=tree_b)
220
def test_merge_kind_change(self):
221
tree_a = self.make_branch_and_tree('tree_a')
222
self.build_tree_contents([('tree_a/file', 'content_1')])
223
tree_a.add('file', 'file-id')
224
tree_a.commit('added file')
225
tree_b = tree_a.bzrdir.sprout('tree_b').open_workingtree()
226
os.unlink('tree_a/file')
227
self.build_tree(['tree_a/file/'])
228
tree_a.commit('changed file to directory')
229
tree_b.merge_from_branch(tree_a.branch)
230
self.assertEqual('directory', file_kind('tree_b/file'))
232
self.assertEqual('file', file_kind('tree_b/file'))
233
self.build_tree_contents([('tree_b/file', 'content_2')])
234
tree_b.commit('content change')
235
tree_b.merge_from_branch(tree_a.branch)
236
self.assertEqual(tree_b.conflicts(),
237
[conflicts.ContentsConflict('file',
240
def test_merge_type_registry(self):
241
merge_type_option = option.Option.OPTIONS['merge-type']
242
self.assertFalse('merge4' in [x[0] for x in
243
merge_type_option.iter_switches()])
244
registry = _mod_merge.get_merge_type_registry()
245
registry.register_lazy('merge4', 'bzrlib.merge', 'Merge4Merger',
246
'time-travelling merge')
247
self.assertTrue('merge4' in [x[0] for x in
248
merge_type_option.iter_switches()])
249
registry.remove('merge4')
250
self.assertFalse('merge4' in [x[0] for x in
251
merge_type_option.iter_switches()])