~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

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

  • Committer: Aaron Bentley
  • Date: 2007-06-21 23:43:17 UTC
  • mto: (2520.5.2 bzr.mpbundle)
  • mto: This revision was merged to the branch mainline in revision 2631.
  • Revision ID: abentley@panoramicfeedback.com-20070621234317-5w3h8h36oe90sups
Implement new merge directive format

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006-2010 Canonical Ltd
 
1
# Copyright (C) 2006 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
12
12
#
13
13
# You should have received a copy of the GNU General Public License
14
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
 
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
16
 
17
17
"""Test for 'bzr mv'"""
18
18
 
19
19
import os
20
20
 
21
 
import bzrlib.branch
22
21
from bzrlib import (
23
22
    osutils,
24
23
    workingtree,
25
24
    )
26
25
 
27
26
from bzrlib.tests import (
28
 
    CaseInsensitiveFilesystemFeature,
29
 
    SymlinkFeature,
30
27
    TestCaseWithTransport,
 
28
    TestSkipped,
31
29
    )
32
30
 
33
31
 
47
45
        files = self.build_tree(['a', 'c', 'subdir/'])
48
46
        tree.add(['a', 'c', 'subdir'])
49
47
 
50
 
        self.run_bzr('mv a b')
 
48
        self.run_bzr('mv', 'a', 'b')
51
49
        self.assertMoved('a','b')
52
50
 
53
 
        self.run_bzr('mv b subdir')
 
51
        self.run_bzr('mv', 'b', 'subdir')
54
52
        self.assertMoved('b','subdir/b')
55
53
 
56
 
        self.run_bzr('mv subdir/b a')
 
54
        self.run_bzr('mv', 'subdir/b', 'a')
57
55
        self.assertMoved('subdir/b','a')
58
56
 
59
 
        self.run_bzr('mv a c subdir')
 
57
        self.run_bzr('mv', 'a', 'c', 'subdir')
60
58
        self.assertMoved('a','subdir/a')
61
59
        self.assertMoved('c','subdir/c')
62
60
 
63
 
        self.run_bzr('mv subdir/a subdir/newa')
 
61
        self.run_bzr('mv', 'subdir/a', 'subdir/newa')
64
62
        self.assertMoved('subdir/a','subdir/newa')
65
63
 
66
64
    def test_mv_unversioned(self):
67
65
        self.build_tree(['unversioned.txt'])
68
66
        self.run_bzr_error(
69
67
            ["^bzr: ERROR: Could not rename unversioned.txt => elsewhere."
70
 
             " .*unversioned.txt is not versioned\.$"],
71
 
            'mv unversioned.txt elsewhere')
 
68
             " .*unversioned.txt is not versioned$"],
 
69
            'mv', 'unversioned.txt', 'elsewhere')
72
70
 
73
71
    def test_mv_nonexisting(self):
74
72
        self.run_bzr_error(
75
73
            ["^bzr: ERROR: Could not rename doesnotexist => somewhereelse."
76
 
             " .*doesnotexist is not versioned\.$"],
77
 
            'mv doesnotexist somewhereelse')
 
74
             " .*doesnotexist is not versioned$"],
 
75
            'mv', 'doesnotexist', 'somewhereelse')
78
76
 
79
77
    def test_mv_unqualified(self):
80
78
        self.run_bzr_error(['^bzr: ERROR: missing file argument$'], 'mv')
81
 
 
 
79
        
82
80
    def test_mv_invalid(self):
83
81
        tree = self.make_branch_and_tree('.')
84
82
        self.build_tree(['test.txt', 'sub1/'])
85
83
        tree.add(['test.txt'])
86
84
 
87
85
        self.run_bzr_error(
88
 
            ["^bzr: ERROR: Could not move to sub1: sub1 is not versioned\.$"],
89
 
            'mv test.txt sub1')
 
86
            ["^bzr: ERROR: Could not move to sub1: sub1 is not versioned$"],
 
87
            'mv', 'test.txt', 'sub1')
90
88
 
