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