/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
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
0.12.12 by Aaron Bentley
Implement shelf creator
16
0.12.17 by Aaron Bentley
Handle creating symlinks
17
import os
18
3873.2.4 by Benoît Pierre
Add a test: test_shelve_unversioned; check if tree is in a clean state
19
from bzrlib import errors, pack, shelf, tests, transform, workingtree
0.12.12 by Aaron Bentley
Implement shelf creator
20
21
0.14.34 by Aaron Bentley
Factor out the empty shelf
22
EMPTY_SHELF = ("Bazaar pack format 1 (introduced in 0.18)\n"
0.15.39 by Aaron Bentley
Update empty shelf serialization
23
               "B23\n"
24
               "metadata\n\n"
25
               "d11:revision_id5:null:e"
0.14.34 by Aaron Bentley
Factor out the empty shelf
26
               "B159\n"
27
               "attribs\n\n"
28
               "d10:_id_numberi0e18:_new_executabilityde7:_new_idde"
29
               "9:_new_namede11:_new_parentde16:_non_present_idsde"
30
               "17:_removed_contentsle11:_removed_idle14:_tree_path_idsdeeE")
31
32
0.12.12 by Aaron Bentley
Implement shelf creator
33
class TestPrepareShelf(tests.TestCaseWithTransport):
34
35
    def test_shelve_rename(self):
36
        tree = self.make_branch_and_tree('.')
37
        self.build_tree(['foo'])
38
        tree.add(['foo'], ['foo-id'])
39
        tree.commit('foo')
40
        tree.rename_one('foo', 'bar')
0.14.7 by Aaron Bentley
Misc test cleanup
41
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
0.12.12 by Aaron Bentley
Implement shelf creator
42
        self.addCleanup(creator.finalize)
0.14.32 by Aaron Bentley
Replace ShelfCreator.__iter__ with ShelfCreator.iter_shelvable
43
        self.assertEqual([('rename', 'foo-id', 'foo', 'bar')],
44
                          list(creator.iter_shelvable()))
0.12.12 by Aaron Bentley
Implement shelf creator
45
        creator.shelve_rename('foo-id')
46
        work_trans_id = creator.work_transform.trans_id_file_id('foo-id')
47
        self.assertEqual('foo', creator.work_transform.final_name(
48
                         work_trans_id))
49
        shelf_trans_id = creator.shelf_transform.trans_id_file_id('foo-id')
50
        self.assertEqual('bar', creator.shelf_transform.final_name(
51
                         shelf_trans_id))
52
53
    def test_shelve_move(self):
54
        tree = self.make_branch_and_tree('.')
55
        self.build_tree(['foo/', 'bar/', 'foo/baz'])
56
        tree.add(['foo', 'bar', 'foo/baz'], ['foo-id', 'bar-id', 'baz-id'])
57
        tree.commit('foo')
58
        tree.rename_one('foo/baz', 'bar/baz')
0.14.7 by Aaron Bentley
Misc test cleanup
59
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
0.12.12 by Aaron Bentley
Implement shelf creator
60
        self.addCleanup(creator.finalize)
61
        self.assertEqual([('rename', 'baz-id', 'foo/baz', 'bar/baz')],
0.14.32 by Aaron Bentley
Replace ShelfCreator.__iter__ with ShelfCreator.iter_shelvable
62
                         list(creator.iter_shelvable()))
0.12.12 by Aaron Bentley
Implement shelf creator
63
        creator.shelve_rename('baz-id')
64
        work_trans_id = creator.work_transform.trans_id_file_id('baz-id')
65
        work_foo = creator.work_transform.trans_id_file_id('foo-id')
66
        self.assertEqual(work_foo, creator.work_transform.final_parent(
67
                         work_trans_id))
68
        shelf_trans_id = creator.shelf_transform.trans_id_file_id('baz-id')
69
        shelf_bar = creator.shelf_transform.trans_id_file_id('bar-id')
70
        self.assertEqual(shelf_bar, creator.shelf_transform.final_parent(
71
                         shelf_trans_id))
0.12.13 by Aaron Bentley
Implement shelving content
72
        creator.transform()
73
        self.assertEqual('foo/baz', tree.id2path('baz-id'))
74
0.12.14 by Aaron Bentley
Add shelving of created files
75
    def assertShelvedFileEqual(self, expected_content, creator, file_id):
