~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

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

  • Committer: Martin Pool
  • Date: 2007-04-04 06:17:31 UTC
  • mto: This revision was merged to the branch mainline in revision 2397.
  • Revision ID: mbp@sourcefrog.net-20070404061731-tt2xrzllqhbodn83
Contents of TODO file moved into bug tracker

Show diffs side-by-side

added added

removed removed

Lines of Context:
24
24
    )
25
25
 
26
26
from bzrlib.tests import (
27
 
    CaseInsensitiveFilesystemFeature,
28
 
    SymlinkFeature,
29
27
    TestCaseWithTransport,
 
28
    TestSkipped,
30
29
    )
31
30
 
32
31
 
33
32
class TestMove(TestCaseWithTransport):
34
33
 
 
34
    def assertInWorkingTree(self,path):
 
35
        tree = workingtree.WorkingTree.open('.')
 
36
        self.assertIsNot(tree.path2id(path), None,
 
37
            path+' not in working tree.')
 
38
 
 
39
    def assertNotInWorkingTree(self,path):
 
40
        tree = workingtree.WorkingTree.open('.')
 
41
        self.assertIs(tree.path2id(path), None, path+' in working tree.')
 
42
 
35
43
    def assertMoved(self,from_path,to_path):
36
44
        """Assert that to_path is existing and versioned but from_path not. """
37
45
        self.failIfExists(from_path)
46
54
        files = self.build_tree(['a', 'c', 'subdir/'])
47
55
        tree.add(['a', 'c', 'subdir'])
48
56
 
49
 
        self.run_bzr('mv a b')
 
57
        self.run_bzr('mv', 'a', 'b')
50
58
        self.assertMoved('a','b')
51
59
 
52
 
        self.run_bzr('mv b subdir')
 
60
        self.run_bzr('mv', 'b', 'subdir')
53
61
        self.assertMoved('b','subdir/b')
54
62
 
55
 
        self.run_bzr('mv subdir/b a')
 
63
        self.run_bzr('mv', 'subdir/b', 'a')
56
64
        self.assertMoved('subdir/b','a')
57
65
 
58
 
        self.run_bzr('mv a c subdir')
 
66
        self.run_bzr('mv', 'a', 'c', 'subdir')
59
67
        self.assertMoved('a','subdir/a')
60
68
        self.assertMoved('c','subdir/c')
61
69
 
62
 
        self.run_bzr('mv subdir/a subdir/newa')
 
70
        self.run_bzr('mv', 'subdir/a', 'subdir/newa')
63
71
        self.assertMoved('subdir/a','subdir/newa')
64
72
 
65
73
    def test_mv_unversioned(self):
66
74
        self.build_tree(['unversioned.txt'])
67
75
        self.run_bzr_error(
68
76
            ["^bzr: ERROR: Could not rename unversioned.txt => elsewhere."
69
 
             " .*unversioned.txt is not versioned\.$"],
70
 
            'mv unversioned.txt elsewhere')
 
77
             " .*unversioned.txt is not versioned$"],
 
78
            'mv', 'unversioned.txt', 'elsewhere')
71
79
 
72
80
    def test_mv_nonexisting(self):
73
81
        self.run_bzr_error(
74
82
            ["^bzr: ERROR: Could not rename doesnotexist => somewhereelse."
75
 
             " .*doesnotexist is not versioned\.$"],
76
 
            'mv doesnotexist somewhereelse')
 
83
             " .*doesnotexist is not versioned$"],
 
84
            'mv', 'doesnotexist', 'somewhereelse')
77
85
 
78
86
    def test_mv_unqualified(self):
79
87
        self.run_bzr_error(['^bzr: ERROR: missing file argument$'], 'mv')
84
92
        tree.add(['test.txt'])
85
93
 
86
94
        self.run_bzr_error(
87
 
            ["^bzr: ERROR: Could not move to sub1: sub1 is not versioned\.$"],
88
 
            'mv test.txt sub1')
 
95
            ["^bzr: ERROR: Could not move to sub1: sub1 is not versioned$"],
 
96
            'mv', 'test.txt', 'sub1')
89
97
 
