/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
4634.123.6 by John Arbash Meinel
Add a direct ShelfCreator test for changing root id.
1
# Copyright (C) 2008, 2009, 2010 Canonical Ltd
0.12.12 by Aaron Bentley
Implement shelf creator
2
#
0.12.80 by Aaron Bentley
Re-format GPL notifications
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
4183.7.1 by Sabin Iacob
update FSF mailing address
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
0.12.12 by Aaron Bentley
Implement shelf creator
16
0.12.17 by Aaron Bentley
Handle creating symlinks
17
import os
18
4241.14.12 by Vincent Ladeuil
Far too many modifications for a single commit, need to restart.
19
from bzrlib import (
20
    errors,
21
    osutils,
22
    pack,
23
    shelf,
24
    tests,
25
    transform,
26
    workingtree,
27
    )
0.12.12 by Aaron Bentley
Implement shelf creator
28
29
0.14.34 by Aaron Bentley
Factor out the empty shelf
30
EMPTY_SHELF = ("Bazaar pack format 1 (introduced in 0.18)\n"
0.15.39 by Aaron Bentley
Update empty shelf serialization
31
               "B23\n"
32
               "metadata\n\n"
33
               "d11:revision_id5:null:e"
0.14.34 by Aaron Bentley
Factor out the empty shelf
34
               "B159\n"
35
               "attribs\n\n"
36
               "d10:_id_numberi0e18:_new_executabilityde7:_new_idde"
37
               "9:_new_namede11:_new_parentde16:_non_present_idsde"
38
               "17:_removed_contentsle11:_removed_idle14:_tree_path_idsdeeE")
39
40
0.12.12 by Aaron Bentley
Implement shelf creator
41
class TestPrepareShelf(tests.TestCaseWithTransport):
42
4526.7.3 by Aaron Bentley
Test shelve_change.
43
    def prepare_shelve_rename(self):
0.12.12 by Aaron Bentley
Implement shelf creator
44
        tree = self.make_branch_and_tree('.')
45
        self.build_tree(['foo'])
46
        tree.add(['foo'], ['foo-id'])
47
        tree.commit('foo')
48
        tree.rename_one('foo', 'bar')
4595.13.2 by Alexander Belchenko
[cherrypick revno 4650 from bzr.dev] Fix shelve on windows. (Robert Collins, #305006)
49
        tree.lock_tree_write()
50
        self.addCleanup(tree.unlock)
0.14.7 by Aaron Bentley
Misc test cleanup
51
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
0.12.12 by Aaron Bentley
Implement shelf creator
52
        self.addCleanup(creator.finalize)
0.14.32 by Aaron Bentley
Replace ShelfCreator.__iter__ with ShelfCreator.iter_shelvable
53
        self.assertEqual([('rename', 'foo-id', 'foo', 'bar')],
54
                          list(creator.iter_shelvable()))
4526.7.3 by Aaron Bentley
Test shelve_change.
55
        return creator
56
57
    def check_shelve_rename(self, creator):
0.12.12 by Aaron Bentley
Implement shelf creator
58
        work_trans_id = creator.work_transform.trans_id_file_id('foo-id')
59
        self.assertEqual('foo', creator.work_transform.final_name(
60
                         work_trans_id))
61
        shelf_trans_id = creator.shelf_transform.trans_id_file_id('foo-id')
62
        self.assertEqual('bar', creator.shelf_transform.final_name(
63
                         shelf_trans_id))
64
4526.7.3 by Aaron Bentley
Test shelve_change.
65
    def test_shelve_rename(self):
66
        creator = self.prepare_shelve_rename()
67
        creator.shelve_rename('foo-id')
68
        self.check_shelve_rename(creator)
69
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)
74
75
    def prepare_shelve_move(self):
0.12.12 by Aaron Bentley
Implement shelf creator
76
        tree = self.make_branch_and_tree('.')
77
        self.build_tree(['foo/', 'bar/', 'foo/baz'])
78
        tree.add(['foo', 'bar', 'foo/baz'], ['foo-id', 'bar-id', 'baz-id'])
79
        tree.commit('foo')
80
        tree.rename_one('foo/baz', 'bar/baz')
4595.13.2 by Alexander Belchenko
[cherrypick revno 4650 from bzr.dev] Fix shelve on windows. (Robert Collins, #305006)
81
        tree.lock_tree_write()
82
        self.addCleanup(tree.unlock)
0.14.7 by Aaron Bentley
Misc test cleanup
83
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
0.12.12 by Aaron Bentley
Implement shelf creator
84
        self.addCleanup(creator.finalize)
85
        self.assertEqual([('rename', 'baz-id', 'foo/baz', 'bar/baz')],
0.14.32 by Aaron Bentley
Replace ShelfCreator.__iter__ with ShelfCreator.iter_shelvable
86
                         list(creator.iter_shelvable()))
4526.7.3 by Aaron Bentley
Test shelve_change.
87
        return creator, tree
88
89
    def check_shelve_move(self, creator, tree):
0.12.12 by Aaron Bentley
Implement shelf creator
90
        work_trans_id = creator.work_transform.trans_id_file_id('baz-id')
91
        work_foo = creator.work_transform.trans_id_file_id('foo-id')
92
        self.assertEqual(work_foo, creator.work_transform.final_parent(
93
                         work_trans_id))
94
        shelf_trans_id = creator.shelf_transform.trans_id_file_id('baz-id')
95
        shelf_bar = creator.shelf_transform.trans_id_file_id('bar-id')
96
        self.assertEqual(shelf_bar, creator.shelf_transform.final_parent(
97
                         shelf_trans_id))
0.12.13 by Aaron Bentley
Implement shelving content
98
        creator.transform()
99
        self.assertEqual('foo/baz', tree.id2path('baz-id'))
100
4526.7.3 by Aaron Bentley
Test shelve_change.
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)
105
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)
110
4634.123.6 by John Arbash Meinel
Add a direct ShelfCreator test for changing root id.
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'])
116
        tree.commit('foo')
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',
123
            self.assertEqual, [
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()))
128
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()))
133
0.12.14 by Aaron Bentley
Add shelving of created files
134
    def assertShelvedFileEqual(self, expected_content, creator, file_id):
