/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')
135
        os.unlink('tree/foo/bar')
136
        os.rmdir('tree/foo')
0.14.7 by Aaron Bentley
Misc test cleanup
137
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
0.14.4 by Aaron Bentley
Implement shelving deletion
138
        self.addCleanup(creator.finalize)
139
        self.assertEqual([('delete file', 'bar-id'),
140
                          ('delete file', 'foo-id')],
141
                          sorted(list(creator)))
142
        creator.shelve_deletion('foo-id')
143
        creator.shelve_deletion('bar-id')
0.14.6 by Aaron Bentley
Fix deletion test
144
        creator.transform()
0.14.4 by Aaron Bentley
Implement shelving deletion
145
        self.failUnlessExists('tree/foo')
146
        self.assertFileEqual('baz', 'tree/foo/bar')
147
0.12.19 by Aaron Bentley
Add support for writing shelves
148
    def test_write_shelf(self):
149
        tree = self.make_branch_and_tree('tree')
150
        self.build_tree(['tree/foo'])
151
        tree.add('foo', 'foo-id')
0.14.7 by Aaron Bentley
Misc test cleanup
152
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
153
        self.addCleanup(creator.finalize)
0.12.19 by Aaron Bentley
Add support for writing shelves
154
        list(creator)
0.14.2 by Aaron Bentley
Somewhat clean up shelving
155
        creator.shelve_creation('foo-id')
0.12.29 by Aaron Bentley
Update failing tests
156
        shelf_file = open('shelf', 'wb')
157
        try:
158
            filename = creator.write_shelf(shelf_file)
159
        finally:
160
            shelf_file.close()
0.12.19 by Aaron Bentley
Add support for writing shelves
161
        parser = pack.ContainerPushParser()
0.12.29 by Aaron Bentley
Update failing tests
162
        shelf_file = open('shelf', 'rb')
0.12.19 by Aaron Bentley
Add support for writing shelves
163
        try:
164
            parser.accept_bytes(shelf_file.read())
165
        finally:
166
            shelf_file.close()
167
        tt = transform.TransformPreview(tree)
0.14.7 by Aaron Bentley
Misc test cleanup
168
        self.addCleanup(tt.finalize)
0.12.29 by Aaron Bentley
Update failing tests
169
        records = iter(parser.read_pending_records())
170
        #skip revision-id
171
        records.next()
172
        serialize_transform.deserialize(tt, records)
0.12.21 by Aaron Bentley
Add failing test of unshelver
173
174
175
class TestUnshelver(tests.TestCaseWithTransport):
176
177
    def test_unshelve(self):
178
        tree = self.make_branch_and_tree('tree')
0.12.30 by Aaron Bentley
Fix test by using non NULL base tree
179
        tree.commit('first commit')
0.12.21 by Aaron Bentley
Add failing test of unshelver
180
        self.build_tree_contents([('tree/foo', 'bar')])
0.12.24 by Aaron Bentley
Get unshelve using merge codepath, not applying transform directly
181
        tree.lock_write()
182
        self.addCleanup(tree.unlock)
0.12.21 by Aaron Bentley
Add failing test of unshelver
183
        tree.add('foo', 'foo-id')
0.15.5 by Aaron Bentley
Rename to shelf
184
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
185
        self.addCleanup(creator.finalize)
0.12.21 by Aaron Bentley
Add failing test of unshelver
186
        list(creator)
0.12.23 by Aaron Bentley
Fix up unshelve some more
187
        creator.shelve_creation('foo-id')
0.12.29 by Aaron Bentley
Update failing tests
188
        shelf_file = open('shelf-file', 'w+b')
189
        try:
190
            filename = creator.write_shelf(shelf_file)
191
            creator.transform()
192
            shelf_file.seek(0)
0.12.34 by Aaron Bentley
merge with unshelve
193
            unshelver = shelf.Unshelver.from_tree_and_shelf(tree, shelf_file)
0.12.29 by Aaron Bentley
Update failing tests
194
            unshelver.unshelve()
195
            self.assertFileEqual('bar', 'tree/foo')
196
        finally:
197
            shelf_file.close()
0.12.26 by Aaron Bentley
Use correct base for shelving
198
199
    def test_unshelve_base(self):
200
        tree = self.make_branch_and_tree('tree')
201
        tree.lock_write()
