/brz/remove-bazaar

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