/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

  • Committer: John Arbash Meinel
  • Date: 2010-01-13 16:27:22 UTC
  • mfrom: (4634.119.6 2.0)
  • mto: (4634.119.7 2.0)
  • mto: This revision was merged to the branch mainline in revision 4959.
  • Revision ID: john@arbash-meinel.com-20100113162722-c177orxwb4fo19xe
Merge bzr/2.0@4725, resolve NEWS

Show diffs side-by-side

added added

removed removed

Lines of Context:
15
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
16
 
17
17
import os
 
18
import stat
18
19
from StringIO import StringIO
19
20
import sys
20
 
import time
21
21
 
22
22
from bzrlib import (
23
23
    bencode,
24
24
    errors,
25
 
    filters,
26
25
    generate_ids,
27
26
    osutils,
28
27
    progress,
29
28
    revision as _mod_revision,
30
 
    rules,
 
29
    symbol_versioning,
31
30
    tests,
32
31
    urlutils,
33
32
    )
137
136
        transform.finalize()
138
137
        transform.finalize()
139
138
 
140
 
    def test_create_files_same_timestamp(self):
141
 
        transform, root = self.get_transform()
142
 
        self.wt.lock_tree_write()
143
 
        self.addCleanup(self.wt.unlock)
144
 
        # Roll back the clock, so that we know everything is being set to the
145
 
        # exact time
146
 
        transform._creation_mtime = creation_mtime = time.time() - 20.0
147
 
        transform.create_file('content-one',
148
 
                              transform.create_path('one', root))
149
 
        time.sleep(1) # *ugly*
150
 
        transform.create_file('content-two',
151
 
                              transform.create_path('two', root))
152
 
        transform.apply()
153
 
        fo, st1 = self.wt.get_file_with_stat(None, path='one', filtered=False)
154
 
        fo.close()
155
 
        fo, st2 = self.wt.get_file_with_stat(None, path='two', filtered=False)
156
 
        fo.close()
157
 
        # We only guarantee 2s resolution
158
 
        self.assertTrue(abs(creation_mtime - st1.st_mtime) < 2.0,
159
 
            "%s != %s within 2 seconds" % (creation_mtime, st1.st_mtime))
160
 
        # But if we have more than that, all files should get the same result
161
 
        self.assertEqual(st1.st_mtime, st2.st_mtime)
162
 
 
163
139
    def test_change_root_id(self):
164
140
        transform, root = self.get_transform()
165
141
        self.assertNotEqual('new-root-id', self.wt.get_root_id())
423
399
        self.assertContainsRe(transform._limbo_name(first), 'new-1/file')
424
400
        self.assertNotContainsRe(transform._limbo_name(second), 'new-1/FiLe')
425
401
 
426
 
    def test_adjust_path_updates_child_limbo_names(self):
427
 
        tree = self.make_branch_and_tree('tree')
428
 
        transform = TreeTransform(tree)
429
 
        self.addCleanup(transform.finalize)
430
 
        foo_id = transform.new_directory('foo', transform.root)
431
 
        bar_id = transform.new_directory('bar', foo_id)
432
 
        baz_id = transform.new_directory('baz', bar_id)
433
 
        qux_id = transform.new_directory('qux', baz_id)
434
 
        transform.adjust_path('quxx', foo_id, bar_id)
435
 
        self.assertStartsWith(transform._limbo_name(qux_id),
436
 
                              transform._limbo_name(bar_id))
437
 
 
438
402
    def test_add_del(self):
439
403
        start, root = self.get_transform()
440
404
        start.new_directory('a', root, 'a')
735
699
                                         ' versioned, but has versioned'
736
700
                                         ' children.  Versioned directory.')
737
701
        self.assertEqual(conflicts_s[6], 'Conflict moving oz/emeraldcity into'
738
 
                                         ' oz/emeraldcity. Cancelled move.')
 
702
                                         ' oz/emeraldcity.  Cancelled move.')
739
703
 
740
704
    def prepare_wrong_parent_kind(self):
741
705
        tt, root = self.get_transform()
1922
1886
        self.assertEqual([], list(target.iter_changes(revision_tree)))
1923
1887
        self.assertTrue(source.is_executable('file1-id'))
1924
1888
 
1925
 
    def install_rot13_content_filter(self, pattern):
1926
 
        # We could use
1927
 
        # self.addCleanup(filters._reset_registry, filters._reset_registry())
1928
 
        # below, but that looks a bit... hard to read even if it's exactly
1929
 
        # the same thing.
1930
 
        original_registry = filters._reset_registry()
1931
 
        def restore_registry():
1932
 
            filters._reset_registry(original_registry)
1933
 
        self.addCleanup(restore_registry)
1934
 
        def rot13(chunks, context=None):
1935
 
            return [''.join(chunks).encode('rot13')]
1936
 
        rot13filter = filters.ContentFilter(rot13, rot13)