90
98
        self.run_bzr_error(
91
99
            ["^bzr: ERROR: Could not move test.txt => .*hello.txt: "
92
 
             "sub1 is not versioned\.$"],
93
 
            'mv test.txt sub1/hello.txt')
 
100
             "sub1 is not versioned$"],
 
101
            'mv', 'test.txt', 'sub1/hello.txt')
94
102
        
95
103
    def test_mv_dirs(self):
96
104
        tree = self.make_branch_and_tree('.')
97
105
        self.build_tree(['hello.txt', 'sub1/'])
98
106
        tree.add(['hello.txt', 'sub1'])
99
107
 
100
 
        self.run_bzr('mv sub1 sub2')
 
108
        self.run_bzr('mv', 'sub1', 'sub2')
101
109
        self.assertMoved('sub1','sub2')
102
110
 
103
 
        self.run_bzr('mv hello.txt sub2')
 
111
        self.run_bzr('mv', 'hello.txt', 'sub2')
104
112
        self.assertMoved('hello.txt','sub2/hello.txt')
105
113
 
106
114
        self.build_tree(['sub1/'])
107
115
        tree.add(['sub1'])
108
 
        self.run_bzr('mv sub2/hello.txt sub1')
 
116
        self.run_bzr('mv', 'sub2/hello.txt', 'sub1')
109
117
        self.assertMoved('sub2/hello.txt','sub1/hello.txt')
110
118
 
111
 
        self.run_bzr('mv sub2 sub1')
 
119
        self.run_bzr('mv', 'sub2', 'sub1')
112
120
        self.assertMoved('sub2','sub1/sub2')
113
121
 
114
122
    def test_mv_relative(self):
117
125
        tree.add(['sub1', 'sub1/sub2', 'sub1/hello.txt'])
118
126
 
119
127
        os.chdir('sub1/sub2')
120
 
        self.run_bzr('mv ../hello.txt .')
 
128
        self.run_bzr('mv', '../hello.txt', '.')
121
129
        self.failUnlessExists('./hello.txt')
122
130
 
123
131
        os.chdir('..')
124
 
        self.run_bzr('mv sub2/hello.txt .')
 
132
        self.run_bzr('mv', 'sub2/hello.txt', '.')
125
133
        os.chdir('..')
126
134
        self.assertMoved('sub1/sub2/hello.txt','sub1/hello.txt')
127
135
 
128
 
    def test_mv_change_case_file(self):
129
 
        # test for bug #77740 (mv unable change filename case on Windows)
130
 
        tree = self.make_branch_and_tree('.')
131
 
        self.build_tree(['test.txt'])
132
 
        tree.add(['test.txt'])
133
 
        self.run_bzr('mv test.txt Test.txt')
134
 
        # we can't use failUnlessExists on case-insensitive filesystem
135
 
        # so try to check shape of the tree
136
 
        shape = sorted(os.listdir(u'.'))
137
 
        self.assertEqual(['.bzr', 'Test.txt'], shape)
138
 
        self.assertInWorkingTree('Test.txt')
139
 
        self.assertNotInWorkingTree('test.txt')
140
 
 
141
 
    def test_mv_change_case_dir(self):
142
 
        tree = self.make_branch_and_tree('.')
143
 
        self.build_tree(['foo/'])
144
 
        tree.add(['foo'])
145
 
        self.run_bzr('mv foo Foo')
146
 
        # we can't use failUnlessExists on case-insensitive filesystem
147
 
        # so try to check shape of the tree
148
 
        shape = sorted(os.listdir(u'.'))
149
 
        self.assertEqual(['.bzr', 'Foo'], shape)
150
 
        self.assertInWorkingTree('Foo')
151
 
        self.assertNotInWorkingTree('foo')
152
 
 
153
 
    def test_mv_change_case_dir_w_files(self):
154
 
        tree = self.make_branch_and_tree('.')
155
 
        self.build_tree(['foo/', 'foo/bar'])
156
 
        tree.add(['foo'])
157
 
        self.run_bzr('mv foo Foo')
158
 
        # we can't use failUnlessExists on case-insensitive filesystem
159
 
        # so try to check shape of the tree
