/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
0.12.12 by Aaron Bentley
Implement shelf creator
1
# Copyright (C) 2008 Aaron Bentley <aaron@aaronbentley.com>
2
#
3
#    This program is free software; you can redistribute it and/or modify
4
#    it under the terms of the GNU General Public License as published by
5
#    the Free Software Foundation; either version 2 of the License, or
6
#    (at your option) any later version.
7
#
8
#    This program is distributed in the hope that it will be useful,
9
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
10
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
#    GNU General Public License for more details.
12
#
13
#    You should have received a copy of the GNU General Public License
14
#    along with this program; if not, write to the Free Software
15
#    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
0.12.17 by Aaron Bentley
Handle creating symlinks
17
import os
18
0.12.19 by Aaron Bentley
Add support for writing shelves
19
from bzrlib import pack, tests, transform
0.14.7 by Aaron Bentley
Misc test cleanup
20
from bzrlib.plugins.shelf2 import shelf, serialize_transform
0.12.12 by Aaron Bentley
Implement shelf creator
21
22
23
class TestPrepareShelf(tests.TestCaseWithTransport):
24
25
    def test_shelve_rename(self):
26
        tree = self.make_branch_and_tree('.')
27
        self.build_tree(['foo'])
28
        tree.add(['foo'], ['foo-id'])
29
        tree.commit('foo')
30
        tree.rename_one('foo', 'bar')
0.14.7 by Aaron Bentley
Misc test cleanup
31
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
0.12.12 by Aaron Bentley
Implement shelf creator
32
        self.addCleanup(creator.finalize)
33
        self.assertEqual([('rename', 'foo-id', 'foo', 'bar')], list(creator))
34
        creator.shelve_rename('foo-id')
35
        work_trans_id = creator.work_transform.trans_id_file_id('foo-id')
36
        self.assertEqual('foo', creator.work_transform.final_name(
37
                         work_trans_id))
38
        shelf_trans_id = creator.shelf_transform.trans_id_file_id('foo-id')
39
        self.assertEqual('bar', creator.shelf_transform.final_name(
40
                         shelf_trans_id))
41
42
    def test_shelve_move(self):
43
        tree = self.make_branch_and_tree('.')
44
        self.build_tree(['foo/', 'bar/', 'foo/baz'])
45
        tree.add(['foo', 'bar', 'foo/baz'], ['foo-id', 'bar-id', 'baz-id'])
46
        tree.commit('foo')
47
        tree.rename_one('foo/baz', 'bar/baz')
0.14.7 by Aaron Bentley
Misc test cleanup
48
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
0.12.12 by Aaron Bentley
Implement shelf creator
49
        self.addCleanup(creator.finalize)
50
        self.assertEqual([('rename', 'baz-id', 'foo/baz', 'bar/baz')],
51
                         list(creator))
52
        creator.shelve_rename('baz-id')
53
        work_trans_id = creator.work_transform.trans_id_file_id('baz-id')
54
        work_foo = creator.work_transform.trans_id_file_id('foo-id')
55
        self.assertEqual(work_foo, creator.work_transform.final_parent(
56
                         work_trans_id))
57
        shelf_trans_id = creator.shelf_transform.trans_id_file_id('baz-id')
58
        shelf_bar = creator.shelf_transform.trans_id_file_id('bar-id')
59
        self.assertEqual(shelf_bar, creator.shelf_transform.final_parent(
60
                         shelf_trans_id))
0.12.13 by Aaron Bentley
Implement shelving content
61
        creator.transform()
62
        self.assertEqual('foo/baz', tree.id2path('baz-id'))
63
0.12.14 by Aaron Bentley
Add shelving of created files
64
    def assertShelvedFileEqual(self, expected_content, creator, file_id):
65
        s_trans_id = creator.shelf_transform.trans_id_file_id(file_id)
66
        shelf_file = creator.shelf_transform._limbo_name(s_trans_id)
67
        self.assertFileEqual(expected_content, shelf_file)
68
0.12.13 by Aaron Bentley
Implement shelving content
69
    def test_shelve_content_change(self):
70
        tree = self.make_branch_and_tree('.')
71
        tree.lock_write()
72
        self.addCleanup(tree.unlock)
73
        self.build_tree_contents([('foo', 'a\n')])
74
        tree.add('foo', 'foo-id')
75
        tree.commit('Committed foo')
76
        self.build_tree_contents([('foo', 'b\na\nc\n')])
