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