/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to breezy/tests/blackbox/test_mv.py

  • Committer: John Arbash Meinel
  • Date: 2006-04-25 15:05:42 UTC
  • mfrom: (1185.85.85 bzr-encoding)
  • mto: This revision was merged to the branch mainline in revision 1752.
  • Revision ID: john@arbash-meinel.com-20060425150542-c7b518dca9928691
[merge] the old bzr-encoding changes, reparenting them on bzr.dev

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006-2012, 2016 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
 
 
17
 
"""Test for 'brz mv'"""
18
 
 
19
 
import os
20
 
 
21
 
import breezy.branch
22
 
from breezy import (
23
 
    osutils,
24
 
    workingtree,
25
 
    )
26
 
 
27
 
from breezy.tests import (
28
 
    TestCaseWithTransport,
29
 
    script,
30
 
    )
31
 
from breezy.tests.features import (
32
 
    CaseInsensitiveFilesystemFeature,
33
 
    SymlinkFeature,
34
 
    UnicodeFilenameFeature,
35
 
    )
36
 
 
37
 
 
38
 
class TestMove(TestCaseWithTransport):
39
 
 
40
 
    def assertMoved(self, from_path, to_path):
41
 
        """Assert that to_path is existing and versioned but from_path not. """
42
 
        self.assertPathDoesNotExist(from_path)
43
 
        self.assertNotInWorkingTree(from_path)
44
 
 
45
 
        self.assertPathExists(to_path)
46
 
        self.assertInWorkingTree(to_path)
47
 
 
48
 
    def test_mv_modes(self):
49
 
        """Test two modes of operation for mv"""
50
 
        tree = self.make_branch_and_tree('.')
51
 
        files = self.build_tree(['a', 'c', 'subdir/'])
52
 
        tree.add(['a', 'c', 'subdir'])
53
 
 
54
 
        self.run_bzr('mv a b')
55
 
        self.assertMoved('a', 'b')
56
 
 
57
 
        self.run_bzr('mv b subdir')
58
 
        self.assertMoved('b', 'subdir/b')
59
 
 
60
 
        self.run_bzr('mv subdir/b a')
61
 
        self.assertMoved('subdir/b', 'a')
62
 
 
63
 
        self.run_bzr('mv a c subdir')
64
 
        self.assertMoved('a', 'subdir/a')
65
 
        self.assertMoved('c', 'subdir/c')
66
 
 
67
 
        self.run_bzr('mv subdir/a subdir/newa')
68
 
        self.assertMoved('subdir/a', 'subdir/newa')
69
 
 
70
 
    def test_mv_unversioned(self):
71
 
        self.build_tree(['unversioned.txt'])
72
 
        self.run_bzr_error(
73
 
            ["^brz: ERROR: Could not rename unversioned.txt => elsewhere."
74
 
             " .*unversioned.txt is not versioned\\.$"],
75
 
            'mv unversioned.txt elsewhere')
76
 
 
77
 
    def test_mv_nonexisting(self):
78
 
        self.run_bzr_error(
79
 
            ["^brz: ERROR: Could not rename doesnotexist => somewhereelse."
80
 
             " .*doesnotexist is not versioned\\.$"],
81
 
            'mv doesnotexist somewhereelse')
82
 
 
83
 
    def test_mv_unqualified(self):
84
 
        self.run_bzr_error(['^brz: ERROR: missing file argument$'], 'mv')
85
 
 
86
 
    def test_mv_invalid(self):
87
 
        tree = self.make_branch_and_tree('.')
88
 
        self.build_tree(['test.txt', 'sub1/'])
89
 
        tree.add(['test.txt'])
90
 
 
91
 
        self.run_bzr_error(
92
 
            ["^brz: ERROR: Could not move to sub1: sub1 is not versioned\\.$"],
93
 
            'mv test.txt sub1')
94
 
 
95
 
        self.run_bzr_error(
96
 
            ["^brz: ERROR: Could not move test.txt => .*hello.txt: "
97
 
             "sub1 is not versioned\\.$"],
98
 
            'mv test.txt sub1/hello.txt')