160
 
        shape = sorted(os.listdir(u'.'))
161
 
        self.assertEqual(['.bzr', 'Foo'], shape)
162
 
        self.assertInWorkingTree('Foo')
163
 
        self.assertNotInWorkingTree('foo')
164
 
 
165
 
    def test_mv_file_to_wrong_case_dir(self):
166
 
        self.requireFeature(CaseInsensitiveFilesystemFeature)
167
 
        tree = self.make_branch_and_tree('.')
168
 
        self.build_tree(['foo/', 'bar'])
169
 
        tree.add(['foo', 'bar'])
170
 
        out, err = self.run_bzr('mv bar Foo', retcode=3)
171
 
        self.assertEquals('', out)
172
 
        self.assertEquals(
173
 
            'bzr: ERROR: Could not move to Foo: Foo is not versioned.\n',
174
 
            err)
175
 
 
176
136
    def test_mv_smoke_aliases(self):
177
137
        # just test that aliases for mv exist, if their behaviour is changed in
178
138
        # the future, then extend the tests.
180
140
        tree = self.make_branch_and_tree('.')
181
141
        tree.add(['a'])
182
142
 
183
 
        self.run_bzr('move a b')
184
 
        self.run_bzr('rename b a')
 
143
        self.run_bzr('move', 'a', 'b')
 
144
        self.run_bzr('rename', 'b', 'a')
185
145
 
186
146
    def test_mv_through_symlinks(self):
187
 
        self.requireFeature(SymlinkFeature)
 
147
        if not osutils.has_symlinks():
 
148
            raise TestSkipped('Symlinks are not supported on this platform')
188
149
        tree = self.make_branch_and_tree('.')
189
150
        self.build_tree(['a/', 'a/b'])
190
151
        os.symlink('a', 'c')
191
152
        os.symlink('.', 'd')
192
153
        tree.add(['a', 'a/b', 'c'], ['a-id', 'b-id', 'c-id'])
193
 
        self.run_bzr('mv c/b b')
 
154
        self.run_bzr('mv', 'c/b', 'b')
194
155
        tree = workingtree.WorkingTree.open('.')
195
156
        self.assertEqual('b-id', tree.path2id('b'))
196
157
 
207
168
        tree.add(['a'])
208
169
 
209
170
        osutils.rename('a', 'b')
210
 
        self.run_bzr('mv a b')
 
171
        self.run_bzr('mv', 'a', 'b')
211
172
        self.assertMoved('a','b')
212
173
 
213
174
    def test_mv_already_moved_file_to_versioned_target(self):
225
186
        os.remove('b')
226
187
        osutils.rename('a', 'b')
227
188
        self.run_bzr_error(
228
 
            ["^bzr: ERROR: Could not move a => b. b is already versioned\.$"],
229
 
            'mv a b')
 
189
            ["^bzr: ERROR: Could not move a => b. b is already versioned$"],
 
190
            'mv', 'a', 'b')
230
191
        #check that nothing changed
231
192
        self.failIfExists('a')
232
193
        self.failUnlessExists('b')
244
205
        tree.add(['a', 'sub'])
245
206
 
246
207
        osutils.rename('a', 'sub/a')
247
 
        self.run_bzr('mv a sub/a')
 
208
        self.run_bzr('mv', 'a', 'sub/a')
248
209
        self.assertMoved('a','sub/a')
249
210
 
250
211
    def test_mv_already_moved_file_into_unversioned_subdir(self):
261
222
 
262
223
        osutils.rename('a', 'sub/a')
263
224
        self.run_bzr_error(
264
 
            ["^bzr: ERROR: Could not move a => a: sub is not versioned\.$"],
265
 
            'mv a sub/a')
 
225
            ["^bzr: ERROR: Could not move a => a: sub is not versioned$"],
 
226
            'mv', 'a', 'sub/a')
266
227
        self.failIfExists('a')
267
228
        self.failUnlessExists('sub/a')
268
229
 
279
240
        tree.add(['a1', 'a2', 'sub'])
280
241
 
281
242
        osutils.rename('a1', 'sub/a1')
282
 
        self.run_bzr('mv a1 a2 sub')
 
