/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_transform.py

Merge up with bzr.dev.

Show diffs side-by-side

added added

removed removed

Lines of Context:
16
16
 
17
17
import os
18
18
import stat
 
19
from StringIO import StringIO
19
20
import sys
20
21
 
21
22
from bzrlib import (
22
23
    errors,
23
24
    generate_ids,
 
25
    osutils,
 
26
    progress,
 
27
    revision as _mod_revision,
24
28
    symbol_versioning,
25
29
    tests,
26
30
    urlutils,
27
31
    )
28
32
from bzrlib.bzrdir import BzrDir
29
33
from bzrlib.conflicts import (DuplicateEntry, DuplicateID, MissingParent,
30
 
                              UnversionedParent, ParentLoop, DeletingParent,)
 
34
                              UnversionedParent, ParentLoop, DeletingParent,
 
35
                              NonDirectoryParent)
 
36
from bzrlib.diff import show_diff_trees
31
37
from bzrlib.errors import (DuplicateKey, MalformedTransform, NoSuchFile,
32
38
                           ReusingTransform, CantMoveRoot, 
33
39
                           PathsNotVersionedError, ExistingLimbo,
45
51
from bzrlib.transform import (TreeTransform, ROOT_PARENT, FinalPaths, 
46
52
                              resolve_conflicts, cook_conflicts, 
47
53
                              find_interesting, build_tree, get_backup_name,
48
 
                              change_entry, _FileMover, resolve_checkout)
49
 
 
 
54
                              change_entry, _FileMover, resolve_checkout,
 
55
                              TransformPreview)
50
56
 
51
57
class TestTreeTransform(tests.TestCaseWithTransport):
52
58
 
250
256
        transform.new_file('FiLe', transform.root, 'content')
251
257
        result = transform.find_conflicts()
252
258
        self.assertEqual([], result)
 
259
        transform.finalize()
253
260
        # Force the tree to report that it is case insensitive, for conflict
254
261
        # generation tests
255
262
        tree.case_sensitive = False
 
263
        transform = TreeTransform(tree)
 
264
        self.addCleanup(transform.finalize)
 
265
        transform.new_file('file', transform.root, 'content')
 
266
        transform.new_file('FiLe', transform.root, 'content')
256
267
        result = transform.find_conflicts()
257
268
        self.assertEqual([('duplicate', 'new-1', 'new-2', 'file')], result)
258
269
 
268
279
        transform.new_file('file', transform.root, 'content')
269
280
        result = transform.find_conflicts()
270
281
        self.assertEqual([], result)
 
282
        transform.finalize()
271
283
        # Force the tree to report that it is case insensitive, for conflict
272
284
        # generation tests
273
285
        tree.case_sensitive = False
 
286
        transform = TreeTransform(tree)
 
287
        self.addCleanup(transform.finalize)
 
288
        transform.new_file('file', transform.root, 'content')
274
289
        result = transform.find_conflicts()
275
290
        self.assertEqual([('duplicate', 'new-1', 'new-2', 'file')], result)
276
291
 
623
638
        self.assertEqual(conflicts_s[6], 'Conflict moving oz/emeraldcity into'
624
639
                                         ' oz/emeraldcity.  Cancelled move.')
625
640
 
 
641
    def prepare_wrong_parent_kind(self):
 
642
        tt, root = self.get_transform()
 
643
        tt.new_file('parent', root, 'contents', 'parent-id')
 
644
        tt.apply()
 
645
        tt, root = self.get_transform()
 
646
        parent_id = tt.trans_id_file_id('parent-id')
 
647
        tt.new_file('child,', parent_id, 'contents2', 'file-id')
 
648
        return tt
 
649
 
 
650
    def test_find_conflicts_wrong_parent_kind(self):
 
651
        tt = self.prepare_wrong_parent_kind()
 
652
        tt.find_conflicts()
 
653
 
 
654
    def test_resolve_conflicts_wrong_existing_parent_kind(self):
 
655
        tt = self.prepare_wrong_parent_kind()
 
656
        raw_conflicts = resolve_conflicts(tt)
 
657
        self.assertEqual(set([('non-directory parent', 'Created directory',
 
658
                         'new-3')]), raw_conflicts)
 