99
 
 
100
 
    def test_mv_dirs(self):
101
 
        tree = self.make_branch_and_tree('.')
102
 
        self.build_tree(['hello.txt', 'sub1/'])
103
 
        tree.add(['hello.txt', 'sub1'])
104
 
 
105
 
        self.run_bzr('mv sub1 sub2')
106
 
        self.assertMoved('sub1', 'sub2')
107
 
 
108
 
        self.run_bzr('mv hello.txt sub2')
109
 
        self.assertMoved('hello.txt', 'sub2/hello.txt')
110
 
 
111
 
        self.build_tree(['sub1/'])
112
 
        tree.add(['sub1'])
113
 
        self.run_bzr('mv sub2/hello.txt sub1')
114
 
        self.assertMoved('sub2/hello.txt', 'sub1/hello.txt')
115
 
 
116
 
        self.run_bzr('mv sub2 sub1')
117
 
        self.assertMoved('sub2', 'sub1/sub2')
118
 
 
119
 
    def test_mv_relative(self):
120
 
        self.build_tree(['sub1/', 'sub1/sub2/', 'sub1/hello.txt'])
121
 
        tree = self.make_branch_and_tree('.')
122
 
        tree.add(['sub1', 'sub1/sub2', 'sub1/hello.txt'])
123
 
 
124
 
        self.run_bzr('mv ../hello.txt .', working_dir='sub1/sub2')
125
 
        self.assertPathExists('sub1/sub2/hello.txt')
126
 
 
127
 
        self.run_bzr('mv sub2/hello.txt .', working_dir='sub1')
128
 
        self.assertMoved('sub1/sub2/hello.txt', 'sub1/hello.txt')
129
 
 
130
 
    def test_mv_change_case_file(self):
131
 
        # test for bug #77740 (mv unable change filename case on Windows)
132
 
        tree = self.make_branch_and_tree('.')
133
 
        self.build_tree(['test.txt'])
134
 
        tree.add(['test.txt'])
135
 
        self.run_bzr('mv test.txt Test.txt')
136
 
        # we can't use failUnlessExists on case-insensitive filesystem
137
 
        # so try to check shape of the tree
138
 
        shape = sorted(os.listdir(u'.'))
139
 
        self.assertEqual(['.bzr', 'Test.txt'], shape)
140
 
        self.assertInWorkingTree('Test.txt')
141
 
        self.assertNotInWorkingTree('test.txt')
142
 
 
143
 
    def test_mv_change_case_dir(self):
144
 
        tree = self.make_branch_and_tree('.')
145
 
        self.build_tree(['foo/'])
146
 
        tree.add(['foo'])
147
 
        self.run_bzr('mv foo Foo')
148
 
        # we can't use failUnlessExists on case-insensitive filesystem
149
 
        # so try to check shape of the tree
150
 
        shape = sorted(os.listdir(u'.'))
151
 
        self.assertEqual(['.bzr', 'Foo'], shape)
152
 
        self.assertInWorkingTree('Foo')
153
 
        self.assertNotInWorkingTree('foo')
154
 
 
155
 
    def test_mv_change_case_dir_w_files(self):
156
 
        tree = self.make_branch_and_tree('.')
157
 
        self.build_tree(['foo/', 'foo/bar'])
158
 
        tree.add(['foo'])
159
 
        self.run_bzr('mv foo Foo')
160
 
        # we can't use failUnlessExists on case-insensitive filesystem
161
 
        # so try to check shape of the tree
162
 
        shape = sorted(os.listdir(u'.'))
163
 
        self.assertEqual(['.bzr', 'Foo'], shape)
164
 
        self.assertInWorkingTree('Foo')
165
 
        self.assertNotInWorkingTree('foo')
166
 
 
167
 
    def test_mv_file_to_wrong_case_dir(self):
168
 
        self.requireFeature(CaseInsensitiveFilesystemFeature)
169
 
        tree = self.make_branch_and_tree('.')