91
89
        self.run_bzr_error(
92
90
            ["^bzr: ERROR: Could not move test.txt => .*hello.txt: "
93
 
             "sub1 is not versioned\.$"],
94
 
            'mv test.txt sub1/hello.txt')
95
 
 
 
91
             "sub1 is not versioned$"],
 
92
            'mv', 'test.txt', 'sub1/hello.txt')
 
93
        
96
94
    def test_mv_dirs(self):
97
95
        tree = self.make_branch_and_tree('.')
98
96
        self.build_tree(['hello.txt', 'sub1/'])
99
97
        tree.add(['hello.txt', 'sub1'])
100
98
 
101
 
        self.run_bzr('mv sub1 sub2')
 
99
        self.run_bzr('mv', 'sub1', 'sub2')
102
100
        self.assertMoved('sub1','sub2')
103
101
 
104
 
        self.run_bzr('mv hello.txt sub2')
 
102
        self.run_bzr('mv', 'hello.txt', 'sub2')
105
103
        self.assertMoved('hello.txt','sub2/hello.txt')
106
104
 
107
105
        self.build_tree(['sub1/'])
108
106
        tree.add(['sub1'])
109
 
        self.run_bzr('mv sub2/hello.txt sub1')
 
107
        self.run_bzr('mv', 'sub2/hello.txt', 'sub1')
110
108
        self.assertMoved('sub2/hello.txt','sub1/hello.txt')
111
109
 
112
 
        self.run_bzr('mv sub2 sub1')
 
110
        self.run_bzr('mv', 'sub2', 'sub1')
113
111
        self.assertMoved('sub2','sub1/sub2')
114
112
 
115
113
    def test_mv_relative(self):
118
116
        tree.add(['sub1', 'sub1/sub2', 'sub1/hello.txt'])
119
117
 
120
118
        os.chdir('sub1/sub2')
121
 
        self.run_bzr('mv ../hello.txt .')
 
119
        self.run_bzr('mv', '../hello.txt', '.')
122
120
        self.failUnlessExists('./hello.txt')
123
121
 
124
122
        os.chdir('..')
125
 
        self.run_bzr('mv sub2/hello.txt .')
 
123
        self.run_bzr('mv', 'sub2/hello.txt', '.')
126
124
        os.chdir('..')
127
125
        self.assertMoved('sub1/sub2/hello.txt','sub1/hello.txt')
128
126
 
129
 
    def test_mv_change_case_file(self):
130
 
        # test for bug #77740 (mv unable change filename case on Windows)
131
 
        tree = self.make_branch_and_tree('.')
132
 
        self.build_tree(['test.txt'])
133
 
        tree.add(['test.txt'])
134
 
        self.run_bzr('mv test.txt Test.txt')
135
 
        # we can't use failUnlessExists on case-insensitive filesystem
136
 
        # so try to check shape of the tree
137
 
        shape = sorted(os.listdir(u'.'))
138
 
        self.assertEqual(['.bzr', 'Test.txt'], shape)
139
 
        self.assertInWorkingTree('Test.txt')
140
 
        self.assertNotInWorkingTree('test.txt')
141
 
 
142
 
    def test_mv_change_case_dir(self):
143
 
        tree = self.make_branch_and_tree('.')
144
 
        self.build_tree(['foo/'])
145
 
        tree.add(['foo'])
146
 
        self.run_bzr('mv foo Foo')
147
 
        # we can't use failUnlessExists on case-insensitive filesystem
148
 
        # so try to check shape of the tree
149
 
        shape = sorted(os.listdir(u'.'))
150
 
        self.assertEqual(['.bzr', 'Foo'], shape)
151
 
        self.assertInWorkingTree('Foo')
152
 
        self.assertNotInWorkingTree('foo')
153
 
 
154
 
    def test_mv_change_case_dir_w_files(self):
155
 
        tree = self.make_branch_and_tree('.')
156
 
        self.build_tree(['foo/', 'foo/bar'])
157
 
        tree.add(['foo'])
158
 
        self.run_bzr('mv foo Foo')
159
 
        # we can't use failUnlessExists on case-insensitive filesystem
160
 
        # so try to check shape of the tree
