~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_transform.py

  • Committer: Aaron Bentley
  • Date: 2008-03-03 16:52:41 UTC
  • mfrom: (3144.3.11 fix-conflict-handling)
  • mto: This revision was merged to the branch mainline in revision 3250.
  • Revision ID: aaron@aaronbentley.com-20080303165241-0k2c7ggs6kr9q6hf
Merge with fix-conflict-handling

Show diffs side-by-side

added added

removed removed

Lines of Context:
22
22
from bzrlib import (
23
23
    errors,
24
24
    generate_ids,
 
25
    osutils,
25
26
    progress,
26
27
    revision as _mod_revision,
27
28
    symbol_versioning,
42
43
from bzrlib.merge import Merge3Merger
43
44
from bzrlib.tests import (
44
45
    CaseInsensitiveFilesystemFeature,
 
46
    HardlinkFeature,
45
47
    SymlinkFeature,
46
48
    TestCase,
47
49
    TestCaseInTempDir,
133
135
        transform.finalize()
134
136
        transform.finalize()
135
137
 
 
138
    def test_hardlink(self):
 
139
        self.requireFeature(HardlinkFeature)
 
140
        transform, root = self.get_transform()
 
141
        transform.new_file('file1', root, 'contents')
 
142
        transform.apply()
 
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)
 
152
 
136
153
    def test_convenience(self):
137
154
        transform, root = self.get_transform()
138
155
        self.wt.lock_tree_write()
1232
1249
 
1233
1250
 
1234
1251
class TestTransformMerge(TestCaseInTempDir):
 
1252
 
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)
1573
1591
 
 
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')
 
1599
        source.lock_write()
 
1600
        self.addCleanup(source.unlock)
 
1601
        return source
 
1602
 
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')])
1581
1606
        calls = []
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
1587
 
        source.lock_read()
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)))
1598
1621
 
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
1633
 
        source.lock_read()
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)))
1644
1661
 
 
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)
 
1670
        target.lock_read()
 
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)
 
1676
 
 
1677
        # Explicitly disallowing hardlinks should prevent them.
 
1678
        target2 = self.make_branch_and_tree('target2')
 
1679
        build_tree(revision_tree, target2, source, hardlink=False)
 
1680
        target2.lock_read()
 
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)
 
1686
 
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)))
1661
1703
 
 
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)
 
1710
        tt.apply()
 
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)
 
1717
        target.lock_read()
 
1718
        self.addCleanup(target.unlock)
 
1719
        self.assertEqual([], list(target._iter_changes(revision_tree)))
 
1720
        self.assertTrue(source.is_executable('file1-id'))
 
1721
 
1662
1722
 
1663
1723
class MockTransform(object):
1664
1724
 
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)
 
1897
        return preview
1836
1898
 
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)
1840
1903
 
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()
1845
1909
 
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())
1957
2026
        finally:
1958
2027
            tree_file.close()
 
2028
 
 
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'))