/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
2255.7.9 by John Arbash Meinel
Add more tests for WorkingTree.move() and a similar suite
1
# Copyright (C) 2007 Canonical Ltd
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
17
"""Tests for interface conformance of 'WorkingTree.rename_one'"""
18
19
import os
20
21
from bzrlib import (
22
    errors,
23
    osutils,
3638.3.13 by Vincent Ladeuil
Fix test_rename_to_denormalised_fails for OSX.
24
    tests,
2255.7.9 by John Arbash Meinel
Add more tests for WorkingTree.move() and a similar suite
25
    )
26
27
from bzrlib.workingtree_4 import WorkingTreeFormat4
28
from bzrlib.tests.workingtree_implementations import TestCaseWithWorkingTree
29
30
31
class TestRenameOne(TestCaseWithWorkingTree):
32
33
    def get_tree_layout(self, tree):
34
        """Get the (path, file_id) pairs for the current tree."""
35
        tree.lock_read()
36
        try:
37
            return [(path, ie.file_id) for path, ie
38
                    in tree.iter_entries_by_dir()]
39
        finally:
40
            tree.unlock()
41
42
    def assertTreeLayout(self, expected, tree):
43
        """Check that the tree has the correct layout."""
44
        actual = self.get_tree_layout(tree)
45
        self.assertEqual(expected, actual)
46
47
    def test_rename_one_target_not_dir(self):
48
        tree = self.make_branch_and_tree('.')
49
        self.build_tree(['a'])
50
        tree.add(['a'])
51
        tree.commit('initial', rev_id='rev-1')
52
53
        self.assertRaises(errors.BzrMoveFailedError,
54
                          tree.rename_one, 'a', 'not-a-dir/b')
55
56
    def test_rename_one_non_existent(self):
57
        tree = self.make_branch_and_tree('.')
58
        self.build_tree(['a/'])
59
        tree.add(['a'])
60
        tree.commit('initial', rev_id='rev-1')
61
        self.assertRaises(errors.BzrMoveFailedError,
62
                          tree.rename_one, 'not-a-file', 'a/failure')
63
        self.assertRaises(errors.BzrMoveFailedError,
64
                          tree.rename_one, 'not-a-file', 'also_not')
65
66
    def test_rename_one_target_not_versioned(self):
67
        tree = self.make_branch_and_tree('.')
68
        self.build_tree(['a/', 'b'])
69
        tree.add(['b'])
70
        tree.commit('initial', rev_id='rev-1')
71
        self.assertRaises(errors.BzrMoveFailedError,
72
                          tree.rename_one, 'b', 'a/b')
73
74
    def test_rename_one_unversioned(self):
75
        tree = self.make_branch_and_tree('.')
76
        self.build_tree(['a/', 'b'])
77
        tree.add(['a'])
78
        tree.commit('initial', rev_id='rev-1')
79
        self.assertRaises(errors.BzrMoveFailedError,
80
                          tree.rename_one, 'b', 'a/b')
81
82
    def test_rename_one_samedir(self):
83
        tree = self.make_branch_and_tree('.')
84
        self.build_tree(['a', 'b/'])
85
        tree.add(['a', 'b'], ['a-id', 'b-id'])
86
        tree.commit('initial', rev_id='rev-1')
87
        root_id = tree.get_root_id()
88
89
        a_contents = tree.get_file_text('a-id')
90
        tree.rename_one('a', 'foo')
91
        self.assertTreeLayout([('', root_id), ('b', 'b-id'), ('foo', 'a-id')],
92
                              tree)
93
        self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('b', 'b-id')],
94
                              tree.basis_tree())
95
        self.failIfExists('a')
96
        self.assertFileEqual(a_contents, 'foo')
97
98
    def test_rename_one_not_localdir(self):
99
        tree = self.make_branch_and_tree('tree')
100
        self.build_tree(['tree/a', 'tree/b/'])
101
        tree.add(['a', 'b'], ['a-id', 'b-id'])
102
        tree.commit('initial', rev_id='rev-1')
103
        root_id = tree.get_root_id()
104
105
        a_contents = tree.get_file_text('a-id')
106
        tree.rename_one('a', 'b/foo')
107
        self.assertTreeLayout([('', root_id), ('b', 'b-id'), ('b/foo', 'a-id')],
108
                              tree)
109
        self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('b', 'b-id')],
110
                              tree.basis_tree())
111
        self.failIfExists('tree/a')
112
        self.assertFileEqual(a_contents, 'tree/b/foo')
113
114
    def test_rename_one_subdir(self):
115
        tree = self.make_branch_and_tree('.')
116
        self.build_tree(['a', 'b/', 'b/c'])
117
        tree.add(['a', 'b', 'b/c'], ['a-id', 'b-id', 'c-id'])
118
        tree.commit('initial', rev_id='rev-1')
119
        root_id = tree.get_root_id()
120
        self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('b', 'b-id'),
121
                               ('b/c', 'c-id')], tree)