161
 
        shape = sorted(os.listdir(u'.'))
162
 
        self.assertEqual(['.bzr', 'Foo'], shape)
163
 
        self.assertInWorkingTree('Foo')
164
 
        self.assertNotInWorkingTree('foo')
165
 
 
166
 
    def test_mv_file_to_wrong_case_dir(self):
167
 
        self.requireFeature(CaseInsensitiveFilesystemFeature)
168
 
        tree = self.make_branch_and_tree('.')
169
 
        self.build_tree(['foo/', 'bar'])
170
 
        tree.add(['foo', 'bar'])
171
 
        out, err = self.run_bzr('mv bar Foo', retcode=3)
172
 
        self.assertEquals('', out)
173
 
        self.assertEquals(
174
 
            'bzr: ERROR: Could not move to Foo: Foo is not versioned.\n',
175
 
            err)
176
 
 
177
127
    def test_mv_smoke_aliases(self):
178
128
        # just test that aliases for mv exist, if their behaviour is changed in
179
129
        # the future, then extend the tests.
181
131
        tree = self.make_branch_and_tree('.')
182
132
        tree.add(['a'])
183
133
 
184
 
        self.run_bzr('move a b')
185
 
        self.run_bzr('rename b a')
 
134
        self.run_bzr('move', 'a', 'b')
 
135
        self.run_bzr('rename', 'b', 'a')
186
136
 
187
137
    def test_mv_through_symlinks(self):
188
 
        self.requireFeature(SymlinkFeature)
 
138
        if not osutils.has_symlinks():
 
139
            raise TestSkipped('Symlinks are not supported on this platform')
189
140
        tree = self.make_branch_and_tree('.')
190
141
        self.build_tree(['a/', 'a/b'])
191
142
        os.symlink('a', 'c')
192
143
        os.symlink('.', 'd')
193
144
        tree.add(['a', 'a/b', 'c'], ['a-id', 'b-id', 'c-id'])
194
 
        self.run_bzr('mv c/b b')
 
145
        self.run_bzr('mv', 'c/b', 'b')
195
146
        tree = workingtree.WorkingTree.open('.')
196
147
        self.assertEqual('b-id', tree.path2id('b'))
197
148
 
208
159
        tree.add(['a'])
209
160
 
210
161
        osutils.rename('a', 'b')
211
 
        self.run_bzr('mv a b')
 
162
        self.run_bzr('mv', 'a', 'b')
212
163
        self.assertMoved('a','b')
213
164
 
214
165
    def test_mv_already_moved_file_to_versioned_target(self):
226
177
        os.remove('b')
227
178
        osutils.rename('a', 'b')
228
179
        self.run_bzr_error(
229
 
            ["^bzr: ERROR: Could not move a => b. b is already versioned\.$"],
230
 
            'mv a b')
 
180
            ["^bzr: ERROR: Could not move a => b. b is already versioned$"],
 
181
            'mv', 'a', 'b')
231
182
        #check that nothing changed
232
183
        self.failIfExists('a')
233
184
        self.failUnlessExists('b')
245
196
        tree.add(['a', 'sub'])
246
197
 
247
198
        osutils.rename('a', 'sub/a')
248
 
        self.run_bzr('mv a sub/a')
 
199
        self.run_bzr('mv', 'a', 'sub/a')
249
200
        self.assertMoved('a','sub/a')
250
201
 
251
202
    def test_mv_already_moved_file_into_unversioned_subdir(self):
262
213
 
263
214
        osutils.rename('a', 'sub/a')
264
215
        self.run_bzr_error(
265
 
            ["^bzr: ERROR: Could not move a => a: sub is not versioned\.$"],
266
 
            'mv a sub/a')
 
216
            ["^bzr: ERROR: Could not move a => a: sub is not versioned$"],
 
217
            'mv', 'a', 'sub/a')
267
218
        self.failIfExists('a')
268
219
        self.failUnlessExists('sub/a')
269
220
 
280
231
        tree.add(['a1', 'a2', 'sub'])
281
232
 
282
233
        osutils.rename('a1', 'sub/a1')