135
        s_trans_id = creator.shelf_transform.trans_id_file_id(file_id)
136
        shelf_file = creator.shelf_transform._limbo_name(s_trans_id)
137
        self.assertFileEqual(expected_content, shelf_file)
138
4595.8.1 by Aaron Bentley
shelve_change handles text modification.
139
    def prepare_content_change(self):
0.12.13 by Aaron Bentley
Implement shelving content
140
        tree = self.make_branch_and_tree('.')
141
        tree.lock_write()
142
        self.addCleanup(tree.unlock)
143
        self.build_tree_contents([('foo', 'a\n')])
144
        tree.add('foo', 'foo-id')
145
        tree.commit('Committed foo')
146
        self.build_tree_contents([('foo', 'b\na\nc\n')])
0.14.7 by Aaron Bentley
Misc test cleanup
147
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
0.12.13 by Aaron Bentley
Implement shelving content
148
        self.addCleanup(creator.finalize)
4595.8.2 by Aaron Bentley
Implement shelve_all
149
        return creator
150
151
    def test_shelve_content_change(self):
152
        creator = self.prepare_content_change()
0.14.32 by Aaron Bentley
Replace ShelfCreator.__iter__ with ShelfCreator.iter_shelvable
153
        self.assertEqual([('modify text', 'foo-id')],
154
                         list(creator.iter_shelvable()))
0.14.14 by Aaron Bentley
Change shelf_text to shelve_lines
155
        creator.shelve_lines('foo-id', ['a\n', 'c\n'])
0.12.13 by Aaron Bentley
Implement shelving content
156
        creator.transform()
157
        self.assertFileEqual('a\nc\n', 'foo')
0.12.14 by Aaron Bentley
Add shelving of created files
158
        self.assertShelvedFileEqual('b\na\n', creator, 'foo-id')
159
4595.8.1 by Aaron Bentley
shelve_change handles text modification.
160
    def test_shelve_change_handles_modify_text(self):
161
        creator = self.prepare_content_change()
162
        creator.shelve_change(('modify text', 'foo-id'))
163
        creator.transform()
164
        self.assertFileEqual('a\n', 'foo')
165
        self.assertShelvedFileEqual('b\na\nc\n', creator, 'foo-id')
4526.7.3 by Aaron Bentley
Test shelve_change.
166
4595.8.2 by Aaron Bentley
Implement shelve_all
167
    def test_shelve_all(self):
168
        creator = self.prepare_content_change()
169
        creator.shelve_all()
170
        creator.transform()
171
        self.assertFileEqual('a\n', 'foo')
172
        self.assertShelvedFileEqual('b\na\nc\n', creator, 'foo-id')
173
4526.7.3 by Aaron Bentley
Test shelve_change.
174
    def prepare_shelve_creation(self):
0.12.14 by Aaron Bentley
Add shelving of created files
175
        tree = self.make_branch_and_tree('.')
176
        tree.lock_write()
177
        self.addCleanup(tree.unlock)
178
        tree.commit('Empty tree')
0.12.16 by Aaron Bentley
Handle shelving directory creation
179
        self.build_tree_contents([('foo', 'a\n'), ('bar/',)])
180
        tree.add(['foo', 'bar'], ['foo-id', 'bar-id'])
0.14.7 by Aaron Bentley
Misc test cleanup
181
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
0.12.14 by Aaron Bentley
Add shelving of created files
182
        self.addCleanup(creator.finalize)
0.14.13 by Aaron Bentley
Provide path and kind when deletes/adds are detected.
183
        self.assertEqual([('add file', 'bar-id', 'directory', 'bar'),
184
                          ('add file', 'foo-id', 'file', 'foo')],
0.14.32 by Aaron Bentley
Replace ShelfCreator.__iter__ with ShelfCreator.iter_shelvable
185
                          sorted(list(creator.iter_shelvable())))
4526.7.3 by Aaron Bentley
Test shelve_change.
186
        return creator, tree
187
188
    def check_shelve_creation(self, creator, tree):
0.12.15 by Aaron Bentley
Handle file-id when shelving creation
189
        self.assertRaises(StopIteration,
190
                          tree.iter_entries_by_dir(['foo-id']).next)
191
        s_trans_id = creator.shelf_transform.trans_id_file_id('foo-id')
192
        self.assertEqual('foo-id',
193
                         creator.shelf_transform.final_file_id(s_trans_id))
0.12.14 by Aaron Bentley
Add shelving of created files
194
        self.failIfExists('foo')
0.12.16 by Aaron Bentley
Handle shelving directory creation
195
        self.failIfExists('bar')
0.12.14 by Aaron Bentley
Add shelving of created files
196
        self.assertShelvedFileEqual('a\n', creator, 'foo-id')
0.12.16 by Aaron Bentley
Handle shelving directory creation
197
        s_bar_trans_id = creator.shelf_transform.trans_id_file_id('bar-id')
198
        self.assertEqual('directory',
199
            creator.shelf_transform.final_kind(s_bar_trans_id))
0.12.17 by Aaron Bentley
Handle creating symlinks
200
4526.7.3 by Aaron Bentley
Test shelve_change.
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')
205
        creator.transform()
206
        self.check_shelve_creation(creator, tree)
207
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'))
212
        creator.transform()
213
        self.check_shelve_creation(creator, tree)
214
215
    def _test_shelve_symlink_creation(self, link_name, link_target,
216
                                      shelve_change=False):
4241.14.16 by Vincent Ladeuil
Fix _PreviewTree.get_symlink_target for unicode symlinks.
217
        self.requireFeature(tests.SymlinkFeature)
218
        tree = self.make_branch_and_tree('.')
