115
114
self.tt.create_file('qux', trans_id)
116
115
this.merge_from_branch(other.branch, merge_type=QuxMerge)
117
116
self.assertEqual('qux', this.get_file_text('foo-id'))
120
class TestMergedBranch(per_workingtree.TestCaseWithWorkingTree):
122
def make_branch_builder(self, relpath, format=None):
124
format = self.bzrdir_format
125
builder = branchbuilder.BranchBuilder(self.get_transport(),
129
def make_inner_branch(self):
130
bld_inner = self.make_branch_builder('inner')
131
bld_inner.start_series()
132
bld_inner.build_snapshot(
134
[('add', ('', 'inner-root-id', 'directory', '')),
135
('add', ('dir', 'dir-id', 'directory', '')),
136
('add', ('dir/file1', 'file1-id', 'file', 'file1 content\n')),
137
('add', ('file3', 'file3-id', 'file', 'file3 content\n')),
139
bld_inner.build_snapshot(
140
'3', ['1'], [('modify', ('file3-id', 'new file3 contents\n')),])
141
bld_inner.build_snapshot(
143
[('add', ('dir/file2', 'file2-id', 'file', 'file2 content\n')),
145
bld_inner.finish_series()
146
br = bld_inner.get_branch()
149
def assertTreeLayout(self, expected, tree):
152
actual = [e[0] for e in tree.list_files()]
153
# list_files doesn't guarantee order
154
actual = sorted(actual)
155
self.assertEqual(expected, actual)
159
def make_outer_tree(self):
160
outer = self.make_branch_and_tree('outer')
161
self.build_tree_contents([('outer/foo', 'foo')])
162
outer.add('foo', 'foo-id')
163
outer.commit('added foo')
164
inner = self.make_inner_branch()
165
outer.merge_from_branch(inner, to_revision='1', from_revision='null:')
166
outer.commit('merge inner branch')
167
outer.mkdir('dir-outer', 'dir-outer-id')
168
outer.move(['dir', 'file3'], to_dir='dir-outer')
169
outer.commit('rename imported dir and file3 to dir-outer')
172
def test_file1_deleted_in_dir(self):
173
outer, inner = self.make_outer_tree()
174
outer.remove(['dir-outer/dir/file1'], keep_files=False)
175
outer.commit('delete file1')
176
outer.merge_from_branch(inner)
177
outer.commit('merge the rest')
178
self.assertTreeLayout(['dir-outer',
180
'dir-outer/dir/file2',
185
def test_file3_deleted_in_root(self):
186
# Reproduce bug #375898
187
outer, inner = self.make_outer_tree()
188
outer.remove(['dir-outer/file3'], keep_files=False)
189
outer.commit('delete file3')
190
outer.merge_from_branch(inner)
191
outer.commit('merge the rest')
192
self.assertTreeLayout(['dir-outer',
194
'dir-outer/dir/file1',
195
'dir-outer/dir/file2',
200
def test_file3_in_root_conflicted(self):
201
outer, inner = self.make_outer_tree()
202
outer.remove(['dir-outer/file3'], keep_files=False)
203
outer.commit('delete file3')
204
nb_conflicts = outer.merge_from_branch(inner, to_revision='3')
205
self.assertEqual(4, nb_conflicts)
206
self.assertTreeLayout(['dir-outer',
208
'dir-outer/dir/file1',
209
# Ideally th conflict helpers should be in
210
# dir-outer/dir but since we can't easily find
211
# back the file3 -> outer-dir/dir rename, root
212
# is good enough -- vila 20100401