283
 
        self.run_bzr('mv a1 a2 sub')
 
234
        self.run_bzr('mv', 'a1', 'a2', 'sub')
284
235
        self.assertMoved('a1','sub/a1')
285
236
        self.assertMoved('a2','sub/a2')
286
237
 
298
249
 
299
250
        osutils.rename('a1', 'sub/a1')
300
251
        self.run_bzr_error(
301
 
            ["^bzr: ERROR: Could not move to sub. sub is not versioned\.$"],
302
 
            'mv a1 a2 sub')
 
252
            ["^bzr: ERROR: Could not move to sub. sub is not versioned$"],
 
253
            'mv', 'a1', 'a2', 'sub')
303
254
        self.failIfExists('a1')
304
255
        self.failUnlessExists('sub/a1')
305
256
        self.failUnlessExists('a2')
322
273
        self.build_tree(['a']) #touch a
323
274
        self.run_bzr_error(
324
275
            ["^bzr: ERROR: Could not rename a => b because both files exist."
325
 
             " \(Use --after to tell bzr about a rename that has already"
326
 
             " happened\)$"],
327
 
            'mv a b')
 
276
             " \(Use --after to update the Bazaar id\)$"],
 
277
            'mv', 'a', 'b')
328
278
        self.failUnlessExists('a')
329
279
        self.failUnlessExists('b')
330
280
 
345
295
        osutils.rename('a', 'b')
346
296
        self.build_tree(['a']) #touch a
347
297
 
348
 
        self.run_bzr('mv a b --after')
 
298
        self.run_bzr('mv', 'a', 'b', '--after')
349
299
        self.failUnlessExists('a')
350
300
        self.assertNotInWorkingTree('a')#a should be unknown now.
351
301
        self.failUnlessExists('b')
371
321
        self.build_tree(['a2']) #touch a2
372
322
 
373
323
        self.run_bzr_error(
374
 
            ["^bzr: ERROR: Could not rename a1 => sub/a1 because both files"
375
 
             " exist. \(Use --after to tell bzr about a rename that has already"
376
 
             " happened\)$"],
377
 
            'mv a1 a2 sub')
 
324
            ["^bzr: ERROR: Could not rename a1 => sub/a1 because both files exist."
 
325
             " \(Use --after to update the Bazaar id\)$"],
 
326
            'mv', 'a1', 'a2', 'sub')
378
327
        self.failUnlessExists('a1')
379
328
        self.failUnlessExists('a2')
380
329
        self.failUnlessExists('sub/a1')
401
350
        self.build_tree(['a1']) #touch a1
402
351
        self.build_tree(['a2']) #touch a2
403
352
 
404
 
        self.run_bzr('mv a1 a2 sub --after')
 
353
        self.run_bzr('mv', 'a1', 'a2', 'sub', '--after')
405
354
        self.failUnlessExists('a1')
406
355
        self.failUnlessExists('a2')
407
356
        self.failUnlessExists('sub/a1')
408
357
        self.failUnlessExists('sub/a2')
409
358
        self.assertInWorkingTree('sub/a1')
410
359
        self.assertInWorkingTree('sub/a2')
411
 
 
412
 
    def test_mv_already_moved_directory(self):
413
 
        """Use `bzr mv a b` to mark a directory as renamed.
414
 
 
415
 
        https://bugs.launchpad.net/bzr/+bug/107967/
416
 
        """
417
 
        self.build_tree(['a/', 'c/'])
418
 
        tree = self.make_branch_and_tree('.')
419
 
        tree.add(['a', 'c'])
420
 
        osutils.rename('a', 'b')
421
 
        osutils.rename('c', 'd')
422
 
        # mv a b should work just like it does for already renamed files
423
 
        self.run_bzr('mv a b')
424
 
        self.failIfExists('a')
425
 
        self.assertNotInWorkingTree('a')
426
 
        self.failUnlessExists('b')
427
 
        self.assertInWorkingTree('b')
428
 
        # and --after should work, too (technically it's ignored)
429
 
        self.run_bzr('mv --after c d')
430
 
        self.failIfExists('c')