219
        tree.lock_write()
220
        self.addCleanup(tree.unlock)
221
        tree.commit('Empty tree')
222
        os.symlink(link_target, link_name)
223
        tree.add(link_name, 'foo-id')
224
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
225
        self.addCleanup(creator.finalize)
226
        self.assertEqual([('add file', 'foo-id', 'symlink', link_name)],
227
                         list(creator.iter_shelvable()))
4526.7.3 by Aaron Bentley
Test shelve_change.
228
        if shelve_change:
229
            creator.shelve_change(('add file', 'foo-id', 'symlink', link_name))
230
        else:
231
            creator.shelve_creation('foo-id')
4241.14.16 by Vincent Ladeuil
Fix _PreviewTree.get_symlink_target for unicode symlinks.
232
        creator.transform()
233
        s_trans_id = creator.shelf_transform.trans_id_file_id('foo-id')
234
        self.failIfExists(link_name)
235
        limbo_name = creator.shelf_transform._limbo_name(s_trans_id)
236
        self.assertEqual(link_target, osutils.readlink(limbo_name))
237
        ptree = creator.shelf_transform.get_preview_tree()
238
        self.assertEqual(link_target, ptree.get_symlink_target('foo-id'))
239
0.12.17 by Aaron Bentley
Handle creating symlinks
240
    def test_shelve_symlink_creation(self):
4241.14.16 by Vincent Ladeuil
Fix _PreviewTree.get_symlink_target for unicode symlinks.
241
        self._test_shelve_symlink_creation('foo', 'bar')
242
243
    def test_shelve_unicode_symlink_creation(self):
244
        self.requireFeature(tests.UnicodeFilenameFeature)
245
        self._test_shelve_symlink_creation(u'fo\N{Euro Sign}o',
246
                                           u'b\N{Euro Sign}ar')
0.12.19 by Aaron Bentley
Add support for writing shelves
247
4526.7.3 by Aaron Bentley
Test shelve_change.
248
    def test_shelve_change_handles_symlink_creation(self):
249
        self._test_shelve_symlink_creation('foo', 'bar', shelve_change=True)
250
4241.14.12 by Vincent Ladeuil
Far too many modifications for a single commit, need to restart.
251
    def _test_shelve_symlink_target_change(self, link_name,
4526.7.3 by Aaron Bentley
Test shelve_change.
252
                                           old_target, new_target,
253
                                           shelve_change=False):
4119.5.1 by James Westby
Shelve can now shelve changes to a symlink's target.
254
        self.requireFeature(tests.SymlinkFeature)
255
        tree = self.make_branch_and_tree('.')
256
        tree.lock_write()
257
        self.addCleanup(tree.unlock)
4241.14.12 by Vincent Ladeuil
Far too many modifications for a single commit, need to restart.
258
        os.symlink(old_target, link_name)
259
        tree.add(link_name, 'foo-id')
4119.5.1 by James Westby
Shelve can now shelve changes to a symlink's target.
260
        tree.commit("commit symlink")
4241.14.12 by Vincent Ladeuil
Far too many modifications for a single commit, need to restart.
261
        os.unlink(link_name)
262
        os.symlink(new_target, link_name)
4119.5.1 by James Westby
Shelve can now shelve changes to a symlink's target.
263
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
264
        self.addCleanup(creator.finalize)
4241.14.12 by Vincent Ladeuil
Far too many modifications for a single commit, need to restart.
265
        self.assertEqual([('modify target', 'foo-id', link_name,
266
                           old_target, new_target)],
4119.5.1 by James Westby
Shelve can now shelve changes to a symlink's target.
267
                         list(creator.iter_shelvable()))
4526.7.3 by Aaron Bentley
Test shelve_change.
268
        if shelve_change:
269
            creator.shelve_change(('modify target', 'foo-id', link_name,
270
                                   old_target, new_target))
271
        else:
272
            creator.shelve_modify_target('foo-id')
4119.5.1 by James Westby
Shelve can now shelve changes to a symlink's target.
273
        creator.transform()
4241.14.21 by Vincent Ladeuil
More cleanup.
274
        self.assertEqual(old_target, osutils.readlink(link_name))
4119.5.1 by James Westby
Shelve can now shelve changes to a symlink's target.
275
        s_trans_id = creator.shelf_transform.trans_id_file_id('foo-id')
276
        limbo_name = creator.shelf_transform._limbo_name(s_trans_id)
4241.14.21 by Vincent Ladeuil
More cleanup.
277
        self.assertEqual(new_target, osutils.readlink(limbo_name))
4241.14.16 by Vincent Ladeuil
Fix _PreviewTree.get_symlink_target for unicode symlinks.
278
        ptree = creator.shelf_transform.get_preview_tree()
279
        self.assertEqual(new_target, ptree.get_symlink_target('foo-id'))
4241.14.12 by Vincent Ladeuil
Far too many modifications for a single commit, need to restart.
280
281
    def test_shelve_symlink_target_change(self):
282
        self._test_shelve_symlink_target_change('foo', 'bar', 'baz')
283
284
    def test_shelve_unicode_symlink_target_change(self):
285
        self.requireFeature(tests.UnicodeFilenameFeature)
286
        self._test_shelve_symlink_target_change(
287
            u'fo\N{Euro Sign}o', u'b\N{Euro Sign}ar', u'b\N{Euro Sign}az')
4119.5.1 by James Westby
Shelve can now shelve changes to a symlink's target.
288
4526.7.3 by Aaron Bentley
Test shelve_change.
289
    def test_shelve_change_handles_symlink_target_change(self):
290
        self._test_shelve_symlink_target_change('foo', 'bar', 'baz',
291
                                                shelve_change=True)
292
0.14.12 by Aaron Bentley
Handle new dangling ids
293
    def test_shelve_creation_no_contents(self):
294
        tree = self.make_branch_and_tree('.')
295
        tree.lock_write()
296
        self.addCleanup(tree.unlock)