122
        self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('b', 'b-id'),
123
                               ('b/c', 'c-id')], tree.basis_tree())
124
        a_contents = tree.get_file_text('a-id')
125
        tree.rename_one('a', 'b/d')
126
        self.assertTreeLayout([('', root_id), ('b', 'b-id'), ('b/c', 'c-id'),
127
                               ('b/d', 'a-id')], tree)
128
        self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('b', 'b-id'),
129
                               ('b/c', 'c-id')], tree.basis_tree())
130
        self.failIfExists('a')
131
        self.assertFileEqual(a_contents, 'b/d')
132
133
    def test_rename_one_parent_dir(self):
134
        tree = self.make_branch_and_tree('.')
135
        self.build_tree(['a', 'b/', 'b/c'])
136
        tree.add(['a', 'b', 'b/c'], ['a-id', 'b-id', 'c-id'])
137
        tree.commit('initial', rev_id='rev-1')
138
        root_id = tree.get_root_id()
139
        c_contents = tree.get_file_text('c-id')
140
        tree.rename_one('b/c', 'd')
141
        self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('b', 'b-id'),
142
                               ('d', 'c-id')], tree)
143
        self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('b', 'b-id'),
144
                               ('b/c', 'c-id')], tree.basis_tree())
145
        self.failIfExists('b/c')
146
        self.assertFileEqual(c_contents, 'd')
147
148
    def test_rename_one_fail_consistent(self):
149
        tree = self.make_branch_and_tree('.')
150
        self.build_tree(['a', 'b/', 'b/a', 'c'])
151
        tree.add(['a', 'b', 'c'], ['a-id', 'b-id', 'c-id'])
152
        tree.commit('initial', rev_id='rev-1')
153
        root_id = tree.get_root_id()
154
        # Target already exists
155
        self.assertRaises(errors.RenameFailedFilesExist,
156
                          tree.rename_one, 'a', 'b/a')
157
        self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('b', 'b-id'),
158
                               ('c', 'c-id')], tree)
159
        self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('b', 'b-id'),
160
                               ('c', 'c-id')], tree.basis_tree())
161
162
    def test_rename_one_onto_existing(self):
163
        tree = self.make_branch_and_tree('.')
164
        self.build_tree(['a', 'b'])
165
        tree.add(['a', 'b'], ['a-id', 'b-id'])
166
        tree.commit('initial', rev_id='rev-1')
167
168
        self.assertRaises(errors.BzrMoveFailedError,
169
                          tree.rename_one, 'a', 'b')
170
171
    def test_rename_one_onto_self(self):
172
        tree = self.make_branch_and_tree('.')
173
        self.build_tree(['b/', 'b/a'])
174
        tree.add(['b', 'b/a'], ['b-id', 'a-id'])
175
        tree.commit('initial', rev_id='rev-1')
176
177
        self.assertRaises(errors.BzrMoveFailedError,
178
                          tree.rename_one, 'b/a', 'b/a')
179
180
    def test_rename_one_onto_self_root(self):
181
        tree = self.make_branch_and_tree('.')
182
        self.build_tree(['a'])
183
        tree.add(['a'], ['a-id'])
184
        tree.commit('initial', rev_id='rev-1')
185
186
        self.assertRaises(errors.BzrMoveFailedError,
187
                          tree.rename_one, 'a', 'a')
188
189
    def test_rename_one_after(self):
190
        tree = self.make_branch_and_tree('.')
191
        self.build_tree(['a', 'b/'])
192
        tree.add(['a', 'b'], ['a-id', 'b-id'])
193
        tree.commit('initial', rev_id='rev-1')
194
        root_id = tree.get_root_id()
195
        os.rename('a', 'b/foo')
196
197
        self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('b', 'b-id')],
198
                              tree)
199
        # We don't need after=True as long as source is missing and target
200
        # exists.
201
        tree.rename_one('a', 'b/foo')
202
        self.assertTreeLayout([('', root_id), ('b', 'b-id'),
203
                               ('b/foo', 'a-id')], tree)
204
        self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('b', 'b-id')],
205
                              tree.basis_tree())
206
207
    def test_rename_one_after_with_after(self):
208
        tree = self.make_branch_and_tree('.')
209
        self.build_tree(['a', 'b/'])
210
        tree.add(['a', 'b'], ['a-id', 'b-id'])
211
        tree.commit('initial', rev_id='rev-1')
212
        root_id = tree.get_root_id()
213
        os.rename('a', 'b/foo')
214
215
        self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('b', 'b-id')],
216
                              tree)
217
        # Passing after=True should work as well
218
        tree.rename_one('a', 'b/foo', after=True)
219
        self.assertTreeLayout([('', root_id), ('b', 'b-id'),
220
                               ('b/foo', 'a-id')], tree)
221
        self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('b', 'b-id')],
222
                              tree.basis_tree())
223
224
    def test_rename_one_after_no_target(self):
225
        tree = self.make_branch_and_tree('.')
226
        self.build_tree(['a', 'b/'])