76
        s_trans_id = creator.shelf_transform.trans_id_file_id(file_id)
77
        shelf_file = creator.shelf_transform._limbo_name(s_trans_id)
78
        self.assertFileEqual(expected_content, shelf_file)
79
0.12.13 by Aaron Bentley
Implement shelving content
80
    def test_shelve_content_change(self):
81
        tree = self.make_branch_and_tree('.')
82
        tree.lock_write()
83
        self.addCleanup(tree.unlock)
84
        self.build_tree_contents([('foo', 'a\n')])
85
        tree.add('foo', 'foo-id')
86
        tree.commit('Committed foo')
87
        self.build_tree_contents([('foo', 'b\na\nc\n')])
0.14.7 by Aaron Bentley
Misc test cleanup
88
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
0.12.13 by Aaron Bentley
Implement shelving content
89
        self.addCleanup(creator.finalize)
0.14.32 by Aaron Bentley
Replace ShelfCreator.__iter__ with ShelfCreator.iter_shelvable
90
        self.assertEqual([('modify text', 'foo-id')],
91
                         list(creator.iter_shelvable()))
0.14.14 by Aaron Bentley
Change shelf_text to shelve_lines
92
        creator.shelve_lines('foo-id', ['a\n', 'c\n'])
0.12.13 by Aaron Bentley
Implement shelving content
93
        creator.transform()
94
        self.assertFileEqual('a\nc\n', 'foo')
0.12.14 by Aaron Bentley
Add shelving of created files
95
        self.assertShelvedFileEqual('b\na\n', creator, 'foo-id')
96
97
    def test_shelve_creation(self):
98
        tree = self.make_branch_and_tree('.')
99
        tree.lock_write()
100
        self.addCleanup(tree.unlock)
101
        tree.commit('Empty tree')
0.12.16 by Aaron Bentley
Handle shelving directory creation
102
        self.build_tree_contents([('foo', 'a\n'), ('bar/',)])
103
        tree.add(['foo', 'bar'], ['foo-id', 'bar-id'])
0.14.7 by Aaron Bentley
Misc test cleanup
104
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
0.12.14 by Aaron Bentley
Add shelving of created files
105
        self.addCleanup(creator.finalize)
0.14.13 by Aaron Bentley
Provide path and kind when deletes/adds are detected.
106
        self.assertEqual([('add file', 'bar-id', 'directory', 'bar'),
107
                          ('add file', 'foo-id', 'file', 'foo')],
0.14.32 by Aaron Bentley
Replace ShelfCreator.__iter__ with ShelfCreator.iter_shelvable
108
                          sorted(list(creator.iter_shelvable())))
0.14.2 by Aaron Bentley
Somewhat clean up shelving
109
        creator.shelve_creation('foo-id')
110
        creator.shelve_creation('bar-id')
0.12.14 by Aaron Bentley
Add shelving of created files
111
        creator.transform()
0.12.15 by Aaron Bentley
Handle file-id when shelving creation
112
        self.assertRaises(StopIteration,
113
                          tree.iter_entries_by_dir(['foo-id']).next)
114
        s_trans_id = creator.shelf_transform.trans_id_file_id('foo-id')
115
        self.assertEqual('foo-id',
116
                         creator.shelf_transform.final_file_id(s_trans_id))
0.12.14 by Aaron Bentley
Add shelving of created files
117
        self.failIfExists('foo')
0.12.16 by Aaron Bentley
Handle shelving directory creation
118
        self.failIfExists('bar')
0.12.14 by Aaron Bentley
Add shelving of created files
119
        self.assertShelvedFileEqual('a\n', creator, 'foo-id')
0.12.16 by Aaron Bentley
Handle shelving directory creation
120
        s_bar_trans_id = creator.shelf_transform.trans_id_file_id('bar-id')
121
        self.assertEqual('directory',
122
            creator.shelf_transform.final_kind(s_bar_trans_id))
0.12.17 by Aaron Bentley
Handle creating symlinks
123
124
    def test_shelve_symlink_creation(self):
125
        self.requireFeature(tests.SymlinkFeature)
126
        tree = self.make_branch_and_tree('.')
127
        tree.lock_write()
128
        self.addCleanup(tree.unlock)
129
        tree.commit('Empty tree')
130
        os.symlink('bar', 'foo')
131
        tree.add('foo', 'foo-id')