0.14.7 by Aaron Bentley
Misc test cleanup
77
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
0.12.13 by Aaron Bentley
Implement shelving content
78
        self.addCleanup(creator.finalize)
79
        self.assertEqual([('modify text', 'foo-id')], list(creator))
0.14.14 by Aaron Bentley
Change shelf_text to shelve_lines
80
        creator.shelve_lines('foo-id', ['a\n', 'c\n'])
0.12.13 by Aaron Bentley
Implement shelving content
81
        creator.transform()
82
        self.assertFileEqual('a\nc\n', 'foo')
0.12.14 by Aaron Bentley
Add shelving of created files
83
        self.assertShelvedFileEqual('b\na\n', creator, 'foo-id')
84
85
    def test_shelve_creation(self):
86
        tree = self.make_branch_and_tree('.')
87
        tree.lock_write()
88
        self.addCleanup(tree.unlock)
89
        tree.commit('Empty tree')
0.12.16 by Aaron Bentley
Handle shelving directory creation
90
        self.build_tree_contents([('foo', 'a\n'), ('bar/',)])
91
        tree.add(['foo', 'bar'], ['foo-id', 'bar-id'])
0.14.7 by Aaron Bentley
Misc test cleanup
92
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
0.12.14 by Aaron Bentley
Add shelving of created files
93
        self.addCleanup(creator.finalize)
0.14.13 by Aaron Bentley
Provide path and kind when deletes/adds are detected.
94
        self.assertEqual([('add file', 'bar-id', 'directory', 'bar'),
95
                          ('add file', 'foo-id', 'file', 'foo')],
0.12.16 by Aaron Bentley
Handle shelving directory creation
96
                          sorted(list(creator)))
0.14.2 by Aaron Bentley
Somewhat clean up shelving
97
        creator.shelve_creation('foo-id')
98
        creator.shelve_creation('bar-id')
0.12.14 by Aaron Bentley
Add shelving of created files
99
        creator.transform()
0.12.15 by Aaron Bentley
Handle file-id when shelving creation
100
        self.assertRaises(StopIteration,
101
                          tree.iter_entries_by_dir(['foo-id']).next)
102
        s_trans_id = creator.shelf_transform.trans_id_file_id('foo-id')
103
        self.assertEqual('foo-id',
104
                         creator.shelf_transform.final_file_id(s_trans_id))
0.12.14 by Aaron Bentley
Add shelving of created files
105
        self.failIfExists('foo')
0.12.16 by Aaron Bentley
Handle shelving directory creation
106
        self.failIfExists('bar')
0.12.14 by Aaron Bentley
Add shelving of created files
107
        self.assertShelvedFileEqual('a\n', creator, 'foo-id')
0.12.16 by Aaron Bentley
Handle shelving directory creation
108
        s_bar_trans_id = creator.shelf_transform.trans_id_file_id('bar-id')
109
        self.assertEqual('directory',
110
            creator.shelf_transform.final_kind(s_bar_trans_id))
0.12.17 by Aaron Bentley
Handle creating symlinks
111
112
    def test_shelve_symlink_creation(self):
113
        self.requireFeature(tests.SymlinkFeature)
114
        tree = self.make_branch_and_tree('.')
115
        tree.lock_write()
116
        self.addCleanup(tree.unlock)
117
        tree.commit('Empty tree')
118
        os.symlink('bar', 'foo')
119
        tree.add('foo', 'foo-id')
0.14.7 by Aaron Bentley
Misc test cleanup
120
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
0.12.17 by Aaron Bentley
Handle creating symlinks
121
        self.addCleanup(creator.finalize)
0.14.13 by Aaron Bentley
Provide path and kind when deletes/adds are detected.
122
        self.assertEqual([('add file', 'foo-id', 'symlink', 'foo')],
123
                         list(creator))
0.14.2 by Aaron Bentley
Somewhat clean up shelving
124
        creator.shelve_creation('foo-id')
0.12.17 by Aaron Bentley
Handle creating symlinks
125
        creator.transform()
126
        s_trans_id = creator.shelf_transform.trans_id_file_id('foo-id')
127
        self.failIfExists('foo')
128
        limbo_name = creator.shelf_transform._limbo_name(s_trans_id)
129
        self.assertEqual('bar', os.readlink(limbo_name))
