46
49
tree.add(['foo'], ['foo-id'])
48
51
tree.rename_one('foo', 'bar')
52
tree.lock_tree_write()
53
self.addCleanup(tree.unlock)
49
54
creator = shelf.ShelfCreator(tree, tree.basis_tree())
50
55
self.addCleanup(creator.finalize)
51
56
self.assertEqual([('rename', 'foo-id', 'foo', 'bar')],
76
81
tree.add(['foo', 'bar', 'foo/baz'], ['foo-id', 'bar-id', 'baz-id'])
78
83
tree.rename_one('foo/baz', 'bar/baz')
84
tree.lock_tree_write()
85
self.addCleanup(tree.unlock)
79
86
creator = shelf.ShelfCreator(tree, tree.basis_tree())
80
87
self.addCleanup(creator.finalize)
81
88
self.assertEqual([('rename', 'baz-id', 'foo/baz', 'bar/baz')],
104
111
creator.shelve_change(('rename', 'baz-id', 'foo/baz', 'bar/baz'))
105
112
self.check_shelve_move(creator, tree)
114
def test_shelve_changed_root_id(self):
115
tree = self.make_branch_and_tree('.')
116
self.build_tree(['foo'])
117
tree.set_root_id('first-root-id')
118
tree.add(['foo'], ['foo-id'])
120
tree.set_root_id('second-root-id')
121
tree.lock_tree_write()
122
self.addCleanup(tree.unlock)
123
creator = shelf.ShelfCreator(tree, tree.basis_tree())
124
self.addCleanup(creator.finalize)
125
self.expectFailure('shelf doesn\'t support shelving root changes yet',
127
('delete file', 'first-root-id', 'directory', ''),
128
('add file', 'second-root-id', 'directory', ''),
129
('rename', 'foo-id', u'foo', u'foo'),
130
], list(creator.iter_shelvable()))
132
self.assertEqual([('delete file', 'first-root-id', 'directory', ''),
133
('add file', 'second-root-id', 'directory', ''),
134
('rename', 'foo-id', u'foo', u'foo'),
135
], list(creator.iter_shelvable()))
107
137
def assertShelvedFileEqual(self, expected_content, creator, file_id):
108
138
s_trans_id = creator.shelf_transform.trans_id_file_id(file_id)
109
139
shelf_file = creator.shelf_transform._limbo_name(s_trans_id)
110
140
self.assertFileEqual(expected_content, shelf_file)
112
def test_shelve_content_change(self):
142
def prepare_content_change(self):
113
143
tree = self.make_branch_and_tree('.')
114
144
tree.lock_write()
115
145
self.addCleanup(tree.unlock)
119
149
self.build_tree_contents([('foo', 'b\na\nc\n')])
120
150
creator = shelf.ShelfCreator(tree, tree.basis_tree())
121
151
self.addCleanup(creator.finalize)
154
def test_shelve_content_change(self):
155
creator = self.prepare_content_change()
122
156
self.assertEqual([('modify text', 'foo-id')],
123
157
list(creator.iter_shelvable()))
124
158
creator.shelve_lines('foo-id', ['a\n', 'c\n'])
126
160
self.assertFileEqual('a\nc\n', 'foo')
127
161
self.assertShelvedFileEqual('b\na\n', creator, 'foo-id')
163
def test_shelve_change_handles_modify_text(self):
164
creator = self.prepare_content_change()
165
creator.shelve_change(('modify text', 'foo-id'))
167
self.assertFileEqual('a\n', 'foo')
168
self.assertShelvedFileEqual('b\na\nc\n', creator, 'foo-id')
170
def test_shelve_all(self):
171
creator = self.prepare_content_change()
174
self.assertFileEqual('a\n', 'foo')
175
self.assertShelvedFileEqual('b\na\nc\n', creator, 'foo-id')
130
177
def prepare_shelve_creation(self):
131
178
tree = self.make_branch_and_tree('.')
147
194
s_trans_id = creator.shelf_transform.trans_id_file_id('foo-id')
148
195
self.assertEqual('foo-id',
149
196
creator.shelf_transform.final_file_id(s_trans_id))
150
self.failIfExists('foo')
151
self.failIfExists('bar')
197
self.assertPathDoesNotExist('foo')
198
self.assertPathDoesNotExist('bar')
152
199
self.assertShelvedFileEqual('a\n', creator, 'foo-id')
153
200
s_bar_trans_id = creator.shelf_transform.trans_id_file_id('bar-id')
154
201
self.assertEqual('directory',
171
218
def _test_shelve_symlink_creation(self, link_name, link_target,
172
219
shelve_change=False):
173
self.requireFeature(tests.SymlinkFeature)
220
self.requireFeature(features.SymlinkFeature)
174
221
tree = self.make_branch_and_tree('.')
175
222
tree.lock_write()
176
223
self.addCleanup(tree.unlock)
187
234
creator.shelve_creation('foo-id')
188
235
creator.transform()
189
236
s_trans_id = creator.shelf_transform.trans_id_file_id('foo-id')
190
self.failIfExists(link_name)
237
self.assertPathDoesNotExist(link_name)
191
238
limbo_name = creator.shelf_transform._limbo_name(s_trans_id)
192
239
self.assertEqual(link_target, osutils.readlink(limbo_name))
193
240
ptree = creator.shelf_transform.get_preview_tree()
197
244
self._test_shelve_symlink_creation('foo', 'bar')
199
246
def test_shelve_unicode_symlink_creation(self):
200
self.requireFeature(tests.UnicodeFilenameFeature)
247
self.requireFeature(features.UnicodeFilenameFeature)
201
248
self._test_shelve_symlink_creation(u'fo\N{Euro Sign}o',
202
249
u'b\N{Euro Sign}ar')
207
254
def _test_shelve_symlink_target_change(self, link_name,
208
255
old_target, new_target,
209
256
shelve_change=False):
210
self.requireFeature(tests.SymlinkFeature)
257
self.requireFeature(features.SymlinkFeature)
211
258
tree = self.make_branch_and_tree('.')
212
259
tree.lock_write()
213
260
self.addCleanup(tree.unlock)
238
285
self._test_shelve_symlink_target_change('foo', 'bar', 'baz')
240
287
def test_shelve_unicode_symlink_target_change(self):
241
self.requireFeature(tests.UnicodeFilenameFeature)
288
self.requireFeature(features.UnicodeFilenameFeature)
242
289
self._test_shelve_symlink_target_change(
243
290
u'fo\N{Euro Sign}o', u'b\N{Euro Sign}ar', u'b\N{Euro Sign}az')
266
313
s_trans_id = creator.shelf_transform.trans_id_file_id('foo-id')
267
314
self.assertEqual('foo-id',
268
315
creator.shelf_transform.final_file_id(s_trans_id))
269
self.failIfExists('foo')
316
self.assertPathDoesNotExist('foo')
271
318
def prepare_shelve_deletion(self):
272
319
tree = self.make_branch_and_tree('tree')
286
333
return creator, tree
288
335
def check_shelve_deletion(self, tree):
289
self.assertTrue('foo-id' in tree)
290
self.assertTrue('bar-id' in tree)
336
self.assertTrue(tree.has_id('foo-id'))
337
self.assertTrue(tree.has_id('bar-id'))
291
338
self.assertFileEqual('baz', 'tree/foo/bar')
293
340
def test_shelve_deletion(self):
310
357
tree.add('foo', 'foo-id')
311
358
tree.commit('Added file and directory')
312
359
os.unlink('tree/foo')
360
tree.lock_tree_write()
361
self.addCleanup(tree.unlock)
313
362
creator = shelf.ShelfCreator(tree, tree.basis_tree())
314
363
self.addCleanup(creator.finalize)
315
364
self.assertEqual([('delete file', 'foo-id', 'file', 'foo')],
316
365
sorted(list(creator.iter_shelvable())))
317
366
creator.shelve_deletion('foo-id')
318
367
creator.transform()
319
self.failUnlessExists('tree/foo')
368
self.assertPathExists('tree/foo')
321
370
def prepare_shelve_change_kind(self):
322
371
tree = self.make_branch_and_tree('tree')
325
374
tree.commit('Added file and directory')
326
375
os.unlink('tree/foo')
327
376
os.mkdir('tree/foo')
377
tree.lock_tree_write()
378
self.addCleanup(tree.unlock)
328
379
creator = shelf.ShelfCreator(tree, tree.basis_tree())
329
380
self.addCleanup(creator.finalize)
330
381
self.assertEqual([('change kind', 'foo-id', 'file', 'directory',
353
404
def test_shelve_change_unknown_change(self):
354
405
tree = self.make_branch_and_tree('tree')
406
tree.lock_tree_write()
407
self.addCleanup(tree.unlock)
355
408
creator = shelf.ShelfCreator(tree, tree.basis_tree())
356
409
self.addCleanup(creator.finalize)
357
410
e = self.assertRaises(ValueError, creator.shelve_change, ('unknown',))
363
416
tree.add('foo', 'foo-id')
364
417
tree.commit('Added file and directory')
365
418
tree.unversion(['foo-id'])
419
tree.lock_tree_write()
420
self.addCleanup(tree.unlock)
366
421
creator = shelf.ShelfCreator(tree, tree.basis_tree())
367
422
self.addCleanup(creator.finalize)
368
423
self.assertEqual([('delete file', 'foo-id', 'file', 'foo')],
369
424
sorted(list(creator.iter_shelvable())))
370
425
creator.shelve_deletion('foo-id')
371
426
creator.transform()
372
self.failUnlessExists('tree/foo')
427
self.assertPathExists('tree/foo')
374
429
def test_shelve_serialization(self):
375
430
tree = self.make_branch_and_tree('.')
431
tree.lock_tree_write()
432
self.addCleanup(tree.unlock)
376
433
creator = shelf.ShelfCreator(tree, tree.basis_tree())
377
434
self.addCleanup(creator.finalize)
378
435
shelf_file = open('shelf', 'wb')
387
444
tree = self.make_branch_and_tree('tree')
388
445
self.build_tree(['tree/foo'])
389
446
tree.add('foo', 'foo-id')
447
tree.lock_tree_write()
448
self.addCleanup(tree.unlock)
390
449
creator = shelf.ShelfCreator(tree, tree.basis_tree())
391
450
self.addCleanup(creator.finalize)
392
451
list(creator.iter_shelvable())
412
471
def test_shelve_unversioned(self):
413
472
tree = self.make_branch_and_tree('tree')
414
self.assertRaises(errors.PathsNotVersionedError,
415
shelf.ShelfCreator, tree, tree.basis_tree(), ['foo'])
473
tree.lock_tree_write()
475
self.assertRaises(errors.PathsNotVersionedError,
476
shelf.ShelfCreator, tree, tree.basis_tree(), ['foo'])
416
479
# We should be able to lock/unlock the tree if ShelfCreator cleaned
418
481
wt = workingtree.WorkingTree.open('tree')
421
484
# And a second tentative should raise the same error (no
422
485
# limbo/pending_deletion leftovers).
423
self.assertRaises(errors.PathsNotVersionedError,
424
shelf.ShelfCreator, tree, tree.basis_tree(), ['foo'])
486
tree.lock_tree_write()
488
self.assertRaises(errors.PathsNotVersionedError,
489
shelf.ShelfCreator, tree, tree.basis_tree(), ['foo'])
493
def test_shelve_skips_added_root(self):
494
"""Skip adds of the root when iterating through shelvable changes."""
495
tree = self.make_branch_and_tree('tree')
496
tree.lock_tree_write()
497
self.addCleanup(tree.unlock)
498
creator = shelf.ShelfCreator(tree, tree.basis_tree())
499
self.addCleanup(creator.finalize)
500
self.assertEqual([], list(creator.iter_shelvable()))
502
def test_shelve_skips_added_root(self):
503
"""Skip adds of the root when iterating through shelvable changes."""
504
tree = self.make_branch_and_tree('tree')
505
tree.lock_tree_write()
506
self.addCleanup(tree.unlock)
507
creator = shelf.ShelfCreator(tree, tree.basis_tree())
508
self.addCleanup(creator.finalize)
509
self.assertEqual([], list(creator.iter_shelvable()))
427
512
class TestUnshelver(tests.TestCaseWithTransport):
467
553
self.build_tree_contents([('tree/foo', 'z\na\nb\nc\n')])
468
554
shelf_file.seek(0)
469
555
unshelver = shelf.Unshelver.from_tree_and_shelf(tree, shelf_file)
556
self.addCleanup(unshelver.finalize)
470
557
unshelver.make_merger().do_merge()
471
558
self.assertFileEqual('z\na\nb\nd\n', 'tree/foo')
484
571
list(creator.iter_shelvable())
485
572
creator.shelve_deletion('foo-id')
486
573
creator.shelve_deletion('bar-id')
487
shelf_file = open('shelf', 'w+b')
488
self.addCleanup(shelf_file.close)
489
creator.write_shelf(shelf_file)
574
with open('shelf', 'w+b') as shelf_file:
575
creator.write_shelf(shelf_file)
492
578
# validate the test setup
493
self.assertTrue('foo-id' in tree)
494
self.assertTrue('bar-id' in tree)
579
self.assertTrue(tree.has_id('foo-id'))
580
self.assertTrue(tree.has_id('bar-id'))
495
581
self.assertFileEqual('baz', 'tree/foo/bar')
497
unshelver = shelf.Unshelver.from_tree_and_shelf(tree, shelf_file)
498
unshelver.make_merger().do_merge()
499
self.assertFalse('foo-id' in tree)
500
self.assertFalse('bar-id' in tree)
582
with open('shelf', 'r+b') as shelf_file:
583
unshelver = shelf.Unshelver.from_tree_and_shelf(tree, shelf_file)
584
self.addCleanup(unshelver.finalize)
585
unshelver.make_merger().do_merge()
586
self.assertFalse(tree.has_id('foo-id'))
587
self.assertFalse(tree.has_id('bar-id'))
502
589
def test_unshelve_base(self):
503
590
tree = self.make_branch_and_tree('tree')
525
612
shelf_file = open('shelf', 'rb')
526
613
self.addCleanup(shelf_file.close)
527
614
unshelver = shelf.Unshelver.from_tree_and_shelf(tree, shelf_file)
529
617
def test_corrupt_shelf(self):
530
618
tree = self.make_branch_and_tree('.')
538
626
self.assertEqual('Shelf corrupt.', str(e))
628
def test_unshelve_subdir_in_now_removed_dir(self):
629
tree = self.make_branch_and_tree('.')
630
self.addCleanup(tree.lock_write().unlock)
631
self.build_tree(['dir/', 'dir/subdir/', 'dir/subdir/foo'])
632
tree.add(['dir'], ['dir-id'])
633
tree.commit('versioned dir')
634
tree.add(['dir/subdir', 'dir/subdir/foo'], ['subdir-id', 'foo-id'])
635
creator = shelf.ShelfCreator(tree, tree.basis_tree())
636
self.addCleanup(creator.finalize)
637
for change in creator.iter_shelvable():
638
creator.shelve_change(change)
639
shelf_manager = tree.get_shelf_manager()
640
shelf_id = shelf_manager.shelve_changes(creator)
641
self.assertPathDoesNotExist('dir/subdir')
643
unshelver = shelf_manager.get_unshelver(shelf_id)
644
self.addCleanup(unshelver.finalize)
645
unshelver.make_merger().do_merge()
646
self.assertPathExists('dir/subdir/foo')
647
self.assertEqual('dir-id', tree.path2id('dir'))
648
self.assertEqual('subdir-id', tree.path2id('dir/subdir'))
649
self.assertEqual('foo-id', tree.path2id('dir/subdir/foo'))
541
652
class TestShelfManager(tests.TestCaseWithTransport):
637
748
creator.shelve_creation('foo-id')
638
749
shelf_manager = tree.get_shelf_manager()
639
750
shelf_id = shelf_manager.shelve_changes(creator)
640
self.failIfExists('tree/foo')
751
self.assertPathDoesNotExist('tree/foo')
641
752
unshelver = shelf_manager.get_unshelver(shelf_id)
753
self.addCleanup(unshelver.finalize)
642
754
unshelver.make_merger().do_merge()
643
755
self.assertFileEqual('bar', 'tree/foo')
645
757
def test_get_metadata(self):
646
758
tree = self.make_branch_and_tree('.')
759
tree.lock_tree_write()
760
self.addCleanup(tree.unlock)
647
761
creator = shelf.ShelfCreator(tree, tree.basis_tree())
762
self.addCleanup(creator.finalize)
648
763
shelf_manager = tree.get_shelf_manager()
649
764
shelf_id = shelf_manager.shelve_changes(creator, 'foo')
650
765
metadata = shelf_manager.get_metadata(shelf_id)