297
        tree.commit('Empty tree')
298
        self.build_tree(['foo'])
299
        tree.add('foo', 'foo-id')
300
        os.unlink('foo')
301
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
302
        self.addCleanup(creator.finalize)
0.14.13 by Aaron Bentley
Provide path and kind when deletes/adds are detected.
303
        self.assertEqual([('add file', 'foo-id', None, 'foo')],
0.14.32 by Aaron Bentley
Replace ShelfCreator.__iter__ with ShelfCreator.iter_shelvable
304
                         sorted(list(creator.iter_shelvable())))
0.14.12 by Aaron Bentley
Handle new dangling ids
305
        creator.shelve_creation('foo-id')
306
        creator.transform()
307
        self.assertRaises(StopIteration,
308
                          tree.iter_entries_by_dir(['foo-id']).next)
309
        self.assertShelvedFileEqual('', creator, 'foo-id')
310
        s_trans_id = creator.shelf_transform.trans_id_file_id('foo-id')
311
        self.assertEqual('foo-id',
312
                         creator.shelf_transform.final_file_id(s_trans_id))
313
        self.failIfExists('foo')
314
4526.7.3 by Aaron Bentley
Test shelve_change.
315
    def prepare_shelve_deletion(self):
0.14.4 by Aaron Bentley
Implement shelving deletion
316
        tree = self.make_branch_and_tree('tree')
0.14.11 by Aaron Bentley
Fix re-versioning
317
        tree.lock_write()
318
        self.addCleanup(tree.unlock)
0.14.4 by Aaron Bentley
Implement shelving deletion
319
        self.build_tree_contents([('tree/foo/',), ('tree/foo/bar', 'baz')])
320
        tree.add(['foo', 'foo/bar'], ['foo-id', 'bar-id'])
321
        tree.commit('Added file and directory')
0.14.9 by Aaron Bentley
Shelve deleted files properly
322
        tree.unversion(['foo-id', 'bar-id'])
0.14.4 by Aaron Bentley
Implement shelving deletion
323
        os.unlink('tree/foo/bar')
324
        os.rmdir('tree/foo')
0.14.7 by Aaron Bentley
Misc test cleanup
325
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
0.14.4 by Aaron Bentley
Implement shelving deletion
326
        self.addCleanup(creator.finalize)
0.14.13 by Aaron Bentley
Provide path and kind when deletes/adds are detected.
327
        self.assertEqual([('delete file', 'bar-id', 'file', 'foo/bar'),
328
                          ('delete file', 'foo-id', 'directory', 'foo')],
0.14.32 by Aaron Bentley
Replace ShelfCreator.__iter__ with ShelfCreator.iter_shelvable
329
                          sorted(list(creator.iter_shelvable())))
4526.7.3 by Aaron Bentley
Test shelve_change.
330
        return creator, tree
331
332
    def check_shelve_deletion(self, tree):
0.14.11 by Aaron Bentley
Fix re-versioning
333
        self.assertTrue('foo-id' in tree)
334
        self.assertTrue('bar-id' in tree)
0.14.4 by Aaron Bentley
Implement shelving deletion
335
        self.assertFileEqual('baz', 'tree/foo/bar')
336
4526.7.3 by Aaron Bentley
Test shelve_change.
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')
341
        creator.transform()
342
        self.check_shelve_deletion(tree)
343
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'))
348
        creator.transform()
349
        self.check_shelve_deletion(tree)
350
0.14.10 by Aaron Bentley
Fix behavior with deletions, unversioning, ...
351
    def test_shelve_delete_contents(self):
352
        tree = self.make_branch_and_tree('tree')
353
        self.build_tree(['tree/foo',])
354
        tree.add('foo', 'foo-id')
355
        tree.commit('Added file and directory')
356
        os.unlink('tree/foo')
4595.13.2 by Alexander Belchenko
[cherrypick revno 4650 from bzr.dev] Fix shelve on windows. (Robert Collins, #305006)
357
        tree.lock_tree_write()
358
        self.addCleanup(tree.unlock)
0.14.10 by Aaron Bentley
Fix behavior with deletions, unversioning, ...
359
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
360
        self.addCleanup(creator.finalize)
0.14.13 by Aaron Bentley
Provide path and kind when deletes/adds are detected.
361
        self.assertEqual([('delete file', 'foo-id', 'file', 'foo')],
0.14.32 by Aaron Bentley
Replace ShelfCreator.__iter__ with ShelfCreator.iter_shelvable
362
                         sorted(list(creator.iter_shelvable())))
0.14.10 by Aaron Bentley
Fix behavior with deletions, unversioning, ...
363
        creator.shelve_deletion('foo-id')
364
        creator.transform()
365
        self.failUnlessExists('tree/foo')
366
4526.7.3 by Aaron Bentley
Test shelve_change.
367
    def prepare_shelve_change_kind(self):
0.14.23 by Aaron Bentley
Allow shelving kind change
368
        tree = self.make_branch_and_tree('tree')
369
        self.build_tree_contents([('tree/foo', 'bar')])
370
        tree.add('foo', 'foo-id')
371
        tree.commit('Added file and directory')
372
        os.unlink('tree/foo')
373
        os.mkdir('tree/foo')
4595.13.2 by Alexander Belchenko
[cherrypick revno 4650 from bzr.dev] Fix shelve on windows. (Robert Collins, #305006)
374
        tree.lock_tree_write()
375
        self.addCleanup(tree.unlock)
0.14.23 by Aaron Bentley
Allow shelving kind change
376
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
377
        self.addCleanup(creator.finalize)
378
        self.assertEqual([('change kind', 'foo-id', 'file', 'directory',
0.14.32 by Aaron Bentley
Replace ShelfCreator.__iter__ with ShelfCreator.iter_shelvable
379
                           'foo')], sorted(list(creator.iter_shelvable())))
4526.7.3 by Aaron Bentley
Test shelve_change.
380
        return creator
381
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])
387
388
    def test_shelve_change_kind(self):
