~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-12-10 17:16:19 UTC
  • mfrom: (4884 +trunk)
  • mto: This revision was merged to the branch mainline in revision 4889.
  • Revision ID: john@arbash-meinel.com-20091210171619-ehdcxjbl8afhq9g1
Bring in bzr.dev 4884

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
19
18
from StringIO import StringIO
20
19
import sys
21
20
 
22
21
from bzrlib import (
23
22
    bencode,
24
23
    errors,
 
24
    filters,
25
25
    generate_ids,
26
26
    osutils,
27
27
    progress,
28
28
    revision as _mod_revision,
29
 
    symbol_versioning,
 
29
    rules,
30
30
    tests,
31
31
    urlutils,
32
32
    )
369
369
        self.assertContainsRe(transform._limbo_name(first), 'new-1/file')
370
370
        self.assertNotContainsRe(transform._limbo_name(second), 'new-1/FiLe')
371
371
 
 
372
    def test_adjust_path_updates_child_limbo_names(self):
 
373
        tree = self.make_branch_and_tree('tree')
 
374
        transform = TreeTransform(tree)
 
375
        self.addCleanup(transform.finalize)
 
376
        foo_id = transform.new_directory('foo', transform.root)
 
377
        bar_id = transform.new_directory('bar', foo_id)
 
378
        baz_id = transform.new_directory('baz', bar_id)
 
379
        qux_id = transform.new_directory('qux', baz_id)
 
380
        transform.adjust_path('quxx', foo_id, bar_id)
 
381
        self.assertStartsWith(transform._limbo_name(qux_id),
 
382
                              transform._limbo_name(bar_id))
 
383
 
372
384
    def test_add_del(self):
373
385
        start, root = self.get_transform()
374
386
        start.new_directory('a', root, 'a')
1856
1868
        self.assertEqual([], list(target.iter_changes(revision_tree)))
1857
1869
        self.assertTrue(source.is_executable('file1-id'))
1858
1870
 
 
1871
    def install_rot13_content_filter(self, pattern):
 
1872
        original_registry = filters._reset_registry()
 
1873
        def restore_registry():
 
1874
            filters._reset_registry(original_registry)
 
1875
        self.addCleanup(restore_registry)
 
1876
        def rot13(chunks, context=None):
 
1877
            return [''.join(chunks).encode('rot13')]
 
1878
        rot13filter = filters.ContentFilter(rot13, rot13)
 
1879
        filters.register_filter_stack_map('rot13', {'yes': [rot13filter]}.get)
 
1880
        os.mkdir(self.test_home_dir + '/.bazaar')
 
1881
        rules_filename = self.test_home_dir + '/.bazaar/rules'
 
1882
        f = open(rules_filename, 'wb')
 
1883
        f.write('[name %s]\nrot13=yes\n' % (pattern,))
 
1884
        f.close()
 
1885
        def uninstall_rules():
 
1886
            os.remove(rules_filename)
 
1887
            rules.reset_rules()
 
1888
        self.addCleanup(uninstall_rules)
 
1889
        rules.reset_rules()
 
1890
 
 
1891
    def test_build_tree_content_filtered_files_are_not_hardlinked(self):
 
1892
        """build_tree will not hardlink files that have content filtering rules
 
1893
        applied to them (but will still hardlink other files from the same tree
 
1894
        if it can).
 
1895
        """
 
1896
        self.requireFeature(HardlinkFeature)
 
1897
        self.install_rot13_content_filter('file1')
 
1898
        source = self.create_ab_tree()
 
1899
        target = self.make_branch_and_tree('target')
 
1900
        revision_tree = source.basis_tree()
 
1901
        revision_tree.lock_read()
 
1902
        self.addCleanup(revision_tree.unlock)
 
1903
        build_tree(revision_tree, target, source, hardlink=True)
 
1904
        target.lock_read()
 
1905
        self.addCleanup(target.unlock)
 
1906
        self.assertEqual([], list(target.iter_changes(revision_tree)))
 
1907
        source_stat = os.stat('source/file1')
 
1908
        target_stat = os.stat('target/file1')
 
1909
        self.assertNotEqual(source_stat, target_stat)
 
1910
        source_stat = os.stat('source/file2')
 
1911
        target_stat = os.stat('target/file2')
 
1912
        self.assertEqualStat(source_stat, target_stat)
 
1913
 
1859
1914
    def test_case_insensitive_build_tree_inventory(self):
1860
1915
        if (tests.CaseInsensitiveFilesystemFeature.available()
1861
1916
            or tests.CaseInsCasePresFilenameFeature.available()):
1916
1971
        branch.lock_write()
1917
1972
        self.addCleanup(branch.unlock)
1918
1973
        tt = TransformPreview(branch.basis_tree())
 
1974
        self.addCleanup(tt.finalize)
1919
1975
        tt.new_directory('', ROOT_PARENT, 'TREE_ROOT')
1920
1976
        rev = tt.commit(branch, 'my message')
1921
1977
        self.assertEqual([], branch.basis_tree().get_parent_ids())
1927
1983
        branch.lock_write()
1928
1984
        self.addCleanup(branch.unlock)
