1
# Copyright (C) 2008 Canonical Ltd.
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.
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.
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
19
from bzrlib import pack, shelf, tests, transform
22
class TestPrepareShelf(tests.TestCaseWithTransport):
24
def test_shelve_rename(self):
25
tree = self.make_branch_and_tree('.')
26
self.build_tree(['foo'])
27
tree.add(['foo'], ['foo-id'])
29
tree.rename_one('foo', 'bar')
30
creator = shelf.ShelfCreator(tree, tree.basis_tree())
31
self.addCleanup(creator.finalize)
32
self.assertEqual([('rename', 'foo-id', 'foo', 'bar')], list(creator))
33
creator.shelve_rename('foo-id')
34
work_trans_id = creator.work_transform.trans_id_file_id('foo-id')
35
self.assertEqual('foo', creator.work_transform.final_name(
37
shelf_trans_id = creator.shelf_transform.trans_id_file_id('foo-id')
38
self.assertEqual('bar', creator.shelf_transform.final_name(
41
def test_shelve_move(self):
42
tree = self.make_branch_and_tree('.')
43
self.build_tree(['foo/', 'bar/', 'foo/baz'])
44
tree.add(['foo', 'bar', 'foo/baz'], ['foo-id', 'bar-id', 'baz-id'])
46
tree.rename_one('foo/baz', 'bar/baz')
47
creator = shelf.ShelfCreator(tree, tree.basis_tree())
48
self.addCleanup(creator.finalize)
49
self.assertEqual([('rename', 'baz-id', 'foo/baz', 'bar/baz')],
51
creator.shelve_rename('baz-id')
52
work_trans_id = creator.work_transform.trans_id_file_id('baz-id')
53
work_foo = creator.work_transform.trans_id_file_id('foo-id')
54
self.assertEqual(work_foo, creator.work_transform.final_parent(
56
shelf_trans_id = creator.shelf_transform.trans_id_file_id('baz-id')
57
shelf_bar = creator.shelf_transform.trans_id_file_id('bar-id')
58
self.assertEqual(shelf_bar, creator.shelf_transform.final_parent(
61
self.assertEqual('foo/baz', tree.id2path('baz-id'))
63
def assertShelvedFileEqual(self, expected_content, creator, file_id):
64
s_trans_id = creator.shelf_transform.trans_id_file_id(file_id)
65
shelf_file = creator.shelf_transform._limbo_name(s_trans_id)
66
self.assertFileEqual(expected_content, shelf_file)
68
def test_shelve_content_change(self):
69
tree = self.make_branch_and_tree('.')
71
self.addCleanup(tree.unlock)
72
self.build_tree_contents([('foo', 'a\n')])
73
tree.add('foo', 'foo-id')
74
tree.commit('Committed foo')
75
self.build_tree_contents([('foo', 'b\na\nc\n')])
76
creator = shelf.ShelfCreator(tree, tree.basis_tree())
77
self.addCleanup(creator.finalize)
78
self.assertEqual([('modify text', 'foo-id')], list(creator))
79
creator.shelve_lines('foo-id', ['a\n', 'c\n'])
81
self.assertFileEqual('a\nc\n', 'foo')
82
self.assertShelvedFileEqual('b\na\n', creator, 'foo-id')
84
def test_shelve_creation(self):
85
tree = self.make_branch_and_tree('.')
87
self.addCleanup(tree.unlock)
88
tree.commit('Empty tree')
89
self.build_tree_contents([('foo', 'a\n'), ('bar/',)])
90
tree.add(['foo', 'bar'], ['foo-id', 'bar-id'])
91
creator = shelf.ShelfCreator(tree, tree.basis_tree())
92
self.addCleanup(creator.finalize)
93
self.assertEqual([('add file', 'bar-id', 'directory', 'bar'),
94
('add file', 'foo-id', 'file', 'foo')],
95
sorted(list(creator)))
96
creator.shelve_creation('foo-id')
97
creator.shelve_creation('bar-id')
99
self.assertRaises(StopIteration,
100
tree.iter_entries_by_dir(['foo-id']).next)
101
s_trans_id = creator.shelf_transform.trans_id_file_id('foo-id')
102
self.assertEqual('foo-id',
103
creator.shelf_transform.final_file_id(s_trans_id))
104
self.failIfExists('foo')
105
self.failIfExists('bar')
106
self.assertShelvedFileEqual('a\n', creator, 'foo-id')
107
s_bar_trans_id = creator.shelf_transform.trans_id_file_id('bar-id')
108
self.assertEqual('directory',
109
creator.shelf_transform.final_kind(s_bar_trans_id))
111
def test_shelve_symlink_creation(self):
112
self.requireFeature(tests.SymlinkFeature)
113
tree = self.make_branch_and_tree('.')
115
self.addCleanup(tree.unlock)
116
tree.commit('Empty tree')
117
os.symlink('bar', 'foo')
118
tree.add('foo', 'foo-id')
119
creator = shelf.ShelfCreator(tree, tree.basis_tree())
120
self.addCleanup(creator.finalize)
121
self.assertEqual([('add file', 'foo-id', 'symlink', 'foo')],
123
creator.shelve_creation('foo-id')
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))
130
def test_shelve_creation_no_contents(self):
131
tree = self.make_branch_and_tree('.')
133
self.addCleanup(tree.unlock)
134
tree.commit('Empty tree')
135
self.build_tree(['foo'])
136
tree.add('foo', 'foo-id')
138
creator = shelf.ShelfCreator(tree, tree.basis_tree())
139
self.addCleanup(creator.finalize)
140
self.assertEqual([('add file', 'foo-id', None, 'foo')],
141
sorted(list(creator)))
142
creator.shelve_creation('foo-id')
144
self.assertRaises(StopIteration,
145
tree.iter_entries_by_dir(['foo-id']).next)
146
self.assertShelvedFileEqual('', creator, 'foo-id')
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))
150
self.failIfExists('foo')
152
def test_shelve_deletion(self):
153
tree = self.make_branch_and_tree('tree')
155
self.addCleanup(tree.unlock)
156
self.build_tree_contents([('tree/foo/',), ('tree/foo/bar', 'baz')])
157
tree.add(['foo', 'foo/bar'], ['foo-id', 'bar-id'])
158
tree.commit('Added file and directory')
159
tree.unversion(['foo-id', 'bar-id'])
160
os.unlink('tree/foo/bar')
162
creator = shelf.ShelfCreator(tree, tree.basis_tree())
163
self.addCleanup(creator.finalize)
164
self.assertEqual([('delete file', 'bar-id', 'file', 'foo/bar'),
165
('delete file', 'foo-id', 'directory', 'foo')],
166
sorted(list(creator)))
167
creator.shelve_deletion('foo-id')
168
creator.shelve_deletion('bar-id')
170
self.assertTrue('foo-id' in tree)
171
self.assertTrue('bar-id' in tree)
172
self.assertFileEqual('baz', 'tree/foo/bar')
174
def test_shelve_delete_contents(self):
175
tree = self.make_branch_and_tree('tree')
176
self.build_tree(['tree/foo',])
177
tree.add('foo', 'foo-id')
178
tree.commit('Added file and directory')
179
os.unlink('tree/foo')
180
creator = shelf.ShelfCreator(tree, tree.basis_tree())
181
self.addCleanup(creator.finalize)
182
self.assertEqual([('delete file', 'foo-id', 'file', 'foo')],
183
sorted(list(creator)))
184
creator.shelve_deletion('foo-id')
186
self.failUnlessExists('tree/foo')
188
def test_shelve_change_kind(self):
189
tree = self.make_branch_and_tree('tree')
190
self.build_tree_contents([('tree/foo', 'bar')])
191
tree.add('foo', 'foo-id')
192
tree.commit('Added file and directory')
193
os.unlink('tree/foo')
195
creator = shelf.ShelfCreator(tree, tree.basis_tree())
196
self.addCleanup(creator.finalize)
197
self.assertEqual([('change kind', 'foo-id', 'file', 'directory',
198
'foo')], sorted(list(creator)))
199
creator.shelve_content_change('foo-id')
201
self.assertFileEqual('bar', 'tree/foo')
202
s_trans_id = creator.shelf_transform.trans_id_file_id('foo-id')
203
self.assertEqual('directory',
204
creator.shelf_transform._new_contents[s_trans_id])
206
def test_shelve_unversion(self):
207
tree = self.make_branch_and_tree('tree')
208
self.build_tree(['tree/foo',])
209
tree.add('foo', 'foo-id')
210
tree.commit('Added file and directory')
211
tree.unversion(['foo-id'])
212
creator = shelf.ShelfCreator(tree, tree.basis_tree())
213
self.addCleanup(creator.finalize)
214
self.assertEqual([('delete file', 'foo-id', 'file', 'foo')],
215
sorted(list(creator)))
216
creator.shelve_deletion('foo-id')
218
self.failUnlessExists('tree/foo')
220
def test_write_shelf(self):
221
tree = self.make_branch_and_tree('tree')
222
self.build_tree(['tree/foo'])
223
tree.add('foo', 'foo-id')
224
creator = shelf.ShelfCreator(tree, tree.basis_tree())
225
self.addCleanup(creator.finalize)
227
creator.shelve_creation('foo-id')
228
filename = creator.write_shelf()
229
self.assertContainsRe(filename, 'tree/.shelf2/01$')
230
self.failUnlessExists(filename)
231
parser = pack.ContainerPushParser()
232
shelf_file = open(filename, 'rb')
234
parser.accept_bytes(shelf_file.read())
237
tt = transform.TransformPreview(tree)
238
self.addCleanup(tt.finalize)
239
tt.deserialize(iter(parser.read_pending_records()))