1937
 
        filters.register_filter_stack_map('rot13', {'yes': [rot13filter]}.get)
1938
 
        os.mkdir(self.test_home_dir + '/.bazaar')
1939
 
        rules_filename = self.test_home_dir + '/.bazaar/rules'
1940
 
        f = open(rules_filename, 'wb')
1941
 
        f.write('[name %s]\nrot13=yes\n' % (pattern,))
1942
 
        f.close()
1943
 
        def uninstall_rules():
1944
 
            os.remove(rules_filename)
1945
 
            rules.reset_rules()
1946
 
        self.addCleanup(uninstall_rules)
1947
 
        rules.reset_rules()
1948
 
 
1949
 
    def test_build_tree_content_filtered_files_are_not_hardlinked(self):
1950
 
        """build_tree will not hardlink files that have content filtering rules
1951
 
        applied to them (but will still hardlink other files from the same tree
1952
 
        if it can).
1953
 
        """
1954
 
        self.requireFeature(HardlinkFeature)
1955
 
        self.install_rot13_content_filter('file1')
1956
 
        source = self.create_ab_tree()
1957
 
        target = self.make_branch_and_tree('target')
1958
 
        revision_tree = source.basis_tree()
1959
 
        revision_tree.lock_read()
1960
 
        self.addCleanup(revision_tree.unlock)
1961
 
        build_tree(revision_tree, target, source, hardlink=True)
1962
 
        target.lock_read()
1963
 
        self.addCleanup(target.unlock)
1964
 
        self.assertEqual([], list(target.iter_changes(revision_tree)))
1965
 
        source_stat = os.stat('source/file1')
1966
 
        target_stat = os.stat('target/file1')
1967
 
        self.assertNotEqual(source_stat, target_stat)
1968
 
        source_stat = os.stat('source/file2')
1969
 
        target_stat = os.stat('target/file2')
1970
 
        self.assertEqualStat(source_stat, target_stat)
1971
 
 
1972
1889
    def test_case_insensitive_build_tree_inventory(self):
1973
1890
        if (tests.CaseInsensitiveFilesystemFeature.available()
1974
1891
            or tests.CaseInsCasePresFilenameFeature.available()):
2029
1946
        branch.lock_write()
2030
1947
        self.addCleanup(branch.unlock)
2031
1948
        tt = TransformPreview(branch.basis_tree())
2032
 
        self.addCleanup(tt.finalize)
2033
1949
        tt.new_directory('', ROOT_PARENT, 'TREE_ROOT')
2034
1950
        rev = tt.commit(branch, 'my message')
2035
1951
        self.assertEqual([], branch.basis_tree().get_parent_ids())
2041
1957
        branch.lock_write()
2042
1958
        self.addCleanup(branch.unlock)
2043
1959
        tt = TransformPreview(branch.basis_tree())
2044
 
        self.addCleanup(tt.finalize)
2045
1960
        e = self.assertRaises(ValueError, tt.commit, branch,
2046
1961
                          'my message', ['rev1b-id'])
