/brz/remove-bazaar

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