659
        cooked_conflicts = cook_conflicts(raw_conflicts, tt)
 
660
        self.assertEqual([NonDirectoryParent('Created directory', 'parent.new',
 
661
        'parent-id')], cooked_conflicts)
 
662
        tt.apply()
 
663
        self.assertEqual(None, self.wt.path2id('parent'))
 
664
        self.assertEqual('parent-id', self.wt.path2id('parent.new'))
 
665
 
 
666
    def test_resolve_conflicts_wrong_new_parent_kind(self):
 
667
        tt, root = self.get_transform()
 
668
        parent_id = tt.new_directory('parent', root, 'parent-id')
 
669
        tt.new_file('child,', parent_id, 'contents2', 'file-id')
 
670
        tt.apply()
 
671
        tt, root = self.get_transform()
 
672
        parent_id = tt.trans_id_file_id('parent-id')
 
673
        tt.delete_contents(parent_id)
 
674
        tt.create_file('contents', parent_id)
 
675
        raw_conflicts = resolve_conflicts(tt)
 
676
        self.assertEqual(set([('non-directory parent', 'Created directory',
 
677
                         'new-3')]), raw_conflicts)
 
678
        tt.apply()
 
679
        self.assertEqual(None, self.wt.path2id('parent'))
 
680
        self.assertEqual('parent-id', self.wt.path2id('parent.new'))
 
681
 
 
682
    def test_resolve_conflicts_wrong_parent_kind_unversioned(self):
 
683
        tt, root = self.get_transform()
 
684
        parent_id = tt.new_directory('parent', root)
 
685
        tt.new_file('child,', parent_id, 'contents2')
 
686
        tt.apply()
 
687
        tt, root = self.get_transform()
 
688
        parent_id = tt.trans_id_tree_path('parent')
 
689
        tt.delete_contents(parent_id)
 
690
        tt.create_file('contents', parent_id)
 
691
        resolve_conflicts(tt)
 
692
        tt.apply()
 
693
        self.assertIs(None, self.wt.path2id('parent'))
 
694
        self.assertIs(None, self.wt.path2id('parent.new'))
 
695
 
626
696
    def test_moving_versioned_directories(self):
627
697
        create, root = self.get_transform()
628
698
        kansas = create.new_directory('kansas', root, 'kansas-id')
703
773
        transform, root = self.get_transform()
704
774
        transform.new_file('file1', root, 'contents', 'file1-id', True)
705
775
        transform.apply()
 
776
        self.wt.lock_write()
 
777
        self.addCleanup(self.wt.unlock)
706
778
        self.assertTrue(self.wt.is_executable('file1-id'))
707
779
        transform, root = self.get_transform()
708
780
        file1_id = transform.trans_id_tree_file_id('file1-id')
1161
1233
 
1162
1234
 
1163
1235
class TestTransformMerge(TestCaseInTempDir):
 
1236
 
1164
1237
    def test_text_merge(self):
1165
1238
        root_id = generate_ids.gen_root_id()
1166
1239
        base = TransformGroup("base", root_id)
1196
1269
        this.tt.new_file('i', this.root, '1\n2\n3\n4\n', 'i')
1197
1270
        this.tt.apply()
1198
1271
        Merge3Merger(this.wt, this.wt, base.wt, other.wt)
 
1272
 
1199
1273
        # textual merge
1200
1274
        self.assertEqual(this.wt.get_file('a').read(), 'y\nb\nc\nd\bz\n')
1201
1275
        # three-way text conflict
1542
1616
        self.assertEqual([], list(target._iter_changes(revision_tree)))
1543
1617
 
1544
1618
    def test_build_tree_accelerator_wrong_kind(self):
 
1619
        self.requireFeature(SymlinkFeature)
1545
1620
        source = self.make_branch_and_tree('source')
1546
1621
        self.build_tree_contents([('source/file1', '')])
1547
1622
        self.build_tree_contents([('source/file2', '')])
1745
1820
        parent = tt.trans_id_file_id('parent-id')
1746
1821
        tt.new_file('file', parent, 'Contents')
