/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
0.12.12 by Aaron Bentley
Implement shelf creator
1
# Copyright (C) 2008 Aaron Bentley <aaron@aaronbentley.com>
2
#
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
16
0.12.17 by Aaron Bentley
Handle creating symlinks
17
import os
18
0.12.19 by Aaron Bentley
Add support for writing shelves
19
from bzrlib import pack, tests, transform
0.14.7 by Aaron Bentley
Misc test cleanup
20
from bzrlib.plugins.shelf2 import shelf, serialize_transform
0.12.12 by Aaron Bentley
Implement shelf creator
21
22
23
class TestPrepareShelf(tests.TestCaseWithTransport):
24
25
    def test_shelve_rename(self):
26
        tree = self.make_branch_and_tree('.')
27
        self.build_tree(['foo'])
28
        tree.add(['foo'], ['foo-id'])
29
        tree.commit('foo')
30
        tree.rename_one('foo', 'bar')
0.14.7 by Aaron Bentley
Misc test cleanup
31
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
0.12.12 by Aaron Bentley
Implement shelf creator
32
        self.addCleanup(creator.finalize)
33
        self.assertEqual([('rename', 'foo-id', 'foo', 'bar')], list(creator))
34
        creator.shelve_rename('foo-id')
35
        work_trans_id = creator.work_transform.trans_id_file_id('foo-id')
36
        self.assertEqual('foo', creator.work_transform.final_name(
37
                         work_trans_id))
38
        shelf_trans_id = creator.shelf_transform.trans_id_file_id('foo-id')
39
        self.assertEqual('bar', creator.shelf_transform.final_name(
40
                         shelf_trans_id))
41
42
    def test_shelve_move(self):
43
        tree = self.make_branch_and_tree('.')
44
        self.build_tree(['foo/', 'bar/', 'foo/baz'])
45
        tree.add(['foo', 'bar', 'foo/baz'], ['foo-id', 'bar-id', 'baz-id'])
46
        tree.commit('foo')
47
        tree.rename_one('foo/baz', 'bar/baz')
0.14.7 by Aaron Bentley
Misc test cleanup
48
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
0.12.12 by Aaron Bentley
Implement shelf creator
49
        self.addCleanup(creator.finalize)
50
        self.assertEqual([('rename', 'baz-id', 'foo/baz', 'bar/baz')],
51
                         list(creator))
52
        creator.shelve_rename('baz-id')
53
        work_trans_id = creator.work_transform.trans_id_file_id('baz-id')
54
        work_foo = creator.work_transform.trans_id_file_id('foo-id')
55
        self.assertEqual(work_foo, creator.work_transform.final_parent(
56
                         work_trans_id))
57
        shelf_trans_id = creator.shelf_transform.trans_id_file_id('baz-id')
58
        shelf_bar = creator.shelf_transform.trans_id_file_id('bar-id')
59
        self.assertEqual(shelf_bar, creator.shelf_transform.final_parent(
60
                         shelf_trans_id))
0.12.13 by Aaron Bentley
Implement shelving content
61
        creator.transform()
62
        self.assertEqual('foo/baz', tree.id2path('baz-id'))
63
0.12.14 by Aaron Bentley
Add shelving of created files
64
    def assertShelvedFileEqual(self, expected_content, creator, file_id):
65
        s_trans_id = creator.shelf_transform.trans_id_file_id(file_id)
66
        shelf_file = creator.shelf_transform._limbo_name(s_trans_id)
67
        self.assertFileEqual(expected_content, shelf_file)
68
0.12.13 by Aaron Bentley
Implement shelving content
69
    def test_shelve_content_change(self):
70
        tree = self.make_branch_and_tree('.')
71
        tree.lock_write()
72
        self.addCleanup(tree.unlock)
73
        self.build_tree_contents([('foo', 'a\n')])
74
        tree.add('foo', 'foo-id')
75
        tree.commit('Committed foo')
76
        self.build_tree_contents([('foo', 'b\na\nc\n')])
0.14.7 by Aaron Bentley
Misc test cleanup
77
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
0.12.13 by Aaron Bentley
Implement shelving content
78
        self.addCleanup(creator.finalize)
79
        self.assertEqual([('modify text', 'foo-id')], list(creator))
80
        creator.shelve_text('foo-id', 'a\nc\n')
81
        creator.transform()
82
        self.assertFileEqual('a\nc\n', 'foo')
0.12.14 by Aaron Bentley
Add shelving of created files
83
        self.assertShelvedFileEqual('b\na\n', creator, 'foo-id')
84
85
    def test_shelve_creation(self):
