/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_bundle.py

  • Committer: Jelmer Vernooij
  • Date: 2009-05-28 16:04:39 UTC
  • mfrom: (4387 +trunk)
  • mto: This revision was merged to the branch mainline in revision 4405.
  • Revision ID: jelmer@samba.org-20090528160439-4z0xlrk5nejobm7q
Merge bzr.dev.

Show diffs side-by-side

added added

removed removed

Lines of Context:
22
22
 
23
23
from bzrlib import (
24
24
    bzrdir,
 
25
    diff,
25
26
    errors,
26
27
    inventory,
 
28
    merge,
27
29
    osutils,
28
30
    repository,
29
31
    revision as _mod_revision,
 
32
    tests,
30
33
    treebuilder,
31
34
    )
32
35
from bzrlib.bundle import read_mergeable_from_url
39
42
from bzrlib.bundle.serializer.v09 import BundleSerializerV09
40
43
from bzrlib.bundle.serializer.v4 import BundleSerializerV4
41
44
from bzrlib.branch import Branch
42
 
from bzrlib.diff import internal_diff
43
 
from bzrlib.merge import Merge3Merger
44
45
from bzrlib.repofmt import knitrepo
45
 
from bzrlib.osutils import sha_file, sha_string
46
46
from bzrlib.tests import (
47
 
    SymlinkFeature,
48
 
    TestCase,
49
 
    TestCaseInTempDir,
50
 
    TestCaseWithTransport,
51
 
    TestSkipped,
52
47
    test_read_bundle,
53
48
    test_commit,
54
49
    )
137
132
    def contents_stats(self, file_id):
138
133
        if file_id not in self.contents:
139
134
            return None, None
140
 
        text_sha1 = sha_file(self.get_file(file_id))
 
135
        text_sha1 = osutils.sha_file(self.get_file(file_id))
141
136
        return text_sha1, len(self.contents[file_id])
142
137
 
143
138
 
144
 
class BTreeTester(TestCase):
 
139
class BTreeTester(tests.TestCase):
145
140
    """A simple unittest tester for the BundleTree class."""
146
141
 
147
142
    def make_tree_1(self):
225
220
 
226
221
    def unified_diff(self, old, new):
227
222
        out = StringIO()
228
 
        internal_diff("old", old, "new", new, out)
 
223
        diff.internal_diff("old", old, "new", new, out)
229
224
        out.seek(0,0)
230
225
        return out.read()
231
226
 
319
314
            [inventory.ROOT_ID, 'a', 'b', 'd', 'e'])
320
315
 
321
316
 
322
 
class BundleTester1(TestCaseWithTransport):
 
317
class BundleTester1(tests.TestCaseWithTransport):
323
318
 
324
319
    def test_mismatched_bundle(self):
325
320
        format = bzrdir.BzrDirMetaFormat1()
366
361
    def make_branch_and_tree(self, path, format=None):
367
362
        if format is None:
368
363
            format = self.bzrdir_format()
369
 
        return TestCaseWithTransport.make_branch_and_tree(self, path, format)
 
364
        return tests.TestCaseWithTransport.make_branch_and_tree(
 
365
            self, path, format)
370
366
 
371
367
    def make_branch(self, path, format=None):
372
368
        if format is None:
373
369
            format = self.bzrdir_format()
374
 
        return TestCaseWithTransport.make_branch(self, path, format)
 
370
        return tests.TestCaseWithTransport.make_branch(self, path, format)
375
371
 
376
372
    def create_bundle_text(self, base_rev_id, rev_id):
377
373
        bundle_txt = StringIO()
521
517
            self.assert_(not repository.has_revision(rev.revision_id),
522
518
                'Revision {%s} present before applying bundle'
523
519
                % rev.revision_id)
524
 
        merge_bundle(info, to_tree, True, Merge3Merger, False, False)
 
520
        merge_bundle(info, to_tree, True, merge.Merge3Merger, False, False)
525
521
 
526
522
        for rev in info.real_revisions:
527
523
            self.assert_(repository.has_revision(rev.revision_id),
661
657
                          verbose=False)
662
658
        bundle = self.get_valid_bundle('a@cset-0-6', 'a@cset-0-7')
663
659
 
664
 
    def test_symlink_bundle(self):
665
 
        self.requireFeature(SymlinkFeature)
 
660
    def _test_symlink_bundle(self, link_name, link_target, new_link_target):
 
661
        link_id = 'link-1'
 
662
 
 
663
        self.requireFeature(tests.SymlinkFeature)
666
664
        self.tree1 = self.make_branch_and_tree('b1')
667
665
        self.b1 = self.tree1.branch
 
666
 
668
667
        tt = TreeTransform(self.tree1)
669
 
        tt.new_symlink('link', tt.root, 'bar/foo', 'link-1')
 
668
        tt.new_symlink(link_name, tt.root, link_target, link_id)
670
669
        tt.apply()
