295
295
trans_id = target_transform.create_path('file1', target_transform.root)
296
296
target_transform.create_hardlink(self.wt.abspath('file1'), trans_id)
297
297
target_transform.apply()
298
self.failUnlessExists('target/file1')
298
self.assertPathExists('target/file1')
299
299
source_stat = os.stat(self.wt.abspath('file1'))
300
300
target_stat = os.stat('target/file1')
301
301
self.assertEqual(source_stat, target_stat)
467
467
transform.new_file('FiLe', transform.root, 'content')
468
468
resolve_conflicts(transform)
469
469
transform.apply()
470
self.failUnlessExists('tree/file')
471
self.failUnlessExists('tree/FiLe.moved')
470
self.assertPathExists('tree/file')
471
self.assertPathExists('tree/FiLe.moved')
473
473
def test_resolve_checkout_case_conflict(self):
474
474
tree = self.make_branch_and_tree('tree')
483
483
resolve_conflicts(transform,
484
484
pass_func=lambda t, c: resolve_checkout(t, c, []))
485
485
transform.apply()
486
self.failUnlessExists('tree/file')
487
self.failUnlessExists('tree/FiLe.moved')
486
self.assertPathExists('tree/file')
487
self.assertPathExists('tree/FiLe.moved')
489
489
def test_apply_case_conflict(self):
490
490
"""Ensure that a transform with case conflicts can always be applied"""
498
498
transform.new_file('dirFiLe', dir, 'content')
499
499
resolve_conflicts(transform)
500
500
transform.apply()
501
self.failUnlessExists('tree/file')
501
self.assertPathExists('tree/file')
502
502
if not os.path.exists('tree/FiLe.moved'):
503
self.failUnlessExists('tree/FiLe')
504
self.failUnlessExists('tree/dir/dirfile')
503
self.assertPathExists('tree/FiLe')
504
self.assertPathExists('tree/dir/dirfile')
505
505
if not os.path.exists('tree/dir/dirFiLe.moved'):
506
self.failUnlessExists('tree/dir/dirFiLe')
506
self.assertPathExists('tree/dir/dirFiLe')
508
508
def test_case_insensitive_limbo(self):
509
509
tree = self.make_branch_and_tree('tree')
1255
1255
parent2 = transform.new_directory('parent2', root)
1256
1256
transform.adjust_path('child1', parent2, child1)
1257
1257
transform.apply()
1258
self.failIfExists(self.wt.abspath('parent1/child1'))
1259
self.failUnlessExists(self.wt.abspath('parent2/child1'))
1258
self.assertPathDoesNotExist(self.wt.abspath('parent1/child1'))
1259
self.assertPathExists(self.wt.abspath('parent2/child1'))
1260
1260
# rename limbo/new-1 => parent1, rename limbo/new-3 => parent2
1261
1261
# no rename for child1 (counting only renames during apply)
1262
1262
self.assertEqual(2, transform.rename_count)
1288
1288
parent2 = transform.new_directory('parent2', root)
1289
1289
transform.adjust_path('child1', parent2, child1)
1290
1290
transform.apply()
1291
self.failIfExists(self.wt.abspath('parent1'))
1292
self.failUnlessExists(self.wt.abspath('parent2/child1'))
1291
self.assertPathDoesNotExist(self.wt.abspath('parent1'))
1292
self.assertPathExists(self.wt.abspath('parent2/child1'))
1293
1293
# rename limbo/new-3 => parent2, rename limbo/new-2 => child1
1294
1294
self.assertEqual(2, transform.rename_count)
1330
1330
child = transform.new_directory('child', parent)
1331
1331
transform.adjust_path('parent', root, parent)
1332
1332
transform.apply()
1333
self.failUnlessExists(self.wt.abspath('parent/child'))
1333
self.assertPathExists(self.wt.abspath('parent/child'))
1334
1334
self.assertEqual(1, transform.rename_count)
1336
1336
def test_reuse_name(self):
1467
1467
tt.create_file(["aa\n"], bar_trans_id)
1468
1468
tt.version_file("bar-1", bar_trans_id)
1470
self.failUnlessExists("foo/bar")
1470
self.assertPathExists("foo/bar")
1473
1473
self.assertEqual(wt.inventory.get_file_kind(wt.path2id("foo")),
1490
1490
tt.delete_contents(foo_trans_id)
1491
1491
tt.create_symlink("bar", foo_trans_id)
1493
self.failUnlessExists("foo")
1493
self.assertPathExists("foo")
1495
1495
self.addCleanup(wt.unlock)
1496
1496
self.assertEqual(wt.inventory.get_file_kind(wt.path2id("foo")),
1509
1509
tt.delete_versioned(bar_trans_id)
1510
1510
tt.create_file(["aa\n"], foo_trans_id)
1512
self.failUnlessExists("foo")
1512
self.assertPathExists("foo")
1514
1514
self.addCleanup(wt.unlock)
1515
1515
self.assertEqual(wt.inventory.get_file_kind(wt.path2id("foo")),
1530
1530
self.build_tree(['baz'])
1531
1531
tt.create_hardlink("baz", foo_trans_id)
1533
self.failUnlessExists("foo")
1534
self.failUnlessExists("baz")
1533
self.assertPathExists("foo")
1534
self.assertPathExists("baz")
1536
1536
self.addCleanup(wt.unlock)
1537
1537
self.assertEqual(wt.inventory.get_file_kind(wt.path2id("foo")),
1814
1814
tree.add_reference(subtree)
1815
1815
tree.commit('a revision')
1816
1816
tree.branch.create_checkout('target')
1817
self.failUnlessExists('target')
1818
self.failUnlessExists('target/subtree')
1817
self.assertPathExists('target')
1818
self.assertPathExists('target/subtree')
1820
1820
def test_file_conflict_handling(self):
1821
1821
"""Ensure that when building trees, conflict handling is done"""
1868
1868
source.commit('added file')
1869
1869
build_tree(source.basis_tree(), target)
1870
1870
self.assertEqual([], target.conflicts())
1871
self.failUnlessExists('target/dir1/file')
1871
self.assertPathExists('target/dir1/file')
1873
1873
# Ensure contents are merged
1874
1874
target = self.make_branch_and_tree('target2')
1875
1875
self.build_tree(['target2/dir1/', 'target2/dir1/file2'])
1876
1876
build_tree(source.basis_tree(), target)
1877
1877
self.assertEqual([], target.conflicts())
1878
self.failUnlessExists('target2/dir1/file2')
1879
self.failUnlessExists('target2/dir1/file')
1878
self.assertPathExists('target2/dir1/file2')
1879
self.assertPathExists('target2/dir1/file')
1881
1881
# Ensure new contents are suppressed for existing branches
1882
1882
target = self.make_branch_and_tree('target3')
1883
1883
self.make_branch('target3/dir1')
1884
1884
self.build_tree(['target3/dir1/file2'])
1885
1885
build_tree(source.basis_tree(), target)
1886
self.failIfExists('target3/dir1/file')
1887
self.failUnlessExists('target3/dir1/file2')
1888
self.failUnlessExists('target3/dir1.diverted/file')
1886
self.assertPathDoesNotExist('target3/dir1/file')
1887
self.assertPathExists('target3/dir1/file2')
1888
self.assertPathExists('target3/dir1.diverted/file')
1889
1889
self.assertEqual([DuplicateEntry('Diverted to',
1890
1890
'dir1.diverted', 'dir1', 'new-dir1', None)],
1891
1891
target.conflicts())
1894
1894
self.build_tree(['target4/dir1/'])
1895
1895
self.make_branch('target4/dir1/file')
1896
1896
build_tree(source.basis_tree(), target)
1897
self.failUnlessExists('target4/dir1/file')
1897
self.assertPathExists('target4/dir1/file')
1898
1898
self.assertEqual('directory', file_kind('target4/dir1/file'))
1899
self.failUnlessExists('target4/dir1/file.diverted')
1899
self.assertPathExists('target4/dir1/file.diverted')
1900
1900
self.assertEqual([DuplicateEntry('Diverted to',
1901
1901
'dir1/file.diverted', 'dir1/file', 'new-file', None)],
1902
1902
target.conflicts())
2351
2351
self.build_tree(['a/', 'a/b', 'c/', 'c/d'])
2352
2352
mover = _FileMover()
2353
2353
mover.rename('a', 'q')
2354
self.failUnlessExists('q')
2355
self.failIfExists('a')
2356
self.failUnlessExists('q/b')
2357
self.failUnlessExists('c')
2358
self.failUnlessExists('c/d')
2354
self.assertPathExists('q')
2355
self.assertPathDoesNotExist('a')
2356
self.assertPathExists('q/b')
2357
self.assertPathExists('c')
2358
self.assertPathExists('c/d')
2360
2360
def test_pre_delete_rollback(self):
2361
2361
self.build_tree(['a/'])
2362
2362
mover = _FileMover()
2363
2363
mover.pre_delete('a', 'q')
2364
self.failUnlessExists('q')
2365
self.failIfExists('a')
2364
self.assertPathExists('q')
2365
self.assertPathDoesNotExist('a')
2366
2366
mover.rollback()
2367
self.failIfExists('q')
2368
self.failUnlessExists('a')
2367
self.assertPathDoesNotExist('q')
2368
self.assertPathExists('a')
2370
2370
def test_apply_deletions(self):
2371
2371
self.build_tree(['a/', 'b/'])
2372
2372
mover = _FileMover()
2373
2373
mover.pre_delete('a', 'q')
2374
2374
mover.pre_delete('b', 'r')
2375
self.failUnlessExists('q')
2376
self.failUnlessExists('r')
2377
self.failIfExists('a')
2378
self.failIfExists('b')
2375
self.assertPathExists('q')
2376
self.assertPathExists('r')
2377
self.assertPathDoesNotExist('a')
2378
self.assertPathDoesNotExist('b')
2379
2379
mover.apply_deletions()
2380
self.failIfExists('q')
2381
self.failIfExists('r')
2382
self.failIfExists('a')
2383
self.failIfExists('b')
2380
self.assertPathDoesNotExist('q')
2381
self.assertPathDoesNotExist('r')
2382
self.assertPathDoesNotExist('a')
2383
self.assertPathDoesNotExist('b')
2385
2385
def test_file_mover_rollback(self):
2386
2386
self.build_tree(['a/', 'a/b', 'c/', 'c/d/', 'c/e/'])
2391
2391
mover.rename('a', 'c')
2392
2392
except errors.FileExists, e:
2393
2393
mover.rollback()
2394
self.failUnlessExists('a')
2395
self.failUnlessExists('c/d')
2394
self.assertPathExists('a')
2395
self.assertPathExists('c/d')
2398
2398
class Bogus(Exception):
2428
2428
tt.adjust_path('d', a_id, tt.trans_id_tree_path('a/b'))
2429
2429
self.assertRaises(Bogus, tt.apply,
2430
2430
_mover=self.ExceptionFileMover(bad_source='a'))
2431
self.failUnlessExists('a')
2432
self.failUnlessExists('a/b')
2431
self.assertPathExists('a')
2432
self.assertPathExists('a/b')
2434
self.failUnlessExists('c')
2435
self.failUnlessExists('c/d')
2434
self.assertPathExists('c')
2435
self.assertPathExists('c/d')
2437
2437
def test_rollback_rename_into_place(self):
2438
2438
tree = self.make_branch_and_tree('.')
2444
2444
tt.adjust_path('d', a_id, tt.trans_id_tree_path('a/b'))
2445
2445
self.assertRaises(Bogus, tt.apply,
2446
2446
_mover=self.ExceptionFileMover(bad_target='c/d'))
2447
self.failUnlessExists('a')
2448
self.failUnlessExists('a/b')
2447
self.assertPathExists('a')
2448
self.assertPathExists('a/b')
2450
self.failUnlessExists('c')
2451
self.failUnlessExists('c/d')
2450
self.assertPathExists('c')
2451
self.assertPathExists('c/d')
2453
2453
def test_rollback_deletion(self):
2454
2454
tree = self.make_branch_and_tree('.')
2460
2460
tt.adjust_path('d', tt.root, tt.trans_id_tree_path('a/b'))
2461
2461
self.assertRaises(Bogus, tt.apply,
2462
2462
_mover=self.ExceptionFileMover(bad_target='d'))
2463
self.failUnlessExists('a')
2464
self.failUnlessExists('a/b')
2463
self.assertPathExists('a')
2464
self.assertPathExists('a/b')
2467
2467
class TestTransformMissingParent(tests.TestCaseWithTransport):