~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_transform.py

  • Committer: John Arbash Meinel
  • Date: 2009-11-13 19:19:11 UTC
  • mto: This revision was merged to the branch mainline in revision 4799.
  • Revision ID: john@arbash-meinel.com-20091113191911-nokhxxx8mllrrl6x
Intern the various strings that are part of the CHKInventory deserialization.

file_ids and revision_ids, in particular, are quite often repeated, so try to keep
a single copy of them.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006-2010 Canonical Ltd
 
1
# Copyright (C) 2006, 2007, 2008 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
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
 
    def test_change_root_id(self):
164
 
        transform, root = self.get_transform()
165
 
        self.assertNotEqual('new-root-id', self.wt.get_root_id())
166
 
        transform.new_directory('', ROOT_PARENT, 'new-root-id')
167
 
        transform.delete_contents(root)
168
 
        transform.unversion_file(root)
169
 
        transform.fixup_new_roots()
170
 
        transform.apply()
171
 
        self.assertEqual('new-root-id', self.wt.get_root_id())
172
 
 
173
 
    def test_change_root_id_add_files(self):
174
 
        transform, root = self.get_transform()
175
 
        self.assertNotEqual('new-root-id', self.wt.get_root_id())
176
 
        new_trans_id = transform.new_directory('', ROOT_PARENT, 'new-root-id')
177
 
        transform.new_file('file', new_trans_id, ['new-contents\n'],
178
 
                           'new-file-id')
179
 
        transform.delete_contents(root)
180
 
        transform.unversion_file(root)
181
 
        transform.fixup_new_roots()
182
 
        transform.apply()
183
 
        self.assertEqual('new-root-id', self.wt.get_root_id())
184
 
        self.assertEqual('new-file-id', self.wt.path2id('file'))
185
 
        self.assertFileEqual('new-contents\n', self.wt.abspath('file'))
186
 
 
187
 
    def test_add_two_roots(self):
188
 
        transform, root = self.get_transform()
189
 
        new_trans_id = transform.new_directory('', ROOT_PARENT, 'new-root-id')
190
 
        new_trans_id = transform.new_directory('', ROOT_PARENT, 'alt-root-id')
191
 
        self.assertRaises(ValueError, transform.fixup_new_roots)
192
 
 
193
139
    def test_hardlink(self):
194
140
        self.requireFeature(HardlinkFeature)
195
141
        transform, root = self.get_transform()
735
681
                                         ' versioned, but has versioned'
736
682
                                         ' children.  Versioned directory.')
737
683
        self.assertEqual(conflicts_s[6], 'Conflict moving oz/emeraldcity into'
738
 
                                         ' oz/emeraldcity. Cancelled move.')
 
684
                                         ' oz/emeraldcity.  Cancelled move.')
739
685
 
740
686
    def prepare_wrong_parent_kind(self):
741
687
        tt, root = self.get_transform()
812
758
        create.apply()
813
759
        transform, root = self.get_transform()
814
760
        transform.adjust_root_path('oldroot', fun)
815
 
        new_root = transform.trans_id_tree_path('')
 
761
        new_root=transform.trans_id_tree_path('')
816
762
        transform.version_file('new-root', new_root)
817
763
        transform.apply()
818
764
 
1922
1868
        self.assertEqual([], list(target.iter_changes(revision_tree)))
1923
1869
        self.assertTrue(source.is_executable('file1-id'))
1924
1870
 
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
1871
    def test_case_insensitive_build_tree_inventory(self):
1973
1872
        if (tests.CaseInsensitiveFilesystemFeature.available()
1974
1873
            or tests.CaseInsCasePresFilenameFeature.available()):
2052
1951
        branch, tt = self.get_branch_and_transform()
2053
1952
        tt.new_file('file', tt.root, 'contents', 'file-id')
2054
1953
        trans_id = tt.new_directory('dir', tt.root, 'dir-id')
2055
 
        if SymlinkFeature.available():
2056
 
            tt.new_symlink('symlink', trans_id, 'target', 'symlink-id')
 
1954
        tt.new_symlink('symlink', trans_id, 'target', 'symlink-id')
2057
1955
        rev = tt.commit(branch, 'message')
2058
1956
        tree = branch.basis_tree()
2059
1957
        self.assertEqual('file', tree.id2path('file-id'))
2060
1958
        self.assertEqual('contents', tree.get_file_text('file-id'))
2061
1959
        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'))
 
1960
        self.assertEqual('dir/symlink', tree.id2path('symlink-id'))
 
1961
        self.assertEqual('target', tree.get_symlink_target('symlink-id'))
2065
1962
 
2066
1963
    def test_add_unversioned(self):
