46
46
tree.add(['foo'], ['foo-id'])
48
48
tree.rename_one('foo', 'bar')
49
tree.lock_tree_write()
50
self.addCleanup(tree.unlock)
51
49
creator = shelf.ShelfCreator(tree, tree.basis_tree())
52
50
self.addCleanup(creator.finalize)
53
51
self.assertEqual([('rename', 'foo-id', 'foo', 'bar')],
78
76
tree.add(['foo', 'bar', 'foo/baz'], ['foo-id', 'bar-id', 'baz-id'])
80
78
tree.rename_one('foo/baz', 'bar/baz')
81
tree.lock_tree_write()
82
self.addCleanup(tree.unlock)
83
79
creator = shelf.ShelfCreator(tree, tree.basis_tree())
84
80
self.addCleanup(creator.finalize)
85
81
self.assertEqual([('rename', 'baz-id', 'foo/baz', 'bar/baz')],
108
104
creator.shelve_change(('rename', 'baz-id', 'foo/baz', 'bar/baz'))
109
105
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()))
134
107
def assertShelvedFileEqual(self, expected_content, creator, file_id):
135
108
s_trans_id = creator.shelf_transform.trans_id_file_id(file_id)
136
109
shelf_file = creator.shelf_transform._limbo_name(s_trans_id)
137
110
self.assertFileEqual(expected_content, shelf_file)
139
def prepare_content_change(self):
112
def test_shelve_content_change(self):
140
113
tree = self.make_branch_and_tree('.')
141
114
tree.lock_write()
142
115
self.addCleanup(tree.unlock)
146
119
self.build_tree_contents([('foo', 'b\na\nc\n')])
147
120
creator = shelf.ShelfCreator(tree, tree.basis_tree())
148
121
self.addCleanup(creator.finalize)
151
def test_shelve_content_change(self):
152
creator = self.prepare_content_change()
153
122
self.assertEqual([('modify text', 'foo-id')],
154
123
list(creator.iter_shelvable()))
155
124
creator.shelve_lines('foo-id', ['a\n', 'c\n'])
157
126
self.assertFileEqual('a\nc\n', 'foo')
158
127
self.assertShelvedFileEqual('b\na\n', creator, 'foo-id')
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
130
def prepare_shelve_creation(self):
175
131
tree = self.make_branch_and_tree('.')
191
147
s_trans_id = creator.shelf_transform.trans_id_file_id('foo-id')
192
148
self.assertEqual('foo-id',
193
149
creator.shelf_transform.final_file_id(s_trans_id))
194
self.assertPathDoesNotExist('foo')
195
self.assertPathDoesNotExist('bar')
150
self.failIfExists('foo')
151
self.failIfExists('bar')
196
152
self.assertShelvedFileEqual('a\n', creator, 'foo-id')
197
153
s_bar_trans_id = creator.shelf_transform.trans_id_file_id('bar-id')
198
154
self.assertEqual('directory',
231
187
creator.shelve_creation('foo-id')
232
188
creator.transform()
233
189
s_trans_id = creator.shelf_transform.trans_id_file_id('foo-id')
234
self.assertPathDoesNotExist(link_name)
190
self.failIfExists(link_name)
235
191
limbo_name = creator.shelf_transform._limbo_name(s_trans_id)
236
192
self.assertEqual(link_target, osutils.readlink(limbo_name))
237
193
ptree = creator.shelf_transform.get_preview_tree()
310
266
s_trans_id = creator.shelf_transform.trans_id_file_id('foo-id')
311
267
self.assertEqual('foo-id',
312
268
creator.shelf_transform.final_file_id(s_trans_id))
313
self.assertPathDoesNotExist('foo')
269
self.failIfExists('foo')
315
271
def prepare_shelve_deletion(self):
316
272
tree = self.make_branch_and_tree('tree')
330
286
return creator, tree
332
288
def check_shelve_deletion(self, tree):
333
self.assertTrue(tree.has_id('foo-id'))
334
self.assertTrue(tree.has_id('bar-id'))
289
self.assertTrue('foo-id' in tree)
290
self.assertTrue('bar-id' in tree)
335
291
self.assertFileEqual('baz', 'tree/foo/bar')
337
293
def test_shelve_deletion(self):
354
310
tree.add('foo', 'foo-id')
355
311
tree.commit('Added file and directory')
356
312
os.unlink('tree/foo')
357
tree.lock_tree_write()
358
self.addCleanup(tree.unlock)
359
313
creator = shelf.ShelfCreator(tree, tree.basis_tree())
360
314
self.addCleanup(creator.finalize)
361
315
self.assertEqual([('delete file', 'foo-id', 'file', 'foo')],
362
316
sorted(list(creator.iter_shelvable())))
363
317
creator.shelve_deletion('foo-id')
364
318
creator.transform()
365
self.assertPathExists('tree/foo')
319
self.failUnlessExists('tree/foo')
367
321
def prepare_shelve_change_kind(self):
368
322
tree = self.make_branch_and_tree('tree')
371
325
tree.commit('Added file and directory')
372
326
os.unlink('tree/foo')
373
327
os.mkdir('tree/foo')
374
tree.lock_tree_write()
375
self.addCleanup(tree.unlock)
376
328
creator = shelf.ShelfCreator(tree, tree.basis_tree())
377
329
self.addCleanup(creator.finalize)
378
330
self.assertEqual([('change kind', 'foo-id', 'file', 'directory',
401
353
def test_shelve_change_unknown_change(self):
402
354
tree = self.make_branch_and_tree('tree')
403
tree.lock_tree_write()
404
self.addCleanup(tree.unlock)
405
355
creator = shelf.ShelfCreator(tree, tree.basis_tree())
406
356
self.addCleanup(creator.finalize)
407
357
e = self.assertRaises(ValueError, creator.shelve_change, ('unknown',))
413
363
tree.add('foo', 'foo-id')
414
364
tree.commit('Added file and directory')
415
365
tree.unversion(['foo-id'])
416
tree.lock_tree_write()
417
self.addCleanup(tree.unlock)
418
366
creator = shelf.ShelfCreator(tree, tree.basis_tree())
419
367
self.addCleanup(creator.finalize)
420
368
self.assertEqual([('delete file', 'foo-id', 'file', 'foo')],
421
369
sorted(list(creator.iter_shelvable())))
422
370
creator.shelve_deletion('foo-id')
423
371
creator.transform()
424
self.assertPathExists('tree/foo')
372
self.failUnlessExists('tree/foo')
426
374
def test_shelve_serialization(self):
427
375
tree = self.make_branch_and_tree('.')
428
tree.lock_tree_write()
429
self.addCleanup(tree.unlock)
430
376
creator = shelf.ShelfCreator(tree, tree.basis_tree())
431
377
self.addCleanup(creator.finalize)
432
378
shelf_file = open('shelf', 'wb')
441
387
tree = self.make_branch_and_tree('tree')
442
388
self.build_tree(['tree/foo'])
443
389
tree.add('foo', 'foo-id')
444
tree.lock_tree_write()
445
self.addCleanup(tree.unlock)
446
390
creator = shelf.ShelfCreator(tree, tree.basis_tree())
447
391
self.addCleanup(creator.finalize)
448
392
list(creator.iter_shelvable())
468
412
def test_shelve_unversioned(self):
469
413
tree = self.make_branch_and_tree('tree')
470
tree.lock_tree_write()
472
self.assertRaises(errors.PathsNotVersionedError,
473
shelf.ShelfCreator, tree, tree.basis_tree(), ['foo'])
414
self.assertRaises(errors.PathsNotVersionedError,
415
shelf.ShelfCreator, tree, tree.basis_tree(), ['foo'])
476
416
# We should be able to lock/unlock the tree if ShelfCreator cleaned
478
418
wt = workingtree.WorkingTree.open('tree')
481
421
# And a second tentative should raise the same error (no
482
422
# limbo/pending_deletion leftovers).
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()))
423
self.assertRaises(errors.PathsNotVersionedError,
424
shelf.ShelfCreator, tree, tree.basis_tree(), ['foo'])
509
427
class TestUnshelver(tests.TestCaseWithTransport):
550
467
self.build_tree_contents([('tree/foo', 'z\na\nb\nc\n')])
551
468
shelf_file.seek(0)
552
469
unshelver = shelf.Unshelver.from_tree_and_shelf(tree, shelf_file)
553
self.addCleanup(unshelver.finalize)
554
470
unshelver.make_merger().do_merge()
555
471
self.assertFileEqual('z\na\nb\nd\n', 'tree/foo')
568
484
list(creator.iter_shelvable())
569
485
creator.shelve_deletion('foo-id')
570
486
creator.shelve_deletion('bar-id')
571
with open('shelf', 'w+b') as shelf_file:
572
creator.write_shelf(shelf_file)
487
shelf_file = open('shelf', 'w+b')
488
self.addCleanup(shelf_file.close)
489
creator.write_shelf(shelf_file)
575
492
# validate the test setup
576
self.assertTrue(tree.has_id('foo-id'))
577
self.assertTrue(tree.has_id('bar-id'))
493
self.assertTrue('foo-id' in tree)
494
self.assertTrue('bar-id' in tree)
578
495
self.assertFileEqual('baz', 'tree/foo/bar')
579
with open('shelf', 'r+b') as shelf_file:
580
unshelver = shelf.Unshelver.from_tree_and_shelf(tree, shelf_file)
581
self.addCleanup(unshelver.finalize)
582
unshelver.make_merger().do_merge()
583
self.assertFalse(tree.has_id('foo-id'))
584
self.assertFalse(tree.has_id('bar-id'))
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)
586
502
def test_unshelve_base(self):
587
503
tree = self.make_branch_and_tree('tree')
609
525
shelf_file = open('shelf', 'rb')
610
526
self.addCleanup(shelf_file.close)
611
527
unshelver = shelf.Unshelver.from_tree_and_shelf(tree, shelf_file)
614
529
def test_corrupt_shelf(self):
615
530
tree = self.make_branch_and_tree('.')
623
538
self.assertEqual('Shelf corrupt.', str(e))
625
def test_unshelve_subdir_in_now_removed_dir(self):
626
tree = self.make_branch_and_tree('.')
627
self.addCleanup(tree.lock_write().unlock)
628
self.build_tree(['dir/', 'dir/subdir/', 'dir/subdir/foo'])
629
tree.add(['dir'], ['dir-id'])
630
tree.commit('versioned dir')
631
tree.add(['dir/subdir', 'dir/subdir/foo'], ['subdir-id', 'foo-id'])
632
creator = shelf.ShelfCreator(tree, tree.basis_tree())
633
self.addCleanup(creator.finalize)
634
for change in creator.iter_shelvable():
635
creator.shelve_change(change)
636
shelf_manager = tree.get_shelf_manager()
637
shelf_id = shelf_manager.shelve_changes(creator)
638
self.assertPathDoesNotExist('dir/subdir')
640
unshelver = shelf_manager.get_unshelver(shelf_id)
641
self.addCleanup(unshelver.finalize)
642
unshelver.make_merger().do_merge()
643
self.assertPathExists('dir/subdir/foo')
644
self.assertEqual('dir-id', tree.path2id('dir'))
645
self.assertEqual('subdir-id', tree.path2id('dir/subdir'))
646
self.assertEqual('foo-id', tree.path2id('dir/subdir/foo'))
649
541
class TestShelfManager(tests.TestCaseWithTransport):
745
637
creator.shelve_creation('foo-id')
746
638
shelf_manager = tree.get_shelf_manager()
747
639
shelf_id = shelf_manager.shelve_changes(creator)
748
self.assertPathDoesNotExist('tree/foo')
640
self.failIfExists('tree/foo')
749
641
unshelver = shelf_manager.get_unshelver(shelf_id)
750
self.addCleanup(unshelver.finalize)
751
642
unshelver.make_merger().do_merge()
752
643
self.assertFileEqual('bar', 'tree/foo')
754
645
def test_get_metadata(self):
755
646
tree = self.make_branch_and_tree('.')
756
tree.lock_tree_write()
757
self.addCleanup(tree.unlock)
758
647
creator = shelf.ShelfCreator(tree, tree.basis_tree())
759
self.addCleanup(creator.finalize)
760
648
shelf_manager = tree.get_shelf_manager()
761
649
shelf_id = shelf_manager.shelve_changes(creator, 'foo')
762
650
metadata = shelf_manager.get_metadata(shelf_id)