138
136
# this is not quite the same as
139
137
self.build_tree(["foo/", "bar/"])
140
138
def check_format(format, url):
141
dir = format._matchingcontroldir.initialize(url)
139
dir = format._matchingbzrdir.initialize(url)
142
140
format.initialize(dir)
143
141
t = transport.get_transport_from_path(url)
144
found_format = bzrrepository.RepositoryFormatMetaDir.find_format(dir)
142
found_format = repository.RepositoryFormatMetaDir.find_format(dir)
145
143
self.assertIsInstance(found_format, format.__class__)
146
144
check_format(repository.format_registry.get_default(), "bar")
148
146
def test_find_format_no_repository(self):
149
147
dir = bzrdir.BzrDirMetaFormat1().initialize(self.get_url())
150
148
self.assertRaises(errors.NoRepositoryPresent,
151
bzrrepository.RepositoryFormatMetaDir.find_format,
149
repository.RepositoryFormatMetaDir.find_format,
154
152
def test_from_string(self):
155
153
self.assertIsInstance(
156
154
SampleRepositoryFormat.from_string(
157
b"Sample .bzr repository format."),
155
"Sample .bzr repository format."),
158
156
SampleRepositoryFormat)
159
157
self.assertRaises(AssertionError,
160
158
SampleRepositoryFormat.from_string,
161
b"Different .bzr repository format.")
159
"Different .bzr repository format.")
163
161
def test_find_format_unknown_format(self):
164
162
dir = bzrdir.BzrDirMetaFormat1().initialize(self.get_url())
165
163
SampleRepositoryFormat().initialize(dir)
166
164
self.assertRaises(UnknownFormatError,
167
bzrrepository.RepositoryFormatMetaDir.find_format,
165
repository.RepositoryFormatMetaDir.find_format,
170
168
def test_find_format_with_features(self):
171
169
tree = self.make_branch_and_tree('.', format='2a')
172
tree.branch.repository.update_feature_flags({b"name": b"necessity"})
173
found_format = bzrrepository.RepositoryFormatMetaDir.find_format(tree.controldir)
174
self.assertIsInstance(found_format, bzrrepository.RepositoryFormatMetaDir)
175
self.assertEqual(found_format.features.get(b"name"), b"necessity")
176
self.assertRaises(bzrdir.MissingFeature, found_format.check_support_status,
170
tree.branch.repository.update_feature_flags({"name": "necessity"})
171
found_format = repository.RepositoryFormatMetaDir.find_format(tree.bzrdir)
172
self.assertIsInstance(found_format, repository.RepositoryFormatMetaDir)
173
self.assertEquals(found_format.features.get("name"), "necessity")
174
self.assertRaises(errors.MissingFeature, found_format.check_support_status,
178
self.addCleanup(bzrrepository.RepositoryFormatMetaDir.unregister_feature,
180
bzrrepository.RepositoryFormatMetaDir.register_feature(b"name")
176
self.addCleanup(repository.RepositoryFormatMetaDir.unregister_feature,
178
repository.RepositoryFormatMetaDir.register_feature("name")
181
179
found_format.check_support_status(True)
190
188
def test_register_unregister_format(self):
191
189
format = SampleRepositoryFormat()
192
190
self.registry.register(format)
193
self.assertEqual(format, self.registry.get(b"Sample .bzr repository format."))
191
self.assertEquals(format, self.registry.get("Sample .bzr repository format."))
194
192
self.registry.remove(format)
195
self.assertRaises(KeyError, self.registry.get, b"Sample .bzr repository format.")
193
self.assertRaises(KeyError, self.registry.get, "Sample .bzr repository format.")
197
195
def test_get_all(self):
198
196
format = SampleRepositoryFormat()
199
self.assertEqual([], self.registry._get_all())
197
self.assertEquals([], self.registry._get_all())
200
198
self.registry.register(format)
201
self.assertEqual([format], self.registry._get_all())
199
self.assertEquals([format], self.registry._get_all())
203
201
def test_register_extra(self):
204
202
format = SampleExtraRepositoryFormat()
205
self.assertEqual([], self.registry._get_all())
203
self.assertEquals([], self.registry._get_all())
206
204
self.registry.register_extra(format)
207
self.assertEqual([format], self.registry._get_all())
205
self.assertEquals([format], self.registry._get_all())
209
207
def test_register_extra_lazy(self):
210
self.assertEqual([], self.registry._get_all())
211
self.registry.register_extra_lazy("breezy.tests.test_repository",
208
self.assertEquals([], self.registry._get_all())
209
self.registry.register_extra_lazy("bzrlib.tests.test_repository",
212
210
"SampleExtraRepositoryFormat")
213
211
formats = self.registry._get_all()
214
self.assertEqual(1, len(formats))
212
self.assertEquals(1, len(formats))
215
213
self.assertIsInstance(formats[0], SampleExtraRepositoryFormat)
552
553
def test_fetch_combines_groups(self):
553
554
builder = self.make_branch_builder('source', format='2a')
554
555
builder.start_series()
555
builder.build_snapshot(None, [
556
('add', ('', b'root-id', 'directory', '')),
557
('add', ('file', b'file-id', 'file', b'content\n'))],
559
builder.build_snapshot([b'1'], [
560
('modify', ('file', b'content-2\n'))],
562
builder.finish_series()
563
source = builder.get_branch()
564
target = self.make_repository('target', format='2a')
565
target.fetch(source.repository)
567
self.addCleanup(target.unlock)
568
details = target.texts._index.get_build_details(
569
[(b'file-id', b'1',), (b'file-id', b'2',)])
570
file_1_details = details[(b'file-id', b'1')]
571
file_2_details = details[(b'file-id', b'2')]
572
# The index, and what to read off disk, should be the same for both
573
# versions of the file.
574
self.assertEqual(file_1_details[0][:3], file_2_details[0][:3])
576
def test_fetch_combines_groups(self):
577
builder = self.make_branch_builder('source', format='2a')
578
builder.start_series()
579
builder.build_snapshot(None, [
580
('add', ('', b'root-id', 'directory', '')),
581
('add', ('file', b'file-id', 'file', 'content\n'))],
583
builder.build_snapshot([b'1'], [
584
('modify', ('file', b'content-2\n'))],
586
builder.finish_series()
587
source = builder.get_branch()
588
target = self.make_repository('target', format='2a')
589
target.fetch(source.repository)
591
self.addCleanup(target.unlock)
592
details = target.texts._index.get_build_details(
593
[(b'file-id', b'1',), (b'file-id', b'2',)])
594
file_1_details = details[(b'file-id', b'1')]
595
file_2_details = details[(b'file-id', b'2')]
596
# The index, and what to read off disk, should be the same for both
597
# versions of the file.
598
self.assertEqual(file_1_details[0][:3], file_2_details[0][:3])
600
def test_fetch_combines_groups(self):
601
builder = self.make_branch_builder('source', format='2a')
602
builder.start_series()
603
builder.build_snapshot(None, [
604
('add', ('', b'root-id', 'directory', '')),
605
('add', ('file', b'file-id', 'file', 'content\n'))],
607
builder.build_snapshot([b'1'], [
608
('modify', ('file', b'content-2\n'))],
610
builder.finish_series()
611
source = builder.get_branch()
612
target = self.make_repository('target', format='2a')
613
target.fetch(source.repository)
615
self.addCleanup(target.unlock)
616
details = target.texts._index.get_build_details(
617
[(b'file-id', b'1',), (b'file-id', b'2',)])
618
file_1_details = details[(b'file-id', b'1')]
619
file_2_details = details[(b'file-id', b'2')]
556
builder.build_snapshot('1', None, [
557
('add', ('', 'root-id', 'directory', '')),
558
('add', ('file', 'file-id', 'file', 'content\n'))])
559
builder.build_snapshot('2', ['1'], [
560
('modify', ('file-id', 'content-2\n'))])
561
builder.finish_series()
562
source = builder.get_branch()
563
target = self.make_repository('target', format='2a')
564
target.fetch(source.repository)
566
self.addCleanup(target.unlock)
567
details = target.texts._index.get_build_details(
568
[('file-id', '1',), ('file-id', '2',)])
569
file_1_details = details[('file-id', '1')]
570
file_2_details = details[('file-id', '2')]
571
# The index, and what to read off disk, should be the same for both
572
# versions of the file.
573
self.assertEqual(file_1_details[0][:3], file_2_details[0][:3])
575
def test_fetch_combines_groups(self):
576
builder = self.make_branch_builder('source', format='2a')
577
builder.start_series()
578
builder.build_snapshot('1', None, [
579
('add', ('', 'root-id', 'directory', '')),
580
('add', ('file', 'file-id', 'file', 'content\n'))])
581
builder.build_snapshot('2', ['1'], [
582
('modify', ('file-id', 'content-2\n'))])
583
builder.finish_series()
584
source = builder.get_branch()
585
target = self.make_repository('target', format='2a')
586
target.fetch(source.repository)
588
self.addCleanup(target.unlock)
589
details = target.texts._index.get_build_details(
590
[('file-id', '1',), ('file-id', '2',)])
591
file_1_details = details[('file-id', '1')]
592
file_2_details = details[('file-id', '2')]
593
# The index, and what to read off disk, should be the same for both
594
# versions of the file.
595
self.assertEqual(file_1_details[0][:3], file_2_details[0][:3])
597
def test_fetch_combines_groups(self):
598
builder = self.make_branch_builder('source', format='2a')
599
builder.start_series()
600
builder.build_snapshot('1', None, [
601
('add', ('', 'root-id', 'directory', '')),
602
('add', ('file', 'file-id', 'file', 'content\n'))])
603
builder.build_snapshot('2', ['1'], [
604
('modify', ('file-id', 'content-2\n'))])
605
builder.finish_series()
606
source = builder.get_branch()
607
target = self.make_repository('target', format='2a')
608
target.fetch(source.repository)
610
self.addCleanup(target.unlock)
611
details = target.texts._index.get_build_details(
612
[('file-id', '1',), ('file-id', '2',)])
613
file_1_details = details[('file-id', '1')]
614
file_2_details = details[('file-id', '2')]
620
615
# The index, and what to read off disk, should be the same for both
621
616
# versions of the file.
622
617
self.assertEqual(file_1_details[0][:3], file_2_details[0][:3])
694
689
# We have to build a fairly large tree, so that we are sure the chk
695
690
# pages will have split into multiple pages.
696
entries = [('add', ('', b'a-root-id', 'directory', None))]
691
entries = [('add', ('', 'a-root-id', 'directory', None))]
697
692
for i in 'abcdefghijklmnopqrstuvwxyz123456789':
698
693
for j in 'abcdefghijklmnopqrstuvwxyz123456789':
700
fid = fname.encode('utf-8') + b'-id'
701
696
content = 'content for %s\n' % (fname,)
702
697
entries.append(('add', (fname, fid, 'file', content)))
703
698
source_builder.start_series()
704
source_builder.build_snapshot(None, entries, revision_id=b'rev-1')
699
source_builder.build_snapshot('rev-1', None, entries)
705
700
# Now change a few of them, so we get a few new pages for the second
707
source_builder.build_snapshot([b'rev-1'], [
708
('modify', ('aa', b'new content for aa-id\n')),
709
('modify', ('cc', b'new content for cc-id\n')),
710
('modify', ('zz', b'new content for zz-id\n')),
711
], revision_id=b'rev-2')
702
source_builder.build_snapshot('rev-2', ['rev-1'], [
703
('modify', ('aa-id', 'new content for aa-id\n')),
704
('modify', ('cc-id', 'new content for cc-id\n')),
705
('modify', ('zz-id', 'new content for zz-id\n')),
712
707
source_builder.finish_series()
713
708
source_branch = source_builder.get_branch()
714
709
source_branch.lock_read()
860
854
self.assertParentIds([], rev_set)
862
856
def test_not_null_set(self):
863
self.builder.build_snapshot(None, [], revision_id='revid1')
857
self.builder.build_snapshot('revid1', None, [])
864
858
rev_set = [_mod_revision.NULL_REVISION]
865
859
self.assertParentIds([], rev_set)
867
861
def test_ghost(self):
868
self.builder.build_snapshot(None, [], revision_id='revid1')
862
self.builder.build_snapshot('revid1', None, [])
869
863
rev_set = ['ghost', 'revid1']
870
864
self.assertParentIds(['initial'], rev_set)
872
866
def test_ghost_parent(self):
873
self.builder.build_snapshot(None, [], revision_id='revid1')
874
self.builder.build_snapshot(['revid1', 'ghost'], [], revision_id='revid2')
867
self.builder.build_snapshot('revid1', None, [])
868
self.builder.build_snapshot('revid2', ['revid1', 'ghost'], [])
875
869
rev_set = ['revid2', 'revid1']
876
870
self.assertParentIds(['ghost', 'initial'], rev_set)
878
872
def test_righthand_parent(self):
879
self.builder.build_snapshot(None, [], revision_id='revid1')
880
self.builder.build_snapshot(['revid1'], [], revision_id='revid2a')
881
self.builder.build_snapshot(['revid1'], [], revision_id='revid2b')
882
self.builder.build_snapshot(['revid2a', 'revid2b'], [],
883
revision_id='revid3')
873
self.builder.build_snapshot('revid1', None, [])
874
self.builder.build_snapshot('revid2a', ['revid1'], [])
875
self.builder.build_snapshot('revid2b', ['revid1'], [])
876
self.builder.build_snapshot('revid3', ['revid2a', 'revid2b'], [])
884
877
rev_set = ['revid3', 'revid2a']
885
878
self.assertParentIds(['revid1', 'revid2b'], rev_set)
1472
1465
def test_pack_optimizes_pack_order(self):
1473
1466
builder = self.make_branch_builder('.', format="1.9")
1474
1467
builder.start_series()
1475
builder.build_snapshot(None, [
1468
builder.build_snapshot('A', None, [
1476
1469
('add', ('', 'root-id', 'directory', None)),
1477
('add', ('f', 'f-id', 'file', 'content\n'))],
1479
builder.build_snapshot(['A'],
1480
[('modify', ('f', 'new-content\n'))],
1482
builder.build_snapshot(['B'],
1483
[('modify', ('f', 'third-content\n'))],
1485
builder.build_snapshot(['C'],
1486
[('modify', ('f', 'fourth-content\n'))],
1470
('add', ('f', 'f-id', 'file', 'content\n'))])
1471
builder.build_snapshot('B', ['A'],
1472
[('modify', ('f-id', 'new-content\n'))])
1473
builder.build_snapshot('C', ['B'],
1474
[('modify', ('f-id', 'third-content\n'))])
1475
builder.build_snapshot('D', ['C'],
1476
[('modify', ('f-id', 'fourth-content\n'))])
1488
1477
b = builder.get_branch()
1490
1479
builder.finish_series()