227
        tree.add(['a', 'b'], ['a-id', 'b-id'])
228
        tree.commit('initial', rev_id='rev-1')
229
        root_id = tree.get_root_id()
230
231
        # Passing after when the file hasn't been rename_one raises an exception
232
        self.assertRaises(errors.BzrMoveFailedError,
233
                          tree.rename_one, 'a', 'b/foo', after=True)
234
        self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('b', 'b-id')],
235
                              tree)
236
        self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('b', 'b-id')],
237
                              tree.basis_tree())
238
239
    def test_rename_one_after_source_and_dest(self):
240
        tree = self.make_branch_and_tree('.')
241
        self.build_tree(['a', 'b/', 'b/foo'])
242
        tree.add(['a', 'b'], ['a-id', 'b-id'])
243
        tree.commit('initial', rev_id='rev-1')
244
        root_id = tree.get_root_id()
245
246
        # TODO: jam 20070225 I would usually use 'rb', but assertFileEqual
247
        #       uses 'r'.
248
        a_file = open('a', 'r')
249
        try:
250
            a_text = a_file.read()
251
        finally:
252
            a_file.close()
253
        foo_file = open('b/foo', 'r')
254
        try:
255
            foo_text = foo_file.read()
256
        finally:
257
            foo_file.close()
258
259
        self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('b', 'b-id')],
260
                              tree)
261
        self.assertRaises(errors.RenameFailedFilesExist,
262
                          tree.rename_one, 'a', 'b/foo', after=False)
263
        self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('b', 'b-id')],
264
                              tree)
265
        self.assertFileEqual(a_text, 'a')
266
        self.assertFileEqual(foo_text, 'b/foo')
267
        # But you can pass after=True
268
        tree.rename_one('a', 'b/foo', after=True)
269
        self.assertTreeLayout([('', root_id), ('b', 'b-id'),
270
                               ('b/foo', 'a-id')], tree)
271
        self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('b', 'b-id')],
272
                              tree.basis_tree())
273
        # But it shouldn't actually move anything
274
        self.assertFileEqual(a_text, 'a')
275
        self.assertFileEqual(foo_text, 'b/foo')
276
277
    def test_rename_one_directory(self):
278
        tree = self.make_branch_and_tree('.')
279
        self.build_tree(['a/', 'a/b', 'a/c/', 'a/c/d', 'e/'])
280
        tree.add(['a', 'a/b', 'a/c', 'a/c/d', 'e'],
281
                 ['a-id', 'b-id', 'c-id', 'd-id', 'e-id'])
282
        tree.commit('initial', rev_id='rev-1')
283
        root_id = tree.get_root_id()
284
285
        tree.rename_one('a', 'e/f')
286
        self.assertTreeLayout([('', root_id), ('e', 'e-id'), ('e/f', 'a-id'),
287
                               ('e/f/b', 'b-id'), ('e/f/c', 'c-id'),
288
                               ('e/f/c/d', 'd-id')], tree)
289
        self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('e', 'e-id'),
290
                               ('a/b', 'b-id'), ('a/c', 'c-id'),
291
                               ('a/c/d', 'd-id')], tree.basis_tree())
292
293
    def test_rename_one_moved(self):
294
        """Moving a moved entry works as expected."""
295
        tree = self.make_branch_and_tree('.')
296
        self.build_tree(['a/', 'a/b', 'c/'])
297
        tree.add(['a', 'a/b', 'c'], ['a-id', 'b-id', 'c-id'])
298
        tree.commit('initial', rev_id='rev-1')
299
        root_id = tree.get_root_id()
300
301
        tree.rename_one('a/b', 'c/foo')
302
        self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('c', 'c-id'),
303
                               ('c/foo', 'b-id')], tree)
304
        self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('c', 'c-id'),
305
                               ('a/b', 'b-id')], tree.basis_tree())
306
307
        tree.rename_one('c/foo', 'bar')
308
        self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('bar', 'b-id'),
309
                               ('c', 'c-id')], tree)
310
        self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('c', 'c-id'),
311
                               ('a/b', 'b-id')], tree.basis_tree())
2825.6.1 by Robert Collins
* ``WorkingTree.rename_one`` will now raise an error if normalisation of the
312
313
    def test_rename_to_denormalised_fails(self):
3638.3.13 by Vincent Ladeuil
Fix test_rename_to_denormalised_fails for OSX.
314
        if osutils.normalizes_filenames():
315
            raise tests.TestNotApplicable('OSX normalizes filenames')
2825.6.1 by Robert Collins
* ``WorkingTree.rename_one`` will now raise an error if normalisation of the
316
        tree = self.make_branch_and_tree('.')
317
        self.build_tree(['a'])
318
        tree.add(['a'])
319
        self.assertRaises((errors.InvalidNormalization, UnicodeEncodeError),
3201.1.2 by John Arbash Meinel
Test needs to be updated now that ยต is allowed.
320
            tree.rename_one, 'a', u'ba\u030arry')