0.14.7 by Aaron Bentley
Misc test cleanup
132
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
0.12.17 by Aaron Bentley
Handle creating symlinks
133
        self.addCleanup(creator.finalize)
0.14.13 by Aaron Bentley
Provide path and kind when deletes/adds are detected.
134
        self.assertEqual([('add file', 'foo-id', 'symlink', 'foo')],
0.14.32 by Aaron Bentley
Replace ShelfCreator.__iter__ with ShelfCreator.iter_shelvable
135
                         list(creator.iter_shelvable()))
0.14.2 by Aaron Bentley
Somewhat clean up shelving
136
        creator.shelve_creation('foo-id')
0.12.17 by Aaron Bentley
Handle creating symlinks
137
        creator.transform()
138
        s_trans_id = creator.shelf_transform.trans_id_file_id('foo-id')
139
        self.failIfExists('foo')
140
        limbo_name = creator.shelf_transform._limbo_name(s_trans_id)
141
        self.assertEqual('bar', os.readlink(limbo_name))
0.12.19 by Aaron Bentley
Add support for writing shelves
142
0.14.12 by Aaron Bentley
Handle new dangling ids
143
    def test_shelve_creation_no_contents(self):
144
        tree = self.make_branch_and_tree('.')
145
        tree.lock_write()
146
        self.addCleanup(tree.unlock)
147
        tree.commit('Empty tree')
148
        self.build_tree(['foo'])
149
        tree.add('foo', 'foo-id')
150
        os.unlink('foo')
151
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
152
        self.addCleanup(creator.finalize)
0.14.13 by Aaron Bentley
Provide path and kind when deletes/adds are detected.
153
        self.assertEqual([('add file', 'foo-id', None, 'foo')],
0.14.32 by Aaron Bentley
Replace ShelfCreator.__iter__ with ShelfCreator.iter_shelvable
154
                         sorted(list(creator.iter_shelvable())))
0.14.12 by Aaron Bentley
Handle new dangling ids
155
        creator.shelve_creation('foo-id')
156
        creator.transform()
157
        self.assertRaises(StopIteration,
158
                          tree.iter_entries_by_dir(['foo-id']).next)
159
        self.assertShelvedFileEqual('', creator, 'foo-id')
160
        s_trans_id = creator.shelf_transform.trans_id_file_id('foo-id')
161
        self.assertEqual('foo-id',
162
                         creator.shelf_transform.final_file_id(s_trans_id))
163
        self.failIfExists('foo')
164
0.14.4 by Aaron Bentley
Implement shelving deletion
165
    def test_shelve_deletion(self):
166
        tree = self.make_branch_and_tree('tree')
0.14.11 by Aaron Bentley
Fix re-versioning
167
        tree.lock_write()
168
        self.addCleanup(tree.unlock)
0.14.4 by Aaron Bentley
Implement shelving deletion
169
        self.build_tree_contents([('tree/foo/',), ('tree/foo/bar', 'baz')])
170
        tree.add(['foo', 'foo/bar'], ['foo-id', 'bar-id'])
171
        tree.commit('Added file and directory')
0.14.9 by Aaron Bentley
Shelve deleted files properly
172
        tree.unversion(['foo-id', 'bar-id'])
0.14.4 by Aaron Bentley
Implement shelving deletion
173
        os.unlink('tree/foo/bar')
174
        os.rmdir('tree/foo')
0.14.7 by Aaron Bentley
Misc test cleanup
175
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
0.14.4 by Aaron Bentley
Implement shelving deletion
176
        self.addCleanup(creator.finalize)
0.14.13 by Aaron Bentley
Provide path and kind when deletes/adds are detected.
177
        self.assertEqual([('delete file', 'bar-id', 'file', 'foo/bar'),
178
                          ('delete file', 'foo-id', 'directory', 'foo')],
0.14.32 by Aaron Bentley
Replace ShelfCreator.__iter__ with ShelfCreator.iter_shelvable
179
                          sorted(list(creator.iter_shelvable())))
0.14.4 by Aaron Bentley
Implement shelving deletion
180
        creator.shelve_deletion('foo-id')
181
        creator.shelve_deletion('bar-id')
0.14.6 by Aaron Bentley
Fix deletion test
182
        creator.transform()
0.14.11 by Aaron Bentley
Fix re-versioning
183
        self.assertTrue('foo-id' in tree)
184
        self.assertTrue('bar-id' in tree)