2047
1962
        self.assertEqual('Cannot supply merge parents for first commit.',
2052
1967
        branch, tt = self.get_branch_and_transform()
2053
1968
        tt.new_file('file', tt.root, 'contents', 'file-id')
2054
1969
        trans_id = tt.new_directory('dir', tt.root, 'dir-id')
2055
 
        if SymlinkFeature.available():
2056
 
            tt.new_symlink('symlink', trans_id, 'target', 'symlink-id')
 
1970
        tt.new_symlink('symlink', trans_id, 'target', 'symlink-id')
2057
1971
        rev = tt.commit(branch, 'message')
2058
1972
        tree = branch.basis_tree()
2059
1973
        self.assertEqual('file', tree.id2path('file-id'))
2060
1974
        self.assertEqual('contents', tree.get_file_text('file-id'))
2061
1975
        self.assertEqual('dir', tree.id2path('dir-id'))
2062
 
        if SymlinkFeature.available():
2063
 
            self.assertEqual('dir/symlink', tree.id2path('symlink-id'))
2064
 
            self.assertEqual('target', tree.get_symlink_target('symlink-id'))
 
1976
        self.assertEqual('dir/symlink', tree.id2path('symlink-id'))
 
1977
        self.assertEqual('target', tree.get_symlink_target('symlink-id'))
2065
1978
 
2066
1979
    def test_add_unversioned(self):
2067
1980
        branch, tt = self.get_branch_and_transform()
2074
1987
        tt.new_file('file', tt.root, 'contents', 'file-id')
2075
1988
        tt.commit(branch, 'message', strict=True)
2076
1989
        tt = TransformPreview(branch.basis_tree())
2077
 
        self.addCleanup(tt.finalize)
2078
1990
        trans_id = tt.trans_id_file_id('file-id')
2079
1991
        tt.delete_contents(trans_id)
2080
1992
        tt.create_file('contents', trans_id)
2371
2283
    def test_ignore_pb(self):
2372
2284
        # pb could be supported, but TT.iter_changes doesn't support it.
2373
2285
        revision_tree, preview_tree = self.get_tree_and_preview_tree()
2374
 
        preview_tree.iter_changes(revision_tree)
 
2286
        preview_tree.iter_changes(revision_tree, pb=progress.DummyProgress())
2375
2287
 
2376
2288
    def test_kind(self):
2377
2289
        revision_tree = self.create_tree()
2392
2304
        self.assertEqual(os.stat(limbo_path).st_mtime,
2393
2305
                         preview_tree.get_file_mtime('file-id'))
2394
2306
 
2395
 
    def test_get_file_mtime_renamed(self):
2396
 
        work_tree = self.make_branch_and_tree('tree')
2397
 
        self.build_tree(['tree/file'])
2398
 
        work_tree.add('file', 'file-id')
2399
 
        preview = TransformPreview(work_tree)
2400
 
        self.addCleanup(preview.finalize)
2401
 
        file_trans_id = preview.trans_id_tree_file_id('file-id')
2402
 
        preview.adjust_path('renamed', preview.root, file_trans_id)
2403
 
        preview_tree = preview.get_preview_tree()
2404
 
        preview_mtime = preview_tree.get_file_mtime('file-id', 'renamed')
2405
 
        work_mtime = work_tree.get_file_mtime('file-id', 'file')
2406
 
 
2407
2307
    def test_get_file(self):
2408
2308
        preview = self.get_empty_preview()
2409
2309
        preview.new_file('file', preview.root, 'contents', 'file-id')
2557
2457
        self.assertEqual(('missing', None, None, None), summary)
2558
2458
 
2559
2459
    def test_file_content_summary_executable(self):
 
2460
        if not osutils.supports_executable():
 
2461
            raise tests.TestNotApplicable()
2560
2462
        preview = self.get_empty_preview()
2561
2463
        path_id = preview.new_file('path', preview.root, 'contents', 'path-id')
2562
2464
        preview.set_executability(True, path_id)
2590
2492
        # size must be known
2591
2493
        self.assertEqual(len('contents'), summary[1])
2592
2494
        # not executable
2593
 
        self.assertEqual(False, summary[2])
 
2495
        if osutils.supports_executable():
 
2496
            self.assertEqual(False, summary[2])
 
2497
        else:
 
2498
            self.assertEqual(None, summary[2])
2594
2499
        # will not have hash (not cheap to determine)
2595
2500
        self.assertIs(None, summary[3])
2596
2501
 
2779
2684
        file_trans_id = preview.trans_id_file_id('file-id')
2780
2685
        preview.delete_contents(file_trans_id)
2781
2686
        preview.create_file('a\nb\n', file_trans_id)
 
2687
        pb = progress.DummyProgress()
2782
2688
        preview_tree = preview.get_preview_tree()
2783
 
        merger = Merger.from_revision_ids(None, preview_tree,
 
2689
        merger = Merger.from_revision_ids(pb, preview_tree,
2784
2690
                                          child_tree.branch.last_revision(),
2785
2691
                                          other_branch=child_tree.branch,
2786
2692
                                          tree_branch=work_tree.branch)
2798
2704
        tt.new_file('name', tt.root, 'content', 'file-id')
2799
2705
        tree2 = self.make_branch_and_tree('tree2')
2800
2706
        tree2.set_root_id('TREE_ROOT')
 
2707
        pb = progress.DummyProgress()
2801
2708
        merger = Merger.from_uncommitted(tree2, tt.get_preview_tree(),
2802
 
                                         None, tree.basis_tree())
 
2709
                                         pb, tree.basis_tree())
2803
2710
        merger.merge_type = Merge3Merger
2804
2711
        merger.do_merge()
2805
2712
 
2815
2722
        tt.create_file('baz', trans_id)
2816
2723
        tree2 = tree.bzrdir.sprout('tree2').open_workingtree()
2817
2724
        self.build_tree_contents([('tree2/foo', 'qux')])
2818
 
        pb = None
 
2725
        pb = progress.DummyProgress()
2819
2726
        merger = Merger.from_uncommitted(tree2, tt.get_preview_tree(),
2820
2727
                                         pb, tree.basis_tree())
2821
2728
        merger.merge_type = Merge3Merger
2853
2760
        branch = self.make_branch('any')
2854
2761
        tree = branch.repository.revision_tree(_mod_revision.NULL_REVISION)
2855
2762
        tt = TransformPreview(tree)
2856
 
        self.addCleanup(tt.finalize)
2857
2763
        foo_id = tt.new_directory('', ROOT_PARENT)
2858
2764
        bar_id = tt.new_file(u'\u1234bar', foo_id, 'contents')
2859
2765
        limbo_path = tt._limbo_name(bar_id)