/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 breezy/tests/per_repository/test_repository.py

  • Committer: Jelmer Vernooij
  • Date: 2019-03-04 00:16:27 UTC
  • mfrom: (7293 work)
  • mto: This revision was merged to the branch mainline in revision 7318.
  • Revision ID: jelmer@jelmer.uk-20190304001627-v6u7o6pf97tukhek
Merge trunk.

Show diffs side-by-side

added added

removed removed

Lines of Context:
63
63
        # type would invalidate the tests.
64
64
        tree = self.make_branch_and_tree('repo')
65
65
        self.assertIsInstance(tree.branch.repository._format,
66
 
            self.repository_format.__class__)
 
66
                              self.repository_format.__class__)
67
67
 
68
68
 
69
69
class TestRepository(per_repository.TestCaseWithRepository):
73
73
        repo = self.make_repository('repo')
74
74
        self.assertIn(getattr(repo._format, attribute), allowed_values)
75
75
 
 
76
    def assertRepositoryAttribute(self, attribute, allowed_values):
 
77
        """Assert that the repo has an attribute 'attribute'."""
 
78
        repo = self.make_repository('repo')
 
79
        self.assertIn(getattr(repo, attribute), allowed_values)
 
80
 
76
81
    def test_attribute_fast_deltas(self):
77
82
        """Test the format.fast_deltas attribute."""
78
83
        self.assertFormatAttribute('fast_deltas', (True, False))
80
85
    def test_attribute_supports_nesting_repositories(self):
81
86
        """Test the format.supports_nesting_repositories."""
82
87
        self.assertFormatAttribute('supports_nesting_repositories',
83
 
            (True, False))
 
88
                                   (True, False))
84
89
 
85
90
    def test_attribute_supports_unreferenced_revisions(self):
86
91
        """Test the format.supports_unreferenced_revisions."""
87
92
        self.assertFormatAttribute('supports_unreferenced_revisions',
88
 
            (True, False))
 
93
                                   (True, False))
89
94
 
90
95
    def test_attribute__fetch_reconcile(self):
91
96
        """Test the _fetch_reconcile attribute."""
99
104
 
100
105
    def test_attribute_format_supports_full_versioned_files(self):
101
106
        self.assertFormatAttribute('supports_full_versioned_files',
102
 
            (True, False))
 
107
                                   (True, False))
103
108
 
104
109
    def test_attribute_format_supports_funky_characters(self):
105
110
        self.assertFormatAttribute('supports_funky_characters',
106
 
            (True, False))
 
111
                                   (True, False))
107
112
 
108
113
    def test_attribute_format_supports_leaving_lock(self):
109
114
        self.assertFormatAttribute('supports_leaving_lock',
110
 
            (True, False))
 
115
                                   (True, False))
111
116
 
112
117
    def test_attribute_format_versioned_directories(self):
113
 
        self.assertFormatAttribute('supports_versioned_directories', (True, False))
 
118
        self.assertFormatAttribute(
 
119
            'supports_versioned_directories', (True, False))
114
120
 
115
121
    def test_attribute_format_revision_graph_can_have_wrong_parents(self):
116
122
        self.assertFormatAttribute('revision_graph_can_have_wrong_parents',
117
 
            (True, False))
 
123
                                   (True, False))
 
124
 
 
125
    def test_attribute_format_supports_random_access(self):
 
126
        self.assertRepositoryAttribute('supports_random_access', (True, False))
118
127
 
119
128
    def test_attribute_format_supports_setting_revision_ids(self):
120
129
        self.assertFormatAttribute('supports_setting_revision_ids',
121
 
            (True, False))
 
130
                                   (True, False))
122
131
 
123
132
    def test_attribute_format_supports_storing_branch_nick(self):
124
133
        self.assertFormatAttribute('supports_storing_branch_nick',
125
 
            (True, False))
 
134
                                   (True, False))
126
135
 
127
136
    def test_attribute_format_supports_custom_revision_properties(self):
128
137
        self.assertFormatAttribute(
129
 
                'supports_custom_revision_properties',
130
 
                (True, False))
 
