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