14
14
# along with this program; if not, write to the Free Software
15
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
"""Test for 'brz mv'"""
17
"""Test for 'bzr mv'"""
27
from breezy.tests import (
27
from brzlib.tests import (
28
28
TestCaseWithTransport,
31
from breezy.tests.features import (
30
from brzlib.tests.features import (
32
31
CaseInsensitiveFilesystemFeature,
34
33
UnicodeFilenameFeature,
38
37
class TestMove(TestCaseWithTransport):
40
def assertMoved(self, from_path, to_path):
39
def assertMoved(self,from_path,to_path):
41
40
"""Assert that to_path is existing and versioned but from_path not. """
42
41
self.assertPathDoesNotExist(from_path)
43
42
self.assertNotInWorkingTree(from_path)
52
51
tree.add(['a', 'c', 'subdir'])
54
53
self.run_bzr('mv a b')
55
self.assertMoved('a', 'b')
54
self.assertMoved('a','b')
57
56
self.run_bzr('mv b subdir')
58
self.assertMoved('b', 'subdir/b')
57
self.assertMoved('b','subdir/b')
60
59
self.run_bzr('mv subdir/b a')
61
self.assertMoved('subdir/b', 'a')
60
self.assertMoved('subdir/b','a')
63
62
self.run_bzr('mv a c subdir')
64
self.assertMoved('a', 'subdir/a')
65
self.assertMoved('c', 'subdir/c')
63
self.assertMoved('a','subdir/a')
64
self.assertMoved('c','subdir/c')
67
66
self.run_bzr('mv subdir/a subdir/newa')
68
self.assertMoved('subdir/a', 'subdir/newa')
67
self.assertMoved('subdir/a','subdir/newa')
70
69
def test_mv_unversioned(self):
71
70
self.build_tree(['unversioned.txt'])
72
71
self.run_bzr_error(
73
["^brz: ERROR: Could not rename unversioned.txt => elsewhere."
74
" .*unversioned.txt is not versioned\\.$"],
72
["^bzr: ERROR: Could not rename unversioned.txt => elsewhere."
73
" .*unversioned.txt is not versioned\.$"],
75
74
'mv unversioned.txt elsewhere')
77
76
def test_mv_nonexisting(self):
78
77
self.run_bzr_error(
79
["^brz: ERROR: Could not rename doesnotexist => somewhereelse."
80
" .*doesnotexist is not versioned\\.$"],
78
["^bzr: ERROR: Could not rename doesnotexist => somewhereelse."
79
" .*doesnotexist is not versioned\.$"],
81
80
'mv doesnotexist somewhereelse')
83
82
def test_mv_unqualified(self):
84
self.run_bzr_error(['^brz: ERROR: missing file argument$'], 'mv')
83
self.run_bzr_error(['^bzr: ERROR: missing file argument$'], 'mv')
86
85
def test_mv_invalid(self):
87
86
tree = self.make_branch_and_tree('.')
89
88
tree.add(['test.txt'])
91
90
self.run_bzr_error(
92
["^brz: ERROR: Could not move to sub1: sub1 is not versioned\\.$"],
91
["^bzr: ERROR: Could not move to sub1: sub1 is not versioned\.$"],
93
92
'mv test.txt sub1')
95
94
self.run_bzr_error(
96
["^brz: ERROR: Could not move test.txt => .*hello.txt: "
97
"sub1 is not versioned\\.$"],
95
["^bzr: ERROR: Could not move test.txt => .*hello.txt: "
96
"sub1 is not versioned\.$"],
98
97
'mv test.txt sub1/hello.txt')
100
99
def test_mv_dirs(self):
103
102
tree.add(['hello.txt', 'sub1'])
105
104
self.run_bzr('mv sub1 sub2')
106
self.assertMoved('sub1', 'sub2')
105
self.assertMoved('sub1','sub2')
108
107
self.run_bzr('mv hello.txt sub2')
109
self.assertMoved('hello.txt', 'sub2/hello.txt')
108
self.assertMoved('hello.txt','sub2/hello.txt')
111
110
self.build_tree(['sub1/'])
112
111
tree.add(['sub1'])
113
112
self.run_bzr('mv sub2/hello.txt sub1')
114
self.assertMoved('sub2/hello.txt', 'sub1/hello.txt')
113
self.assertMoved('sub2/hello.txt','sub1/hello.txt')
116
115
self.run_bzr('mv sub2 sub1')
117
self.assertMoved('sub2', 'sub1/sub2')
116
self.assertMoved('sub2','sub1/sub2')
119
118
def test_mv_relative(self):
120
119
self.build_tree(['sub1/', 'sub1/sub2/', 'sub1/hello.txt'])
125
124
self.assertPathExists('sub1/sub2/hello.txt')
127
126
self.run_bzr('mv sub2/hello.txt .', working_dir='sub1')
128
self.assertMoved('sub1/sub2/hello.txt', 'sub1/hello.txt')
127
self.assertMoved('sub1/sub2/hello.txt','sub1/hello.txt')
130
129
def test_mv_change_case_file(self):
131
130
# test for bug #77740 (mv unable change filename case on Windows)
172
171
out, err = self.run_bzr('mv bar Foo', retcode=3)
173
172
self.assertEqual('', out)
174
173
self.assertEqual(
175
'brz: ERROR: Could not move to Foo: Foo is not versioned.\n',
174
'bzr: ERROR: Could not move to Foo: Foo is not versioned.\n',
178
177
def test_mv_smoke_aliases(self):
197
196
self.build_tree(['a/', 'a/b'])
198
197
os.symlink('a', 'c')
199
198
os.symlink('.', 'd')
200
tree.add(['a', 'a/b', 'c'], [b'a-id', b'b-id', b'c-id'])
199
tree.add(['a', 'a/b', 'c'], ['a-id', 'b-id', 'c-id'])
201
200
self.run_bzr('mv c/b b')
202
201
tree = workingtree.WorkingTree.open('.')
203
self.assertEqual(b'b-id', tree.path2id('b'))
202
self.assertEqual('b-id', tree.path2id('b'))
205
204
def test_mv_already_moved_file(self):
206
"""Test brz mv original_file to moved_file.
205
"""Test bzr mv original_file to moved_file.
208
207
Tests if a file which has allready been moved by an external tool,
209
is handled correctly by brz mv.
208
is handled correctly by bzr mv.
210
209
Setup: a is in the working tree, b does not exist.
211
User does: mv a b; brz mv a b
210
User does: mv a b; bzr mv a b
213
212
self.build_tree(['a'])
214
213
tree = self.make_branch_and_tree('.')
217
216
osutils.rename('a', 'b')
218
217
self.run_bzr('mv a b')
219
self.assertMoved('a', 'b')
218
self.assertMoved('a','b')
221
220
def test_mv_already_moved_file_to_versioned_target(self):
222
"""Test brz mv existing_file to versioned_file.
221
"""Test bzr mv existing_file to versioned_file.
224
223
Tests if an attempt to move an existing versioned file
225
224
to another versiond file will fail.
226
225
Setup: a and b are in the working tree.
227
User does: rm b; mv a b; brz mv a b
226
User does: rm b; mv a b; bzr mv a b
229
228
self.build_tree(['a', 'b'])
230
229
tree = self.make_branch_and_tree('.')
234
233
osutils.rename('a', 'b')
235
234
self.run_bzr_error(
236
["^brz: ERROR: Could not move a => b. b is already versioned\\.$"],
235
["^bzr: ERROR: Could not move a => b. b is already versioned\.$"],
238
# check that nothing changed
237
#check that nothing changed
239
238
self.assertPathDoesNotExist('a')
240
239
self.assertPathExists('b')
242
241
def test_mv_already_moved_file_into_subdir(self):
243
"""Test brz mv original_file to versioned_directory/file.
242
"""Test bzr mv original_file to versioned_directory/file.
245
244
Tests if a file which has already been moved into a versioned
246
directory by an external tool, is handled correctly by brz mv.
245
directory by an external tool, is handled correctly by bzr mv.
247
246
Setup: a and sub/ are in the working tree.
248
User does: mv a sub/a; brz mv a sub/a
247
User does: mv a sub/a; bzr mv a sub/a
250
249
self.build_tree(['a', 'sub/'])
251
250
tree = self.make_branch_and_tree('.')
254
253
osutils.rename('a', 'sub/a')
255
254
self.run_bzr('mv a sub/a')
256
self.assertMoved('a', 'sub/a')
255
self.assertMoved('a','sub/a')
258
257
def test_mv_already_moved_file_into_unversioned_subdir(self):
259
"""Test brz mv original_file to unversioned_directory/file.
258
"""Test bzr mv original_file to unversioned_directory/file.
261
260
Tests if an attempt to move an existing versioned file
262
261
into an unversioned directory will fail.
263
262
Setup: a is in the working tree, sub/ is not.
264
User does: mv a sub/a; brz mv a sub/a
263
User does: mv a sub/a; bzr mv a sub/a
266
265
self.build_tree(['a', 'sub/'])
267
266
tree = self.make_branch_and_tree('.')
270
269
osutils.rename('a', 'sub/a')
271
270
self.run_bzr_error(
272
["^brz: ERROR: Could not move a => a: sub is not versioned\\.$"],
271
["^bzr: ERROR: Could not move a => a: sub is not versioned\.$"],
274
273
self.assertPathDoesNotExist('a')
275
274
self.assertPathExists('sub/a')
277
276
def test_mv_already_moved_files_into_subdir(self):
278
"""Test brz mv original_files to versioned_directory.
277
"""Test bzr mv original_files to versioned_directory.
280
279
Tests if files which has already been moved into a versioned
281
directory by an external tool, is handled correctly by brz mv.
280
directory by an external tool, is handled correctly by bzr mv.
282
281
Setup: a1, a2, sub are in the working tree.
283
User does: mv a1 sub/.; brz mv a1 a2 sub
282
User does: mv a1 sub/.; bzr mv a1 a2 sub
285
284
self.build_tree(['a1', 'a2', 'sub/'])
286
285
tree = self.make_branch_and_tree('.')
289
288
osutils.rename('a1', 'sub/a1')
290
289
self.run_bzr('mv a1 a2 sub')
291
self.assertMoved('a1', 'sub/a1')
292
self.assertMoved('a2', 'sub/a2')
290
self.assertMoved('a1','sub/a1')
291
self.assertMoved('a2','sub/a2')
294
293
def test_mv_already_moved_files_into_unversioned_subdir(self):
295
"""Test brz mv original_file to unversioned_directory.
294
"""Test bzr mv original_file to unversioned_directory.
297
296
Tests if an attempt to move existing versioned file
298
297
into an unversioned directory will fail.
299
298
Setup: a1, a2 are in the working tree, sub is not.
300
User does: mv a1 sub/.; brz mv a1 a2 sub
299
User does: mv a1 sub/.; bzr mv a1 a2 sub
302
301
self.build_tree(['a1', 'a2', 'sub/'])
303
302
tree = self.make_branch_and_tree('.')
313
312
self.assertPathDoesNotExist('sub/a2')
315
314
def test_mv_already_moved_file_forcing_after(self):
316
"""Test brz mv versioned_file to unversioned_file.
315
"""Test bzr mv versioned_file to unversioned_file.
318
317
Tests if an attempt to move an existing versioned file to an existing
319
318
unversioned file will fail, informing the user to use the --after
320
319
option to force this.
321
320
Setup: a is in the working tree, b not versioned.
322
User does: mv a b; touch a; brz mv a b
321
User does: mv a b; touch a; bzr mv a b
324
323
self.build_tree(['a', 'b'])
325
324
tree = self.make_branch_and_tree('.')
328
327
osutils.rename('a', 'b')
329
self.build_tree(['a']) # touch a
328
self.build_tree(['a']) #touch a
330
329
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"
330
["^bzr: ERROR: Could not rename a => b because both files exist."
331
" \(Use --after to tell bzr about a rename that has already"
335
334
self.assertPathExists('a')
336
335
self.assertPathExists('b')
338
337
def test_mv_already_moved_file_using_after(self):
339
"""Test brz mv --after versioned_file to unversioned_file.
338
"""Test bzr mv --after versioned_file to unversioned_file.
341
340
Tests if an existing versioned file can be forced to move to an
342
341
existing unversioned file using the --after option. With the result
343
342
that bazaar considers the unversioned_file to be moved from
344
343
versioned_file and versioned_file will become unversioned.
345
344
Setup: a is in the working tree and b exists.
346
User does: mv a b; touch a; brz mv a b --after
345
User does: mv a b; touch a; bzr mv a b --after
347
346
Resulting in a => b and a is unknown.
349
348
self.build_tree(['a', 'b'])
350
349
tree = self.make_branch_and_tree('.')
352
351
osutils.rename('a', 'b')
353
self.build_tree(['a']) # touch a
352
self.build_tree(['a']) #touch a
355
354
self.run_bzr('mv a b --after')
356
355
self.assertPathExists('a')
357
self.assertNotInWorkingTree('a') # a should be unknown now.
356
self.assertNotInWorkingTree('a')#a should be unknown now.
358
357
self.assertPathExists('b')
359
358
self.assertInWorkingTree('b')
361
360
def test_mv_already_moved_files_forcing_after(self):
362
"""Test brz mv versioned_files to directory/unversioned_file.
361
"""Test bzr mv versioned_files to directory/unversioned_file.
364
363
Tests if an attempt to move an existing versioned file to an existing
365
364
unversioned file in some other directory will fail, informing the user
368
367
Setup: a1, a2, sub are versioned and in the working tree,
369
368
sub/a1, sub/a2 are in working tree.
370
User does: mv a* sub; touch a1; touch a2; brz mv a1 a2 sub
369
User does: mv a* sub; touch a1; touch a2; bzr mv a1 a2 sub
372
371
self.build_tree(['a1', 'a2', 'sub/', 'sub/a1', 'sub/a2'])
373
372
tree = self.make_branch_and_tree('.')
374
373
tree.add(['a1', 'a2', 'sub'])
375
374
osutils.rename('a1', 'sub/a1')
376
375
osutils.rename('a2', 'sub/a2')
377
self.build_tree(['a1']) # touch a1
378
self.build_tree(['a2']) # touch a2
376
self.build_tree(['a1']) #touch a1
377
self.build_tree(['a2']) #touch a2
380
379
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"
380
["^bzr: ERROR: Could not rename a1 => sub/a1 because both files"
381
" exist. \(Use --after to tell bzr about a rename that has already"
385
384
self.assertPathExists('a1')
386
385
self.assertPathExists('a2')
388
387
self.assertPathExists('sub/a2')
390
389
def test_mv_already_moved_files_using_after(self):
391
"""Test brz mv --after versioned_file to directory/unversioned_file.
390
"""Test bzr mv --after versioned_file to directory/unversioned_file.
393
392
Tests if an existing versioned file can be forced to move to an
394
393
existing unversioned file in some other directory using the --after
399
398
Setup: a1, a2, sub are versioned and in the working tree,
400
399
sub/a1, sub/a2 are in working tree.
401
User does: mv a* sub; touch a1; touch a2; brz mv a1 a2 sub --after
400
User does: mv a* sub; touch a1; touch a2; bzr mv a1 a2 sub --after
403
402
self.build_tree(['a1', 'a2', 'sub/', 'sub/a1', 'sub/a2'])
404
403
tree = self.make_branch_and_tree('.')
405
404
tree.add(['a1', 'a2', 'sub'])
406
405
osutils.rename('a1', 'sub/a1')
407
406
osutils.rename('a2', 'sub/a2')
408
self.build_tree(['a1']) # touch a1
409
self.build_tree(['a2']) # touch a2
407
self.build_tree(['a1']) #touch a1
408
self.build_tree(['a2']) #touch a2
411
410
self.run_bzr('mv a1 a2 sub --after')
412
411
self.assertPathExists('a1')
454
453
self.assertEqual(out, '')
455
454
self.assertEqual(err, 'a => b\nc => d\n')
456
455
tree = workingtree.WorkingTree.open('tree')
457
self.assertTrue(tree.is_versioned('b'))
458
self.assertTrue(tree.is_versioned('d'))
456
self.assertIsNot(None, tree.path2id('b'))
457
self.assertIsNot(None, tree.path2id('d'))
460
459
def test_mv_auto_one_path(self):
461
460
self.make_abcd_tree()
463
462
self.assertEqual(out, '')
464
463
self.assertEqual(err, 'a => b\nc => d\n')
465
464
tree = workingtree.WorkingTree.open('tree')
466
self.assertTrue(tree.is_versioned('b'))
467
self.assertTrue(tree.is_versioned('d'))
465
self.assertIsNot(None, tree.path2id('b'))
466
self.assertIsNot(None, tree.path2id('d'))
469
468
def test_mv_auto_two_paths(self):
470
469
self.make_abcd_tree()
471
470
out, err = self.run_bzr('mv --auto tree tree2', retcode=3)
472
self.assertEqual('brz: ERROR: Only one path may be specified to'
471
self.assertEqual('bzr: ERROR: Only one path may be specified to'
473
472
' --auto.\n', err)
475
474
def test_mv_auto_dry_run(self):
478
477
self.assertEqual(out, '')
479
478
self.assertEqual(err, 'a => b\nc => d\n')
480
479
tree = workingtree.WorkingTree.open('tree')
481
self.assertTrue(tree.is_versioned('a'))
482
self.assertTrue(tree.is_versioned('c'))
480
self.assertIsNot(None, tree.path2id('a'))
481
self.assertIsNot(None, tree.path2id('c'))
484
483
def test_mv_no_auto_dry_run(self):
485
484
self.make_abcd_tree()
486
485
out, err = self.run_bzr('mv c d --dry-run',
487
486
working_dir='tree', retcode=3)
488
self.assertEqual('brz: ERROR: --dry-run requires --auto.\n', err)
487
self.assertEqual('bzr: ERROR: --dry-run requires --auto.\n', err)
490
489
def test_mv_auto_after(self):
491
490
self.make_abcd_tree()
492
491
out, err = self.run_bzr('mv --auto --after', working_dir='tree',
494
self.assertEqual('brz: ERROR: --after cannot be specified with'
493
self.assertEqual('bzr: ERROR: --after cannot be specified with'
495
494
' --auto.\n', err)
497
496
def test_mv_quiet(self):
505
504
def test_mv_readonly_lightweight_checkout(self):
506
505
branch = self.make_branch('foo')
507
branch = breezy.branch.Branch.open(self.get_readonly_url('foo'))
506
branch = brzlib.branch.Branch.open(self.get_readonly_url('foo'))
508
507
tree = branch.create_checkout('tree', lightweight=True)
509
508
self.build_tree(['tree/path'])
518
517
tree = self.make_branch_and_tree(".")
519
518
self.build_tree([u"\xA7"])
520
519
out, err = self.run_bzr_error(["Could not rename", "not versioned"],
521
["mv", u"\xA7", "b"])
520
["mv", u"\xA7", "b"])
523
522
def test_mv_removed_non_ascii(self):
524
523
"""Clear error on mv of a removed non-ascii file, see lp:898541"""
529
528
tree.commit(u"Adding \xA7")
530
529
os.remove(u"\xA7")
531
530
out, err = self.run_bzr_error(["Could not rename", "not exist"],
532
["mv", u"\xA7", "b"])
534
def test_dupe_move(self):
535
self.script_runner = script.ScriptRunner()
536
self.script_runner.run_script(self, '''
538
Created a standalone tree (format: 2a)
543
$ echo text >> dir/test.txt
546
$ brz ci -m "Add files"
547
2>Committing to: .../brz-bug/
550
2>Committed revision 1.
552
$ mv dir2/test.txt dir2/test2.txt
568
$ brz mv dir/test.txt dir2/test2.txt
569
dir/test.txt => dir2/test2.txt
531
["mv", u"\xA7", "b"])