86
        tree = self.make_branch_and_tree('.')
87
        tree.lock_write()
88
        self.addCleanup(tree.unlock)
89
        tree.commit('Empty tree')
0.12.16 by Aaron Bentley
Handle shelving directory creation
90
        self.build_tree_contents([('foo', 'a\n'), ('bar/',)])
91
        tree.add(['foo', 'bar'], ['foo-id', 'bar-id'])
0.14.7 by Aaron Bentley
Misc test cleanup
92
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
0.12.14 by Aaron Bentley
Add shelving of created files
93
        self.addCleanup(creator.finalize)
0.12.16 by Aaron Bentley
Handle shelving directory creation
94
        self.assertEqual([('add file', 'bar-id', 'directory'),
95
                          ('add file', 'foo-id', 'file')],
96
                          sorted(list(creator)))
0.14.2 by Aaron Bentley
Somewhat clean up shelving
97
        creator.shelve_creation('foo-id')
98
        creator.shelve_creation('bar-id')
0.12.14 by Aaron Bentley
Add shelving of created files
99
        creator.transform()
0.12.15 by Aaron Bentley
Handle file-id when shelving creation
100
        self.assertRaises(StopIteration,
101
                          tree.iter_entries_by_dir(['foo-id']).next)
102
        s_trans_id = creator.shelf_transform.trans_id_file_id('foo-id')
103
        self.assertEqual('foo-id',
104
                         creator.shelf_transform.final_file_id(s_trans_id))
0.12.14 by Aaron Bentley
Add shelving of created files
105
        self.failIfExists('foo')
0.12.16 by Aaron Bentley
Handle shelving directory creation
106
        self.failIfExists('bar')
0.12.14 by Aaron Bentley
Add shelving of created files
107
        self.assertShelvedFileEqual('a\n', creator, 'foo-id')
0.12.16 by Aaron Bentley
Handle shelving directory creation
108
        s_bar_trans_id = creator.shelf_transform.trans_id_file_id('bar-id')
109
        self.assertEqual('directory',
110
            creator.shelf_transform.final_kind(s_bar_trans_id))
0.12.17 by Aaron Bentley
Handle creating symlinks
111
112
    def test_shelve_symlink_creation(self):
113
        self.requireFeature(tests.SymlinkFeature)
114
        tree = self.make_branch_and_tree('.')
115
        tree.lock_write()
116
        self.addCleanup(tree.unlock)
117
        tree.commit('Empty tree')
118
        os.symlink('bar', 'foo')
119
        tree.add('foo', 'foo-id')
0.14.7 by Aaron Bentley
Misc test cleanup
120
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
0.12.17 by Aaron Bentley
Handle creating symlinks
121
        self.addCleanup(creator.finalize)
122
        self.assertEqual([('add file', 'foo-id', 'symlink')], list(creator))
0.14.2 by Aaron Bentley
Somewhat clean up shelving
123
        creator.shelve_creation('foo-id')
0.12.17 by Aaron Bentley
Handle creating symlinks
124
        creator.transform()
125
        s_trans_id = creator.shelf_transform.trans_id_file_id('foo-id')
126
        self.failIfExists('foo')
127
        limbo_name = creator.shelf_transform._limbo_name(s_trans_id)
128
        self.assertEqual('bar', os.readlink(limbo_name))
0.12.19 by Aaron Bentley
Add support for writing shelves
129
0.14.4 by Aaron Bentley
Implement shelving deletion
130
    def test_shelve_deletion(self):
131
        tree = self.make_branch_and_tree('tree')
132
        self.build_tree_contents([('tree/foo/',), ('tree/foo/bar', 'baz')])
133
        tree.add(['foo', 'foo/bar'], ['foo-id', 'bar-id'])
134
        tree.commit('Added file and directory')
0.14.9 by Aaron Bentley
Shelve deleted files properly
135
        tree.unversion(['foo-id', 'bar-id'])
0.14.4 by Aaron Bentley
Implement shelving deletion
136
        os.unlink('tree/foo/bar')
137
        os.rmdir('tree/foo')
0.14.7 by Aaron Bentley
Misc test cleanup
138
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
0.14.4 by Aaron Bentley
Implement shelving deletion
139
        self.addCleanup(creator.finalize)
140
        self.assertEqual([('delete file', 'bar-id'),
141
                          ('delete file', 'foo-id')],
142
                          sorted(list(creator)))
143
        creator.shelve_deletion('foo-id')
144
        creator.shelve_deletion('bar-id')
0.14.6 by Aaron Bentley
Fix deletion test
145
        creator.transform()