0.14.4 by Aaron Bentley
Implement shelving deletion
185
        self.assertFileEqual('baz', 'tree/foo/bar')
186
0.14.10 by Aaron Bentley
Fix behavior with deletions, unversioning, ...
187
    def test_shelve_delete_contents(self):
188
        tree = self.make_branch_and_tree('tree')
189
        self.build_tree(['tree/foo',])
190
        tree.add('foo', 'foo-id')
191
        tree.commit('Added file and directory')
192
        os.unlink('tree/foo')
193
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
194
        self.addCleanup(creator.finalize)
0.14.13 by Aaron Bentley
Provide path and kind when deletes/adds are detected.
195
        self.assertEqual([('delete file', 'foo-id', 'file', 'foo')],
0.14.32 by Aaron Bentley
Replace ShelfCreator.__iter__ with ShelfCreator.iter_shelvable
196
                         sorted(list(creator.iter_shelvable())))
0.14.10 by Aaron Bentley
Fix behavior with deletions, unversioning, ...
197
        creator.shelve_deletion('foo-id')
198
        creator.transform()
199
        self.failUnlessExists('tree/foo')
200
0.14.23 by Aaron Bentley
Allow shelving kind change
201
    def test_shelve_change_kind(self):
202
        tree = self.make_branch_and_tree('tree')
203
        self.build_tree_contents([('tree/foo', 'bar')])
204
        tree.add('foo', 'foo-id')
205
        tree.commit('Added file and directory')
206
        os.unlink('tree/foo')
207
        os.mkdir('tree/foo')
208
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
209
        self.addCleanup(creator.finalize)
210
        self.assertEqual([('change kind', 'foo-id', 'file', 'directory',
0.14.32 by Aaron Bentley
Replace ShelfCreator.__iter__ with ShelfCreator.iter_shelvable
211
                           'foo')], sorted(list(creator.iter_shelvable())))
0.14.23 by Aaron Bentley
Allow shelving kind change
212
        creator.shelve_content_change('foo-id')
213
        creator.transform()
214
        self.assertFileEqual('bar', 'tree/foo')
215
        s_trans_id = creator.shelf_transform.trans_id_file_id('foo-id')
216
        self.assertEqual('directory',
217
                         creator.shelf_transform._new_contents[s_trans_id])
218
0.14.10 by Aaron Bentley
Fix behavior with deletions, unversioning, ...
219
    def test_shelve_unversion(self):
220
        tree = self.make_branch_and_tree('tree')
221
        self.build_tree(['tree/foo',])
222
        tree.add('foo', 'foo-id')
223
        tree.commit('Added file and directory')
224
        tree.unversion(['foo-id'])
225
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
226
        self.addCleanup(creator.finalize)
0.14.13 by Aaron Bentley
Provide path and kind when deletes/adds are detected.
227
        self.assertEqual([('delete file', 'foo-id', 'file', 'foo')],
0.14.32 by Aaron Bentley
Replace ShelfCreator.__iter__ with ShelfCreator.iter_shelvable
228
                         sorted(list(creator.iter_shelvable())))
0.14.10 by Aaron Bentley
Fix behavior with deletions, unversioning, ...
229
        creator.shelve_deletion('foo-id')
230
        creator.transform()
231
        self.failUnlessExists('tree/foo')
232
0.14.33 by Aaron Bentley
Add explicit test of shelf on-disk format
233
    def test_shelve_serialization(self):
234
        tree = self.make_branch_and_tree('.')
235
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
236
        self.addCleanup(creator.finalize)
0.12.76 by Aaron Bentley
Convert failing tests
237
        shelf_file = open('shelf', 'wb')
238
        self.addCleanup(shelf_file.close)
239
        try:
240
            creator.write_shelf(shelf_file)
241
        finally:
242
            shelf_file.close()
243
        self.assertFileEqual(EMPTY_SHELF, 'shelf')
0.14.33 by Aaron Bentley
Add explicit test of shelf on-disk format
244
0.12.19 by Aaron Bentley
Add support for writing shelves
245
    def test_write_shelf(self):
246
        tree = self.make_branch_and_tree('tree')
247
        self.build_tree(['tree/foo'])
248
        tree.add('foo', 'foo-id')
0.14.7 by Aaron Bentley
Misc test cleanup
249
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
250
        self.addCleanup(creator.finalize)
0.14.32 by Aaron Bentley
Replace ShelfCreator.__iter__ with ShelfCreator.iter_shelvable
251
        list(creator.iter_shelvable())
