90
90
os.chdir('branch2')
91
91
self.run_bzr('merge ../branch1/baz', retcode=3)
92
92
self.run_bzr('merge ../branch1/foo')
93
self.assertPathExists('foo')
94
self.assertPathDoesNotExist('bar')
93
self.failUnlessExists('foo')
94
self.failIfExists('bar')
95
95
wt2 = WorkingTree.open('.') # opens branch2
96
96
self.assertEqual([tip], wt2.get_parent_ids())
124
def test_merge_into_null_tree(self):
125
wt = self.make_branch_and_tree('tree')
126
null_tree = wt.basis_tree()
127
self.build_tree(['tree/file'])
129
wt.commit('tree with root')
130
merger = _mod_merge.Merge3Merger(null_tree, null_tree, null_tree, wt,
131
this_branch=wt.branch,
133
with merger.make_preview_transform() as tt:
134
self.assertEqual([], tt.find_conflicts())
135
preview = tt.get_preview_tree()
136
self.assertEqual(wt.get_root_id(), preview.get_root_id())
138
124
def test_create_rename(self):
139
125
"""Rename an inventory entry while creating the file"""
140
126
tree =self.make_branch_and_tree('.')
172
158
merge_inner(tree_b.branch, tree_a, tree_b.basis_tree(),
173
159
this_tree=tree_b, ignore_zero=True)
174
self.assertTrue('All changes applied successfully.\n' not in
160
self.failUnless('All changes applied successfully.\n' not in
177
163
merge_inner(tree_b.branch, tree_a, tree_b.basis_tree(),
178
164
this_tree=tree_b, ignore_zero=False)
179
self.assertTrue('All changes applied successfully.\n' in self.get_log())
165
self.failUnless('All changes applied successfully.\n' in self.get_log())
181
167
def test_merge_inner_conflicts(self):
182
168
tree_a = self.make_branch_and_tree('a')
401
387
'>>>>>>> MERGE-SOURCE\n',
404
def test_merge_reverse_revision_range(self):
405
tree = self.make_branch_and_tree(".")
407
self.addCleanup(tree.unlock)
408
self.build_tree(['a'])
410
tree.commit("added a")
411
first_rev = tree.branch.revision_history()[0]
412
merger = _mod_merge.Merger.from_revision_ids(None, tree,
413
_mod_revision.NULL_REVISION,
415
merger.merge_type = _mod_merge.Merge3Merger
416
merger.interesting_files = 'a'
417
conflict_count = merger.do_merge()
418
self.assertEqual(0, conflict_count)
420
self.assertPathDoesNotExist("a")
422
self.assertPathExists("a")
424
390
def test_make_merger(self):
425
391
this_tree = self.make_branch_and_tree('this')
426
392
this_tree.commit('rev1', rev_id='rev1')
491
457
tree_file.close()
493
def test_merge_require_tree_root(self):
494
tree = self.make_branch_and_tree(".")
496
self.addCleanup(tree.unlock)
497
self.build_tree(['a'])
499
tree.commit("added a")
500
old_root_id = tree.get_root_id()
501
first_rev = tree.branch.revision_history()[0]
502
merger = _mod_merge.Merger.from_revision_ids(None, tree,
503
_mod_revision.NULL_REVISION,
505
merger.merge_type = _mod_merge.Merge3Merger
506
conflict_count = merger.do_merge()
507
self.assertEqual(0, conflict_count)
508
self.assertEquals(set([old_root_id]), tree.all_file_ids())
509
tree.set_parent_ids([])
511
459
def test_merge_add_into_deleted_root(self):
512
460
# Yes, people actually do this. And report bugs if it breaks.
513
461
source = self.make_branch_and_tree('source', format='rich-root-pack')
1322
1270
self.assertEqual(['B-id', 'C-id', 'F-id'],
1323
1271
[t.get_revision_id() for t in merger._lca_trees])
1325
def test_find_base_new_root_criss_cross(self):
1332
builder = self.get_builder()
1333
builder.build_snapshot('A-id', None,
1334
[('add', ('', None, 'directory', None))])
1335
builder.build_snapshot('B-id', [],
1336
[('add', ('', None, 'directory', None))])
1337
builder.build_snapshot('D-id', ['A-id', 'B-id'], [])
1338
builder.build_snapshot('C-id', ['A-id', 'B-id'], [])
1339
merger = self.make_Merger(builder, 'D-id')
1340
self.assertEqual('A-id', merger.base_rev_id)
1341
self.assertTrue(merger._is_criss_cross)
1342
self.assertEqual(['A-id', 'B-id'], [t.get_revision_id()
1343
for t in merger._lca_trees])
1345
1273
def test_no_criss_cross_passed_to_merge_type(self):
1346
1274
class LCATreesMerger(LoggingMerger):
1347
1275
supports_lca_trees = True
2916
2844
def get_merger_factory(self):
2917
2845
# Allows the inner methods to access the test attributes
2920
2848
class FooMerger(_mod_merge.ConfigurableFileMerger):
2921
2849
name_prefix = "foo"
2922
2850
default_files = ['bar']
2924
2852
def merge_text(self, params):
2925
calls.append('merge_text')
2853
test.calls.append('merge_text')
2926
2854
return ('not_applicable', None)
2928
2856
def factory(merger):