243
        self.run_bzr('mv', 'a1', 'a2', 'sub')
283
244
        self.assertMoved('a1','sub/a1')
284
245
        self.assertMoved('a2','sub/a2')
285
246
 
297
258
 
298
259
        osutils.rename('a1', 'sub/a1')
299
260
        self.run_bzr_error(
300
 
            ["^bzr: ERROR: Could not move to sub. sub is not versioned\.$"],
301
 
            'mv a1 a2 sub')
 
261
            ["^bzr: ERROR: Could not move to sub. sub is not versioned$"],
 
262
            'mv', 'a1', 'a2', 'sub')
302
263
        self.failIfExists('a1')
303
264
        self.failUnlessExists('sub/a1')
304
265
        self.failUnlessExists('a2')
321
282
        self.build_tree(['a']) #touch a
322
283
        self.run_bzr_error(
323
284
            ["^bzr: ERROR: Could not rename a => b because both files exist."
324
 
             " \(Use --after to tell bzr about a rename that has already"
325
 
             " happened\)$"],
326
 
            'mv a b')
 
285
             " \(Use --after to update the Bazaar id\)$"],
 
286
            'mv', 'a', 'b')
327
287
        self.failUnlessExists('a')
328
288
        self.failUnlessExists('b')
329
289
 
344
304
        osutils.rename('a', 'b')
345
305
        self.build_tree(['a']) #touch a
346
306
 
347
 
        self.run_bzr('mv a b --after')
 
307
        self.run_bzr('mv', 'a', 'b', '--after')
348
308
        self.failUnlessExists('a')
349
309
        self.assertNotInWorkingTree('a')#a should be unknown now.
350
310
        self.failUnlessExists('b')
370
330
        self.build_tree(['a2']) #touch a2
371
331
 
372
332
        self.run_bzr_error(
373
 
            ["^bzr: ERROR: Could not rename a1 => sub/a1 because both files"
374
 
             " exist. \(Use --after to tell bzr about a rename that has already"
375
 
             " happened\)$"],
376
 
            'mv a1 a2 sub')
 
333
            ["^bzr: ERROR: Could not rename a1 => sub/a1 because both files exist."
 
334
             " \(Use --after to update the Bazaar id\)$"],
 
335
            'mv', 'a1', 'a2', 'sub')
377
336
        self.failUnlessExists('a1')
378
337
        self.failUnlessExists('a2')
379
338
        self.failUnlessExists('sub/a1')
400
359
        self.build_tree(['a1']) #touch a1
401
360
        self.build_tree(['a2']) #touch a2
402
361
 
403
 
        self.run_bzr('mv a1 a2 sub --after')
 
362
        self.run_bzr('mv', 'a1', 'a2', 'sub', '--after')
404
363
        self.failUnlessExists('a1')
405
364
        self.failUnlessExists('a2')
406
365
        self.failUnlessExists('sub/a1')
407
366
        self.failUnlessExists('sub/a2')
408
367
        self.assertInWorkingTree('sub/a1')
409
368
        self.assertInWorkingTree('sub/a2')
410
 
 
411
 
    def test_mv_already_moved_directory(self):
412
 
        """Use `bzr mv a b` to mark a directory as renamed.
413
 
 
414
 
        https://bugs.launchpad.net/bzr/+bug/107967/
415
 
        """
416
 
        self.build_tree(['a/', 'c/'])
417
 
        tree = self.make_branch_and_tree('.')
418
 
        tree.add(['a', 'c'])
419
 
        osutils.rename('a', 'b')
420
 
        osutils.rename('c', 'd')
421
 
        # mv a b should work just like it does for already renamed files
422
 
        self.run_bzr('mv a b')
423
 
        self.failIfExists('a')
424
 
        self.assertNotInWorkingTree('a')
425
 
        self.failUnlessExists('b')
426
 
        self.assertInWorkingTree('b')
427
 
        # and --after should work, too (technically it's ignored)
428
 
        self.run_bzr('mv --after c d')
429
 
        self.failIfExists('c')
430
 
        self.assertNotInWorkingTree('c')
431
 
        self.failUnlessExists('d')
432
 
        self.assertInWorkingTree('d')