170
 
        self.build_tree(['foo/', 'bar'])
171
 
        tree.add(['foo', 'bar'])
172
 
        out, err = self.run_bzr('mv bar Foo', retcode=3)
173
 
        self.assertEqual('', out)
174
 
        self.assertEqual(
175
 
            'brz: ERROR: Could not move to Foo: Foo is not versioned.\n',
176
 
            err)
177
 
 
178
 
    def test_mv_smoke_aliases(self):
179
 
        # just test that aliases for mv exist, if their behaviour is changed in
180
 
        # the future, then extend the tests.
181
 
        self.build_tree(['a'])
182
 
        tree = self.make_branch_and_tree('.')
183
 
        tree.add(['a'])
184
 
 
185
 
        self.run_bzr('move a b')
186
 
        self.run_bzr('rename b a')
187
 
 
188
 
    def test_mv_no_root(self):
189
 
        tree = self.make_branch_and_tree('.')
190
 
        self.run_bzr_error(
191
 
            ["brz: ERROR: can not move root of branch"],
192
 
            'mv . a')
193
 
 
194
 
    def test_mv_through_symlinks(self):
195
 
        self.requireFeature(SymlinkFeature)
196
 
        tree = self.make_branch_and_tree('.')
197
 
        self.build_tree(['a/', 'a/b'])
198
 
        os.symlink('a', 'c')
199
 
        os.symlink('.', 'd')
200
 
        tree.add(['a', 'a/b', 'c'], [b'a-id', b'b-id', b'c-id'])
201
 
        self.run_bzr('mv c/b b')
202
 
        tree = workingtree.WorkingTree.open('.')
203
 
        self.assertEqual(b'b-id', tree.path2id('b'))
204
 
 
205
 
    def test_mv_already_moved_file(self):
206
 
        """Test brz mv original_file to moved_file.
207
 
 
208
 
        Tests if a file which has allready been moved by an external tool,
209
 
        is handled correctly by brz mv.
210
 
        Setup: a is in the working tree, b does not exist.
211
 
        User does: mv a b; brz mv a b
212
 
        """
213
 
        self.build_tree(['a'])
214
 
        tree = self.make_branch_and_tree('.')
215
 
        tree.add(['a'])
216
 
 
217
 
        osutils.rename('a', 'b')
218
 
        self.run_bzr('mv a b')
219
 
        self.assertMoved('a', 'b')
220
 
 
221
 
    def test_mv_already_moved_file_to_versioned_target(self):
222
 
        """Test brz mv existing_file to versioned_file.
223
 
 
224
 
        Tests if an attempt to move an existing versioned file
225
 
        to another versiond file will fail.
226
 
        Setup: a and b are in the working tree.
227
 
        User does: rm b; mv a b; brz mv a b
228
 
        """
229
 
        self.build_tree(['a', 'b'])
230
 
        tree = self.make_branch_and_tree('.')
231
 
        tree.add(['a', 'b'])
232
 
 
233
 
        os.remove('b')
234
 
        osutils.rename('a', 'b')
235
 
        self.run_bzr_error(
236
 
            ["^brz: ERROR: Could not move a => b. b is already versioned\\.$"],
237
 
            'mv a b')
238
 
        # check that nothing changed
239
 
        self.assertPathDoesNotExist('a')
240
 
        self.assertPathExists('b')
241
 
 
242
 
    def test_mv_already_moved_file_into_subdir(self):
243
 
        """Test brz mv original_file to versioned_directory/file.
244
 
 
245
 
        Tests if a file which has already been moved into a versioned
246
 
        directory by an external tool, is handled correctly by brz mv.
247
 
        Setup: a and sub/ are in the working tree.
248
 
        User does: mv a sub/a; brz mv a sub/a
249
 
        """
250
 
        self.build_tree(['a', 'sub/'])
251
 
        tree = self.make_branch_and_tree('.')
252
 
        tree.add(['a', 'sub'])
253
 
 
254
 
        osutils.rename('a', 'sub/a')