0.14.2 by Aaron Bentley
Somewhat clean up shelving
252
        creator.shelve_creation('foo-id')
0.12.29 by Aaron Bentley
Update failing tests
253
        shelf_file = open('shelf', 'wb')
254
        try:
0.12.61 by Aaron Bentley
Stop assigning result of write_shelf
255
            creator.write_shelf(shelf_file)
0.12.29 by Aaron Bentley
Update failing tests
256
        finally:
257
            shelf_file.close()
0.12.19 by Aaron Bentley
Add support for writing shelves
258
        parser = pack.ContainerPushParser()
0.12.29 by Aaron Bentley
Update failing tests
259
        shelf_file = open('shelf', 'rb')
0.12.19 by Aaron Bentley
Add support for writing shelves
260
        try:
261
            parser.accept_bytes(shelf_file.read())
262
        finally:
263
            shelf_file.close()
264
        tt = transform.TransformPreview(tree)
0.14.7 by Aaron Bentley
Misc test cleanup
265
        self.addCleanup(tt.finalize)
0.12.29 by Aaron Bentley
Update failing tests
266
        records = iter(parser.read_pending_records())
267
        #skip revision-id
268
        records.next()
0.15.26 by Aaron Bentley
Merge with prepare-shelf
269
        tt.deserialize(records)
0.12.21 by Aaron Bentley
Add failing test of unshelver
270
3873.2.4 by Benoît Pierre
Add a test: test_shelve_unversioned; check if tree is in a clean state
271
    def test_shelve_unversioned(self):
272
        tree = self.make_branch_and_tree('tree')
273
        self.assertRaises(errors.PathsNotVersionedError,
274
                          shelf.ShelfCreator, tree, tree.basis_tree(), ['foo'])
275
        # We should be able to lock/unlock the tree if ShelfCreator cleaned
276
        # after itself.
277
        wt = workingtree.WorkingTree.open('tree')
278
        wt.lock_tree_write()
279
        wt.unlock()
280
        # And a second tentative should raise the same error (no
281
        # limbo/pending_deletion leftovers).
282
        self.assertRaises(errors.PathsNotVersionedError,
283
                          shelf.ShelfCreator, tree, tree.basis_tree(), ['foo'])
284
0.12.21 by Aaron Bentley
Add failing test of unshelver
285
286
class TestUnshelver(tests.TestCaseWithTransport):
287
0.15.31 by Aaron Bentley
Remove 'unshelve' method, test make_merger
288
    def test_make_merger(self):
0.12.21 by Aaron Bentley
Add failing test of unshelver
289
        tree = self.make_branch_and_tree('tree')
0.12.30 by Aaron Bentley
Fix test by using non NULL base tree
290
        tree.commit('first commit')
0.12.21 by Aaron Bentley
Add failing test of unshelver
291
        self.build_tree_contents([('tree/foo', 'bar')])
0.12.24 by Aaron Bentley
Get unshelve using merge codepath, not applying transform directly
292
        tree.lock_write()
293
        self.addCleanup(tree.unlock)
0.12.21 by Aaron Bentley
Add failing test of unshelver
294
        tree.add('foo', 'foo-id')
0.15.5 by Aaron Bentley
Rename to shelf
295
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
296
        self.addCleanup(creator.finalize)
0.12.73 by Aaron Bentley
Merge unshelve into shelf-manager
297
        list(creator.iter_shelvable())
0.12.23 by Aaron Bentley
Fix up unshelve some more
298
        creator.shelve_creation('foo-id')
0.12.29 by Aaron Bentley
Update failing tests
299
        shelf_file = open('shelf-file', 'w+b')
300
        try:
0.12.61 by Aaron Bentley
Stop assigning result of write_shelf
301
            creator.write_shelf(shelf_file)
0.12.29 by Aaron Bentley
Update failing tests
302
            creator.transform()
303
            shelf_file.seek(0)
0.12.34 by Aaron Bentley
merge with unshelve
304
            unshelver = shelf.Unshelver.from_tree_and_shelf(tree, shelf_file)
0.12.66 by Aaron Bentley
Merge with unshelve
305
            unshelver.make_merger().do_merge()
0.12.29 by Aaron Bentley
Update failing tests
306
            self.assertFileEqual('bar', 'tree/foo')
307
        finally:
308
            shelf_file.close()