431
 
        self.assertNotInWorkingTree('c')
432
 
        self.failUnlessExists('d')
433
 
        self.assertInWorkingTree('d')
434
 
 
435
 
    def make_abcd_tree(self):
436
 
        tree = self.make_branch_and_tree('tree')
437
 
        self.build_tree(['tree/a', 'tree/c'])
438
 
        tree.add(['a', 'c'])
439
 
        tree.commit('record old names')
440
 
        osutils.rename('tree/a', 'tree/b')
441
 
        osutils.rename('tree/c', 'tree/d')
442
 
        return tree
443
 
 
444
 
    def test_mv_auto(self):
445
 
        self.make_abcd_tree()
446
 
        out, err = self.run_bzr('mv --auto', working_dir='tree')
447
 
        self.assertEqual(out, '')
448
 
        self.assertEqual(err, 'a => b\nc => d\n')
449
 
        tree = workingtree.WorkingTree.open('tree')
450
 
        self.assertIsNot(None, tree.path2id('b'))
451
 
        self.assertIsNot(None, tree.path2id('d'))
452
 
 
453
 
    def test_mv_auto_one_path(self):
454
 
        self.make_abcd_tree()
455
 
        out, err = self.run_bzr('mv --auto tree')
456
 
        self.assertEqual(out, '')
457
 
        self.assertEqual(err, 'a => b\nc => d\n')
458
 
        tree = workingtree.WorkingTree.open('tree')
459
 
        self.assertIsNot(None, tree.path2id('b'))
460
 
        self.assertIsNot(None, tree.path2id('d'))
461
 
 
462
 
    def test_mv_auto_two_paths(self):
463
 
        self.make_abcd_tree()
464
 
        out, err = self.run_bzr('mv --auto tree tree2', retcode=3)
465
 
        self.assertEqual('bzr: ERROR: Only one path may be specified to'
466
 
                         ' --auto.\n', err)
467
 
 
468
 
    def test_mv_auto_dry_run(self):
469
 
        self.make_abcd_tree()
470
 
        out, err = self.run_bzr('mv --auto --dry-run', working_dir='tree')
471
 
        self.assertEqual(out, '')
472
 
        self.assertEqual(err, 'a => b\nc => d\n')
473
 
        tree = workingtree.WorkingTree.open('tree')
474
 
        self.assertIsNot(None, tree.path2id('a'))
475
 
        self.assertIsNot(None, tree.path2id('c'))
476
 
 
477
 
    def test_mv_no_auto_dry_run(self):
478
 
        self.make_abcd_tree()
479
 
        out, err = self.run_bzr('mv c d --dry-run',
480
 
                                working_dir='tree', retcode=3)
481
 
        self.assertEqual('bzr: ERROR: --dry-run requires --auto.\n', err)
482
 
 
483
 
    def test_mv_auto_after(self):
484
 
        self.make_abcd_tree()
485
 
        out, err = self.run_bzr('mv --auto --after', working_dir='tree',
486
 
                                retcode=3)
487
 
        self.assertEqual('bzr: ERROR: --after cannot be specified with'
488
 
                         ' --auto.\n', err)
489
 
 
490
 
    def test_mv_quiet(self):
491
 
        tree = self.make_branch_and_tree('.')
492
 
        self.build_tree(['aaa'])
493
 
        tree.add(['aaa'])
494
 
        out, err = self.run_bzr('mv --quiet aaa bbb')
495
 
        self.assertEqual(out, '')
496
 
        self.assertEqual(err, '')
497
 
 
498
 
    def test_mv_readonly_lightweight_checkout(self):
499
 
        branch = self.make_branch('foo')
500
 
        branch = bzrlib.branch.Branch.open(self.get_readonly_url('foo'))
501
 
        tree = branch.create_checkout('tree', lightweight=True)
502
 
        self.build_tree(['tree/path'])
503
 
        tree.add('path')
504
 
        # If this fails, the tree is trying to acquire a branch lock, which it
505
 
        # shouldn't.
506
 
        self.run_bzr(['mv', 'tree/path', 'tree/path2'])