0.12.19 by Aaron Bentley
Add support for writing shelves
130
0.14.12 by Aaron Bentley
Handle new dangling ids
131
    def test_shelve_creation_no_contents(self):
132
        tree = self.make_branch_and_tree('.')
133
        tree.lock_write()
134
        self.addCleanup(tree.unlock)
135
        tree.commit('Empty tree')
136
        self.build_tree(['foo'])
137
        tree.add('foo', 'foo-id')
138
        os.unlink('foo')
139
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
140
        self.addCleanup(creator.finalize)
0.14.13 by Aaron Bentley
Provide path and kind when deletes/adds are detected.
141
        self.assertEqual([('add file', 'foo-id', None, 'foo')],
0.14.12 by Aaron Bentley
Handle new dangling ids
142
                         sorted(list(creator)))
143
        creator.shelve_creation('foo-id')
144
        creator.transform()
145
        self.assertRaises(StopIteration,
146
                          tree.iter_entries_by_dir(['foo-id']).next)
147
        self.assertShelvedFileEqual('', creator, 'foo-id')
148
        s_trans_id = creator.shelf_transform.trans_id_file_id('foo-id')
149
        self.assertEqual('foo-id',
150
                         creator.shelf_transform.final_file_id(s_trans_id))
151
        self.failIfExists('foo')
152
0.14.4 by Aaron Bentley
Implement shelving deletion
153
    def test_shelve_deletion(self):
154
        tree = self.make_branch_and_tree('tree')
0.14.11 by Aaron Bentley
Fix re-versioning
155
        tree.lock_write()
156
        self.addCleanup(tree.unlock)
0.14.4 by Aaron Bentley
Implement shelving deletion
157
        self.build_tree_contents([('tree/foo/',), ('tree/foo/bar', 'baz')])
158
        tree.add(['foo', 'foo/bar'], ['foo-id', 'bar-id'])
159
        tree.commit('Added file and directory')
0.14.9 by Aaron Bentley
Shelve deleted files properly
160
        tree.unversion(['foo-id', 'bar-id'])
0.14.4 by Aaron Bentley
Implement shelving deletion
161
        os.unlink('tree/foo/bar')
162
        os.rmdir('tree/foo')
0.14.7 by Aaron Bentley
Misc test cleanup
163
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
0.14.4 by Aaron Bentley
Implement shelving deletion
164
        self.addCleanup(creator.finalize)
0.14.13 by Aaron Bentley
Provide path and kind when deletes/adds are detected.
165
        self.assertEqual([('delete file', 'bar-id', 'file', 'foo/bar'),
166
                          ('delete file', 'foo-id', 'directory', 'foo')],
0.14.4 by Aaron Bentley
Implement shelving deletion
167
                          sorted(list(creator)))
168
        creator.shelve_deletion('foo-id')
169
        creator.shelve_deletion('bar-id')
0.14.6 by Aaron Bentley
Fix deletion test
170
        creator.transform()
0.14.11 by Aaron Bentley
Fix re-versioning
171
        self.assertTrue('foo-id' in tree)
172
        self.assertTrue('bar-id' in tree)
0.14.4 by Aaron Bentley
Implement shelving deletion
173
        self.assertFileEqual('baz', 'tree/foo/bar')
174
0.14.10 by Aaron Bentley
Fix behavior with deletions, unversioning, ...
175
    def test_shelve_delete_contents(self):
176
        tree = self.make_branch_and_tree('tree')
177
        self.build_tree(['tree/foo',])
178
        tree.add('foo', 'foo-id')
179
        tree.commit('Added file and directory')
180
        os.unlink('tree/foo')
181
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
182
        self.addCleanup(creator.finalize)
0.14.13 by Aaron Bentley
Provide path and kind when deletes/adds are detected.
183
        self.assertEqual([('delete file', 'foo-id', 'file', 'foo')],
184
                         sorted(list(creator)))
0.14.10 by Aaron Bentley
Fix behavior with deletions, unversioning, ...
185
        creator.shelve_deletion('foo-id')
186
        creator.transform()
187
        self.failUnlessExists('tree/foo')
188
0.14.23 by Aaron Bentley
Allow shelving kind change
189
    def test_shelve_change_kind(self):
190
        tree = self.make_branch_and_tree('tree')
191
        self.build_tree_contents([('tree/foo', 'bar')])
192
        tree.add('foo', 'foo-id')
193
        tree.commit('Added file and directory')
194
        os.unlink('tree/foo')