0.12.26 by Aaron Bentley
Use correct base for shelving
309
0.15.23 by Aaron Bentley
Use correct tree for desrializing transform
310
    def test_unshelve_changed(self):
311
        tree = self.make_branch_and_tree('tree')
312
        tree.lock_write()
313
        self.addCleanup(tree.unlock)
314
        self.build_tree_contents([('tree/foo', 'a\nb\nc\n')])
315
        tree.add('foo', 'foo-id')
316
        tree.commit('first commit')
317
        self.build_tree_contents([('tree/foo', 'a\nb\nd\n')])
318
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
319
        self.addCleanup(creator.finalize)
0.12.73 by Aaron Bentley
Merge unshelve into shelf-manager
320
        list(creator.iter_shelvable())
0.15.23 by Aaron Bentley
Use correct tree for desrializing transform
321
        creator.shelve_lines('foo-id', ['a\n', 'b\n', 'c\n'])
0.12.57 by Aaron Bentley
Update for new Shelf API
322
        shelf_file = open('shelf', 'w+b')
323
        self.addCleanup(shelf_file.close)
324
        creator.write_shelf(shelf_file)
0.15.23 by Aaron Bentley
Use correct tree for desrializing transform
325
        creator.transform()
326
        self.build_tree_contents([('tree/foo', 'z\na\nb\nc\n')])
0.12.57 by Aaron Bentley
Update for new Shelf API
327
        shelf_file.seek(0)
328
        unshelver = shelf.Unshelver.from_tree_and_shelf(tree, shelf_file)
0.15.31 by Aaron Bentley
Remove 'unshelve' method, test make_merger
329
        unshelver.make_merger().do_merge()
0.15.23 by Aaron Bentley
Use correct tree for desrializing transform
330
        self.assertFileEqual('z\na\nb\nd\n', 'tree/foo')
331
3981.1.1 by Robert Collins
Fix bug 319790 - unshelve of deleted paths failing.
332
    def test_unshelve_deleted(self):
333
        tree = self.make_branch_and_tree('tree')
334
        tree.lock_write()
335
        self.addCleanup(tree.unlock)
336
        self.build_tree_contents([('tree/foo/',), ('tree/foo/bar', 'baz')])
337
        tree.add(['foo', 'foo/bar'], ['foo-id', 'bar-id'])
338
        tree.commit('Added file and directory')
339
        tree.unversion(['foo-id', 'bar-id'])
340
        os.unlink('tree/foo/bar')
341
        os.rmdir('tree/foo')
342
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
343
        list(creator.iter_shelvable())
344
        creator.shelve_deletion('foo-id')
345
        creator.shelve_deletion('bar-id')
346
        shelf_file = open('shelf', 'w+b')
347
        self.addCleanup(shelf_file.close)
348
        creator.write_shelf(shelf_file)
349
        creator.transform()
350
        creator.finalize()
351
        # validate the test setup
352
        self.assertTrue('foo-id' in tree)
353
        self.assertTrue('bar-id' in tree)
354
        self.assertFileEqual('baz', 'tree/foo/bar')
355
        shelf_file.seek(0)
356
        unshelver = shelf.Unshelver.from_tree_and_shelf(tree, shelf_file)
357
        unshelver.make_merger().do_merge()
358
        self.assertFalse('foo-id' in tree)
359
        self.assertFalse('bar-id' in tree)
360
0.12.26 by Aaron Bentley
Use correct base for shelving
361
    def test_unshelve_base(self):
362
        tree = self.make_branch_and_tree('tree')
363
        tree.lock_write()
364
        self.addCleanup(tree.unlock)
365
        tree.commit('rev1', rev_id='rev1')
0.15.5 by Aaron Bentley
Rename to shelf
366
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
0.12.59 by Aaron Bentley
Fix locking bugs in tests
367
        self.addCleanup(creator.finalize)
0.12.42 by Aaron Bentley
Get shelf from tree
368
        manager = tree.get_shelf_manager()
0.12.29 by Aaron Bentley
Update failing tests
369
        shelf_id, shelf_file = manager.new_shelf()
370
        try:
0.12.61 by Aaron Bentley
Stop assigning result of write_shelf
371
            creator.write_shelf(shelf_file)
0.12.29 by Aaron Bentley
Update failing tests
372
        finally:
373
            shelf_file.close()