2067
1964
        branch, tt = self.get_branch_and_transform()
2371
2268
    def test_ignore_pb(self):
2372
2269
        # pb could be supported, but TT.iter_changes doesn't support it.
2373
2270
        revision_tree, preview_tree = self.get_tree_and_preview_tree()
2374
 
        preview_tree.iter_changes(revision_tree)
 
2271
        preview_tree.iter_changes(revision_tree, pb=progress.DummyProgress())
2375
2272
 
2376
2273
    def test_kind(self):
2377
2274
        revision_tree = self.create_tree()
2557
2454
        self.assertEqual(('missing', None, None, None), summary)
2558
2455
 
2559
2456
    def test_file_content_summary_executable(self):
 
2457
        if not osutils.supports_executable():
 
2458
            raise TestNotApplicable()
2560
2459
        preview = self.get_empty_preview()
2561
2460
        path_id = preview.new_file('path', preview.root, 'contents', 'path-id')
2562
2461
        preview.set_executability(True, path_id)
2571
2470
        self.assertIs(None, summary[3])
2572
2471
 
2573
2472
    def test_change_executability(self):
 
2473
        if not osutils.supports_executable():
 
2474
            raise TestNotApplicable()
2574
2475
        tree = self.make_branch_and_tree('tree')
2575
2476
        self.build_tree(['tree/path'])
2576
2477
        tree.add('path')
2590
2491
        # size must be known
2591
2492
        self.assertEqual(len('contents'), summary[1])
2592
2493
        # not executable
2593
 
        self.assertEqual(False, summary[2])
 
2494
        if osutils.supports_executable():
 
2495
            self.assertEqual(False, summary[2])
 
2496
        else:
 
2497
            self.assertEqual(None, summary[2])
2594
2498
        # will not have hash (not cheap to determine)
2595
2499
        self.assertIs(None, summary[3])
2596
2500
 
2739
2643
        preview = self.get_empty_preview()
2740
2644
        root = preview.new_directory('', ROOT_PARENT, 'tree-root')
2741
2645
        # FIXME: new_directory should mark root.
2742
 
        preview.fixup_new_roots()
 
2646
        preview.adjust_path('', ROOT_PARENT, root)
2743
2647
        preview_tree = preview.get_preview_tree()
2744
2648
        file_trans_id = preview.new_file('a', preview.root, 'contents',
2745
2649
                                         'a-id')
2779
2683
        file_trans_id = preview.trans_id_file_id('file-id')
2780
2684
        preview.delete_contents(file_trans_id)
2781
2685
        preview.create_file('a\nb\n', file_trans_id)
 
2686
        pb = progress.DummyProgress()
2782
2687
        preview_tree = preview.get_preview_tree()
2783
 
        merger = Merger.from_revision_ids(None, preview_tree,
 
2688
        merger = Merger.from_revision_ids(pb, preview_tree,
2784
2689
                                          child_tree.branch.last_revision(),
2785
2690
                                          other_branch=child_tree.branch,
2786
2691
                                          tree_branch=work_tree.branch)
2798
2703
        tt.new_file('name', tt.root, 'content', 'file-id')
2799
2704
        tree2 = self.make_branch_and_tree('tree2')
2800
2705
        tree2.set_root_id('TREE_ROOT')
 
2706
        pb = progress.DummyProgress()
2801
2707
        merger = Merger.from_uncommitted(tree2, tt.get_preview_tree(),
2802
 
                                         None, tree.basis_tree())
 
2708
                                         pb, tree.basis_tree())
2803
2709
        merger.merge_type = Merge3Merger
2804
2710
        merger.do_merge()
2805
2711
 
2815
2721
        tt.create_file('baz', trans_id)
2816
2722
        tree2 = tree.bzrdir.sprout('tree2').open_workingtree()
2817
2723
        self.build_tree_contents([('tree2/foo', 'qux')])
2818
 
        pb = None
 
2724
        pb = progress.DummyProgress()
2819
2725
        merger = Merger.from_uncommitted(tree2, tt.get_preview_tree(),
2820
2726
                                         pb, tree.basis_tree())
2821
2727
        merger.merge_type = Merge3Merger
2853
2759
        branch = self.make_branch('any')
2854
2760
        tree = branch.repository.revision_tree(_mod_revision.NULL_REVISION)
2855
2761
        tt = TransformPreview(tree)
2856
 
        self.addCleanup(tt.finalize)
2857
2762
        foo_id = tt.new_directory('', ROOT_PARENT)
2858
2763
        bar_id = tt.new_file(u'\u1234bar', foo_id, 'contents')
2859
2764
        limbo_path = tt._limbo_name(bar_id)