133
135
transform.finalize()
134
136
transform.finalize()
138
def test_hardlink(self):
139
self.requireFeature(HardlinkFeature)
140
transform, root = self.get_transform()
141
transform.new_file('file1', root, 'contents')
143
target = self.make_branch_and_tree('target')
144
target_transform = TreeTransform(target)
145
trans_id = target_transform.create_path('file1', target_transform.root)
146
target_transform.create_hardlink(self.wt.abspath('file1'), trans_id)
147
target_transform.apply()
148
self.failUnlessExists('target/file1')
149
source_stat = os.stat(self.wt.abspath('file1'))
150
target_stat = os.stat('target/file1')
151
self.assertEqual(source_stat, target_stat)
136
153
def test_convenience(self):
137
154
transform, root = self.get_transform()
138
155
self.wt.lock_tree_write()
1234
1251
class TestTransformMerge(TestCaseInTempDir):
1235
1253
def test_text_merge(self):
1236
1254
root_id = generate_ids.gen_root_id()
1237
1255
base = TransformGroup("base", root_id)
1571
1589
# children of non-root directories should not be renamed
1572
1590
self.assertEqual(2, transform_result.rename_count)
1592
def create_ab_tree(self):
1593
"""Create a committed test tree with two files"""
1594
source = self.make_branch_and_tree('source')
1595
self.build_tree_contents([('source/file1', 'A')])
1596
self.build_tree_contents([('source/file2', 'B')])
1597
source.add(['file1', 'file2'], ['file1-id', 'file2-id'])
1598
source.commit('commit files')
1600
self.addCleanup(source.unlock)
1574
1603
def test_build_tree_accelerator_tree(self):
1575
source = self.make_branch_and_tree('source')
1576
self.build_tree_contents([('source/file1', 'A')])
1577
self.build_tree_contents([('source/file2', 'B')])
1578
source.add(['file1', 'file2'], ['file1-id', 'file2-id'])
1579
source.commit('commit files')
1604
source = self.create_ab_tree()
1580
1605
self.build_tree_contents([('source/file2', 'C')])
1582
1607
real_source_get_file = source.get_file
1584
1609
calls.append(file_id)
1585
1610
return real_source_get_file(file_id, path)
1586
1611
source.get_file = get_file
1588
self.addCleanup(source.unlock)
1589
1612
target = self.make_branch_and_tree('target')
1590
1613
revision_tree = source.basis_tree()
1591
1614
revision_tree.lock_read()
1597
1620
self.assertEqual([], list(target._iter_changes(revision_tree)))
1599
1622
def test_build_tree_accelerator_tree_missing_file(self):
1600
source = self.make_branch_and_tree('source')
1601
self.build_tree_contents([('source/file1', 'A')])
1602
self.build_tree_contents([('source/file2', 'B')])
1603
source.add(['file1', 'file2'])
1604
source.commit('commit files')
1623
source = self.create_ab_tree()
1605
1624
os.unlink('source/file1')
1606
1625
source.remove(['file2'])
1607
1626
target = self.make_branch_and_tree('target')
1630
1649
calls.append(file_id)
1631
1650
return real_source_get_file(file_id, path)
1632
1651
source.get_file = get_file
1634
self.addCleanup(source.unlock)
1635
1652
target = self.make_branch_and_tree('target')
1636
1653
revision_tree = source.basis_tree()
1637
1654
revision_tree.lock_read()
1642
1659
self.addCleanup(target.unlock)
1643
1660
self.assertEqual([], list(target._iter_changes(revision_tree)))
1662
def test_build_tree_hardlink(self):
1663
self.requireFeature(HardlinkFeature)
1664
source = self.create_ab_tree()
1665
target = self.make_branch_and_tree('target')
1666
revision_tree = source.basis_tree()
1667
revision_tree.lock_read()
1668
self.addCleanup(revision_tree.unlock)
1669
build_tree(revision_tree, target, source, hardlink=True)
1671
self.addCleanup(target.unlock)
1672
self.assertEqual([], list(target._iter_changes(revision_tree)))
1673
source_stat = os.stat('source/file1')
1674
target_stat = os.stat('target/file1')
1675
self.assertEqual(source_stat, target_stat)
1677
# Explicitly disallowing hardlinks should prevent them.
1678
target2 = self.make_branch_and_tree('target2')
1679
build_tree(revision_tree, target2, source, hardlink=False)
1681
self.addCleanup(target2.unlock)
1682
self.assertEqual([], list(target2._iter_changes(revision_tree)))
1683
source_stat = os.stat('source/file1')
1684
target2_stat = os.stat('target2/file1')
1685
self.assertNotEqual(source_stat, target2_stat)
1645
1687
def test_build_tree_accelerator_tree_moved(self):
1646
1688
source = self.make_branch_and_tree('source')
1647
1689
self.build_tree_contents([('source/file1', 'A')])
1659
1701
self.addCleanup(target.unlock)
1660
1702
self.assertEqual([], list(target._iter_changes(revision_tree)))
1704
def test_build_tree_hardlinks_preserve_execute(self):
1705
self.requireFeature(HardlinkFeature)
1706
source = self.create_ab_tree()
1707
tt = TreeTransform(source)
1708
trans_id = tt.trans_id_tree_file_id('file1-id')
1709
tt.set_executability(True, trans_id)
1711
self.assertTrue(source.is_executable('file1-id'))
1712
target = self.make_branch_and_tree('target')
1713
revision_tree = source.basis_tree()
1714
revision_tree.lock_read()
1715
self.addCleanup(revision_tree.unlock)
1716
build_tree(revision_tree, target, source, hardlink=True)
1718
self.addCleanup(target.unlock)
1719
self.assertEqual([], list(target._iter_changes(revision_tree)))
1720
self.assertTrue(source.is_executable('file1-id'))
1663
1723
class MockTransform(object):
1832
1892
def get_empty_preview(self):
1833
1893
repository = self.make_repository('repo')
1834
1894
tree = repository.revision_tree(_mod_revision.NULL_REVISION)
1835
return TransformPreview(tree)
1895
preview = TransformPreview(tree)
1896
self.addCleanup(preview.finalize)
1837
1899
def test_transform_preview(self):
1838
1900
revision_tree = self.create_tree()
1839
1901
preview = TransformPreview(revision_tree)
1902
self.addCleanup(preview.finalize)
1841
1904
def test_transform_preview_tree(self):
1842
1905
revision_tree = self.create_tree()
1843
1906
preview = TransformPreview(revision_tree)
1907
self.addCleanup(preview.finalize)
1844
1908
preview.get_preview_tree()
1846
1910
def test_transform_new_file(self):
1847
1911
revision_tree = self.create_tree()
1848
1912
preview = TransformPreview(revision_tree)
1913
self.addCleanup(preview.finalize)
1849
1914
preview.new_file('file2', preview.root, 'content B\n', 'file2-id')
1850
1915
preview_tree = preview.get_preview_tree()
1851
1916
self.assertEqual(preview_tree.kind('file2-id'), 'file')
1855
1920
def test_diff_preview_tree(self):
1856
1921
revision_tree = self.create_tree()
1857
1922
preview = TransformPreview(revision_tree)
1923
self.addCleanup(preview.finalize)
1858
1924
preview.new_file('file2', preview.root, 'content B\n', 'file2-id')
1859
1925
preview_tree = preview.get_preview_tree()
1860
1926
out = StringIO()
1867
1933
def test_transform_conflicts(self):
1868
1934
revision_tree = self.create_tree()
1869
1935
preview = TransformPreview(revision_tree)
1936
self.addCleanup(preview.finalize)
1870
1937
preview.new_file('a', preview.root, 'content 2')
1871
1938
resolve_conflicts(preview)
1872
1939
trans_id = preview.trans_id_file_id('a-id')
1875
1942
def get_tree_and_preview_tree(self):
1876
1943
revision_tree = self.create_tree()
1877
1944
preview = TransformPreview(revision_tree)
1945
self.addCleanup(preview.finalize)
1878
1946
a_trans_id = preview.trans_id_file_id('a-id')
1879
1947
preview.delete_contents(a_trans_id)
1880
1948
preview.create_file('b content', a_trans_id)
1932
2000
def test_kind(self):
1933
2001
revision_tree = self.create_tree()
1934
2002
preview = TransformPreview(revision_tree)
2003
self.addCleanup(preview.finalize)
1935
2004
preview.new_file('file', preview.root, 'contents', 'file-id')
1936
2005
preview.new_directory('directory', preview.root, 'dir-id')
1937
2006
preview_tree = preview.get_preview_tree()
1956
2025
self.assertEqual('contents', tree_file.read())
1958
2027
tree_file.close()
2029
def test_get_symlink_target(self):
2030
self.requireFeature(SymlinkFeature)
2031
preview = self.get_empty_preview()
2032
preview.new_symlink('symlink', preview.root, 'target', 'symlink-id')
2033
preview_tree = preview.get_preview_tree()
2034
self.assertEqual('target',
2035
preview_tree.get_symlink_target('symlink-id'))