138
            'supports_custom_revision_properties',
 
139
            (True, False))
131
140
 
132
141
    def test_attribute_format_supports_overriding_transport(self):
133
142
        repo = self.make_repository('repo')
134
 
        self.assertIn(repo._format.supports_overriding_transport, (True, False))
 
143
        self.assertIn(
 
144
            repo._format.supports_overriding_transport, (True, False))
135
145
 
136
146
        repo.control_transport.copy_tree('.', '../repository.backup')
137
147
        backup_transport = repo.control_transport.clone('../repository.backup')
138
148
        if repo._format.supports_overriding_transport:
139
149
            backup = repo._format.open(
140
 
                    repo.controldir,
141
 
                    _override_transport=backup_transport)
 
150
                repo.controldir,
 
151
                _override_transport=backup_transport)
142
152
            self.assertIs(backup_transport, backup.control_transport)
143
153
        else:
144
154
            self.assertRaises(TypeError, repo._format.open,
145
 
                    repo.controldir, _override_transport=backup_transport)
 
155
                              repo.controldir, _override_transport=backup_transport)
146
156
 
147
157
    def test_format_is_deprecated(self):
148
158
        repo = self.make_repository('repo')
154
164
 
155
165
    def test_attribute_format_records_per_file_revision(self):
156
166
        self.assertFormatAttribute('records_per_file_revision',
157
 
            (True, False))
 
167
                                   (True, False))
158
168
 
159
169
    def test_clone_to_default_format(self):
160
 
        #TODO: Test that cloning a repository preserves all the information
 
170
        # TODO: Test that cloning a repository preserves all the information
161
171
        # such as signatures[not tested yet] etc etc.
162
172
        # when changing to the current default format.
163
173
        tree_a = self.make_branch_and_tree('a')
180
190
        rev_tree = tree.branch.repository.revision_tree(second_revision)
181
191
        rev_tree.lock_read()
182
192
        self.addCleanup(rev_tree.unlock)
183
 
        root_revision = rev_tree.get_file_revision(u'', rev_tree.get_root_id())
 
193
        root_revision = rev_tree.get_file_revision(u'')
184
194
        rich_root = (root_revision != second_revision)
185
195
        self.assertEqual(rich_root,
186
196
                         tree.branch.repository.supports_rich_root())
221
231
        except NotImplementedError:
222
232
            return
223
233
        self.assertEqual(self.repository_format,
224
 
             bzrrepository.RepositoryFormatMetaDir.find_format(opened_control))
 
234
                         bzrrepository.RepositoryFormatMetaDir.find_format(opened_control))
225
235
 
226
236
    def test_format_matchingcontroldir(self):
227
237
        self.assertEqual(self.repository_format,
228
 
            self.repository_format._matchingcontroldir.repository_format)
 
238
                         self.repository_format._matchingcontroldir.repository_format)
229
239
        self.assertEqual(self.repository_format,
230
 
            self.bzrdir_format.repository_format)
 
240
                         self.bzrdir_format.repository_format)
231
241
 
232
242
    def test_format_network_name(self):
233
243
        repo = self.make_repository('r')
288
298
        rev1 = wt.commit('lala!', allow_pointless=True)
289
299
        root_id = wt.path2id('')
290
300
        tree = wt.branch.repository.revision_tree(rev1)
291
 
        tree.lock_read()
292
 
        try:
293
 
            self.assertEqual(rev1,
294
 
                tree.get_file_revision(u'', tree.get_root_id()))
 
301
        with tree.lock_read():
 
302
            self.assertEqual(rev1, tree.get_file_revision(u''))
295
303
            expected = inventory.InventoryDirectory(root_id, '', None)
296
304
            expected.revision = rev1
