1
# Copyright (C) 2008 Aaron Bentley <aaron@aaronbentley.com>
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, tests, transform
20
from bzrlib.plugins.shelf2 import shelf, serialize_transform
23
class TestPrepareShelf(tests.TestCaseWithTransport):
25
def test_shelve_rename(self):
26
tree = self.make_branch_and_tree('.')
27
self.build_tree(['foo'])
28
tree.add(['foo'], ['foo-id'])
30
tree.rename_one('foo', 'bar')
31
creator = shelf.ShelfCreator(tree, tree.basis_tree())
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(
38
shelf_trans_id = creator.shelf_transform.trans_id_file_id('foo-id')
39
self.assertEqual('bar', creator.shelf_transform.final_name(
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'])
47
tree.rename_one('foo/baz', 'bar/baz')
48
creator = shelf.ShelfCreator(tree, tree.basis_tree())
49
self.addCleanup(creator.finalize)
50
self.assertEqual([('rename', 'baz-id', 'foo/baz', 'bar/baz')],
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(
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(
62
self.assertEqual('foo/baz', tree.id2path('baz-id'))
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)
69
def test_shelve_content_change(self):
70
tree = self.make_branch_and_tree('.')
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')])
77
creator = shelf.ShelfCreator(tree, tree.basis_tree())
78
self.addCleanup(creator.finalize)
79
self.assertEqual([('modify text', 'foo-id')], list(creator))
80
creator.shelve_lines('foo-id', ['a\n', 'c\n'])
82
self.assertFileEqual('a\nc\n', 'foo')
83
self.assertShelvedFileEqual('b\na\n', creator, 'foo-id')
85
def test_shelve_creation(self):
86
tree = self.make_branch_and_tree('.')
88
self.addCleanup(tree.unlock)
89
tree.commit('Empty tree')
90
self.build_tree_contents([('foo', 'a\n'), ('bar/',)])
91
tree.add(['foo', 'bar'], ['foo-id', 'bar-id'])
92
creator = shelf.ShelfCreator(tree, tree.basis_tree())
93
self.addCleanup(creator.finalize)
94
self.assertEqual([('add file', 'bar-id', 'directory', 'bar'),
95
('add file', 'foo-id', 'file', 'foo')],
96
sorted(list(creator)))
97
creator.shelve_creation('foo-id')
98
creator.shelve_creation('bar-id')
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))
105
self.failIfExists('foo')
106
self.failIfExists('bar')
107
self.assertShelvedFileEqual('a\n', creator, 'foo-id')
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))
112
def test_shelve_symlink_creation(self):
113
self.requireFeature(tests.SymlinkFeature)
114
tree = self.make_branch_and_tree('.')
116
self.addCleanup(tree.unlock)
117
tree.commit('Empty tree')
118
os.symlink('bar', 'foo')
119
tree.add('foo', 'foo-id')
120
creator = shelf.ShelfCreator(tree, tree.basis_tree())
121
self.addCleanup(creator.finalize)
122
self.assertEqual([('add file', 'foo-id', 'symlink', 'foo')],
124
creator.shelve_creation('foo-id')
126
s_trans_id = creator.shelf_transform.trans_id_file_id('foo-id')
127
self.failIfExists('foo')
128
limbo_name = creator.shelf_transform._limbo_name(s_trans_id)
129
self.assertEqual('bar', os.readlink(limbo_name))
131
def test_shelve_creation_no_contents(self):
132
tree = self.make_branch_and_tree('.')
134
self.addCleanup(tree.unlock)
135
tree.commit('Empty tree')
136
self.build_tree(['foo'])
137
tree.add('foo', 'foo-id')
139
creator = shelf.ShelfCreator(tree, tree.basis_tree())
140
self.addCleanup(creator.finalize)
141
self.assertEqual([('add file', 'foo-id', None, 'foo')],
142
sorted(list(creator)))
143
creator.shelve_creation('foo-id')
145
self.assertRaises(StopIteration,
146
tree.iter_entries_by_dir(['foo-id']).next)
147
self.assertShelvedFileEqual('', creator, 'foo-id')
148
s_trans_id = creator.shelf_transform.trans_id_file_id('foo-id')
149
self.assertEqual('foo-id',
150
creator.shelf_transform.final_file_id(s_trans_id))
151
self.failIfExists('foo')
153
def test_shelve_deletion(self):
154
tree = self.make_branch_and_tree('tree')
156
self.addCleanup(tree.unlock)
157
self.build_tree_contents([('tree/foo/',), ('tree/foo/bar', 'baz')])
158
tree.add(['foo', 'foo/bar'], ['foo-id', 'bar-id'])
159
tree.commit('Added file and directory')
160
tree.unversion(['foo-id', 'bar-id'])
161
os.unlink('tree/foo/bar')
163
creator = shelf.ShelfCreator(tree, tree.basis_tree())
164
self.addCleanup(creator.finalize)
165
self.assertEqual([('delete file', 'bar-id', 'file', 'foo/bar'),
166
('delete file', 'foo-id', 'directory', 'foo')],
167
sorted(list(creator)))
168
creator.shelve_deletion('foo-id')
169
creator.shelve_deletion('bar-id')
171
self.assertTrue('foo-id' in tree)
172
self.assertTrue('bar-id' in tree)
173
self.assertFileEqual('baz', 'tree/foo/bar')
175
def test_shelve_delete_contents(self):
176
tree = self.make_branch_and_tree('tree')
177
self.build_tree(['tree/foo',])
178
tree.add('foo', 'foo-id')
179
tree.commit('Added file and directory')
180
os.unlink('tree/foo')
181
creator = shelf.ShelfCreator(tree, tree.basis_tree())
182
self.addCleanup(creator.finalize)
183
self.assertEqual([('delete file', 'foo-id', 'file', 'foo')],
184
sorted(list(creator)))
185
creator.shelve_deletion('foo-id')
187
self.failUnlessExists('tree/foo')
189
def test_shelve_change_kind(self):
190
tree = self.make_branch_and_tree('tree')
191
self.build_tree_contents([('tree/foo', 'bar')])
192
tree.add('foo', 'foo-id')
193
tree.commit('Added file and directory')
194
os.unlink('tree/foo')
196
creator = shelf.ShelfCreator(tree, tree.basis_tree())
197
self.addCleanup(creator.finalize)
198
self.assertEqual([('change kind', 'foo-id', 'file', 'directory',
199
'foo')], sorted(list(creator)))
200
creator.shelve_content_change('foo-id')
202
self.assertFileEqual('bar', 'tree/foo')
203
s_trans_id = creator.shelf_transform.trans_id_file_id('foo-id')
204
self.assertEqual('directory',
205
creator.shelf_transform._new_contents[s_trans_id])
207
def test_shelve_unversion(self):
208
tree = self.make_branch_and_tree('tree')
209
self.build_tree(['tree/foo',])
210
tree.add('foo', 'foo-id')
211
tree.commit('Added file and directory')
212
tree.unversion(['foo-id'])
213
creator = shelf.ShelfCreator(tree, tree.basis_tree())
214
self.addCleanup(creator.finalize)
215
self.assertEqual([('delete file', 'foo-id', 'file', 'foo')],
216
sorted(list(creator)))
217
creator.shelve_deletion('foo-id')
219
self.failUnlessExists('tree/foo')
221
def test_write_shelf(self):
222
tree = self.make_branch_and_tree('tree')
223
self.build_tree(['tree/foo'])
224
tree.add('foo', 'foo-id')
225
creator = shelf.ShelfCreator(tree, tree.basis_tree())
226
self.addCleanup(creator.finalize)
228
creator.shelve_creation('foo-id')
229
filename = creator.write_shelf()
230
self.assertContainsRe(filename, 'tree/.shelf2/01$')
231
self.failUnlessExists(filename)
232
parser = pack.ContainerPushParser()
233
shelf_file = open(filename, 'rb')
235
parser.accept_bytes(shelf_file.read())
238
tt = transform.TransformPreview(tree)
239
self.addCleanup(tt.finalize)
240
serialize_transform.deserialize(tt,
241
iter(parser.read_pending_records()))