/brz/remove-bazaar

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