297
 
            self.assertEqual([('', 'V', 'directory', root_id, expected)],
 
305
            self.assertEqual([('', 'V', 'directory', expected)],
298
306
                             list(tree.list_files(include_root=True)))
299
 
        finally:
300
 
            tree.unlock()
301
307
        self.assertRaises(ValueError, wt.branch.repository.revision_tree, None)
302
308
        tree = wt.branch.repository.revision_tree(_mod_revision.NULL_REVISION)
303
 
        tree.lock_read()
304
 
        try:
 
309
        with tree.lock_read():
305
310
            self.assertEqual([], list(tree.list_files(include_root=True)))
306
 
        finally:
307
 
            tree.unlock()
308
311
 
309
312
    def test_get_revision_delta(self):
310
313
        tree_a = self.make_branch_and_tree('a')
371
374
            repo.sign_revision(a, gpg.LoopbackGPGStrategy(None))
372
375
        except errors.UnsupportedOperation:
373
376
            self.assertFalse(repo._format.supports_revision_signatures)
374
 
            raise tests.TestNotApplicable("signatures not supported by repository format")
 
377
            raise tests.TestNotApplicable(
 
378
                "signatures not supported by repository format")
375
379
        repo.commit_write_group()
376
380
        repo.unlock()
377
381
        old_signature = repo.get_signature_text(a)
411
415
            # roundtrip xml invalid characters in the xml-based serializers.
412
416
            escaped_message, escape_count = re.subn(
413
417
                u'[^\x09\x0A\x0D\u0020-\uD7FF\uE000-\uFFFD]+',
414
 
                lambda match: match.group(0).encode('unicode_escape').decode('ascii'),
 
418
                lambda match: match.group(0).encode(
 
419
                    'unicode_escape').decode('ascii'),
415
420
                message)
416
421
            self.assertEqual(rev.message, escaped_message)
417
422
        else:
431
436
        # into '\n' anyway
432
437
        unichars[ord('\r')] = u'\n'
433
438
        self.assertMessageRoundtrips(
434
 
            u"All 8-bit chars: " +  ''.join(unichars))
 
439
            u"All 8-bit chars: " + ''.join(unichars))
435
440
 
436
441
    def test_check_repository(self):
437
442
        """Check a fairly simple repository's history"""
481
486
        rev_tree.lock_read()
482
487
        self.addCleanup(rev_tree.unlock)
483
488
        root_id = rev_tree.get_root_id()
484
 
        self.assertEqual(revid, rev_tree.get_file_revision(u'', root_id))
 
489
        self.assertEqual(revid, rev_tree.get_file_revision(u''))
485
490
 
486
491
    def test_pointless_commit(self):
487
492
        tree = self.make_branch_and_tree('.')
515
520
                         [(file1_id, rev1, 'file1-old'),
516
521
                          (file1_id, rev2, 'file1-new'),
517
522
                          (file2_id, rev1, 'file2'),
518
 
                         ]))
 
523
                          ]))
519
524
        self.assertEqual(b'foo', extracted['file1-old'])
520
525
        self.assertEqual(b'bar', extracted['file2'])
521
526
        self.assertEqual(b'baz', extracted['file1-new'])
522
527
        self.assertRaises(errors.RevisionNotPresent, list,
523
528
                          repository.iter_files_bytes(
524
 
                          [(file1_id, b'rev3', 'file1-notpresent')]))
 
529
                              [(file1_id, b'rev3', 'file1-notpresent')]))
525
530
        self.assertRaises((errors.RevisionNotPresent, errors.NoSuchId), list,
526
531
                          repository.iter_files_bytes(
527
532
                          [(b'file3-id', b'rev3', 'file1-notpresent')]))
607
612
        self.addCleanup(b.unlock)
608
613
        if b.repository._format.supports_revision_signatures:
609
614
            b.repository.start_write_group()
610
 
            b.repository.add_signature_text(rev_a, b'This might be a signature')
 
615
            b.repository.add_signature_text(
 
616
                rev_a, b'This might be a signature')
611
617
            b.repository.commit_write_group()
612
618
            self.assertEqual(b'This might be a signature',
613
619
                             b.repository.get_signature_text(rev_a))
615
621
            b.repository.start_write_group()
616
622
            self.addCleanup(b.repository.abort_write_group)