0.12.26 by Aaron Bentley
Use correct base for shelving
374
        tree.commit('rev2', rev_id='rev2')
0.12.29 by Aaron Bentley
Update failing tests
375
        shelf_file = manager.read_shelf(1)
0.12.59 by Aaron Bentley
Fix locking bugs in tests
376
        self.addCleanup(shelf_file.close)
377
        unshelver = shelf.Unshelver.from_tree_and_shelf(tree, shelf_file)
378
        self.addCleanup(unshelver.finalize)
0.12.26 by Aaron Bentley
Use correct base for shelving
379
        self.assertEqual('rev1', unshelver.base_tree.get_revision_id())
0.12.27 by Aaron Bentley
Implement shelf manager
380
0.15.41 by Aaron Bentley
Replace assert with proper error handling
381
    def test_unshelve_serialization(self):
382
        tree = self.make_branch_and_tree('.')
383
        self.build_tree_contents([('shelf', EMPTY_SHELF)])
0.12.76 by Aaron Bentley
Convert failing tests
384
        shelf_file = open('shelf', 'rb')
385
        self.addCleanup(shelf_file.close)
386
        unshelver = shelf.Unshelver.from_tree_and_shelf(tree, shelf_file)
0.15.41 by Aaron Bentley
Replace assert with proper error handling
387
388
    def test_corrupt_shelf(self):
389
        tree = self.make_branch_and_tree('.')
390
        self.build_tree_contents([('shelf', EMPTY_SHELF.replace('metadata',
391
                                                                'foo'))])
0.12.76 by Aaron Bentley
Convert failing tests
392
        shelf_file = open('shelf', 'rb')
393
        self.addCleanup(shelf_file.close)
0.15.41 by Aaron Bentley
Replace assert with proper error handling
394
        e = self.assertRaises(errors.ShelfCorrupt,
395
                              shelf.Unshelver.from_tree_and_shelf, tree,
0.12.76 by Aaron Bentley
Convert failing tests
396
                              shelf_file)
0.15.41 by Aaron Bentley
Replace assert with proper error handling
397
        self.assertEqual('Shelf corrupt.', str(e))
0.12.75 by Aaron Bentley
Merge unshelve into shelf-manager
398
0.12.27 by Aaron Bentley
Implement shelf manager
399
400
class TestShelfManager(tests.TestCaseWithTransport):
401
0.12.42 by Aaron Bentley
Get shelf from tree
402
    def test_get_shelf_manager(self):
0.12.27 by Aaron Bentley
Implement shelf manager
403
        tree = self.make_branch_and_tree('.')
0.12.42 by Aaron Bentley
Get shelf from tree
404
        manager = tree.get_shelf_manager()
0.12.41 by Aaron Bentley
Change shelf to use WT control dir for shelves
405
        self.assertEqual(tree._transport.base + 'shelf/',
0.12.27 by Aaron Bentley
Implement shelf manager
406
                         manager.transport.base)
407
408
    def get_manager(self):
0.12.42 by Aaron Bentley
Get shelf from tree
409
        return self.make_branch_and_tree('.').get_shelf_manager()
0.12.27 by Aaron Bentley
Implement shelf manager
410
0.12.77 by Aaron Bentley
Use names of the form shelf-5 for shelves
411
    def test_get_shelf_filename(self):
412
        tree = self.make_branch_and_tree('.')
413
        manager = tree.get_shelf_manager()
414
        self.assertEqual('shelf-1', manager.get_shelf_filename(1))
415
416
    def test_get_shelf_ids(self):
417
        tree = self.make_branch_and_tree('.')
418
        manager = tree.get_shelf_manager()
419
        self.assertEqual([1, 3], manager.get_shelf_ids(
420
                         ['shelf-1', 'shelf-02', 'shelf-3']))
421
0.12.27 by Aaron Bentley
Implement shelf manager
422
    def test_new_shelf(self):
423
        manager = self.get_manager()
424
        shelf_id, shelf_file = manager.new_shelf()
425
        shelf_file.close()
426
        self.assertEqual(1, shelf_id)
427
        shelf_id, shelf_file = manager.new_shelf()
428
        shelf_file.close()
429
        self.assertEqual(2, shelf_id)
430
        manager.delete_shelf(1)
431
        shelf_id, shelf_file = manager.new_shelf()
432
        shelf_file.close()
433
        self.assertEqual(3, shelf_id)
434
435
    def test_active_shelves(self):