195
        os.mkdir('tree/foo')
196
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
197
        self.addCleanup(creator.finalize)
198
        self.assertEqual([('change kind', 'foo-id', 'file', 'directory',
199
                           'foo')], sorted(list(creator)))
200
        creator.shelve_content_change('foo-id')
201
        creator.transform()
202
        self.assertFileEqual('bar', 'tree/foo')
203
        s_trans_id = creator.shelf_transform.trans_id_file_id('foo-id')
204
        self.assertEqual('directory',
205
                         creator.shelf_transform._new_contents[s_trans_id])
206
0.14.10 by Aaron Bentley
Fix behavior with deletions, unversioning, ...
207
    def test_shelve_unversion(self):
208
        tree = self.make_branch_and_tree('tree')
209
        self.build_tree(['tree/foo',])
210
        tree.add('foo', 'foo-id')
211
        tree.commit('Added file and directory')
212
        tree.unversion(['foo-id'])
213
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
214
        self.addCleanup(creator.finalize)
0.14.13 by Aaron Bentley
Provide path and kind when deletes/adds are detected.
215
        self.assertEqual([('delete file', 'foo-id', 'file', 'foo')],
216
                         sorted(list(creator)))
0.14.10 by Aaron Bentley
Fix behavior with deletions, unversioning, ...
217
        creator.shelve_deletion('foo-id')
218
        creator.transform()
219
        self.failUnlessExists('tree/foo')
220
0.12.19 by Aaron Bentley
Add support for writing shelves
221
    def test_write_shelf(self):
222
        tree = self.make_branch_and_tree('tree')
223
        self.build_tree(['tree/foo'])
224
        tree.add('foo', 'foo-id')
0.14.7 by Aaron Bentley
Misc test cleanup
225
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
226
        self.addCleanup(creator.finalize)
0.12.19 by Aaron Bentley
Add support for writing shelves
227
        list(creator)
0.14.2 by Aaron Bentley
Somewhat clean up shelving
228
        creator.shelve_creation('foo-id')
0.12.29 by Aaron Bentley
Update failing tests
229
        shelf_file = open('shelf', 'wb')
230
        try:
0.12.61 by Aaron Bentley
Stop assigning result of write_shelf
231
            creator.write_shelf(shelf_file)
0.12.29 by Aaron Bentley
Update failing tests
232
        finally:
233
            shelf_file.close()
0.12.19 by Aaron Bentley
Add support for writing shelves
234
        parser = pack.ContainerPushParser()
0.12.29 by Aaron Bentley
Update failing tests
235
        shelf_file = open('shelf', 'rb')
0.12.19 by Aaron Bentley
Add support for writing shelves
236
        try:
237
            parser.accept_bytes(shelf_file.read())
238
        finally:
239
            shelf_file.close()
240
        tt = transform.TransformPreview(tree)
0.14.7 by Aaron Bentley
Misc test cleanup
241
        self.addCleanup(tt.finalize)
0.12.29 by Aaron Bentley
Update failing tests
242
        records = iter(parser.read_pending_records())
243
        #skip revision-id
244
        records.next()
245
        serialize_transform.deserialize(tt, records)
0.12.21 by Aaron Bentley
Add failing test of unshelver
246
247
248
class TestUnshelver(tests.TestCaseWithTransport):
249
250
    def test_unshelve(self):
251
        tree = self.make_branch_and_tree('tree')
0.12.30 by Aaron Bentley
Fix test by using non NULL base tree
252
        tree.commit('first commit')
0.12.21 by Aaron Bentley
Add failing test of unshelver
253
        self.build_tree_contents([('tree/foo', 'bar')])
0.12.24 by Aaron Bentley
Get unshelve using merge codepath, not applying transform directly
254
        tree.lock_write()
255
        self.addCleanup(tree.unlock)
0.12.21 by Aaron Bentley
Add failing test of unshelver
256
        tree.add('foo', 'foo-id')
0.15.5 by Aaron Bentley
Rename to shelf
257
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
258
        self.addCleanup(creator.finalize)
0.12.21 by Aaron Bentley
Add failing test of unshelver
259
        list(creator)
0.12.23 by Aaron Bentley
Fix up unshelve some more
260
        creator.shelve_creation('foo-id')
0.12.29 by Aaron Bentley
Update failing tests
261
        shelf_file = open('shelf-file', 'w+b')
262
        try:
0.12.61 by Aaron Bentley
Stop assigning result of write_shelf
263
            creator.write_shelf(shelf_file)
0.12.29 by Aaron Bentley
Update failing tests
264
            creator.transform()
265
            shelf_file.seek(0)
0.12.34 by Aaron Bentley
merge with unshelve
266
            unshelver = shelf.Unshelver.from_tree_and_shelf(tree, shelf_file)
0.12.29 by Aaron Bentley
Update failing tests
267
            unshelver.unshelve()
268
            self.assertFileEqual('bar', 'tree/foo')
269
        finally:
270
            shelf_file.close()
0.12.26 by Aaron Bentley
Use correct base for shelving
271
0.15.23 by Aaron Bentley
Use correct tree for desrializing transform
272
    def test_unshelve_changed(self):
273
        tree = self.make_branch_and_tree('tree')
274
        tree.lock_write()
275
        self.addCleanup(tree.unlock)
276
        self.build_tree_contents([('tree/foo', 'a\nb\nc\n')])
277
        tree.add('foo', 'foo-id')
278
        tree.commit('first commit')
279
        self.build_tree_contents([('tree/foo', 'a\nb\nd\n')])
280
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
281
        self.addCleanup(creator.finalize)
282
        list(creator)
283
        creator.shelve_lines('foo-id', ['a\n', 'b\n', 'c\n'])
0.12.57 by Aaron Bentley
Update for new Shelf API
284
        shelf_file = open('shelf', 'w+b')
285
        self.addCleanup(shelf_file.close)
286
        creator.write_shelf(shelf_file)
0.15.23 by Aaron Bentley
Use correct tree for desrializing transform
287
        creator.transform()
288
        self.build_tree_contents([('tree/foo', 'z\na\nb\nc\n')])
0.12.57 by Aaron Bentley
Update for new Shelf API
289
        shelf_file.seek(0)
290
        unshelver = shelf.Unshelver.from_tree_and_shelf(tree, shelf_file)
0.15.23 by Aaron Bentley
Use correct tree for desrializing transform
291
        unshelver.unshelve()
292
        self.assertFileEqual('z\na\nb\nd\n', 'tree/foo')
293
0.12.26 by Aaron Bentley
Use correct base for shelving
294
    def test_unshelve_base(self):
295
        tree = self.make_branch_and_tree('tree')
296
        tree.lock_write()
297
        self.addCleanup(tree.unlock)
298
        tree.commit('rev1', rev_id='rev1')
0.15.5 by Aaron Bentley
Rename to shelf
299
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
0.12.59 by Aaron Bentley
Fix locking bugs in tests
300
        self.addCleanup(creator.finalize)
0.12.42 by Aaron Bentley
Get shelf from tree
301
        manager = tree.get_shelf_manager()
0.12.29 by Aaron Bentley
Update failing tests
302
        shelf_id, shelf_file = manager.new_shelf()
303
        try:
0.12.61 by Aaron Bentley
Stop assigning result of write_shelf
304
            creator.write_shelf(shelf_file)
0.12.29 by Aaron Bentley
Update failing tests
305
        finally:
306
            shelf_file.close()
0.12.26 by Aaron Bentley
Use correct base for shelving
307
        tree.commit('rev2', rev_id='rev2')
0.12.29 by Aaron Bentley
Update failing tests
308
        shelf_file = manager.read_shelf(1)
0.12.59 by Aaron Bentley
Fix locking bugs in tests
309
        self.addCleanup(shelf_file.close)
310
        unshelver = shelf.Unshelver.from_tree_and_shelf(tree, shelf_file)
311
        self.addCleanup(unshelver.finalize)
0.12.26 by Aaron Bentley
Use correct base for shelving
312
        self.assertEqual('rev1', unshelver.base_tree.get_revision_id())
0.12.27 by Aaron Bentley
Implement shelf manager
313
314
315
class TestShelfManager(tests.TestCaseWithTransport):
316
0.12.42 by Aaron Bentley
Get shelf from tree
317
    def test_get_shelf_manager(self):
0.12.27 by Aaron Bentley
Implement shelf manager
318
        tree = self.make_branch_and_tree('.')
0.12.42 by Aaron Bentley
Get shelf from tree
319
        manager = tree.get_shelf_manager()
0.12.41 by Aaron Bentley
Change shelf to use WT control dir for shelves
320
        self.assertEqual(tree._transport.base + 'shelf/',
0.12.27 by Aaron Bentley
Implement shelf manager
321
                         manager.transport.base)
