218
218
tree_a.add('file')
219
219
tree_a.commit('commit base')
220
220
# basis_tree() is only guaranteed to be valid as long as it is actually
221
# the basis tree. This mutates the tree after grabbing basis, so go to
221
# the basis tree. This test commits to the tree after grabbing basis,
222
# so we go to the repository.
223
223
base_tree = tree_a.branch.repository.revision_tree(tree_a.last_revision())
224
224
tree_b = tree_a.bzrdir.sprout('tree_b').open_workingtree()
225
225
self.build_tree_contents([('tree_a/file', 'content_2')])
226
226
tree_a.commit('commit other')
227
227
other_tree = tree_a.basis_tree()
228
# 'file' is now missing but isn't altered in any commit in b so no
229
# change should be applied.
228
230
os.unlink('tree_b/file')
229
231
merge_inner(tree_b.branch, other_tree, base_tree, this_tree=tree_b)
1095
1097
'>>>>>>> MERGE-SOURCE\n'
1096
1098
'line 4\n', 'this/file1')
1100
def test_modify_conflicts_with_delete(self):
1101
# If one side deletes a line, and the other modifies that line, then
1102
# the modification should be considered a conflict
1103
builder = self.make_branch_builder('test')
1104
builder.start_series()
1105
builder.build_snapshot('BASE-id', None,
1106
[('add', ('', None, 'directory', None)),
1107
('add', ('foo', 'foo-id', 'file', 'a\nb\nc\nd\ne\n')),
1110
builder.build_snapshot('OTHER-id', ['BASE-id'],
1111
[('modify', ('foo-id', 'a\nc\nd\ne\n'))])
1112
# Modify 'b\n', add 'X\n'
1113
builder.build_snapshot('THIS-id', ['BASE-id'],
1114
[('modify', ('foo-id', 'a\nb2\nc\nd\nX\ne\n'))])
1115
builder.finish_series()
1116
branch = builder.get_branch()
1117
this_tree = branch.bzrdir.create_workingtree()
1118
this_tree.lock_write()
1119
self.addCleanup(this_tree.unlock)
1120
other_tree = this_tree.bzrdir.sprout('other', 'OTHER-id').open_workingtree()
1121
self.do_merge(this_tree, other_tree)
1122
if self.merge_type is _mod_merge.LCAMerger:
1123
self.expectFailure("lca merge doesn't track deleted lines",
1124
self.assertFileEqual,
1129
'>>>>>>> MERGE-SOURCE\n'
1135
self.assertFileEqual(
1140
'>>>>>>> MERGE-SOURCE\n'
1146
def get_limbodir_deletiondir(self, wt):
1147
transform = TreeTransform(wt)
1148
limbodir = transform._limbodir
1149
deletiondir = transform._deletiondir
1150
transform.finalize()
1151
return (limbodir, deletiondir)
1153
def test_merge_with_existing_limbo(self):
1154
wt = self.make_branch_and_tree('this')
1155
(limbodir, deletiondir) = self.get_limbodir_deletiondir(wt)
1157
self.assertRaises(errors.ExistingLimbo, self.do_merge, wt, wt)
1158
self.assertRaises(errors.LockError, wt.unlock)
1160
def test_merge_with_pending_deletion(self):
1161
wt = self.make_branch_and_tree('this')
1162
(limbodir, deletiondir) = self.get_limbodir_deletiondir(wt)
1163
os.mkdir(deletiondir)
1164
self.assertRaises(errors.ExistingPendingDeletion, self.do_merge, wt, wt)
1165
self.assertRaises(errors.LockError, wt.unlock)
1099
1168
class TestMerge3Merge(TestCaseWithTransport, TestMergeImplementation):
1187
1256
class TestMergerInMemory(TestMergerBase):
1258
def test_cache_trees_with_revision_ids_None(self):
1259
merger = self.make_Merger(self.setup_simple_graph(), 'C-id')
1260
original_cache = dict(merger._cached_trees)
1261
merger.cache_trees_with_revision_ids([None])
1262
self.assertEqual(original_cache, merger._cached_trees)
1264
def test_cache_trees_with_revision_ids_no_revision_id(self):
1265
merger = self.make_Merger(self.setup_simple_graph(), 'C-id')
1266
original_cache = dict(merger._cached_trees)
1267
tree = self.make_branch_and_memory_tree('tree')
1268
merger.cache_trees_with_revision_ids([tree])
1269
self.assertEqual(original_cache, merger._cached_trees)
1271
def test_cache_trees_with_revision_ids_having_revision_id(self):
1272
merger = self.make_Merger(self.setup_simple_graph(), 'C-id')
1273
original_cache = dict(merger._cached_trees)
1274
tree = merger.this_branch.repository.revision_tree('B-id')
1275
original_cache['B-id'] = tree
1276
merger.cache_trees_with_revision_ids([tree])
1277
self.assertEqual(original_cache, merger._cached_trees)
1189
1279
def test_find_base(self):
1190
1280
merger = self.make_Merger(self.setup_simple_graph(), 'C-id')
1191
1281
self.assertEqual('A-id', merger.base_rev_id)