255
 
        self.run_bzr('mv a sub/a')
256
 
        self.assertMoved('a', 'sub/a')
257
 
 
258
 
    def test_mv_already_moved_file_into_unversioned_subdir(self):
259
 
        """Test brz mv original_file to unversioned_directory/file.
260
 
 
261
 
        Tests if an attempt to move an existing versioned file
262
 
        into an unversioned directory will fail.
263
 
        Setup: a is in the working tree, sub/ is not.
264
 
        User does: mv a sub/a; brz mv a sub/a
265
 
        """
266
 
        self.build_tree(['a', 'sub/'])
267
 
        tree = self.make_branch_and_tree('.')
268
 
        tree.add(['a'])
269
 
 
270
 
        osutils.rename('a', 'sub/a')
271
 
        self.run_bzr_error(
272
 
            ["^brz: ERROR: Could not move a => a: sub is not versioned\\.$"],
273
 
            'mv a sub/a')
274
 
        self.assertPathDoesNotExist('a')
275
 
        self.assertPathExists('sub/a')
276
 
 
277
 
    def test_mv_already_moved_files_into_subdir(self):
278
 
        """Test brz mv original_files to versioned_directory.
279
 
 
280
 
        Tests if files which has already been moved into a versioned
281
 
        directory by an external tool, is handled correctly by brz mv.
282
 
        Setup: a1, a2, sub are in the working tree.
283
 
        User does: mv a1 sub/.; brz mv a1 a2 sub
284
 
        """
285
 
        self.build_tree(['a1', 'a2', 'sub/'])
286
 
        tree = self.make_branch_and_tree('.')
287
 
        tree.add(['a1', 'a2', 'sub'])
288
 
 
289
 
        osutils.rename('a1', 'sub/a1')
290
 
        self.run_bzr('mv a1 a2 sub')
291
 
        self.assertMoved('a1', 'sub/a1')
292
 
        self.assertMoved('a2', 'sub/a2')
293
 
 
294
 
    def test_mv_already_moved_files_into_unversioned_subdir(self):
295
 
        """Test brz mv original_file to unversioned_directory.
296
 
 
297
 
        Tests if an attempt to move existing versioned file
298
 
        into an unversioned directory will fail.
299
 
        Setup: a1, a2 are in the working tree, sub is not.
300
 
        User does: mv a1 sub/.; brz mv a1 a2 sub
301
 
        """
302
 
        self.build_tree(['a1', 'a2', 'sub/'])
303
 
        tree = self.make_branch_and_tree('.')
304
 
        tree.add(['a1', 'a2'])
305
 
 
306
 
        osutils.rename('a1', 'sub/a1')
307
 
        self.run_bzr_error(
308
 
            ["^brz: ERROR: Could not move to sub. sub is not versioned\\.$"],
309
 
            'mv a1 a2 sub')
310
 
        self.assertPathDoesNotExist('a1')
311
 
        self.assertPathExists('sub/a1')
312
 
        self.assertPathExists('a2')
313
 
        self.assertPathDoesNotExist('sub/a2')
314
 
 
315
 
    def test_mv_already_moved_file_forcing_after(self):
316
 
        """Test brz mv versioned_file to unversioned_file.
317
 
 
318
 
        Tests if an attempt to move an existing versioned file to an existing
319
 
        unversioned file will fail, informing the user to use the --after
320
 
        option to force this.
321
 
        Setup: a is in the working tree, b not versioned.
322
 
        User does: mv a b; touch a; brz mv a b
323
 
        """
324
 
        self.build_tree(['a', 'b'])
325
 
        tree = self.make_branch_and_tree('.')
326
 
        tree.add(['a'])
327
 
 
328
 
        osutils.rename('a', 'b')
329
 
        self.build_tree(['a'])  # touch a
330
 
        self.run_bzr_error(
331
 
            ["^brz: ERROR: Could not rename a => b because both files exist."
332
 
             " \\(Use --after to tell brz about a rename that has already"
333
 
             " happened\\)$"],
334
 
            'mv a b')