617
623
            self.assertRaises(errors.UnsupportedOperation,
618
 
                b.repository.add_signature_text, rev_a,
619
 
                b'This might be a signature')
 
624
                              b.repository.add_signature_text, rev_a,
 
625
                              b'This might be a signature')
620
626
 
621
627
    # XXX: this helper duplicated from tests.test_repository
622
628
    def make_remote_repository(self, path, shared=None):
684
690
        from breezy.bzr.fullhistory import BzrBranchFormat5
685
691
        format = remote_backing_repo.controldir.cloning_metadir()
686
692
        format._branch_format = BzrBranchFormat5()
687
 
        remote_transport = remote_repo.controldir.root_transport.clone('branch')
 
693
        remote_transport = remote_repo.controldir.root_transport.clone(
 
694
            'branch')
688
695
        controldir.ControlDir.create_branch_convenience(
689
696
            remote_transport.base, force_new_repo=False, format=format)
690
697
        remote_branch = controldir.ControlDir.open_from_transport(
703
710
                "Cannot lock pre_metadir_formats remotely.")
704
711
        remote_transport = self.make_smart_server('remote')
705
712
        local_branch = self.make_branch('local')
706
 
        remote_branch = local_branch.create_clone_on_transport(remote_transport)
 
713
        remote_branch = local_branch.create_clone_on_transport(
 
714
            remote_transport)
707
715
        self.assertEqual(
708
716
            local_branch.repository._format.supports_external_lookups,
709
717
            remote_branch.repository._format.supports_external_lookups)
738
746
        else:
739
747
            info_repo = repo
740
748
        format_description = info.describe_format(info_repo.controldir,
741
 
            info_repo, None, None)
 
749
                                                  info_repo, None, None)
742
750
        formats = format_description.split(' or ')
743
751
        stack_on_format = formats[0]
744
752
        if stack_on_format in ["pack-0.92", "dirstate", "metaweave"]:
745
753
            stack_on_format = "1.9"
746
754
        elif stack_on_format in ["dirstate-with-subtree", "rich-root",
747
 
            "rich-root-pack", "pack-0.92-subtree"]:
 
755
                                 "rich-root-pack", "pack-0.92-subtree"]:
748
756
            stack_on_format = "1.9-rich-root"
749
757
        # formats not tested for above are already stackable, so we can use the
750
758
        # format as-is.
751
759
        stack_on = self.make_branch('stack-on-me', format=stack_on_format)
752
 
        self.make_controldir('.').get_config().set_default_stack_on('stack-on-me')
 
760
        self.make_controldir('.').get_config(
 
761
        ).set_default_stack_on('stack-on-me')
753
762
        target = branch.controldir.clone(self.get_url('target'))
754
763
        # The target branch supports stacking.
755
764
        self.assertTrue(target.open_branch()._format.supports_stacking())
779
788
        repo = made_control.create_repository(shared=shared)
780
789
        if not repo._format.supports_nesting_repositories:
781
790
            raise tests.TestNotApplicable("repository does not support "
782
 
                "nesting repositories")
 
791
                                          "nesting repositories")
783
792
        controldir.ControlDir.create_branch_convenience(
784
793
            self.get_url('repository/foo'), force_new_repo=False)
785
794
        controldir.ControlDir.create_branch_convenience(
821
830
        branch = self.make_branch('branch')
822
831
        if not branch.repository._format.supports_nesting_repositories:
823
832
            raise tests.TestNotApplicable("format does not support nesting "
824
 
                "repositories")
 
833
                                          "repositories")
825
834
        contained = self.make_branch('branch/contained')
826
835
        branches = branch.repository.find_branches(using=True)
827
836
        self.assertEqual([branch.base], [b.base for b in branches])
834
843
            repo = self.make_repository('repo', shared=False)
835
844
        except errors.IncompatibleFormat:
836
845
            raise tests.TestNotApplicable("format does not support standalone "
837
 
                "repositories")
 
846
                                          "repositories")
838
847
        try:
839
848
            repo.controldir.open_branch()
