41
41
class TestPrepareShelf(tests.TestCaseWithTransport):
43
def test_shelve_rename(self):
43
def prepare_shelve_rename(self):
44
44
tree = self.make_branch_and_tree('.')
45
45
self.build_tree(['foo'])
46
46
tree.add(['foo'], ['foo-id'])
48
48
tree.rename_one('foo', 'bar')
49
tree.lock_tree_write()
50
self.addCleanup(tree.unlock)
49
51
creator = shelf.ShelfCreator(tree, tree.basis_tree())
50
52
self.addCleanup(creator.finalize)
51
53
self.assertEqual([('rename', 'foo-id', 'foo', 'bar')],
52
54
list(creator.iter_shelvable()))
53
creator.shelve_rename('foo-id')
57
def check_shelve_rename(self, creator):
54
58
work_trans_id = creator.work_transform.trans_id_file_id('foo-id')
55
59
self.assertEqual('foo', creator.work_transform.final_name(
58
62
self.assertEqual('bar', creator.shelf_transform.final_name(
61
def test_shelve_move(self):
65
def test_shelve_rename(self):
66
creator = self.prepare_shelve_rename()
67
creator.shelve_rename('foo-id')
68
self.check_shelve_rename(creator)
70
def test_shelve_change_handles_rename(self):
71
creator = self.prepare_shelve_rename()
72
creator.shelve_change(('rename', 'foo-id', 'foo', 'bar'))
73
self.check_shelve_rename(creator)
75
def prepare_shelve_move(self):
62
76
tree = self.make_branch_and_tree('.')
63
77
self.build_tree(['foo/', 'bar/', 'foo/baz'])
64
78
tree.add(['foo', 'bar', 'foo/baz'], ['foo-id', 'bar-id', 'baz-id'])
66
80
tree.rename_one('foo/baz', 'bar/baz')
81
tree.lock_tree_write()
82
self.addCleanup(tree.unlock)
67
83
creator = shelf.ShelfCreator(tree, tree.basis_tree())
68
84
self.addCleanup(creator.finalize)
69
85
self.assertEqual([('rename', 'baz-id', 'foo/baz', 'bar/baz')],
70
86
list(creator.iter_shelvable()))
71
creator.shelve_rename('baz-id')
89
def check_shelve_move(self, creator, tree):
72
90
work_trans_id = creator.work_transform.trans_id_file_id('baz-id')
73
91
work_foo = creator.work_transform.trans_id_file_id('foo-id')
74
92
self.assertEqual(work_foo, creator.work_transform.final_parent(
80
98
creator.transform()
81
99
self.assertEqual('foo/baz', tree.id2path('baz-id'))
101
def test_shelve_move(self):
102
creator, tree = self.prepare_shelve_move()
103
creator.shelve_rename('baz-id')
104
self.check_shelve_move(creator, tree)
106
def test_shelve_change_handles_move(self):
107
creator, tree = self.prepare_shelve_move()
108
creator.shelve_change(('rename', 'baz-id', 'foo/baz', 'bar/baz'))
109
self.check_shelve_move(creator, tree)
111
def test_shelve_changed_root_id(self):
112
tree = self.make_branch_and_tree('.')
113
self.build_tree(['foo'])
114
tree.set_root_id('first-root-id')
115
tree.add(['foo'], ['foo-id'])
117
tree.set_root_id('second-root-id')
118
tree.lock_tree_write()
119
self.addCleanup(tree.unlock)
120
creator = shelf.ShelfCreator(tree, tree.basis_tree())
121
self.addCleanup(creator.finalize)
122
self.expectFailure('shelf doesn\'t support shelving root changes yet',
124
('delete file', 'first-root-id', 'directory', ''),
125
('add file', 'second-root-id', 'directory', ''),
126
('rename', 'foo-id', u'foo', u'foo'),
127
], list(creator.iter_shelvable()))
129
self.assertEqual([('delete file', 'first-root-id', 'directory', ''),
130
('add file', 'second-root-id', 'directory', ''),
131
('rename', 'foo-id', u'foo', u'foo'),
132
], list(creator.iter_shelvable()))
83
134
def assertShelvedFileEqual(self, expected_content, creator, file_id):
84
135
s_trans_id = creator.shelf_transform.trans_id_file_id(file_id)
85
136
shelf_file = creator.shelf_transform._limbo_name(s_trans_id)
86
137
self.assertFileEqual(expected_content, shelf_file)
88
def test_shelve_content_change(self):
139
def prepare_content_change(self):
89
140
tree = self.make_branch_and_tree('.')
91
142
self.addCleanup(tree.unlock)
95
146
self.build_tree_contents([('foo', 'b\na\nc\n')])
96
147
creator = shelf.ShelfCreator(tree, tree.basis_tree())
97
148
self.addCleanup(creator.finalize)
151
def test_shelve_content_change(self):
152
creator = self.prepare_content_change()
98
153
self.assertEqual([('modify text', 'foo-id')],
99
154
list(creator.iter_shelvable()))
100
155
creator.shelve_lines('foo-id', ['a\n', 'c\n'])
102
157
self.assertFileEqual('a\nc\n', 'foo')
103
158
self.assertShelvedFileEqual('b\na\n', creator, 'foo-id')
105
def test_shelve_creation(self):
160
def test_shelve_change_handles_modify_text(self):
161
creator = self.prepare_content_change()
162
creator.shelve_change(('modify text', 'foo-id'))
164
self.assertFileEqual('a\n', 'foo')
165
self.assertShelvedFileEqual('b\na\nc\n', creator, 'foo-id')
167
def test_shelve_all(self):
168
creator = self.prepare_content_change()
171
self.assertFileEqual('a\n', 'foo')
172
self.assertShelvedFileEqual('b\na\nc\n', creator, 'foo-id')
174
def prepare_shelve_creation(self):
106
175
tree = self.make_branch_and_tree('.')
107
176
tree.lock_write()
108
177
self.addCleanup(tree.unlock)
114
183
self.assertEqual([('add file', 'bar-id', 'directory', 'bar'),
115
184
('add file', 'foo-id', 'file', 'foo')],
116
185
sorted(list(creator.iter_shelvable())))
117
creator.shelve_creation('foo-id')
118
creator.shelve_creation('bar-id')
188
def check_shelve_creation(self, creator, tree):
120
189
self.assertRaises(StopIteration,
121
190
tree.iter_entries_by_dir(['foo-id']).next)
122
191
s_trans_id = creator.shelf_transform.trans_id_file_id('foo-id')
129
198
self.assertEqual('directory',
130
199
creator.shelf_transform.final_kind(s_bar_trans_id))
132
def _test_shelve_symlink_creation(self, link_name, link_target):
201
def test_shelve_creation(self):
202
creator, tree = self.prepare_shelve_creation()
203
creator.shelve_creation('foo-id')
204
creator.shelve_creation('bar-id')
206
self.check_shelve_creation(creator, tree)
208
def test_shelve_change_handles_creation(self):
209
creator, tree = self.prepare_shelve_creation()
210
creator.shelve_change(('add file', 'foo-id', 'file', 'foo'))
211
creator.shelve_change(('add file', 'bar-id', 'directory', 'bar'))
213
self.check_shelve_creation(creator, tree)
215
def _test_shelve_symlink_creation(self, link_name, link_target,
216
shelve_change=False):
133
217
self.requireFeature(tests.SymlinkFeature)
134
218
tree = self.make_branch_and_tree('.')
135
219
tree.lock_write()
141
225
self.addCleanup(creator.finalize)
142
226
self.assertEqual([('add file', 'foo-id', 'symlink', link_name)],
143
227
list(creator.iter_shelvable()))
144
creator.shelve_creation('foo-id')
229
creator.shelve_change(('add file', 'foo-id', 'symlink', link_name))
231
creator.shelve_creation('foo-id')
145
232
creator.transform()
146
233
s_trans_id = creator.shelf_transform.trans_id_file_id('foo-id')
147
234
self.failIfExists(link_name)
158
245
self._test_shelve_symlink_creation(u'fo\N{Euro Sign}o',
159
246
u'b\N{Euro Sign}ar')
248
def test_shelve_change_handles_symlink_creation(self):
249
self._test_shelve_symlink_creation('foo', 'bar', shelve_change=True)
161
251
def _test_shelve_symlink_target_change(self, link_name,
162
old_target, new_target):
252
old_target, new_target,
253
shelve_change=False):
163
254
self.requireFeature(tests.SymlinkFeature)
164
255
tree = self.make_branch_and_tree('.')
165
256
tree.lock_write()
174
265
self.assertEqual([('modify target', 'foo-id', link_name,
175
266
old_target, new_target)],
176
267
list(creator.iter_shelvable()))
177
creator.shelve_modify_target('foo-id')
269
creator.shelve_change(('modify target', 'foo-id', link_name,
270
old_target, new_target))
272
creator.shelve_modify_target('foo-id')
178
273
creator.transform()
179
274
self.assertEqual(old_target, osutils.readlink(link_name))
180
275
s_trans_id = creator.shelf_transform.trans_id_file_id('foo-id')
191
286
self._test_shelve_symlink_target_change(
192
287
u'fo\N{Euro Sign}o', u'b\N{Euro Sign}ar', u'b\N{Euro Sign}az')
289
def test_shelve_change_handles_symlink_target_change(self):
290
self._test_shelve_symlink_target_change('foo', 'bar', 'baz',
194
293
def test_shelve_creation_no_contents(self):
195
294
tree = self.make_branch_and_tree('.')
196
295
tree.lock_write()
228
327
self.assertEqual([('delete file', 'bar-id', 'file', 'foo/bar'),
229
328
('delete file', 'foo-id', 'directory', 'foo')],
230
329
sorted(list(creator.iter_shelvable())))
231
creator.shelve_deletion('foo-id')
232
creator.shelve_deletion('bar-id')
332
def check_shelve_deletion(self, tree):
234
333
self.assertTrue('foo-id' in tree)
235
334
self.assertTrue('bar-id' in tree)
236
335
self.assertFileEqual('baz', 'tree/foo/bar')
337
def test_shelve_deletion(self):
338
creator, tree = self.prepare_shelve_deletion()
339
creator.shelve_deletion('foo-id')
340
creator.shelve_deletion('bar-id')
342
self.check_shelve_deletion(tree)
344
def test_shelve_change_handles_deletion(self):
345
creator, tree = self.prepare_shelve_deletion()
346
creator.shelve_change(('delete file', 'foo-id', 'directory', 'foo'))
347
creator.shelve_change(('delete file', 'bar-id', 'file', 'foo/bar'))
349
self.check_shelve_deletion(tree)
238
351
def test_shelve_delete_contents(self):
239
352
tree = self.make_branch_and_tree('tree')
240
353
self.build_tree(['tree/foo',])
241
354
tree.add('foo', 'foo-id')
242
355
tree.commit('Added file and directory')
243
356
os.unlink('tree/foo')
357
tree.lock_tree_write()
358
self.addCleanup(tree.unlock)
244
359
creator = shelf.ShelfCreator(tree, tree.basis_tree())
245
360
self.addCleanup(creator.finalize)
246
361
self.assertEqual([('delete file', 'foo-id', 'file', 'foo')],
249
364
creator.transform()
250
365
self.failUnlessExists('tree/foo')
252
def test_shelve_change_kind(self):
367
def prepare_shelve_change_kind(self):
253
368
tree = self.make_branch_and_tree('tree')
254
369
self.build_tree_contents([('tree/foo', 'bar')])
255
370
tree.add('foo', 'foo-id')
256
371
tree.commit('Added file and directory')
257
372
os.unlink('tree/foo')
258
373
os.mkdir('tree/foo')
374
tree.lock_tree_write()
375
self.addCleanup(tree.unlock)
259
376
creator = shelf.ShelfCreator(tree, tree.basis_tree())
260
377
self.addCleanup(creator.finalize)
261
378
self.assertEqual([('change kind', 'foo-id', 'file', 'directory',
262
379
'foo')], sorted(list(creator.iter_shelvable())))
382
def check_shelve_change_kind(self, creator):
383
self.assertFileEqual('bar', 'tree/foo')
384
s_trans_id = creator.shelf_transform.trans_id_file_id('foo-id')
385
self.assertEqual('directory',
386
creator.shelf_transform._new_contents[s_trans_id])
388
def test_shelve_change_kind(self):
389
creator = self.prepare_shelve_change_kind()
263
390
creator.shelve_content_change('foo-id')
264
391
creator.transform()
265
self.assertFileEqual('bar', 'tree/foo')
266
s_trans_id = creator.shelf_transform.trans_id_file_id('foo-id')
267
self.assertEqual('directory',
268
creator.shelf_transform._new_contents[s_trans_id])
392
self.check_shelve_change_kind(creator)
394
def test_shelve_change_handles_change_kind(self):
395
creator = self.prepare_shelve_change_kind()
396
creator.shelve_change(('change kind', 'foo-id', 'file', 'directory',
399
self.check_shelve_change_kind(creator)
401
def test_shelve_change_unknown_change(self):
402
tree = self.make_branch_and_tree('tree')
403
tree.lock_tree_write()
404
self.addCleanup(tree.unlock)
405
creator = shelf.ShelfCreator(tree, tree.basis_tree())
406
self.addCleanup(creator.finalize)
407
e = self.assertRaises(ValueError, creator.shelve_change, ('unknown',))
408
self.assertEqual('Unknown change kind: "unknown"', str(e))
270
410
def test_shelve_unversion(self):
271
411
tree = self.make_branch_and_tree('tree')
273
413
tree.add('foo', 'foo-id')
274
414
tree.commit('Added file and directory')
275
415
tree.unversion(['foo-id'])
416
tree.lock_tree_write()
417
self.addCleanup(tree.unlock)
276
418
creator = shelf.ShelfCreator(tree, tree.basis_tree())
277
419
self.addCleanup(creator.finalize)
278
420
self.assertEqual([('delete file', 'foo-id', 'file', 'foo')],
297
441
tree = self.make_branch_and_tree('tree')
298
442
self.build_tree(['tree/foo'])
299
443
tree.add('foo', 'foo-id')
444
tree.lock_tree_write()
445
self.addCleanup(tree.unlock)
300
446
creator = shelf.ShelfCreator(tree, tree.basis_tree())
301
447
self.addCleanup(creator.finalize)
302
448
list(creator.iter_shelvable())
322
468
def test_shelve_unversioned(self):
323
469
tree = self.make_branch_and_tree('tree')
324
self.assertRaises(errors.PathsNotVersionedError,
325
shelf.ShelfCreator, tree, tree.basis_tree(), ['foo'])
470
tree.lock_tree_write()
472
self.assertRaises(errors.PathsNotVersionedError,
473
shelf.ShelfCreator, tree, tree.basis_tree(), ['foo'])
326
476
# We should be able to lock/unlock the tree if ShelfCreator cleaned
328
478
wt = workingtree.WorkingTree.open('tree')
331
481
# And a second tentative should raise the same error (no
332
482
# limbo/pending_deletion leftovers).
333
self.assertRaises(errors.PathsNotVersionedError,
334
shelf.ShelfCreator, tree, tree.basis_tree(), ['foo'])
483
tree.lock_tree_write()
485
self.assertRaises(errors.PathsNotVersionedError,
486
shelf.ShelfCreator, tree, tree.basis_tree(), ['foo'])
490
def test_shelve_skips_added_root(self):
491
"""Skip adds of the root when iterating through shelvable changes."""
492
tree = self.make_branch_and_tree('tree')
493
tree.lock_tree_write()
494
self.addCleanup(tree.unlock)
495
creator = shelf.ShelfCreator(tree, tree.basis_tree())
496
self.addCleanup(creator.finalize)
497
self.assertEqual([], list(creator.iter_shelvable()))
499
def test_shelve_skips_added_root(self):
500
"""Skip adds of the root when iterating through shelvable changes."""
501
tree = self.make_branch_and_tree('tree')
502
tree.lock_tree_write()
503
self.addCleanup(tree.unlock)
504
creator = shelf.ShelfCreator(tree, tree.basis_tree())
505
self.addCleanup(creator.finalize)
506
self.assertEqual([], list(creator.iter_shelvable()))
337
509
class TestUnshelver(tests.TestCaseWithTransport):
549
725
shelf_id = shelf_manager.shelve_changes(creator)
550
726
self.failIfExists('tree/foo')
551
727
unshelver = shelf_manager.get_unshelver(shelf_id)
728
self.addCleanup(unshelver.finalize)
552
729
unshelver.make_merger().do_merge()
553
730
self.assertFileEqual('bar', 'tree/foo')
555
732
def test_get_metadata(self):
556
733
tree = self.make_branch_and_tree('.')
734
tree.lock_tree_write()
735
self.addCleanup(tree.unlock)
557
736
creator = shelf.ShelfCreator(tree, tree.basis_tree())
737
self.addCleanup(creator.finalize)
558
738
shelf_manager = tree.get_shelf_manager()
559
739
shelf_id = shelf_manager.shelve_changes(creator, 'foo')
560
740
metadata = shelf_manager.get_metadata(shelf_id)