335
 
        self.assertPathExists('a')
336
 
        self.assertPathExists('b')
337
 
 
338
 
    def test_mv_already_moved_file_using_after(self):
339
 
        """Test brz mv --after versioned_file to unversioned_file.
340
 
 
341
 
        Tests if an existing versioned file can be forced to move to an
342
 
        existing unversioned file using the --after option. With the result
343
 
        that bazaar considers the unversioned_file to be moved from
344
 
        versioned_file and versioned_file will become unversioned.
345
 
        Setup: a is in the working tree and b exists.
346
 
        User does: mv a b; touch a; brz mv a b --after
347
 
        Resulting in a => b and a is unknown.
348
 
        """
349
 
        self.build_tree(['a', 'b'])
350
 
        tree = self.make_branch_and_tree('.')
351
 
        tree.add(['a'])
352
 
        osutils.rename('a', 'b')
353
 
        self.build_tree(['a'])  # touch a
354
 
 
355
 
        self.run_bzr('mv a b --after')
356
 
        self.assertPathExists('a')
357
 
        self.assertNotInWorkingTree('a')  # a should be unknown now.
358
 
        self.assertPathExists('b')
359
 
        self.assertInWorkingTree('b')
360
 
 
361
 
    def test_mv_already_moved_files_forcing_after(self):
362
 
        """Test brz mv versioned_files to directory/unversioned_file.
363
 
 
364
 
        Tests if an attempt to move an existing versioned file to an existing
365
 
        unversioned file in some other directory will fail, informing the user
366
 
        to use the --after option to force this.
367
 
 
368
 
        Setup: a1, a2, sub are versioned and in the working tree,
369
 
               sub/a1, sub/a2 are in working tree.
370
 
        User does: mv a* sub; touch a1; touch a2; brz mv a1 a2 sub
371
 
        """
372
 
        self.build_tree(['a1', 'a2', 'sub/', 'sub/a1', 'sub/a2'])
373
 
        tree = self.make_branch_and_tree('.')
374
 
        tree.add(['a1', 'a2', 'sub'])
375
 
        osutils.rename('a1', 'sub/a1')
376
 
        osutils.rename('a2', 'sub/a2')
377
 
        self.build_tree(['a1'])  # touch a1
378
 
        self.build_tree(['a2'])  # touch a2
379
 
 
380
 
        self.run_bzr_error(
381
 
            ["^brz: ERROR: Could not rename a1 => sub/a1 because both files"
382
 
             " exist. \\(Use --after to tell brz about a rename that has already"
383
 
             " happened\\)$"],
384
 
            'mv a1 a2 sub')
385
 
        self.assertPathExists('a1')
386
 
        self.assertPathExists('a2')
387
 
        self.assertPathExists('sub/a1')
388
 
        self.assertPathExists('sub/a2')
389
 
 
390
 
    def test_mv_already_moved_files_using_after(self):
391
 
        """Test brz mv --after versioned_file to directory/unversioned_file.
392
 
 
393
 
        Tests if an existing versioned file can be forced to move to an
394
 
        existing unversioned file in some other directory using the --after
395
 
        option. With the result that bazaar considers
396
 
        directory/unversioned_file to be moved from versioned_file and
397
 
        versioned_file will become unversioned.
398
 
 
399
 
        Setup: a1, a2, sub are versioned and in the working tree,
400
 
               sub/a1, sub/a2 are in working tree.
401
 
        User does: mv a* sub; touch a1; touch a2; brz mv a1 a2 sub --after
402
 
        """
403
 
        self.build_tree(['a1', 'a2', 'sub/', 'sub/a1', 'sub/a2'])
404
 
        tree = self.make_branch_and_tree('.')
405
 
        tree.add(['a1', 'a2', 'sub'])
406
 
        osutils.rename('a1', 'sub/a1')
407
 
        osutils.rename('a2', 'sub/a2')
408
 
        self.build_tree(['a1'])  # touch a1