389
        creator = self.prepare_shelve_change_kind()
0.14.23 by Aaron Bentley
Allow shelving kind change
390
        creator.shelve_content_change('foo-id')
391
        creator.transform()
4526.7.3 by Aaron Bentley
Test shelve_change.
392
        self.check_shelve_change_kind(creator)
393
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',
397
                               'foo'))
398
        creator.transform()
399
        self.check_shelve_change_kind(creator)
400
401
    def test_shelve_change_unknown_change(self):
402
        tree = self.make_branch_and_tree('tree')
4595.13.2 by Alexander Belchenko
[cherrypick revno 4650 from bzr.dev] Fix shelve on windows. (Robert Collins, #305006)
403
        tree.lock_tree_write()
404
        self.addCleanup(tree.unlock)
4526.7.3 by Aaron Bentley
Test shelve_change.
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))
0.14.23 by Aaron Bentley
Allow shelving kind change
409
0.14.10 by Aaron Bentley
Fix behavior with deletions, unversioning, ...
410
    def test_shelve_unversion(self):
411
        tree = self.make_branch_and_tree('tree')
412
        self.build_tree(['tree/foo',])
413
        tree.add('foo', 'foo-id')
414
        tree.commit('Added file and directory')
415
        tree.unversion(['foo-id'])
