73
73
repo = self.make_repository('repo')
74
74
self.assertIn(getattr(repo._format, attribute), allowed_values)
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)
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',
85
90
def test_attribute_supports_unreferenced_revisions(self):
86
91
"""Test the format.supports_unreferenced_revisions."""
87
92
self.assertFormatAttribute('supports_unreferenced_revisions',
90
95
def test_attribute__fetch_reconcile(self):
91
96
"""Test the _fetch_reconcile attribute."""
100
105
def test_attribute_format_supports_full_versioned_files(self):
101
106
self.assertFormatAttribute('supports_full_versioned_files',
104
109
def test_attribute_format_supports_funky_characters(self):
105
110
self.assertFormatAttribute('supports_funky_characters',
108
113
def test_attribute_format_supports_leaving_lock(self):
109
114
self.assertFormatAttribute('supports_leaving_lock',
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))
115
121
def test_attribute_format_revision_graph_can_have_wrong_parents(self):
116
122
self.assertFormatAttribute('revision_graph_can_have_wrong_parents',
125
def test_attribute_format_supports_random_access(self):
126
self.assertRepositoryAttribute('supports_random_access', (True, False))
119
128
def test_attribute_format_supports_setting_revision_ids(self):
120
129
self.assertFormatAttribute('supports_setting_revision_ids',
123
132
def test_attribute_format_supports_storing_branch_nick(self):
124
133
self.assertFormatAttribute('supports_storing_branch_nick',
127
136
def test_attribute_format_supports_custom_revision_properties(self):
128
137
self.assertFormatAttribute(
129
'supports_custom_revision_properties',
138
'supports_custom_revision_properties',
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))
144
repo._format.supports_overriding_transport, (True, False))
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(
141
_override_transport=backup_transport)
151
_override_transport=backup_transport)
142
152
self.assertIs(backup_transport, backup.control_transport)
144
154
self.assertRaises(TypeError, repo._format.open,
145
repo.controldir, _override_transport=backup_transport)
155
repo.controldir, _override_transport=backup_transport)
147
157
def test_format_is_deprecated(self):
148
158
repo = self.make_repository('repo')
155
165
def test_attribute_format_records_per_file_revision(self):
156
166
self.assertFormatAttribute('records_per_file_revision',
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:
223
233
self.assertEqual(self.repository_format,
224
bzrrepository.RepositoryFormatMetaDir.find_format(opened_control))
234
bzrrepository.RepositoryFormatMetaDir.find_format(opened_control))
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)
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)
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)))
301
307
self.assertRaises(ValueError, wt.branch.repository.revision_tree, None)
302
308
tree = wt.branch.repository.revision_tree(_mod_revision.NULL_REVISION)
309
with tree.lock_read():
305
310
self.assertEqual([], list(tree.list_files(include_root=True)))
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()
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'),
416
421
self.assertEqual(rev.message, escaped_message)
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''))
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'),
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')
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(
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(
707
715
self.assertEqual(
708
716
local_branch.repository._format.supports_external_lookups,
709
717
remote_branch.repository._format.supports_external_lookups)
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
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 "
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])
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')
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)
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'),
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 - "
1056
1066
self.assertEqual([