409
 
        self.build_tree(['a2'])  # touch a2
410
 
 
411
 
        self.run_bzr('mv a1 a2 sub --after')
412
 
        self.assertPathExists('a1')
413
 
        self.assertPathExists('a2')
414
 
        self.assertPathExists('sub/a1')
415
 
        self.assertPathExists('sub/a2')
416
 
        self.assertInWorkingTree('sub/a1')
417
 
        self.assertInWorkingTree('sub/a2')
418
 
 
419
 
    def test_mv_already_moved_directory(self):
420
 
        """Use `brz mv a b` to mark a directory as renamed.
421
 
 
422
 
        https://bugs.launchpad.net/bzr/+bug/107967/
423
 
        """
424
 
        self.build_tree(['a/', 'c/'])
425
 
        tree = self.make_branch_and_tree('.')
426
 
        tree.add(['a', 'c'])
427
 
        osutils.rename('a', 'b')
428
 
        osutils.rename('c', 'd')
429
 
        # mv a b should work just like it does for already renamed files
430
 
        self.run_bzr('mv a b')
431
 
        self.assertPathDoesNotExist('a')
432
 
        self.assertNotInWorkingTree('a')
433
 
        self.assertPathExists('b')
434
 
        self.assertInWorkingTree('b')
435
 
        # and --after should work, too (technically it's ignored)
436
 
        self.run_bzr('mv --after c d')
437
 
        self.assertPathDoesNotExist('c')
438
 
        self.assertNotInWorkingTree('c')
439
 
        self.assertPathExists('d')
440
 
        self.assertInWorkingTree('d')
441
 
 
442
 
    def make_abcd_tree(self):
443
 
        tree = self.make_branch_and_tree('tree')
444
 
        self.build_tree(['tree/a', 'tree/c'])
445
 
        tree.add(['a', 'c'])
446
 
        tree.commit('record old names')
447
 
        osutils.rename('tree/a', 'tree/b')
448
 
        osutils.rename('tree/c', 'tree/d')
449
 
        return tree
450
 
 
451
 
    def test_mv_auto(self):
452
 
        self.make_abcd_tree()
453
 
        out, err = self.run_bzr('mv --auto', working_dir='tree')
454
 
        self.assertEqual(out, '')
455
 
        self.assertEqual(err, 'a => b\nc => d\n')
456
 
        tree = workingtree.WorkingTree.open('tree')
457
 
        self.assertTrue(tree.is_versioned('b'))
458
 
        self.assertTrue(tree.is_versioned('d'))
459
 
 
460
 
    def test_mv_auto_one_path(self):
461
 
        self.make_abcd_tree()
462
 
        out, err = self.run_bzr('mv --auto tree')
463
 
        self.assertEqual(out, '')
464
 
        self.assertEqual(err, 'a => b\nc => d\n')
465
 
        tree = workingtree.WorkingTree.open('tree')
466
 
        self.assertTrue(tree.is_versioned('b'))
467
 
        self.assertTrue(tree.is_versioned('d'))
468
 
 
469
 
    def test_mv_auto_two_paths(self):
470
 
        self.make_abcd_tree()
471
 
        out, err = self.run_bzr('mv --auto tree tree2', retcode=3)
472
 
        self.assertEqual('brz: ERROR: Only one path may be specified to'
473
 
                         ' --auto.\n', err)
474
 
 
475
 
    def test_mv_auto_dry_run(self):
476
 
        self.make_abcd_tree()
477
 
        out, err = self.run_bzr('mv --auto --dry-run', working_dir='tree')
478
 
        self.assertEqual(out, '')
479
 
        self.assertEqual(err, 'a => b\nc => d\n')
480
 
        tree = workingtree.WorkingTree.open('tree')
481
 
        self.assertTrue(tree.is_versioned('a'))
482
 
        self.assertTrue(tree.is_versioned('c'))
483
 
 
484
 
    def test_mv_no_auto_dry_run(self):
485
 
        self.make_abcd_tree()