671
670
        self.tree1.commit('add symlink', rev_id='l@cset-0-1')
672
 
        self.get_valid_bundle('null:', 'l@cset-0-1')
 
671
        bundle = self.get_valid_bundle('null:', 'l@cset-0-1')
 
672
        if getattr(bundle ,'revision_tree', None) is not None:
 
673
            # Not all bundle formats supports revision_tree
 
674
            bund_tree = bundle.revision_tree(self.b1.repository, 'l@cset-0-1')
 
675
            self.assertEqual(link_target, bund_tree.get_symlink_target(link_id))
 
676
 
673
677
        tt = TreeTransform(self.tree1)
674
 
        trans_id = tt.trans_id_tree_file_id('link-1')
 
678
        trans_id = tt.trans_id_tree_file_id(link_id)
675
679
        tt.adjust_path('link2', tt.root, trans_id)
676
680
        tt.delete_contents(trans_id)
677
 
        tt.create_symlink('mars', trans_id)
 
681
        tt.create_symlink(new_link_target, trans_id)
678
682
        tt.apply()
679
683
        self.tree1.commit('rename and change symlink', rev_id='l@cset-0-2')
680
 
        self.get_valid_bundle('l@cset-0-1', 'l@cset-0-2')
 
684
        bundle = self.get_valid_bundle('l@cset-0-1', 'l@cset-0-2')
 
685
        if getattr(bundle ,'revision_tree', None) is not None:
 
686
            # Not all bundle formats supports revision_tree
 
687
            bund_tree = bundle.revision_tree(self.b1.repository, 'l@cset-0-2')
 
688
            self.assertEqual(new_link_target,
 
689
                             bund_tree.get_symlink_target(link_id))
 
690
 
681
691
        tt = TreeTransform(self.tree1)
682
 
        trans_id = tt.trans_id_tree_file_id('link-1')
 
692
        trans_id = tt.trans_id_tree_file_id(link_id)
683
693
        tt.delete_contents(trans_id)
684
694
        tt.create_symlink('jupiter', trans_id)
685
695
        tt.apply()
686
696
        self.tree1.commit('just change symlink target', rev_id='l@cset-0-3')
687
 
        self.get_valid_bundle('l@cset-0-2', 'l@cset-0-3')
 
697
        bundle = self.get_valid_bundle('l@cset-0-2', 'l@cset-0-3')
 
698
 
688
699
        tt = TreeTransform(self.tree1)
689
 
        trans_id = tt.trans_id_tree_file_id('link-1')
 
700
        trans_id = tt.trans_id_tree_file_id(link_id)
690
701
        tt.delete_contents(trans_id)
691
702
        tt.apply()
692
703
        self.tree1.commit('Delete symlink', rev_id='l@cset-0-4')
693
 
        self.get_valid_bundle('l@cset-0-3', 'l@cset-0-4')
 
704
        bundle = self.get_valid_bundle('l@cset-0-3', 'l@cset-0-4')
 
705
 
 
706
    def test_symlink_bundle(self):
 
707
        self._test_symlink_bundle('link', 'bar/foo', 'mars')
 
708
 
 
709
    def test_unicode_symlink_bundle(self):
 
710
        self.requireFeature(tests.UnicodeFilenameFeature)
 
711
        self._test_symlink_bundle(u'\N{Euro Sign}link',
 
712
                                  u'bar/\N{Euro Sign}foo',
 
713
                                  u'mars\N{Euro Sign}')
694
714
 
695
715
    def test_binary_bundle(self):
696
716
        self.tree1 = self.make_branch_and_tree('b1')
794
814
        return bundle_file.getvalue()
795
815
 
796
816
    def test_unicode_bundle(self):
 
817
        self.requireFeature(tests.UnicodeFilenameFeature)
797
818
        # Handle international characters
798
819
        os.mkdir('b1')
799
 
        try:
800
 
            f = open(u'b1/with Dod\N{Euro Sign}', 'wb')
801
 
        except UnicodeEncodeError:
802
 
            raise TestSkipped("Filesystem doesn't support unicode")
 
820
        f = open(u'b1/with Dod\N{Euro Sign}', 'wb')
803
821
 
804
822
        self.tree1 = self.make_branch_and_tree('b1')
805
823
        self.b1 = self.tree1.branch
843
861
 
844
862
    def test_whitespace_bundle(self):
845
863
        if sys.platform in ('win32', 'cygwin'):
846
 
            raise TestSkipped('Windows doesn\'t support filenames'
847
 
                              ' with tabs or trailing spaces')
 
864
            raise tests.TestSkipped('Windows doesn\'t support filenames'
 
865
                                    ' with tabs or trailing spaces')
848
866
        self.tree1 = self.make_branch_and_tree('b1')
849
867
        self.b1 = self.tree1.branch
850
868
 
1030
1048
        repo = self.make_repo_with_installed_revisions()
1031
1049
        recorded_inv_sha1 = repo.get_inventory_sha1('rev2')