436
        manager = self.get_manager()
437
        self.assertEqual([], manager.active_shelves())
438
        shelf_id, shelf_file = manager.new_shelf()
439
        shelf_file.close()
440
        self.assertEqual([1], manager.active_shelves())
441
442
    def test_delete_shelf(self):
443
        manager = self.get_manager()
444
        shelf_id, shelf_file = manager.new_shelf()
445
        shelf_file.close()
446
        self.assertEqual([1], manager.active_shelves())
447
        manager.delete_shelf(1)
448
        self.assertEqual([], manager.active_shelves())
449
450
    def test_last_shelf(self):
451
        manager = self.get_manager()
452
        self.assertIs(None, manager.last_shelf())
453
        shelf_id, shelf_file = manager.new_shelf()
454
        shelf_file.close()
455
        self.assertEqual(1, manager.last_shelf())
456
457
    def test_read_shelf(self):
458
        manager = self.get_manager()
459
        shelf_id, shelf_file = manager.new_shelf()
460
        try:
461
            shelf_file.write('foo')
462
        finally:
463
            shelf_file.close()
464
        shelf_id, shelf_file = manager.new_shelf()
465
        try:
466
            shelf_file.write('bar')
467
        finally:
468
            shelf_file.close()
469
        shelf_file = manager.read_shelf(1)
470
        try:
471
            self.assertEqual('foo', shelf_file.read())
472
        finally:
473
            shelf_file.close()
474
        shelf_file = manager.read_shelf(2)
475
        try:
476
            self.assertEqual('bar', shelf_file.read())
477
        finally:
478
            shelf_file.close()
0.12.43 by Aaron Bentley
Make ShelfManager consume ShelfCreator and produce Unshelver
479
0.12.50 by Aaron Bentley
Improve error handling for non-existant shelf-ids
480
    def test_read_non_existant(self):
481
        manager = self.get_manager()
0.12.68 by Aaron Bentley
Update docs, move items to proper files.
482
        e = self.assertRaises(errors.NoSuchShelfId, manager.read_shelf, 1)
0.12.50 by Aaron Bentley
Improve error handling for non-existant shelf-ids
483
        self.assertEqual('No changes are shelved with id "1".', str(e))
484
0.12.43 by Aaron Bentley
Make ShelfManager consume ShelfCreator and produce Unshelver
485
    def test_shelve_changes(self):
486
        tree = self.make_branch_and_tree('tree')
0.12.44 by Aaron Bentley
Give manager responsibility for applying transform
487
        tree.commit('no-change commit')
488
        tree.lock_write()
489
        self.addCleanup(tree.unlock)
490
        self.build_tree_contents([('tree/foo', 'bar')])
491
        self.assertFileEqual('bar', 'tree/foo')
0.12.43 by Aaron Bentley
Make ShelfManager consume ShelfCreator and produce Unshelver
492
        tree.add('foo', 'foo-id')
493
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
494
        self.addCleanup(creator.finalize)
0.12.74 by Aaron Bentley
Update to use iter_shelvable
495
        list(creator.iter_shelvable())
0.12.43 by Aaron Bentley
Make ShelfManager consume ShelfCreator and produce Unshelver
496
        creator.shelve_creation('foo-id')
497
        shelf_manager = tree.get_shelf_manager()
498
        shelf_id = shelf_manager.shelve_changes(creator)
0.12.44 by Aaron Bentley
Give manager responsibility for applying transform
499
        self.failIfExists('tree/foo')
0.12.43 by Aaron Bentley
Make ShelfManager consume ShelfCreator and produce Unshelver
500
        unshelver = shelf_manager.get_unshelver(shelf_id)
0.12.67 by Aaron Bentley
Update for new Unshelver API
501
        unshelver.make_merger().do_merge()
0.12.44 by Aaron Bentley
Give manager responsibility for applying transform
502
        self.assertFileEqual('bar', 'tree/foo')
0.16.112 by Aaron Bentley
Add tests
503
504
    def test_get_metadata(self):
505
        tree = self.make_branch_and_tree('.')
506
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
507
        shelf_manager = tree.get_shelf_manager()
508
        shelf_id = shelf_manager.shelve_changes(creator, 'foo')
509
        metadata = shelf_manager.get_metadata(shelf_id)
510
        self.assertEqual('foo', metadata['message'])
511
        self.assertEqual('null:', metadata['revision_id'])