322
323
    def get_manager(self):
0.12.42 by Aaron Bentley
Get shelf from tree
324
        return self.make_branch_and_tree('.').get_shelf_manager()
0.12.27 by Aaron Bentley
Implement shelf manager
325
326
    def test_new_shelf(self):
327
        manager = self.get_manager()
328
        shelf_id, shelf_file = manager.new_shelf()
329
        shelf_file.close()
330
        self.assertEqual(1, shelf_id)
331
        shelf_id, shelf_file = manager.new_shelf()
332
        shelf_file.close()
333
        self.assertEqual(2, shelf_id)
334
        manager.delete_shelf(1)
335
        shelf_id, shelf_file = manager.new_shelf()
336
        shelf_file.close()
337
        self.assertEqual(3, shelf_id)
338
339
    def test_active_shelves(self):
340
        manager = self.get_manager()
341
        self.assertEqual([], manager.active_shelves())
342
        shelf_id, shelf_file = manager.new_shelf()
343
        shelf_file.close()
344
        self.assertEqual([1], manager.active_shelves())
345
346
    def test_delete_shelf(self):
347
        manager = self.get_manager()
348
        shelf_id, shelf_file = manager.new_shelf()
349
        shelf_file.close()
350
        self.assertEqual([1], manager.active_shelves())
351
        manager.delete_shelf(1)
352
        self.assertEqual([], manager.active_shelves())
353
354
    def test_last_shelf(self):
355
        manager = self.get_manager()
356
        self.assertIs(None, manager.last_shelf())
357
        shelf_id, shelf_file = manager.new_shelf()
358
        shelf_file.close()
359
        self.assertEqual(1, manager.last_shelf())
360
361
    def test_read_shelf(self):
362
        manager = self.get_manager()
363
        shelf_id, shelf_file = manager.new_shelf()
364
        try:
365
            shelf_file.write('foo')
366
        finally:
367
            shelf_file.close()
368
        shelf_id, shelf_file = manager.new_shelf()
369
        try:
370
            shelf_file.write('bar')
371
        finally:
372
            shelf_file.close()
373
        shelf_file = manager.read_shelf(1)
374
        try:
375
            self.assertEqual('foo', shelf_file.read())
376
        finally:
377
            shelf_file.close()
378
        shelf_file = manager.read_shelf(2)
379
        try:
380
            self.assertEqual('bar', shelf_file.read())
381
        finally:
382
            shelf_file.close()
0.12.43 by Aaron Bentley
Make ShelfManager consume ShelfCreator and produce Unshelver
383
0.12.50 by Aaron Bentley
Improve error handling for non-existant shelf-ids
384
    def test_read_non_existant(self):
385
        manager = self.get_manager()
386
        e = self.assertRaises(shelf.NoSuchShelfId, manager.read_shelf, 1)
387
        self.assertEqual('No changes are shelved with id "1".', str(e))
388
0.12.43 by Aaron Bentley
Make ShelfManager consume ShelfCreator and produce Unshelver
389
    def test_shelve_changes(self):
390
        tree = self.make_branch_and_tree('tree')
0.12.44 by Aaron Bentley
Give manager responsibility for applying transform
391
        tree.commit('no-change commit')
392
        tree.lock_write()
393
        self.addCleanup(tree.unlock)
394
        self.build_tree_contents([('tree/foo', 'bar')])
395
        self.assertFileEqual('bar', 'tree/foo')
0.12.43 by Aaron Bentley
Make ShelfManager consume ShelfCreator and produce Unshelver
396
        tree.add('foo', 'foo-id')
397
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
398
        self.addCleanup(creator.finalize)
399
        list(creator)
400
        creator.shelve_creation('foo-id')
401
        shelf_manager = tree.get_shelf_manager()
402
        shelf_id = shelf_manager.shelve_changes(creator)
0.12.44 by Aaron Bentley
Give manager responsibility for applying transform
403
        self.failIfExists('tree/foo')
0.12.43 by Aaron Bentley
Make ShelfManager consume ShelfCreator and produce Unshelver
404
        unshelver = shelf_manager.get_unshelver(shelf_id)
0.12.44 by Aaron Bentley
Give manager responsibility for applying transform
405
        unshelver.unshelve()
406
        self.assertFileEqual('bar', 'tree/foo')