1032
1050
        xml = repo.get_inventory_xml('rev2')
1033
 
        self.assertEqual(sha_string(xml), recorded_inv_sha1)
 
1051
        self.assertEqual(osutils.sha_string(xml), recorded_inv_sha1)
1034
1052
 
1035
1053
    def test_across_models_incompatible(self):
1036
1054
        tree = self.make_simple_tree('dirstate-with-subtree')
1039
1057
        try:
1040
1058
            bundle = read_bundle(self.create_bundle_text('null:', 'rev1')[0])
1041
1059
        except errors.IncompatibleBundleFormat:
1042
 
            raise TestSkipped("Format 0.8 doesn't work with knit3")
 
1060
            raise tests.TestSkipped("Format 0.8 doesn't work with knit3")
1043
1061
        repo = self.make_repository('repo', format='knit')
1044
1062
        bundle.install_revisions(repo)
1045
1063
 
1066
1084
        try:
1067
1085
            bundle = read_bundle(self.create_bundle_text('null:', 'rev1')[0])
1068
1086
        except errors.IncompatibleBundleFormat:
1069
 
            raise TestSkipped("Format 0.8 doesn't work with knit3")
 
1087
            raise tests.TestSkipped("Format 0.8 doesn't work with knit3")
1070
1088
        if isinstance(bundle, v09.BundleInfo09):
1071
 
            raise TestSkipped("Format 0.9 doesn't work with subtrees")
 
1089
            raise tests.TestSkipped("Format 0.9 doesn't work with subtrees")
1072
1090
        repo = self.make_repository('repo', format='knit')
1073
1091
        self.assertRaises(errors.IncompatibleRevision,
1074
1092
                          bundle.install_revisions, repo)
1081
1099
        try:
1082
1100
            self.tree1.commit('Revision/id/with/slashes', rev_id='rev/id')
1083
1101
        except ValueError:
1084
 
            raise TestSkipped("Repository doesn't support revision ids with"
1085
 
                              " slashes")
 
1102
            raise tests.TestSkipped(
 
1103
                "Repository doesn't support revision ids with slashes")
1086
1104
        bundle = self.get_valid_bundle('null:', 'rev/id')
1087
1105
 
1088
1106
    def test_skip_file(self):
1104
1122
        self.tree1.commit('rev3', rev_id='rev3')
1105
1123
        bundle = self.get_valid_bundle('reva', 'rev3')
1106
1124
        if getattr(bundle, 'get_bundle_reader', None) is None:
1107
 
            raise TestSkipped('Bundle format cannot provide reader')
 
1125
            raise tests.TestSkipped('Bundle format cannot provide reader')
1108
1126
        # be sure that file1 comes before file2
1109
1127
        for b, m, k, r, f in bundle.get_bundle_reader().iter_records():
1110
1128
            if f == 'file3-id':
1113
1131
        bundle.install_revisions(target.branch.repository)
1114
1132
 
1115
1133
 
1116
 
class V08BundleTester(BundleTester, TestCaseWithTransport):
 
1134
class V08BundleTester(BundleTester, tests.TestCaseWithTransport):
1117
1135
 
1118
1136
    format = '0.8'
1119
1137
 
1252
1270
        return format
1253
1271
 
1254
1272
 
1255
 
class V4BundleTester(BundleTester, TestCaseWithTransport):
 
1273
class V4BundleTester(BundleTester, tests.TestCaseWithTransport):
1256
1274
 
1257
1275
    format = '4'
1258
1276
 
1463
1481
        self.check_valid(bundle)
1464
1482
 
1465
1483
 
1466
 
class MungedBundleTesterV09(TestCaseWithTransport, MungedBundleTester):
 
1484
class MungedBundleTesterV09(tests.TestCaseWithTransport, MungedBundleTester):
1467
1485
 
1468
1486
    format = '0.9'
1469
1487
 
1501
1519
        self.check_valid(bundle)
1502
1520
 
1503
1521
 
1504
 
class MungedBundleTesterV4(TestCaseWithTransport, MungedBundleTester):
 
1522
class MungedBundleTesterV4(tests.TestCaseWithTransport, MungedBundleTester):
1505
1523
 
1506
1524
    format = '4'
1507
1525
 
1508
1526
 
1509
 
class TestBundleWriterReader(TestCase):
 
1527
class TestBundleWriterReader(tests.TestCase):
1510
1528
 
1511
1529
    def test_roundtrip_record(self):
1512
1530
        fileobj = StringIO()
1577
1595
        self.assertRaises(errors.BadBundle, record_iter.next)
1578
1596
 
1579
1597
 
1580
 
class TestReadMergeableFromUrl(TestCaseWithTransport):
 
1598
class TestReadMergeableFromUrl(tests.TestCaseWithTransport):
1581
1599
 
1582
1600
    def test_read_mergeable_skips_local(self):
1583
1601
        """A local bundle named like the URL should not be read.