840
849
        except errors.NotBranchError:
871
880
            if token is None:
872
881
                # This test does not apply, because this repository refuses lock
873
882
                # tokens.
874
 
                self.assertRaises(NotImplementedError, repo.leave_lock_in_place)
 
883
                self.assertRaises(NotImplementedError,
 
884
                                  repo.leave_lock_in_place)
875
885
                return
876
886
            repo.leave_lock_in_place()
877
887
        finally:
964
974
        revtree = branch.repository.revision_tree(rev1)
965
975
        revtree.lock_read()
966
976
        self.addCleanup(revtree.unlock)
967
 
        contents = revtree.get_file_text(revtree.id2path(FOO_ID), FOO_ID)
 
977
        contents = revtree.get_file_text('foo')
968
978
        self.assertEqual(contents, b'contents of repo/foo\n')
969
979
 
970
980
    def test_create_bundle(self):
1007
1017
    def test_multiple_files(self):
1008
1018
        # Test multiple files
1009
1019
        delta = self.repository.get_revision_delta(
1010
 
                self.rev1, specific_fileids=[
1011
 
                    self.tree_a.path2id('foo'),
1012
 
                    self.tree_a.path2id('baz')])
 
1020
            self.rev1, specific_fileids=[
 
1021
                self.tree_a.path2id('foo'),
 
1022
                self.tree_a.path2id('baz')])
1013
1023
        self.assertIsInstance(delta, _mod_delta.TreeDelta)
1014
1024
        self.assertEqual([
1015
1025
            ('baz', self.tree_a.path2id('baz'), 'file'),
1019
1029
    def test_directory(self):
1020
1030
        # Test a directory
1021
1031
        delta = self.repository.get_revision_delta(
1022
 
                self.rev1, specific_fileids=[self.bar_id])
 
1032
            self.rev1, specific_fileids=[self.bar_id])
1023
1033
        self.assertIsInstance(delta, _mod_delta.TreeDelta)
1024
1034
        self.assertEqual([
1025
1035
            ('bar', self.tree_a.path2id('bar'), 'directory'),
1030
1040
    def test_unrelated(self):
1031
1041
        # Try another revision
1032
1042
        delta = self.repository.get_revision_delta(
1033
 
                self.rev2, specific_fileids=[self.tree_a.path2id('foo')])
 
1043
            self.rev2, specific_fileids=[self.tree_a.path2id('foo')])
1034
1044
        self.assertIsInstance(delta, _mod_delta.TreeDelta)
1035
1045
        self.assertEqual([], delta.added)
1036
1046
 
1037
1047
    def test_file_in_directory(self):
1038
1048
        # Test a file in a directory, both of which were added
1039
1049
        delta = self.repository.get_revision_delta(
1040
 
                self.rev1, specific_fileids=[self.tree_a.path2id('bar/b2')])
 
1050
            self.rev1, specific_fileids=[self.tree_a.path2id('bar/b2')])
1041
1051
        self.assertIsInstance(delta, _mod_delta.TreeDelta)
1042
1052
        self.assertEqual([
1043
1053
            ('bar', self.tree_a.path2id('bar'), 'directory'),
1046
1056
 
1047
1057
    def test_file_in_unchanged_directory(self):
1048
1058
        delta = self.repository.get_revision_delta(self.rev2,
1049
 
            specific_fileids=[self.tree_a.path2id('bar/b3')])
 
1059
                                                   specific_fileids=[self.tree_a.path2id('bar/b3')])
1050
1060
        self.assertIsInstance(delta, _mod_delta.TreeDelta)
1051
1061
        if delta.added == [
1052
1062
            ('bar', self.tree_a.path2id('bar'), 'directory'),
1053
 
            ('bar/b3', self.tree_a.path2id('bar/b3'), 'file')]:
 
1063
                ('bar/b3', self.tree_a.path2id('bar/b3'), 'file')]:
1054
1064
            self.knownFailure("bzr incorrectly reports 'bar' as added - "
1055
1065
                              "bug 878217")
1056
1066
        self.assertEqual([