4595.13.2 by Alexander Belchenko
[cherrypick revno 4650 from bzr.dev] Fix shelve on windows. (Robert Collins, #305006)
416
        tree.lock_tree_write()
417
        self.addCleanup(tree.unlock)
0.14.10 by Aaron Bentley
Fix behavior with deletions, unversioning, ...
418
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
419
        self.addCleanup(creator.finalize)
0.14.13 by Aaron Bentley
Provide path and kind when deletes/adds are detected.
420
        self.assertEqual([('delete file', 'foo-id', 'file', 'foo')],
0.14.32 by Aaron Bentley
Replace ShelfCreator.__iter__ with ShelfCreator.iter_shelvable
421
                         sorted(list(creator.iter_shelvable())))
0.14.10 by Aaron Bentley
Fix behavior with deletions, unversioning, ...
422
        creator.shelve_deletion('foo-id')
423
        creator.transform()
424
        self.failUnlessExists('tree/foo')
425
0.14.33 by Aaron Bentley
Add explicit test of shelf on-disk format
426
    def test_shelve_serialization(self):
427
        tree = self.make_branch_and_tree('.')
4595.13.2 by Alexander Belchenko
[cherrypick revno 4650 from bzr.dev] Fix shelve on windows. (Robert Collins, #305006)
428
        tree.lock_tree_write()
429
        self.addCleanup(tree.unlock)
0.14.33 by Aaron Bentley
Add explicit test of shelf on-disk format
430
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
431
        self.addCleanup(creator.finalize)
0.12.76 by Aaron Bentley
Convert failing tests
432
        shelf_file = open('shelf', 'wb')
433
        self.addCleanup(shelf_file.close)
434
        try:
435
            creator.write_shelf(shelf_file)
436
        finally:
437
            shelf_file.close()
438
        self.assertFileEqual(EMPTY_SHELF, 'shelf')
0.14.33 by Aaron Bentley
Add explicit test of shelf on-disk format
439
0.12.19 by Aaron Bentley
Add support for writing shelves
440
    def test_write_shelf(self):
441
        tree = self.make_branch_and_tree('tree')
442
        self.build_tree(['tree/foo'])
443
        tree.add('foo', 'foo-id')
4595.13.2 by Alexander Belchenko
[cherrypick revno 4650 from bzr.dev] Fix shelve on windows. (Robert Collins, #305006)
444
        tree.lock_tree_write()
445
        self.addCleanup(tree.unlock)
0.14.7 by Aaron Bentley
Misc test cleanup
446
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
447
        self.addCleanup(creator.finalize)
0.14.32 by Aaron Bentley
Replace ShelfCreator.__iter__ with ShelfCreator.iter_shelvable
448
        list(creator.iter_shelvable())
0.14.2 by Aaron Bentley
Somewhat clean up shelving
449
        creator.shelve_creation('foo-id')
0.12.29 by Aaron Bentley
Update failing tests
450
        shelf_file = open('shelf', 'wb')
451
        try:
0.12.61 by Aaron Bentley
Stop assigning result of write_shelf
452
            creator.write_shelf(shelf_file)
0.12.29 by Aaron Bentley
Update failing tests
453
        finally:
454
            shelf_file.close()
0.12.19 by Aaron Bentley
Add support for writing shelves
455
        parser = pack.ContainerPushParser()
0.12.29 by Aaron Bentley
Update failing tests
456
        shelf_file = open('shelf', 'rb')
0.12.19 by Aaron Bentley
Add support for writing shelves
457
        try:
458
            parser.accept_bytes(shelf_file.read())
459
        finally:
460
            shelf_file.close()
461
        tt = transform.TransformPreview(tree)
0.14.7 by Aaron Bentley
Misc test cleanup
462
        self.addCleanup(tt.finalize)
0.12.29 by Aaron Bentley
Update failing tests
463
        records = iter(parser.read_pending_records())
464
        #skip revision-id
465
        records.next()
0.15.26 by Aaron Bentley
Merge with prepare-shelf
466
        tt.deserialize(records)
0.12.21 by Aaron Bentley
Add failing test of unshelver
467
3873.2.4 by Benoît Pierre
Add a test: test_shelve_unversioned; check if tree is in a clean state
468
    def test_shelve_unversioned(self):
469
        tree = self.make_branch_and_tree('tree')
4595.13.2 by Alexander Belchenko
[cherrypick revno 4650 from bzr.dev] Fix shelve on windows. (Robert Collins, #305006)
470
        tree.lock_tree_write()
471
        try:
472
            self.assertRaises(errors.PathsNotVersionedError,
473
                              shelf.ShelfCreator, tree, tree.basis_tree(), ['foo'])
474
        finally:
475
            tree.unlock()
3873.2.4 by Benoît Pierre
Add a test: test_shelve_unversioned; check if tree is in a clean state
476
        # We should be able to lock/unlock the tree if ShelfCreator cleaned
477
        # after itself.
478
        wt = workingtree.WorkingTree.open('tree')
479
        wt.lock_tree_write()
480
        wt.unlock()
481
        # And a second tentative should raise the same error (no
482
        # limbo/pending_deletion leftovers).
4595.13.2 by Alexander Belchenko
[cherrypick revno 4650 from bzr.dev] Fix shelve on windows. (Robert Collins, #305006)
483
        tree.lock_tree_write()
484
        try:
485
            self.assertRaises(errors.PathsNotVersionedError,
486
                              shelf.ShelfCreator, tree, tree.basis_tree(), ['foo'])
487
        finally:
488
            tree.unlock()
489
4634.7.1 by Robert Collins
Merge and cherrypick outstanding 2.0 relevant patches from bzr.dev: Up to rev
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')
4595.13.2 by Alexander Belchenko
[cherrypick revno 4650 from bzr.dev] Fix shelve on windows. (Robert Collins, #305006)
493
        tree.lock_tree_write()
494
        self.addCleanup(tree.unlock)
4634.7.1 by Robert Collins
Merge and cherrypick outstanding 2.0 relevant patches from bzr.dev: Up to rev
495
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
496
        self.addCleanup(creator.finalize)
497
        self.assertEqual([], list(creator.iter_shelvable()))
3873.2.4 by Benoît Pierre
Add a test: test_shelve_unversioned; check if tree is in a clean state
498
4595.9.1 by Aaron Bentley
Fix shelve in uncommitted trees.
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
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
503
        self.addCleanup(creator.finalize)
504
        self.assertEqual([], list(creator.iter_shelvable()))
505
0.12.21 by Aaron Bentley
Add failing test of unshelver
506
507
class TestUnshelver(tests.TestCaseWithTransport):
508
0.15.31 by Aaron Bentley
Remove 'unshelve' method, test make_merger
509
    def test_make_merger(self):
0.12.21 by Aaron Bentley
Add failing test of unshelver
510
        tree = self.make_branch_and_tree('tree')
0.12.30 by Aaron Bentley
Fix test by using non NULL base tree
511
        tree.commit('first commit')
0.12.21 by Aaron Bentley
Add failing test of unshelver
512
        self.build_tree_contents([('tree/foo', 'bar')])
0.12.24 by Aaron Bentley
Get unshelve using merge codepath, not applying transform directly
513
        tree.lock_write()
514
        self.addCleanup(tree.unlock)
0.12.21 by Aaron Bentley
Add failing test of unshelver
515
        tree.add('foo', 'foo-id')
0.15.5 by Aaron Bentley
Rename to shelf
516
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
517
        self.addCleanup(creator.finalize)
0.12.73 by Aaron Bentley
Merge unshelve into shelf-manager
518
        list(creator.iter_shelvable())
0.12.23 by Aaron Bentley
Fix up unshelve some more
519
        creator.shelve_creation('foo-id')
0.12.29 by Aaron Bentley
Update failing tests
520
        shelf_file = open('shelf-file', 'w+b')
521
        try:
0.12.61 by Aaron Bentley
Stop assigning result of write_shelf
522
            creator.write_shelf(shelf_file)
0.12.29 by Aaron Bentley
Update failing tests
523
            creator.transform()
524
            shelf_file.seek(0)
0.12.34 by Aaron Bentley
merge with unshelve
525
            unshelver = shelf.Unshelver.from_tree_and_shelf(tree, shelf_file)
0.12.66 by Aaron Bentley
Merge with unshelve
526
            unshelver.make_merger().do_merge()
0.12.29 by Aaron Bentley
Update failing tests
527
            self.assertFileEqual('bar', 'tree/foo')
528
        finally:
529
            shelf_file.close()
0.12.26 by Aaron Bentley
Use correct base for shelving
530
0.15.23 by Aaron Bentley
Use correct tree for desrializing transform
531
    def test_unshelve_changed(self):
532
        tree = self.make_branch_and_tree('tree')
533
        tree.lock_write()
534
        self.addCleanup(tree.unlock)
535
        self.build_tree_contents([('tree/foo', 'a\nb\nc\n')])
536
        tree.add('foo', 'foo-id')
537
        tree.commit('first commit')
538
        self.build_tree_contents([('tree/foo', 'a\nb\nd\n')])
539
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
540
        self.addCleanup(creator.finalize)
0.12.73 by Aaron Bentley
Merge unshelve into shelf-manager
541
        list(creator.iter_shelvable())
0.15.23 by Aaron Bentley
Use correct tree for desrializing transform
542
        creator.shelve_lines('foo-id', ['a\n', 'b\n', 'c\n'])
0.12.57 by Aaron Bentley
Update for new Shelf API
543
        shelf_file = open('shelf', 'w+b')
544
        self.addCleanup(shelf_file.close)
545
        creator.write_shelf(shelf_file)
0.15.23 by Aaron Bentley
Use correct tree for desrializing transform
546
        creator.transform()
547
        self.build_tree_contents([('tree/foo', 'z\na\nb\nc\n')])
0.12.57 by Aaron Bentley
Update for new Shelf API
548
        shelf_file.seek(0)
549
        unshelver = shelf.Unshelver.from_tree_and_shelf(tree, shelf_file)
0.15.31 by Aaron Bentley
Remove 'unshelve' method, test make_merger
550
        unshelver.make_merger().do_merge()
0.15.23 by Aaron Bentley
Use correct tree for desrializing transform
551
        self.assertFileEqual('z\na\nb\nd\n', 'tree/foo')
552
3981.1.1 by Robert Collins
Fix bug 319790 - unshelve of deleted paths failing.
553
    def test_unshelve_deleted(self):
554
        tree = self.make_branch_and_tree('tree')
555
        tree.lock_write()
556
        self.addCleanup(tree.unlock)
557
        self.build_tree_contents([('tree/foo/',), ('tree/foo/bar', 'baz')])
558
        tree.add(['foo', 'foo/bar'], ['foo-id', 'bar-id'])
559
        tree.commit('Added file and directory')
560
        tree.unversion(['foo-id', 'bar-id'])
561
        os.unlink('tree/foo/bar')
562
        os.rmdir('tree/foo')
563
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
564
        list(creator.iter_shelvable())
565
        creator.shelve_deletion('foo-id')
566
        creator.shelve_deletion('bar-id')
567
        shelf_file = open('shelf', 'w+b')
568
        self.addCleanup(shelf_file.close)
569
        creator.write_shelf(shelf_file)
570
        creator.transform()
571
        creator.finalize()
572
        # validate the test setup
573
        self.assertTrue('foo-id' in tree)
574
        self.assertTrue('bar-id' in tree)
575
        self.assertFileEqual('baz', 'tree/foo/bar')
576
        shelf_file.seek(0)
577
        unshelver = shelf.Unshelver.from_tree_and_shelf(tree, shelf_file)
578
        unshelver.make_merger().do_merge()
579
        self.assertFalse('foo-id' in tree)
580
        self.assertFalse('bar-id' in tree)
581
0.12.26 by Aaron Bentley
Use correct base for shelving
582
    def test_unshelve_base(self):
583
        tree = self.make_branch_and_tree('tree')
584
        tree.lock_write()
585
        self.addCleanup(tree.unlock)
586
        tree.commit('rev1', rev_id='rev1')
0.15.5 by Aaron Bentley
Rename to shelf
587
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
0.12.59 by Aaron Bentley
Fix locking bugs in tests
588
        self.addCleanup(creator.finalize)
0.12.42 by Aaron Bentley
Get shelf from tree
589
        manager = tree.get_shelf_manager()
0.12.29 by Aaron Bentley
Update failing tests
590
        shelf_id, shelf_file = manager.new_shelf()
591
        try:
0.12.61 by Aaron Bentley
Stop assigning result of write_shelf
592
            creator.write_shelf(shelf_file)
0.12.29 by Aaron Bentley
Update failing tests
593
        finally:
594
            shelf_file.close()
0.12.26 by Aaron Bentley
Use correct base for shelving
595
        tree.commit('rev2', rev_id='rev2')
0.12.29 by Aaron Bentley
Update failing tests
596
        shelf_file = manager.read_shelf(1)
0.12.59 by Aaron Bentley
Fix locking bugs in tests
597
        self.addCleanup(shelf_file.close)
598
        unshelver = shelf.Unshelver.from_tree_and_shelf(tree, shelf_file)
599
        self.addCleanup(unshelver.finalize)
0.12.26 by Aaron Bentley
Use correct base for shelving
600
        self.assertEqual('rev1', unshelver.base_tree.get_revision_id())
0.12.27 by Aaron Bentley
Implement shelf manager
601
0.15.41 by Aaron Bentley
Replace assert with proper error handling
602
    def test_unshelve_serialization(self):
603
        tree = self.make_branch_and_tree('.')
604
        self.build_tree_contents([('shelf', EMPTY_SHELF)])
0.12.76 by Aaron Bentley
Convert failing tests
605
        shelf_file = open('shelf', 'rb')
606
        self.addCleanup(shelf_file.close)
607
        unshelver = shelf.Unshelver.from_tree_and_shelf(tree, shelf_file)
4595.13.2 by Alexander Belchenko
[cherrypick revno 4650 from bzr.dev] Fix shelve on windows. (Robert Collins, #305006)
608
        unshelver.finalize()
0.15.41 by Aaron Bentley
Replace assert with proper error handling
609
610
    def test_corrupt_shelf(self):
611
        tree = self.make_branch_and_tree('.')
612
        self.build_tree_contents([('shelf', EMPTY_SHELF.replace('metadata',
613
                                                                'foo'))])
0.12.76 by Aaron Bentley
Convert failing tests
614
        shelf_file = open('shelf', 'rb')
615
        self.addCleanup(shelf_file.close)
0.15.41 by Aaron Bentley
Replace assert with proper error handling
616
        e = self.assertRaises(errors.ShelfCorrupt,
617
                              shelf.Unshelver.from_tree_and_shelf, tree,
0.12.76 by Aaron Bentley
Convert failing tests
618
                              shelf_file)
0.15.41 by Aaron Bentley
Replace assert with proper error handling
619
        self.assertEqual('Shelf corrupt.', str(e))
0.12.75 by Aaron Bentley
Merge unshelve into shelf-manager
620
0.12.27 by Aaron Bentley
Implement shelf manager
621
622
class TestShelfManager(tests.TestCaseWithTransport):
623
0.12.42 by Aaron Bentley
Get shelf from tree
624
    def test_get_shelf_manager(self):
0.12.27 by Aaron Bentley
Implement shelf manager
625
        tree = self.make_branch_and_tree('.')
0.12.42 by Aaron Bentley
Get shelf from tree
626
        manager = tree.get_shelf_manager()
0.12.41 by Aaron Bentley
Change shelf to use WT control dir for shelves
627
        self.assertEqual(tree._transport.base + 'shelf/',
0.12.27 by Aaron Bentley
Implement shelf manager
628
                         manager.transport.base)
629
630
    def get_manager(self):
0.12.42 by Aaron Bentley
Get shelf from tree
631
        return self.make_branch_and_tree('.').get_shelf_manager()
0.12.27 by Aaron Bentley
Implement shelf manager
632
0.12.77 by Aaron Bentley
Use names of the form shelf-5 for shelves
633
    def test_get_shelf_filename(self):
634
        tree = self.make_branch_and_tree('.')
635
        manager = tree.get_shelf_manager()
636
        self.assertEqual('shelf-1', manager.get_shelf_filename(1))
637
638
    def test_get_shelf_ids(self):
639
        tree = self.make_branch_and_tree('.')
640
        manager = tree.get_shelf_manager()
641
        self.assertEqual([1, 3], manager.get_shelf_ids(
642
                         ['shelf-1', 'shelf-02', 'shelf-3']))
643
0.12.27 by Aaron Bentley
Implement shelf manager
644
    def test_new_shelf(self):
645
        manager = self.get_manager()
646
        shelf_id, shelf_file = manager.new_shelf()
647
        shelf_file.close()
648
        self.assertEqual(1, shelf_id)
649
        shelf_id, shelf_file = manager.new_shelf()
650
        shelf_file.close()
651
        self.assertEqual(2, shelf_id)
652
        manager.delete_shelf(1)
653
        shelf_id, shelf_file = manager.new_shelf()
654
        shelf_file.close()
655
        self.assertEqual(3, shelf_id)
656
657
    def test_active_shelves(self):
658
        manager = self.get_manager()
659
        self.assertEqual([], manager.active_shelves())
660
        shelf_id, shelf_file = manager.new_shelf()
661
        shelf_file.close()
662
        self.assertEqual([1], manager.active_shelves())
663
664
    def test_delete_shelf(self):
665
        manager = self.get_manager()
666
        shelf_id, shelf_file = manager.new_shelf()
667
        shelf_file.close()
668
        self.assertEqual([1], manager.active_shelves())
669
        manager.delete_shelf(1)
670
        self.assertEqual([], manager.active_shelves())
671
672
    def test_last_shelf(self):
673
        manager = self.get_manager()
674
        self.assertIs(None, manager.last_shelf())
675
        shelf_id, shelf_file = manager.new_shelf()
676
        shelf_file.close()
677
        self.assertEqual(1, manager.last_shelf())
678
679
    def test_read_shelf(self):
680
        manager = self.get_manager()
681
        shelf_id, shelf_file = manager.new_shelf()
682
        try:
683
            shelf_file.write('foo')
684
        finally:
685
            shelf_file.close()
686
        shelf_id, shelf_file = manager.new_shelf()
687
        try:
688
            shelf_file.write('bar')
689
        finally:
690
            shelf_file.close()
691
        shelf_file = manager.read_shelf(1)
692
        try:
693
            self.assertEqual('foo', shelf_file.read())
694
        finally:
695
            shelf_file.close()
696
        shelf_file = manager.read_shelf(2)
697
        try:
698
            self.assertEqual('bar', shelf_file.read())
699
        finally:
700
            shelf_file.close()
0.12.43 by Aaron Bentley
Make ShelfManager consume ShelfCreator and produce Unshelver
701
0.12.50 by Aaron Bentley
Improve error handling for non-existant shelf-ids
702
    def test_read_non_existant(self):
703
        manager = self.get_manager()
0.12.68 by Aaron Bentley
Update docs, move items to proper files.
704
        e = self.assertRaises(errors.NoSuchShelfId, manager.read_shelf, 1)
0.12.50 by Aaron Bentley
Improve error handling for non-existant shelf-ids
705
        self.assertEqual('No changes are shelved with id "1".', str(e))
706
0.12.43 by Aaron Bentley
Make ShelfManager consume ShelfCreator and produce Unshelver
707
    def test_shelve_changes(self):
708
        tree = self.make_branch_and_tree('tree')
0.12.44 by Aaron Bentley
Give manager responsibility for applying transform
709
        tree.commit('no-change commit')
710
        tree.lock_write()
711
        self.addCleanup(tree.unlock)
712
        self.build_tree_contents([('tree/foo', 'bar')])
713
        self.assertFileEqual('bar', 'tree/foo')
0.12.43 by Aaron Bentley
Make ShelfManager consume ShelfCreator and produce Unshelver
714
        tree.add('foo', 'foo-id')
715
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
716
        self.addCleanup(creator.finalize)
0.12.74 by Aaron Bentley
Update to use iter_shelvable
717
        list(creator.iter_shelvable())
0.12.43 by Aaron Bentley
Make ShelfManager consume ShelfCreator and produce Unshelver
718
        creator.shelve_creation('foo-id')
719
        shelf_manager = tree.get_shelf_manager()
720
        shelf_id = shelf_manager.shelve_changes(creator)
0.12.44 by Aaron Bentley
Give manager responsibility for applying transform
721
        self.failIfExists('tree/foo')
0.12.43 by Aaron Bentley
Make ShelfManager consume ShelfCreator and produce Unshelver
722
        unshelver = shelf_manager.get_unshelver(shelf_id)
0.12.67 by Aaron Bentley
Update for new Unshelver API
723
        unshelver.make_merger().do_merge()
0.12.44 by Aaron Bentley
Give manager responsibility for applying transform
724
        self.assertFileEqual('bar', 'tree/foo')
0.16.112 by Aaron Bentley
Add tests
725
726
    def test_get_metadata(self):
727
        tree = self.make_branch_and_tree('.')
4595.13.2 by Alexander Belchenko
[cherrypick revno 4650 from bzr.dev] Fix shelve on windows. (Robert Collins, #305006)
728
        tree.lock_tree_write()
729
        self.addCleanup(tree.unlock)
0.16.112 by Aaron Bentley
Add tests
730
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
4595.13.2 by Alexander Belchenko
[cherrypick revno 4650 from bzr.dev] Fix shelve on windows. (Robert Collins, #305006)
731
        self.addCleanup(creator.finalize)
0.16.112 by Aaron Bentley
Add tests
732
        shelf_manager = tree.get_shelf_manager()
733
        shelf_id = shelf_manager.shelve_changes(creator, 'foo')
734
        metadata = shelf_manager.get_metadata(shelf_id)
735
        self.assertEqual('foo', metadata['message'])
736
        self.assertEqual('null:', metadata['revision_id'])