486
 
        out, err = self.run_bzr('mv c d --dry-run',
487
 
                                working_dir='tree', retcode=3)
488
 
        self.assertEqual('brz: ERROR: --dry-run requires --auto.\n', err)
489
 
 
490
 
    def test_mv_auto_after(self):
491
 
        self.make_abcd_tree()
492
 
        out, err = self.run_bzr('mv --auto --after', working_dir='tree',
493
 
                                retcode=3)
494
 
        self.assertEqual('brz: ERROR: --after cannot be specified with'
495
 
                         ' --auto.\n', err)
496
 
 
497
 
    def test_mv_quiet(self):
498
 
        tree = self.make_branch_and_tree('.')
499
 
        self.build_tree(['aaa'])
500
 
        tree.add(['aaa'])
501
 
        out, err = self.run_bzr('mv --quiet aaa bbb')
502
 
        self.assertEqual(out, '')
503
 
        self.assertEqual(err, '')
504
 
 
505
 
    def test_mv_readonly_lightweight_checkout(self):
506
 
        branch = self.make_branch('foo')
507
 
        branch = breezy.branch.Branch.open(self.get_readonly_url('foo'))
508
 
        tree = branch.create_checkout('tree', lightweight=True)
509
 
        self.build_tree(['tree/path'])
510
 
        tree.add('path')
511
 
        # If this fails, the tree is trying to acquire a branch lock, which it
512
 
        # shouldn't.
513
 
        self.run_bzr(['mv', 'tree/path', 'tree/path2'])
514
 
 
515
 
    def test_mv_unversioned_non_ascii(self):
516
 
        """Clear error on mv of an unversioned non-ascii file, see lp:707954"""
517
 
        self.requireFeature(UnicodeFilenameFeature)
518
 
        tree = self.make_branch_and_tree(".")
519
 
        self.build_tree([u"\xA7"])
520
 
        out, err = self.run_bzr_error(["Could not rename", "not versioned"],
521
 
                                      ["mv", u"\xA7", "b"])
522
 
 
523
 
    def test_mv_removed_non_ascii(self):
524
 
        """Clear error on mv of a removed non-ascii file, see lp:898541"""
525
 
        self.requireFeature(UnicodeFilenameFeature)
526
 
        tree = self.make_branch_and_tree(".")
527
 
        self.build_tree([u"\xA7"])
528
 
        tree.add([u"\xA7"])
529
 
        tree.commit(u"Adding \xA7")
530
 
        os.remove(u"\xA7")
531
 
        out, err = self.run_bzr_error(["Could not rename", "not exist"],
532
 
                                      ["mv", u"\xA7", "b"])
533
 
 
534
 
    def test_dupe_move(self):
535
 
        self.script_runner = script.ScriptRunner()
536
 
        self.script_runner.run_script(self, '''
537
 
        $ brz init brz-bug
538
 
        Created a standalone tree (format: 2a)
539
 
        $ cd brz-bug
540
 
        $ mkdir dir
541
 
        $ brz add
542
 
        adding dir
543
 
        $ echo text >> dir/test.txt
544
 
        $ brz add
545
 
        adding dir/test.txt
546
 
        $ brz ci -m "Add files"
547
 
        2>Committing to: .../brz-bug/
548
 
        2>added dir
549
 
        2>added dir/test.txt
550
 
        2>Committed revision 1.
551
 
        $ mv dir dir2
552
 
        $ mv dir2/test.txt dir2/test2.txt
553
 
        $ brz st
554
 
        removed:
555
 
          dir/
556
 
          dir/test.txt
557
 
        unknown:
558
 
          dir2/
559
 
        $ brz mv dir dir2
560
 
        dir => dir2
561
 
        $ brz st
562
 
        removed:
563
 
          dir/test.txt
564
 
        renamed:
565
 
          dir/ => dir2/
566
 
        unknown:
567
 
          dir2/test2.txt
568
 
        $ brz mv dir/test.txt dir2/test2.txt
569
 
        dir/test.txt => dir2/test2.txt
570
 
        ''')