1313
1313
transform.cancel_creation(trans_id)
1314
1314
transform.apply()
1316
def test_create_from_tree(self):
1317
tree1 = self.make_branch_and_tree('tree1')
1318
self.build_tree_contents([('tree1/foo/',), ('tree1/bar', 'baz')])
1319
tree1.add(['foo', 'bar'], ['foo-id', 'bar-id'])
1320
tree2 = self.make_branch_and_tree('tree2')
1321
tt = TreeTransform(tree2)
1322
foo_trans_id = tt.create_path('foo', tt.root)
1323
create_from_tree(tt, foo_trans_id, tree1, 'foo-id')
1324
bar_trans_id = tt.create_path('bar', tt.root)
1325
create_from_tree(tt, bar_trans_id, tree1, 'bar-id')
1327
self.assertEqual('directory', osutils.file_kind('tree2/foo'))
1328
self.assertFileEqual('baz', 'tree2/bar')
1330
def test_create_from_tree_bytes(self):
1331
"""Provided lines are used instead of tree content."""
1332
tree1 = self.make_branch_and_tree('tree1')
1333
self.build_tree_contents([('tree1/foo', 'bar'),])
1334
tree1.add('foo', 'foo-id')
1335
tree2 = self.make_branch_and_tree('tree2')
1336
tt = TreeTransform(tree2)
1337
foo_trans_id = tt.create_path('foo', tt.root)
1338
create_from_tree(tt, foo_trans_id, tree1, 'foo-id', bytes='qux')
1340
self.assertFileEqual('qux', 'tree2/foo')
1342
def test_create_from_tree_symlink(self):
1343
self.requireFeature(SymlinkFeature)
1344
tree1 = self.make_branch_and_tree('tree1')
1345
os.symlink('bar', 'tree1/foo')
1346
tree1.add('foo', 'foo-id')
1347
tt = TreeTransform(self.make_branch_and_tree('tree2'))
1348
foo_trans_id = tt.create_path('foo', tt.root)
1349
create_from_tree(tt, foo_trans_id, tree1, 'foo-id')
1351
self.assertEqual('bar', os.readlink('tree2/foo'))
1317
1354
class TransformGroup(object):
1976
2013
resolve_conflicts(tt)
2016
A_ENTRY = ('a-id', ('a', 'a'), True, (True, True),
2017
('TREE_ROOT', 'TREE_ROOT'), ('a', 'a'), ('file', 'file'),
2019
ROOT_ENTRY = ('TREE_ROOT', ('', ''), False, (True, True), (None, None),
2020
('', ''), ('directory', 'directory'), (False, None))
1979
2023
class TestTransformPreview(tests.TestCaseWithTransport):
1981
2025
def create_tree(self):
2053
2097
(False, False))],
2054
2098
list(preview_tree.iter_changes(revision_tree)))
2056
def test_wrong_tree_value_error(self):
2100
def test_include_unchanged_succeeds(self):
2057
2101
revision_tree, preview_tree = self.get_tree_and_preview_tree()
2058
e = self.assertRaises(ValueError, preview_tree.iter_changes,
2060
self.assertEqual('from_tree must be transform source tree.', str(e))
2102
changes = preview_tree.iter_changes(revision_tree,
2103
include_unchanged=True)
2104
root = revision_tree.inventory.root.file_id
2062
def test_include_unchanged_value_error(self):
2063
revision_tree, preview_tree = self.get_tree_and_preview_tree()
2064
e = self.assertRaises(ValueError, preview_tree.iter_changes,
2065
revision_tree, include_unchanged=True)
2066
self.assertEqual('include_unchanged is not supported', str(e))
2106
self.assertEqual([ROOT_ENTRY, A_ENTRY], list(changes))
2068
2108
def test_specific_files(self):
2069
2109
revision_tree, preview_tree = self.get_tree_and_preview_tree()
2070
e = self.assertRaises(ValueError, preview_tree.iter_changes,
2071
revision_tree, specific_files=['pete'])
2072
self.assertEqual('specific_files is not supported', str(e))
2110
changes = preview_tree.iter_changes(revision_tree,
2111
specific_files=[''])
2112
self.assertEqual([ROOT_ENTRY, A_ENTRY], list(changes))
2074
def test_want_unversioned_value_error(self):
2114
def test_want_unversioned(self):
2075
2115
revision_tree, preview_tree = self.get_tree_and_preview_tree()
2076
e = self.assertRaises(ValueError, preview_tree.iter_changes,
2077
revision_tree, want_unversioned=True)
2078
self.assertEqual('want_unversioned is not supported', str(e))
2116
changes = preview_tree.iter_changes(revision_tree,
2117
want_unversioned=True)
2118
self.assertEqual([ROOT_ENTRY, A_ENTRY], list(changes))
2080
2120
def test_ignore_extra_trees_no_specific_files(self):
2081
2121
# extra_trees is harmless without specific_files, so we'll silently
2459
2499
expected = [(('', 'tree-root'),
2460
2500
[('a', 'a', 'file', None, 'a-id', 'file')])]
2461
2501
self.assertEqual(expected, list(preview_tree.walkdirs()))
2503
def test_extras(self):
2504
work_tree = self.make_branch_and_tree('tree')
2505
self.build_tree(['tree/removed-file', 'tree/existing-file',
2506
'tree/not-removed-file'])
2507
work_tree.add(['removed-file', 'not-removed-file'])
2508
preview = TransformPreview(work_tree)
2509
self.addCleanup(preview.finalize)
2510
preview.new_file('new-file', preview.root, 'contents')
2511
preview.new_file('new-versioned-file', preview.root, 'contents',
2513
tree = preview.get_preview_tree()
2514
preview.unversion_file(preview.trans_id_tree_path('removed-file'))
2515
self.assertEqual(set(['new-file', 'removed-file', 'existing-file']),
2518
def test_merge_into_preview(self):
2519
work_tree = self.make_branch_and_tree('tree')
2520
self.build_tree_contents([('tree/file','b\n')])
2521
work_tree.add('file', 'file-id')
2522
work_tree.commit('first commit')
2523
child_tree = work_tree.bzrdir.sprout('child').open_workingtree()
2524
self.build_tree_contents([('child/file','b\nc\n')])
2525
child_tree.commit('child commit')
2526
child_tree.lock_write()
2527
self.addCleanup(child_tree.unlock)
2528
work_tree.lock_write()
2529
self.addCleanup(work_tree.unlock)
2530
preview = TransformPreview(work_tree)
2531
self.addCleanup(preview.finalize)
2532
preview_tree = preview.get_preview_tree()
2533
file_trans_id = preview.trans_id_file_id('file-id')
2534
preview.delete_contents(file_trans_id)
2535
preview.create_file('a\nb\n', file_trans_id)
2536
pb = progress.DummyProgress()
2537
merger = Merger.from_revision_ids(pb, preview_tree,
2538
child_tree.branch.last_revision(),
2539
other_branch=child_tree.branch,
2540
tree_branch=work_tree.branch)
2541
merger.merge_type = Merge3Merger
2542
tt = merger.make_merger().make_preview_transform()
2543
self.addCleanup(tt.finalize)
2544
final_tree = tt.get_preview_tree()
2545
self.assertEqual('a\nb\nc\n', final_tree.get_file_text('file-id'))
2547
def test_merge_preview_into_workingtree(self):
2548
tree = self.make_branch_and_tree('tree')
2549
tt = TransformPreview(tree)
2550
self.addCleanup(tt.finalize)
2551
tt.new_file('name', tt.root, 'content', 'file-id')
2552
tree2 = self.make_branch_and_tree('tree2')
2553
pb = progress.DummyProgress()
2554
merger = Merger.from_uncommitted(tree2, tt.get_preview_tree(),
2555
pb, tree.basis_tree())
2556
merger.merge_type = Merge3Merger
2559
def test_merge_preview_into_workingtree_handles_conflicts(self):
2560
tree = self.make_branch_and_tree('tree')
2561
self.build_tree_contents([('tree/foo', 'bar')])
2562
tree.add('foo', 'foo-id')
2564
tt = TransformPreview(tree)
2565
self.addCleanup(tt.finalize)
2566
trans_id = tt.trans_id_file_id('foo-id')
2567
tt.delete_contents(trans_id)
2568
tt.create_file('baz', trans_id)
2569
tree2 = tree.bzrdir.sprout('tree2').open_workingtree()
2570
self.build_tree_contents([('tree2/foo', 'qux')])
2571
pb = progress.DummyProgress()
2572
merger = Merger.from_uncommitted(tree2, tt.get_preview_tree(),
2573
pb, tree.basis_tree())
2574
merger.merge_type = Merge3Merger
2577
def test_is_executable(self):
2578
tree = self.make_branch_and_tree('tree')
2579
preview = TransformPreview(tree)
2580
self.addCleanup(preview.finalize)
2581
preview.new_file('foo', preview.root, 'bar', 'baz-id')
2582
preview_tree = preview.get_preview_tree()
2583
self.assertEqual(False, preview_tree.is_executable('baz-id',
2585
self.assertEqual(False, preview_tree.is_executable('baz-id'))