1929
1985
        tt = TransformPreview(branch.basis_tree())
 
1986
        self.addCleanup(tt.finalize)
1930
1987
        e = self.assertRaises(ValueError, tt.commit, branch,
1931
1988
                          'my message', ['rev1b-id'])
1932
1989
        self.assertEqual('Cannot supply merge parents for first commit.',
1937
1994
        branch, tt = self.get_branch_and_transform()
1938
1995
        tt.new_file('file', tt.root, 'contents', 'file-id')
1939
1996
        trans_id = tt.new_directory('dir', tt.root, 'dir-id')
1940
 
        tt.new_symlink('symlink', trans_id, 'target', 'symlink-id')
 
1997
        if SymlinkFeature.available():
 
1998
            tt.new_symlink('symlink', trans_id, 'target', 'symlink-id')
1941
1999
        rev = tt.commit(branch, 'message')
1942
2000
        tree = branch.basis_tree()
1943
2001
        self.assertEqual('file', tree.id2path('file-id'))
1944
2002
        self.assertEqual('contents', tree.get_file_text('file-id'))
1945
2003
        self.assertEqual('dir', tree.id2path('dir-id'))
1946
 
        self.assertEqual('dir/symlink', tree.id2path('symlink-id'))
1947
 
        self.assertEqual('target', tree.get_symlink_target('symlink-id'))
 
2004
        if SymlinkFeature.available():
 
2005
            self.assertEqual('dir/symlink', tree.id2path('symlink-id'))
 
2006
            self.assertEqual('target', tree.get_symlink_target('symlink-id'))
1948
2007
 
1949
2008
    def test_add_unversioned(self):
1950
2009
        branch, tt = self.get_branch_and_transform()
1957
2016
        tt.new_file('file', tt.root, 'contents', 'file-id')
1958
2017
        tt.commit(branch, 'message', strict=True)
1959
2018
        tt = TransformPreview(branch.basis_tree())
 
2019
        self.addCleanup(tt.finalize)
1960
2020
        trans_id = tt.trans_id_file_id('file-id')
1961
2021
        tt.delete_contents(trans_id)
1962
2022
        tt.create_file('contents', trans_id)
2274
2334
        self.assertEqual(os.stat(limbo_path).st_mtime,
2275
2335
                         preview_tree.get_file_mtime('file-id'))
2276
2336
 
 
2337
    def test_get_file_mtime_renamed(self):
 
2338
        work_tree = self.make_branch_and_tree('tree')
 
2339
        self.build_tree(['tree/file'])
 
2340
        work_tree.add('file', 'file-id')
 
2341
        preview = TransformPreview(work_tree)
 
2342
        self.addCleanup(preview.finalize)
 
2343
        file_trans_id = preview.trans_id_tree_file_id('file-id')
 
2344
        preview.adjust_path('renamed', preview.root, file_trans_id)
 
2345
        preview_tree = preview.get_preview_tree()
 
2346
        preview_mtime = preview_tree.get_file_mtime('file-id', 'renamed')
 
2347
        work_mtime = work_tree.get_file_mtime('file-id', 'file')
 
2348
 
2277
2349
    def test_get_file(self):
2278
2350
        preview = self.get_empty_preview()
2279
2351
        preview.new_file('file', preview.root, 'contents', 'file-id')
2427
2499
        self.assertEqual(('missing', None, None, None), summary)
2428
2500
 
2429
2501
    def test_file_content_summary_executable(self):
2430
 
        if not osutils.supports_executable():
2431
 
            raise TestNotApplicable()
2432
2502
        preview = self.get_empty_preview()
2433
2503
        path_id = preview.new_file('path', preview.root, 'contents', 'path-id')
2434
2504
        preview.set_executability(True, path_id)
2443
2513
        self.assertIs(None, summary[3])
2444
2514
 
2445
2515
    def test_change_executability(self):
2446
 
        if not osutils.supports_executable():
2447
 
            raise TestNotApplicable()
2448
2516
        tree = self.make_branch_and_tree('tree')
2449
2517
        self.build_tree(['tree/path'])
2450
2518
        tree.add('path')
2464
2532
        # size must be known
2465
2533
        self.assertEqual(len('contents'), summary[1])
2466
2534
        # not executable
2467
 
        if osutils.supports_executable():
2468
 
            self.assertEqual(False, summary[2])
2469
 
        else:
2470
 
            self.assertEqual(None, summary[2])
 
2535
        self.assertEqual(False, summary[2])
2471
2536
        # will not have hash (not cheap to determine)
2472
2537
        self.assertIs(None, summary[3])
2473
2538
 
2732
2797
        branch = self.make_branch('any')
2733
2798
        tree = branch.repository.revision_tree(_mod_revision.NULL_REVISION)
2734
2799
        tt = TransformPreview(tree)
 
2800
        self.addCleanup(tt.finalize)
2735
2801
        foo_id = tt.new_directory('', ROOT_PARENT)
2736
2802
        bar_id = tt.new_file(u'\u1234bar', foo_id, 'contents')
2737
2803
        limbo_path = tt._limbo_name(bar_id)