1747
1822
        resolve_conflicts(tt)
 
1823
 
 
1824
 
 
1825
class TestTransformPreview(tests.TestCaseWithTransport):
 
1826
 
 
1827
    def create_tree(self):
 
1828
        tree = self.make_branch_and_tree('.')
 
1829
        self.build_tree_contents([('a', 'content 1')])
 
1830
        tree.add('a', 'a-id')
 
1831
        tree.commit('rev1', rev_id='rev1')
 
1832
        return tree.branch.repository.revision_tree('rev1')
 
1833
 
 
1834
    def get_empty_preview(self):
 
1835
        repository = self.make_repository('repo')
 
1836
        tree = repository.revision_tree(_mod_revision.NULL_REVISION)
 
1837
        preview = TransformPreview(tree)
 
1838
        self.addCleanup(preview.finalize)
 
1839
        return preview
 
1840
 
 
1841
    def test_transform_preview(self):
 
1842
        revision_tree = self.create_tree()
 
1843
        preview = TransformPreview(revision_tree)
 
1844
        self.addCleanup(preview.finalize)
 
1845
 
 
1846
    def test_transform_preview_tree(self):
 
1847
        revision_tree = self.create_tree()
 
1848
        preview = TransformPreview(revision_tree)
 
1849
        self.addCleanup(preview.finalize)
 
1850
        preview.get_preview_tree()
 
1851
 
 
1852
    def test_transform_new_file(self):
 
1853
        revision_tree = self.create_tree()
 
1854
        preview = TransformPreview(revision_tree)
 
1855
        self.addCleanup(preview.finalize)
 
1856
        preview.new_file('file2', preview.root, 'content B\n', 'file2-id')
 
1857
        preview_tree = preview.get_preview_tree()
 
1858
        self.assertEqual(preview_tree.kind('file2-id'), 'file')
 
1859
        self.assertEqual(
 
1860
            preview_tree.get_file('file2-id').read(), 'content B\n')
 
1861
 
 
1862
    def test_diff_preview_tree(self):
 
1863
        revision_tree = self.create_tree()
 
1864
        preview = TransformPreview(revision_tree)
 
1865
        self.addCleanup(preview.finalize)
 
1866
        preview.new_file('file2', preview.root, 'content B\n', 'file2-id')
 
1867
        preview_tree = preview.get_preview_tree()
 
1868
        out = StringIO()
 
1869
        show_diff_trees(revision_tree, preview_tree, out)
 
1870
        lines = out.getvalue().splitlines()
 
1871
        self.assertEqual(lines[0], "=== added file 'file2'")
 
1872
        # 3 lines of diff administrivia
 
1873
        self.assertEqual(lines[4], "+content B")
 
1874
 
 
1875
    def test_transform_conflicts(self):
 
1876
        revision_tree = self.create_tree()
 
1877
        preview = TransformPreview(revision_tree)
 
1878
        self.addCleanup(preview.finalize)
 
1879
        preview.new_file('a', preview.root, 'content 2')
 
1880
        resolve_conflicts(preview)
 
1881
        trans_id = preview.trans_id_file_id('a-id')
 
1882
        self.assertEqual('a.moved', preview.final_name(trans_id))
 
1883
 
 
1884
    def get_tree_and_preview_tree(self):
 
1885
        revision_tree = self.create_tree()
 
1886
        preview = TransformPreview(revision_tree)
 
1887
        self.addCleanup(preview.finalize)
 
1888
        a_trans_id = preview.trans_id_file_id('a-id')
 
1889
        preview.delete_contents(a_trans_id)
 
1890
        preview.create_file('b content', a_trans_id)
 
1891
        preview_tree = preview.get_preview_tree()
 
1892
        return revision_tree, preview_tree
 
1893
 
 
1894
    def test_iter_changes(self):
 
1895
        revision_tree, preview_tree = self.get_tree_and_preview_tree()
 
1896
        root = revision_tree.inventory.root.file_id
 
1897
        self.assertEqual([('a-id', ('a', 'a'), True, (True, True),
 
1898
                          (root, root), ('a', 'a'), ('file', 'file'),
 
1899
                          (False, False))],
 
1900
                          list(preview_tree._iter_changes(revision_tree)))
 