0.14.4 by Aaron Bentley
Implement shelving deletion
146
        self.failUnlessExists('tree/foo')
147
        self.assertFileEqual('baz', 'tree/foo/bar')
148
0.14.10 by Aaron Bentley
Fix behavior with deletions, unversioning, ...
149
    def test_shelve_delete_contents(self):
150
        tree = self.make_branch_and_tree('tree')
151
        self.build_tree(['tree/foo',])
152
        tree.add('foo', 'foo-id')
153
        tree.commit('Added file and directory')
154
        os.unlink('tree/foo')
155
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
156
        self.addCleanup(creator.finalize)
157
        self.assertEqual([('delete file', 'foo-id')], sorted(list(creator)))
158
        creator.shelve_deletion('foo-id')
159
        creator.transform()
160
        self.failUnlessExists('tree/foo')
161
162
    def test_shelve_unversion(self):
163
        tree = self.make_branch_and_tree('tree')
164
        self.build_tree(['tree/foo',])
165
        tree.add('foo', 'foo-id')
166
        tree.commit('Added file and directory')
167
        tree.unversion(['foo-id'])
168
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
169
        self.addCleanup(creator.finalize)
170
        self.assertEqual([('delete file', 'foo-id')], sorted(list(creator)))
171
        creator.shelve_deletion('foo-id')
172
        creator.transform()
173
        self.failUnlessExists('tree/foo')
174
0.12.19 by Aaron Bentley
Add support for writing shelves
175
    def test_write_shelf(self):
176
        tree = self.make_branch_and_tree('tree')
177
        self.build_tree(['tree/foo'])
178
        tree.add('foo', 'foo-id')
0.14.7 by Aaron Bentley
Misc test cleanup
179
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
180
        self.addCleanup(creator.finalize)
0.12.19 by Aaron Bentley
Add support for writing shelves
181
        list(creator)
0.14.2 by Aaron Bentley
Somewhat clean up shelving
182
        creator.shelve_creation('foo-id')
0.12.29 by Aaron Bentley
Update failing tests
183
        shelf_file = open('shelf', 'wb')
184
        try:
185
            filename = creator.write_shelf(shelf_file)
186
        finally:
187
            shelf_file.close()
0.12.19 by Aaron Bentley
Add support for writing shelves
188
        parser = pack.ContainerPushParser()
0.12.29 by Aaron Bentley
Update failing tests
189
        shelf_file = open('shelf', 'rb')
0.12.19 by Aaron Bentley
Add support for writing shelves
190
        try:
191
            parser.accept_bytes(shelf_file.read())
192
        finally:
193
            shelf_file.close()
194
        tt = transform.TransformPreview(tree)
0.14.7 by Aaron Bentley
Misc test cleanup
195
        self.addCleanup(tt.finalize)
0.12.29 by Aaron Bentley
Update failing tests
196
        records = iter(parser.read_pending_records())
197
        #skip revision-id
198
        records.next()
199
        serialize_transform.deserialize(tt, records)
0.12.21 by Aaron Bentley
Add failing test of unshelver
200
201
202
class TestUnshelver(tests.TestCaseWithTransport):
203
204
    def test_unshelve(self):
205
        tree = self.make_branch_and_tree('tree')
0.12.30 by Aaron Bentley
Fix test by using non NULL base tree
206
        tree.commit('first commit')
0.12.21 by Aaron Bentley
Add failing test of unshelver
207
        self.build_tree_contents([('tree/foo', 'bar')])
0.12.24 by Aaron Bentley
Get unshelve using merge codepath, not applying transform directly
208
        tree.lock_write()
209
        self.addCleanup(tree.unlock)
0.12.21 by Aaron Bentley
Add failing test of unshelver
210
        tree.add('foo', 'foo-id')
0.15.5 by Aaron Bentley
Rename to shelf
211
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
212
        self.addCleanup(creator.finalize)
0.12.21 by Aaron Bentley
Add failing test of unshelver
213
        list(creator)
0.12.23 by Aaron Bentley
Fix up unshelve some more
214
        creator.shelve_creation('foo-id')
0.12.29 by Aaron Bentley
Update failing tests
215
        shelf_file = open('shelf-file', 'w+b')
216
        try:
217
            filename = creator.write_shelf(shelf_file)
218
            creator.transform()
219
            shelf_file.seek(0)
0.12.34 by Aaron Bentley
merge with unshelve
220
            unshelver = shelf.Unshelver.from_tree_and_shelf(tree, shelf_file)
0.12.29 by Aaron Bentley
Update failing tests
221
            unshelver.unshelve()
