26
26
from bzrlib.tests import (
29
from bzrlib.tests.matchers import HasLayout
30
31
from bzrlib.tests.per_workingtree import TestCaseWithWorkingTree
33
34
class TestRenameOne(TestCaseWithWorkingTree):
35
def get_tree_layout(self, tree):
36
"""Get the (path, file_id) pairs for the current tree."""
39
return [(path, ie.file_id) for path, ie
40
in tree.iter_entries_by_dir()]
44
36
def assertTreeLayout(self, expected, tree):
45
37
"""Check that the tree has the correct layout."""
46
actual = self.get_tree_layout(tree)
47
self.assertEqual(expected, actual)
38
self.assertThat(tree, HasLayout(expected))
49
40
def test_rename_one_target_not_dir(self):
50
41
tree = self.make_branch_and_tree('.')
91
82
a_contents = tree.get_file_text('a-id')
92
83
tree.rename_one('a', 'foo')
93
self.assertTreeLayout([('', root_id), ('b', 'b-id'), ('foo', 'a-id')],
84
self.assertTreeLayout([('', root_id), ('b/', 'b-id'), ('foo', 'a-id')],
95
self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('b', 'b-id')],
86
self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('b/', 'b-id')],
97
88
self.assertPathDoesNotExist('a')
98
89
self.assertFileEqual(a_contents, 'foo')
107
98
a_contents = tree.get_file_text('a-id')
108
99
tree.rename_one('a', 'b/foo')
109
self.assertTreeLayout([('', root_id), ('b', 'b-id'), ('b/foo', 'a-id')],
100
self.assertTreeLayout([('', root_id), ('b/', 'b-id'), ('b/foo', 'a-id')],
111
self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('b', 'b-id')],
102
self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('b/', 'b-id')],
112
103
tree.basis_tree())
113
104
self.assertPathDoesNotExist('tree/a')
114
105
self.assertFileEqual(a_contents, 'tree/b/foo')
119
110
tree.add(['a', 'b', 'b/c'], ['a-id', 'b-id', 'c-id'])
120
111
tree.commit('initial', rev_id='rev-1')
121
112
root_id = tree.get_root_id()
122
self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('b', 'b-id'),
113
self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('b/', 'b-id'),
123
114
('b/c', 'c-id')], tree)
124
self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('b', 'b-id'),
115
self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('b/', 'b-id'),
125
116
('b/c', 'c-id')], tree.basis_tree())
126
117
a_contents = tree.get_file_text('a-id')
127
118
tree.rename_one('a', 'b/d')
128
self.assertTreeLayout([('', root_id), ('b', 'b-id'), ('b/c', 'c-id'),
119
self.assertTreeLayout([('', root_id), ('b/', 'b-id'), ('b/c', 'c-id'),
129
120
('b/d', 'a-id')], tree)
130
self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('b', 'b-id'),
121
self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('b/', 'b-id'),
131
122
('b/c', 'c-id')], tree.basis_tree())
132
123
self.assertPathDoesNotExist('a')
133
124
self.assertFileEqual(a_contents, 'b/d')
140
131
root_id = tree.get_root_id()
141
132
c_contents = tree.get_file_text('c-id')
142
133
tree.rename_one('b/c', 'd')
143
self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('b', 'b-id'),
134
self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('b/', 'b-id'),
144
135
('d', 'c-id')], tree)
145
self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('b', 'b-id'),
136
self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('b/', 'b-id'),
146
137
('b/c', 'c-id')], tree.basis_tree())
147
138
self.assertPathDoesNotExist('b/c')
148
139
self.assertFileEqual(c_contents, 'd')
156
147
# Target already exists
157
148
self.assertRaises(errors.RenameFailedFilesExist,
158
149
tree.rename_one, 'a', 'b/a')
159
self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('b', 'b-id'),
150
self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('b/', 'b-id'),
160
151
('c', 'c-id')], tree)
161
self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('b', 'b-id'),
152
self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('b/', 'b-id'),
162
153
('c', 'c-id')], tree.basis_tree())
164
155
def test_rename_one_onto_existing(self):
196
187
root_id = tree.get_root_id()
197
188
os.rename('a', 'b/foo')
199
self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('b', 'b-id')],
190
self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('b/', 'b-id')],
201
192
# We don't need after=True as long as source is missing and target
203
194
tree.rename_one('a', 'b/foo')
204
self.assertTreeLayout([('', root_id), ('b', 'b-id'),
195
self.assertTreeLayout([('', root_id), ('b/', 'b-id'),
205
196
('b/foo', 'a-id')], tree)
206
self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('b', 'b-id')],
197
self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('b/', 'b-id')],
207
198
tree.basis_tree())
209
200
def test_rename_one_after_with_after(self):
214
205
root_id = tree.get_root_id()
215
206
os.rename('a', 'b/foo')
217
self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('b', 'b-id')],
208
self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('b/', 'b-id')],
219
210
# Passing after=True should work as well
220
211
tree.rename_one('a', 'b/foo', after=True)
221
self.assertTreeLayout([('', root_id), ('b', 'b-id'),
212
self.assertTreeLayout([('', root_id), ('b/', 'b-id'),
222
213
('b/foo', 'a-id')], tree)
223
self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('b', 'b-id')],
214
self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('b/', 'b-id')],
224
215
tree.basis_tree())
226
217
def test_rename_one_after_dest_versioned(self):
278
269
os.rename('a', 'b/foo')
279
270
tree.remove(['a'])
281
self.assertTreeLayout([('', root_id), ('b', 'b-id')], tree)
272
self.assertTreeLayout([('', root_id), ('b/', 'b-id')], tree)
282
273
# We don't need after=True as long as source is missing and target
284
275
tree.rename_one('a', 'b/foo')
285
self.assertTreeLayout([('', root_id), ('b', 'b-id'),
276
self.assertTreeLayout([('', root_id), ('b/', 'b-id'),
286
277
('b/foo', 'a-id')], tree)
287
self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('b', 'b-id')],
278
self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('b/', 'b-id')],
288
279
tree.basis_tree())
290
281
def test_rename_one_after_no_target(self):
297
288
# Passing after when the file hasn't been rename_one raises an exception
298
289
self.assertRaises(errors.BzrMoveFailedError,
299
290
tree.rename_one, 'a', 'b/foo', after=True)
300
self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('b', 'b-id')],
291
self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('b/', 'b-id')],
302
self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('b', 'b-id')],
293
self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('b/', 'b-id')],
303
294
tree.basis_tree())
305
296
def test_rename_one_after_source_and_dest(self):
325
self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('b', 'b-id')],
316
self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('b/', 'b-id')],
327
318
self.assertRaises(errors.RenameFailedFilesExist,
328
319
tree.rename_one, 'a', 'b/foo', after=False)
329
self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('b', 'b-id')],
320
self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('b/', 'b-id')],
331
322
self.assertFileEqual(a_text, 'a')
332
323
self.assertFileEqual(foo_text, 'b/foo')
333
324
# But you can pass after=True
334
325
tree.rename_one('a', 'b/foo', after=True)
335
self.assertTreeLayout([('', root_id), ('b', 'b-id'),
326
self.assertTreeLayout([('', root_id), ('b/', 'b-id'),
336
327
('b/foo', 'a-id')], tree)
337
self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('b', 'b-id')],
328
self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('b/', 'b-id')],
338
329
tree.basis_tree())
339
330
# But it shouldn't actually move anything
340
331
self.assertFileEqual(a_text, 'a')
349
340
root_id = tree.get_root_id()
351
342
tree.rename_one('a', 'e/f')
352
self.assertTreeLayout([('', root_id), ('e', 'e-id'), ('e/f', 'a-id'),
353
('e/f/b', 'b-id'), ('e/f/c', 'c-id'),
343
self.assertTreeLayout([('', root_id), ('e/', 'e-id'), ('e/f/', 'a-id'),
344
('e/f/b', 'b-id'), ('e/f/c/', 'c-id'),
354
345
('e/f/c/d', 'd-id')], tree)
355
self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('e', 'e-id'),
356
('a/b', 'b-id'), ('a/c', 'c-id'),
346
self.assertTreeLayout([('', root_id), ('a/', 'a-id'), ('e/', 'e-id'),
347
('a/b', 'b-id'), ('a/c/', 'c-id'),
357
348
('a/c/d', 'd-id')], tree.basis_tree())
359
350
def test_rename_one_moved(self):
365
356
root_id = tree.get_root_id()
367
358
tree.rename_one('a/b', 'c/foo')
368
self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('c', 'c-id'),
359
self.assertTreeLayout([('', root_id), ('a/', 'a-id'), ('c/', 'c-id'),
369
360
('c/foo', 'b-id')], tree)
370
self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('c', 'c-id'),
361
self.assertTreeLayout([('', root_id), ('a/', 'a-id'), ('c/', 'c-id'),
371
362
('a/b', 'b-id')], tree.basis_tree())
373
364
tree.rename_one('c/foo', 'bar')
374
self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('bar', 'b-id'),
375
('c', 'c-id')], tree)
376
self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('c', 'c-id'),
365
self.assertTreeLayout([('', root_id), ('a/', 'a-id'), ('bar', 'b-id'),
366
('c/', 'c-id')], tree)
367
self.assertTreeLayout([('', root_id), ('a/', 'a-id'), ('c/', 'c-id'),
377
368
('a/b', 'b-id')], tree.basis_tree())
379
370
def test_rename_to_denormalised_fails(self):