1901
 
 
1902
    def test_wrong_tree_value_error(self):
 
1903
        revision_tree, preview_tree = self.get_tree_and_preview_tree()
 
1904
        e = self.assertRaises(ValueError, preview_tree._iter_changes,
 
1905
                              preview_tree)
 
1906
        self.assertEqual('from_tree must be transform source tree.', str(e))
 
1907
 
 
1908
    def test_include_unchanged_value_error(self):
 
1909
        revision_tree, preview_tree = self.get_tree_and_preview_tree()
 
1910
        e = self.assertRaises(ValueError, preview_tree._iter_changes,
 
1911
                              revision_tree, include_unchanged=True)
 
1912
        self.assertEqual('include_unchanged is not supported', str(e))
 
1913
 
 
1914
    def test_specific_files(self):
 
1915
        revision_tree, preview_tree = self.get_tree_and_preview_tree()
 
1916
        e = self.assertRaises(ValueError, preview_tree._iter_changes,
 
1917
                              revision_tree, specific_files=['pete'])
 
1918
        self.assertEqual('specific_files is not supported', str(e))
 
1919
 
 
1920
    def test_want_unversioned_value_error(self):
 
1921
        revision_tree, preview_tree = self.get_tree_and_preview_tree()
 
1922
        e = self.assertRaises(ValueError, preview_tree._iter_changes,
 
1923
                              revision_tree, want_unversioned=True)
 
1924
        self.assertEqual('want_unversioned is not supported', str(e))
 
1925
 
 
1926
    def test_ignore_extra_trees_no_specific_files(self):
 
1927
        # extra_trees is harmless without specific_files, so we'll silently
 
1928
        # accept it, even though we won't use it.
 
1929
        revision_tree, preview_tree = self.get_tree_and_preview_tree()
 
1930
        preview_tree._iter_changes(revision_tree, extra_trees=[preview_tree])
 
1931
 
 
1932
    def test_ignore_require_versioned_no_specific_files(self):
 
1933
        # require_versioned is meaningless without specific_files.
 
1934
        revision_tree, preview_tree = self.get_tree_and_preview_tree()
 
1935
        preview_tree._iter_changes(revision_tree, require_versioned=False)
 
1936
 
 
1937
    def test_ignore_pb(self):
 
1938
        # pb could be supported, but TT.iter_changes doesn't support it.
 
1939
        revision_tree, preview_tree = self.get_tree_and_preview_tree()
 
1940
        preview_tree._iter_changes(revision_tree, pb=progress.DummyProgress())
 
1941
 
 
1942
    def test_kind(self):
 
1943
        revision_tree = self.create_tree()
 
1944
        preview = TransformPreview(revision_tree)
 
1945
        self.addCleanup(preview.finalize)
 
1946
        preview.new_file('file', preview.root, 'contents', 'file-id')
 
1947
        preview.new_directory('directory', preview.root, 'dir-id')
 
1948
        preview_tree = preview.get_preview_tree()
 
1949
        self.assertEqual('file', preview_tree.kind('file-id'))
 
1950
        self.assertEqual('directory', preview_tree.kind('dir-id'))
 
1951
 
 
1952
    def test_get_file_mtime(self):
 
1953
        preview = self.get_empty_preview()
 
1954
        file_trans_id = preview.new_file('file', preview.root, 'contents',
 
1955
                                         'file-id')
 
1956
        limbo_path = preview._limbo_name(file_trans_id)
 
1957
        preview_tree = preview.get_preview_tree()
 
1958
        self.assertEqual(os.stat(limbo_path).st_mtime,
 
1959
                         preview_tree.get_file_mtime('file-id'))
 
1960
 
 
1961
    def test_get_file(self):
 
1962
        preview = self.get_empty_preview()
 
1963
        preview.new_file('file', preview.root, 'contents', 'file-id')
 
1964
        preview_tree = preview.get_preview_tree()
 
1965
        tree_file = preview_tree.get_file('file-id')
 
1966
        try:
 
1967
            self.assertEqual('contents', tree_file.read())
 
1968
        finally:
 
1969
            tree_file.close()