222
            self.assertFileEqual('bar', 'tree/foo')
223
        finally:
224
            shelf_file.close()
0.12.26 by Aaron Bentley
Use correct base for shelving
225
226
    def test_unshelve_base(self):
227
        tree = self.make_branch_and_tree('tree')
228
        tree.lock_write()
229
        self.addCleanup(tree.unlock)
230
        tree.commit('rev1', rev_id='rev1')
0.15.5 by Aaron Bentley
Rename to shelf
231
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
0.12.34 by Aaron Bentley
merge with unshelve
232
        manager = shelf.ShelfManager.for_tree(tree)
0.12.29 by Aaron Bentley
Update failing tests
233
        shelf_id, shelf_file = manager.new_shelf()
234
        try:
235
            filename = creator.write_shelf(shelf_file)
236
        finally:
237
            shelf_file.close()
0.12.26 by Aaron Bentley
Use correct base for shelving
238
        tree.commit('rev2', rev_id='rev2')
0.12.29 by Aaron Bentley
Update failing tests
239
        shelf_file = manager.read_shelf(1)
240
        try:
0.12.34 by Aaron Bentley
merge with unshelve
241
            unshelver = shelf.Unshelver.from_tree_and_shelf(tree, shelf_file)
0.12.29 by Aaron Bentley
Update failing tests
242
        finally:
243
            shelf_file.close()
0.12.26 by Aaron Bentley
Use correct base for shelving
244
        self.assertEqual('rev1', unshelver.base_tree.get_revision_id())
0.12.27 by Aaron Bentley
Implement shelf manager
245
246
247
class TestShelfManager(tests.TestCaseWithTransport):
248
249
    def test_for_tree(self):
250
        tree = self.make_branch_and_tree('.')
0.12.35 by Aaron Bentley
prepare_shelf => shelf
251
        manager = shelf.ShelfManager.for_tree(tree)
0.12.27 by Aaron Bentley
Implement shelf manager
252
        self.assertEqual(tree.bzrdir.root_transport.base + '.shelf2/',
253
                         manager.transport.base)
254
255
    def get_manager(self):
256
        tree = self.make_branch_and_tree('.')
0.12.35 by Aaron Bentley
prepare_shelf => shelf
257
        return shelf.ShelfManager.for_tree(tree)
0.12.27 by Aaron Bentley
Implement shelf manager
258
259
    def test_new_shelf(self):
260
        manager = self.get_manager()
261
        shelf_id, shelf_file = manager.new_shelf()
262
        shelf_file.close()
263
        self.assertEqual(1, shelf_id)
264
        shelf_id, shelf_file = manager.new_shelf()
265
        shelf_file.close()
266
        self.assertEqual(2, shelf_id)
267
        manager.delete_shelf(1)
268
        shelf_id, shelf_file = manager.new_shelf()
269
        shelf_file.close()
270
        self.assertEqual(3, shelf_id)
271
272
    def test_active_shelves(self):
273
        manager = self.get_manager()
274
        self.assertEqual([], manager.active_shelves())
275
        shelf_id, shelf_file = manager.new_shelf()
276
        shelf_file.close()
277
        self.assertEqual([1], manager.active_shelves())
278
279
    def test_delete_shelf(self):
280
        manager = self.get_manager()
281
        shelf_id, shelf_file = manager.new_shelf()
282
        shelf_file.close()
283
        self.assertEqual([1], manager.active_shelves())
284
        manager.delete_shelf(1)
285
        self.assertEqual([], manager.active_shelves())
286
287
    def test_last_shelf(self):
288
        manager = self.get_manager()
289
        self.assertIs(None, manager.last_shelf())
290
        shelf_id, shelf_file = manager.new_shelf()
291
        shelf_file.close()
292
        self.assertEqual(1, manager.last_shelf())
293
294
    def test_read_shelf(self):
295
        manager = self.get_manager()
296
        shelf_id, shelf_file = manager.new_shelf()
297
        try:
298
            shelf_file.write('foo')
299
        finally:
300
            shelf_file.close()
301
        shelf_id, shelf_file = manager.new_shelf()
302
        try:
303
            shelf_file.write('bar')
304
        finally:
305
            shelf_file.close()
306
        shelf_file = manager.read_shelf(1)
307
        try:
308
            self.assertEqual('foo', shelf_file.read())
309
        finally:
310
            shelf_file.close()
311
        shelf_file = manager.read_shelf(2)
312
        try:
313
            self.assertEqual('bar', shelf_file.read())
314
        finally:
315
            shelf_file.close()