202
        self.addCleanup(tree.unlock)
203
        tree.commit('rev1', rev_id='rev1')
0.15.5 by Aaron Bentley
Rename to shelf
204
        creator = shelf.ShelfCreator(tree, tree.basis_tree())
0.12.34 by Aaron Bentley
merge with unshelve
205
        manager = shelf.ShelfManager.for_tree(tree)
0.12.29 by Aaron Bentley
Update failing tests
206
        shelf_id, shelf_file = manager.new_shelf()
207
        try:
208
            filename = creator.write_shelf(shelf_file)
209
        finally:
210
            shelf_file.close()
0.12.26 by Aaron Bentley
Use correct base for shelving
211
        tree.commit('rev2', rev_id='rev2')
0.12.29 by Aaron Bentley
Update failing tests
212
        shelf_file = manager.read_shelf(1)
213
        try:
0.12.34 by Aaron Bentley
merge with unshelve
214
            unshelver = shelf.Unshelver.from_tree_and_shelf(tree, shelf_file)
0.12.29 by Aaron Bentley
Update failing tests
215
        finally:
216
            shelf_file.close()
0.12.26 by Aaron Bentley
Use correct base for shelving
217
        self.assertEqual('rev1', unshelver.base_tree.get_revision_id())
0.12.27 by Aaron Bentley
Implement shelf manager
218
219
220
class TestShelfManager(tests.TestCaseWithTransport):
221
222
    def test_for_tree(self):
223
        tree = self.make_branch_and_tree('.')
0.12.35 by Aaron Bentley
prepare_shelf => shelf
224
        manager = shelf.ShelfManager.for_tree(tree)
0.12.27 by Aaron Bentley
Implement shelf manager
225
        self.assertEqual(tree.bzrdir.root_transport.base + '.shelf2/',
226
                         manager.transport.base)
227
228
    def get_manager(self):
229
        tree = self.make_branch_and_tree('.')
0.12.35 by Aaron Bentley
prepare_shelf => shelf
230
        return shelf.ShelfManager.for_tree(tree)
0.12.27 by Aaron Bentley
Implement shelf manager
231
232
    def test_new_shelf(self):
233
        manager = self.get_manager()
234
        shelf_id, shelf_file = manager.new_shelf()
235
        shelf_file.close()
236
        self.assertEqual(1, shelf_id)
237
        shelf_id, shelf_file = manager.new_shelf()
238
        shelf_file.close()
239
        self.assertEqual(2, shelf_id)
240
        manager.delete_shelf(1)
241
        shelf_id, shelf_file = manager.new_shelf()
242
        shelf_file.close()
243
        self.assertEqual(3, shelf_id)
244
245
    def test_active_shelves(self):
246
        manager = self.get_manager()
247
        self.assertEqual([], manager.active_shelves())
248
        shelf_id, shelf_file = manager.new_shelf()
249
        shelf_file.close()
250
        self.assertEqual([1], manager.active_shelves())
251
252
    def test_delete_shelf(self):
253
        manager = self.get_manager()
254
        shelf_id, shelf_file = manager.new_shelf()
255
        shelf_file.close()
256
        self.assertEqual([1], manager.active_shelves())
257
        manager.delete_shelf(1)
258
        self.assertEqual([], manager.active_shelves())
259
260
    def test_last_shelf(self):
261
        manager = self.get_manager()
262
        self.assertIs(None, manager.last_shelf())
263
        shelf_id, shelf_file = manager.new_shelf()
264
        shelf_file.close()
265
        self.assertEqual(1, manager.last_shelf())
266
267
    def test_read_shelf(self):
268
        manager = self.get_manager()
269
        shelf_id, shelf_file = manager.new_shelf()
270
        try:
271
            shelf_file.write('foo')
272
        finally:
273
            shelf_file.close()
274
        shelf_id, shelf_file = manager.new_shelf()
275
        try:
276
            shelf_file.write('bar')
277
        finally:
278
            shelf_file.close()
279
        shelf_file = manager.read_shelf(1)
280
        try:
281
            self.assertEqual('foo', shelf_file.read())
282
        finally:
283
            shelf_file.close()
284
        shelf_file = manager.read_shelf(2)
285
        try:
286
            self.assertEqual('bar', shelf_file.read())
287
        finally:
288
            shelf_file.close()