99
99
def make_format_registry(self):
100
100
my_format_registry = controldir.ControlDirFormatRegistry()
101
101
my_format_registry.register('deprecated', DeprecatedBzrDirFormat,
102
'Some format. Slower and unawesome and deprecated.',
102
'Some format. Slower and unawesome and deprecated.',
104
104
my_format_registry.register_lazy('lazy', 'breezy.tests.test_bzrdir',
105
'DeprecatedBzrDirFormat', 'Format registered lazily',
105
'DeprecatedBzrDirFormat', 'Format registered lazily',
107
107
bzr.register_metadir(my_format_registry, 'knit',
108
'breezy.bzr.knitrepo.RepositoryFormatKnit1',
109
'Format using knits',
108
'breezy.bzr.knitrepo.RepositoryFormatKnit1',
109
'Format using knits',
111
111
my_format_registry.set_default('knit')
112
112
bzr.register_metadir(my_format_registry,
114
'breezy.bzr.knitrepo.RepositoryFormatKnit3',
115
'Experimental successor to knit. Use at your own risk.',
116
branch_format='breezy.bzr.branch.BzrBranchFormat6',
114
'breezy.bzr.knitrepo.RepositoryFormatKnit3',
115
'Experimental successor to knit. Use at your own risk.',
116
branch_format='breezy.bzr.branch.BzrBranchFormat6',
118
118
bzr.register_metadir(my_format_registry,
120
'breezy.bzr.knitrepo.RepositoryFormatKnit3',
121
'Experimental successor to knit. Use at your own risk.',
122
branch_format='breezy.bzr.branch.BzrBranchFormat6', hidden=True)
120
'breezy.bzr.knitrepo.RepositoryFormatKnit3',
121
'Experimental successor to knit. Use at your own risk.',
122
branch_format='breezy.bzr.branch.BzrBranchFormat6', hidden=True)
123
123
my_format_registry.register('hiddendeprecated', DeprecatedBzrDirFormat,
124
'Old format. Slower and does not support things. ', hidden=True)
124
'Old format. Slower and does not support things. ', hidden=True)
125
125
my_format_registry.register_lazy('hiddenlazy', 'breezy.tests.test_bzrdir',
126
'DeprecatedBzrDirFormat', 'Format registered lazily',
127
deprecated=True, hidden=True)
126
'DeprecatedBzrDirFormat', 'Format registered lazily',
127
deprecated=True, hidden=True)
128
128
return my_format_registry
130
130
def test_format_registry(self):
135
135
self.assertIsInstance(my_bzrdir, DeprecatedBzrDirFormat)
136
136
my_bzrdir = my_format_registry.make_controldir('default')
137
137
self.assertIsInstance(my_bzrdir.repository_format,
138
knitrepo.RepositoryFormatKnit1)
138
knitrepo.RepositoryFormatKnit1)
139
139
my_bzrdir = my_format_registry.make_controldir('knit')
140
140
self.assertIsInstance(my_bzrdir.repository_format,
141
knitrepo.RepositoryFormatKnit1)
141
knitrepo.RepositoryFormatKnit1)
142
142
my_bzrdir = my_format_registry.make_controldir('branch6')
143
143
self.assertIsInstance(my_bzrdir.get_branch_format(),
144
144
breezy.bzr.branch.BzrBranchFormat6)
166
166
experimental, deprecated = rest.split('Deprecated formats')
167
167
self.assertContainsRe(new, 'formats-help')
168
168
self.assertContainsRe(new,
169
':knit:\n \\(native\\) \\(default\\) Format using knits\n')
169
':knit:\n \\(native\\) \\(default\\) Format using knits\n')
170
170
self.assertContainsRe(experimental,
171
':branch6:\n \\(native\\) Experimental successor to knit')
171
':branch6:\n \\(native\\) Experimental successor to knit')
172
172
self.assertContainsRe(deprecated,
173
':lazy:\n \\(native\\) Format registered lazily\n')
173
':lazy:\n \\(native\\) Format registered lazily\n')
174
174
self.assertNotContainsRe(new, 'hidden')
176
176
def test_set_default_repository(self):
177
177
default_factory = controldir.format_registry.get('default')
178
178
old_default = [k for k, v in controldir.format_registry.iteritems()
179
179
if v == default_factory and k != 'default'][0]
180
controldir.format_registry.set_default_repository('dirstate-with-subtree')
180
controldir.format_registry.set_default_repository(
181
'dirstate-with-subtree')
182
183
self.assertIs(controldir.format_registry.get('dirstate-with-subtree'),
183
184
controldir.format_registry.get('default'))
190
191
def test_aliases(self):
191
192
a_registry = controldir.ControlDirFormatRegistry()
192
193
a_registry.register('deprecated', DeprecatedBzrDirFormat,
193
'Old format. Slower and does not support stuff',
194
'Old format. Slower and does not support stuff',
195
196
a_registry.register_alias('deprecatedalias', 'deprecated')
196
197
self.assertEqual({'deprecatedalias': 'deprecated'},
197
198
a_registry.aliases())
282
283
# is the right format object found for a branch?
283
284
# create a branch with a few known format objects.
284
285
bzr.BzrProber.formats.register(BzrDirFormatTest1.get_format_string(),
286
287
self.addCleanup(bzr.BzrProber.formats.remove,
287
BzrDirFormatTest1.get_format_string())
288
BzrDirFormatTest1.get_format_string())
288
289
bzr.BzrProber.formats.register(BzrDirFormatTest2.get_format_string(),
290
291
self.addCleanup(bzr.BzrProber.formats.remove,
291
BzrDirFormatTest2.get_format_string())
292
BzrDirFormatTest2.get_format_string())
292
293
t = self.get_transport()
293
294
self.build_tree(["foo/", "bar/"], transport=t)
294
296
def check_format(format, url):
295
297
format.initialize(url)
296
298
t = _mod_transport.get_transport_from_path(url)
330
332
# which bzrdir.Open will refuse (not supported)
331
333
self.assertRaises(UnsupportedFormatError, bzrdir.BzrDir.open, url)
332
334
# which bzrdir.open_containing will refuse (not supported)
333
self.assertRaises(UnsupportedFormatError, bzrdir.BzrDir.open_containing, url)
335
self.assertRaises(UnsupportedFormatError,
336
bzrdir.BzrDir.open_containing, url)
334
337
# but open_downlevel will work
335
338
t = _mod_transport.get_transport_from_url(url)
336
339
self.assertEqual(format.open(t), bzrdir.BzrDir.open_unsupported(url))
337
340
# unregister the format
338
341
bzr.BzrProber.formats.remove(format.get_format_string())
339
342
# now open_downlevel should fail too.
340
self.assertRaises(UnknownFormatError, bzrdir.BzrDir.open_unsupported, url)
343
self.assertRaises(UnknownFormatError,
344
bzrdir.BzrDir.open_unsupported, url)
342
346
def test_create_branch_and_repo_uses_default(self):
343
347
format = SampleBzrDirFormat()
422
426
format = controldir.format_registry.make_controldir('knit')
423
427
self.make_repository('.', shared=True, format=format)
424
428
branch = bzrdir.BzrDir.create_branch_convenience('child',
426
430
branch.controldir.open_workingtree()
427
431
self.assertRaises(errors.NoRepositoryPresent,
428
432
branch.controldir.open_repository)
433
437
format = controldir.format_registry.make_controldir('knit')
434
438
self.make_repository('.', shared=True, format=format)
435
439
branch = bzrdir.BzrDir.create_branch_convenience('child',
436
force_new_tree=False, format=format)
440
force_new_tree=False, format=format)
437
441
self.assertRaises(errors.NoWorkingTree,
438
442
branch.controldir.open_workingtree)
439
443
self.assertRaises(errors.NoRepositoryPresent,
459
463
repo = self.make_repository('.', shared=True, format=format)
460
464
repo.set_make_working_trees(False)
461
465
branch = bzrdir.BzrDir.create_branch_convenience('child',
462
force_new_tree=True, format=format)
466
force_new_tree=True, format=format)
463
467
branch.controldir.open_workingtree()
464
468
self.assertRaises(errors.NoRepositoryPresent,
465
469
branch.controldir.open_repository)
470
474
format = controldir.format_registry.make_controldir('knit')
471
475
self.make_repository('.', shared=True, format=format)
472
476
branch = bzrdir.BzrDir.create_branch_convenience('child',
473
force_new_repo=True, format=format)
477
force_new_repo=True, format=format)
474
478
branch.controldir.open_repository()
475
479
branch.controldir.open_workingtree()
539
544
# Should end up with a 1.9 format (stackable)
540
545
repo, control, require_stacking, repo_policy = \
541
546
old_fmt.initialize_on_transport_ex(t,
542
repo_format_name=repo_name, stacked_on='../trunk',
547
repo_format_name=repo_name, stacked_on='../trunk',
544
549
if repo is not None:
545
550
# Repositories are open write-locked
546
551
self.assertTrue(repo.is_write_locked())
551
556
opened = bzrdir.BzrDir.open(t.base)
552
557
if not isinstance(old_fmt, remote.RemoteBzrDirFormat):
553
558
self.assertEqual(control._format.network_name(),
554
old_fmt.network_name())
559
old_fmt.network_name())
555
560
self.assertEqual(control._format.network_name(),
556
opened._format.network_name())
561
opened._format.network_name())
557
562
self.assertEqual(control.__class__, opened.__class__)
558
563
self.assertLength(1, repo._fallback_repositories)
566
571
def test_clone_ignores_policy_for_unsupported_formats(self):
567
572
child_branch, new_child_transport = self.prepare_default_stacking(
568
573
child_format='pack-0.92')
569
new_child = child_branch.controldir.clone_on_transport(new_child_transport)
574
new_child = child_branch.controldir.clone_on_transport(
570
576
self.assertRaises(branch.UnstackableBranchFormat,
571
577
new_child.open_branch().get_stacked_on_url)
592
598
child_branch, new_child_transport = self.prepare_default_stacking(
593
599
child_format='pack-0.92')
594
600
new_child = child_branch.controldir.clone_on_transport(new_child_transport,
595
stacked_on=child_branch.controldir.root_transport.base)
601
stacked_on=child_branch.controldir.root_transport.base)
596
602
self.assertEqual(child_branch.controldir.root_transport.base,
597
603
new_child.open_branch().get_stacked_on_url())
598
604
repo = new_child.open_repository()
632
638
stack_on = self.make_branch('stack_on', format='1.6')
633
639
stacked = self.make_branch('stack_on/stacked', format='1.6')
634
640
policy = bzrdir.UseExistingRepository(stacked.repository,
635
'.', self.get_readonly_url('stack_on'))
641
'.', self.get_readonly_url('stack_on'))
636
642
policy.configure_branch(stacked)
637
643
self.assertEqual(self.get_readonly_url('stack_on'),
638
644
stacked.get_stacked_on_url())
652
658
self.transport_readonly_server = http_server.HttpServer
654
660
def local_branch_path(self, branch):
655
return os.path.realpath(urlutils.local_path_from_url(branch.base))
661
return os.path.realpath(urlutils.local_path_from_url(branch.base))
657
663
def test_open_containing(self):
658
664
self.assertRaises(NotBranchError, bzrdir.BzrDir.open_containing,
660
666
self.assertRaises(NotBranchError, bzrdir.BzrDir.open_containing,
661
667
self.get_readonly_url('g/p/q'))
662
668
control = bzrdir.BzrDir.create(self.get_url())
663
branch, relpath = bzrdir.BzrDir.open_containing(self.get_readonly_url(''))
669
branch, relpath = bzrdir.BzrDir.open_containing(
670
self.get_readonly_url(''))
664
671
self.assertEqual('', relpath)
665
branch, relpath = bzrdir.BzrDir.open_containing(self.get_readonly_url('g/p/q'))
672
branch, relpath = bzrdir.BzrDir.open_containing(
673
self.get_readonly_url('g/p/q'))
666
674
self.assertEqual('g/p/q', relpath)
668
676
def test_open_containing_tree_branch_or_repository_empty(self):
669
677
self.assertRaises(errors.NotBranchError,
670
bzrdir.BzrDir.open_containing_tree_branch_or_repository,
671
self.get_readonly_url(''))
678
bzrdir.BzrDir.open_containing_tree_branch_or_repository,
679
self.get_readonly_url(''))
673
681
def test_open_containing_tree_branch_or_repository_all(self):
674
682
self.make_branch_and_tree('topdir')
755
763
def test_open_containing_from_transport(self):
756
764
self.assertRaises(NotBranchError,
757
bzrdir.BzrDir.open_containing_from_transport,
758
_mod_transport.get_transport_from_url(self.get_readonly_url('')))
765
bzrdir.BzrDir.open_containing_from_transport,
766
_mod_transport.get_transport_from_url(self.get_readonly_url('')))
759
767
self.assertRaises(NotBranchError,
760
bzrdir.BzrDir.open_containing_from_transport,
761
_mod_transport.get_transport_from_url(
762
self.get_readonly_url('g/p/q')))
768
bzrdir.BzrDir.open_containing_from_transport,
769
_mod_transport.get_transport_from_url(
770
self.get_readonly_url('g/p/q')))
763
771
control = bzrdir.BzrDir.create(self.get_url())
764
772
branch, relpath = bzrdir.BzrDir.open_containing_from_transport(
765
773
_mod_transport.get_transport_from_url(
837
845
tree = self.make_branch_and_tree('tree1',
838
846
format='development-subtree')
839
847
sub_tree = self.make_branch_and_tree('tree1/subtree',
840
format='development-subtree')
848
format='development-subtree')
841
849
sub_tree.set_root_id(b'subtree-root')
842
850
tree.add_reference(sub_tree)
843
851
self.build_tree(['tree1/subtree/file'])
858
864
branch = self.make_branch('branch', format='knit')
859
865
format = branch.controldir.cloning_metadir()
860
866
self.assertIsInstance(format.workingtree_format,
861
workingtree_4.WorkingTreeFormat6)
867
workingtree_4.WorkingTreeFormat6)
863
869
def test_sprout_recursive_treeless(self):
864
870
tree = self.make_branch_and_tree('tree1',
865
format='development-subtree')
871
format='development-subtree')
866
872
sub_tree = self.make_branch_and_tree('tree1/subtree',
867
format='development-subtree')
873
format='development-subtree')
868
874
tree.add_reference(sub_tree)
869
875
self.build_tree(['tree1/subtree/file'])
870
876
sub_tree.add('file')
876
882
# FIXME: subtree/.bzr is left here which allows the test to pass (or
877
883
# fail :-( ) -- vila 20100909
878
884
repo = self.make_repository('repo', shared=True,
879
format='development-subtree')
885
format='development-subtree')
880
886
repo.set_make_working_trees(False)
881
887
# FIXME: we just deleted the workingtree and now we want to use it ????
882
888
# At a minimum, we should use tree.branch below (but this fails too
900
906
def test_find_controldirs(self):
901
907
foo, bar, baz = self.make_foo_bar_baz()
902
908
t = self.get_transport()
903
self.assertEqualBzrdirs([baz, foo, bar], bzrdir.BzrDir.find_controldirs(t))
909
self.assertEqualBzrdirs(
910
[baz, foo, bar], bzrdir.BzrDir.find_controldirs(t))
905
912
def make_fake_permission_denied_transport(self, transport, paths):
906
913
"""Create a transport that raises PermissionDenied for some paths."""
927
934
self.make_fake_permission_denied_transport(t, ['foo'])
928
935
# local transport
929
936
self.assertBranchUrlsEndWith('/baz/',
930
bzrdir.BzrDir.find_controldirs(path_filter_transport))
937
bzrdir.BzrDir.find_controldirs(path_filter_transport))
932
939
smart_transport = self.make_smart_server('.',
933
backing_server=path_filter_server)
940
backing_server=path_filter_server)
934
941
self.assertBranchUrlsEndWith('/baz/',
935
bzrdir.BzrDir.find_controldirs(smart_transport))
942
bzrdir.BzrDir.find_controldirs(smart_transport))
937
944
def test_find_controldirs_list_current(self):
938
945
def list_current(transport):
990
997
abranch = bzrdir.BzrDir.create(abranch_url).create_branch()
991
998
t.delete_tree('arepo/.bzr')
992
999
self.assertRaises(errors.NoRepositoryPresent,
993
branch.Branch.open, abranch_url)
1000
branch.Branch.open, abranch_url)
994
1001
self.make_branch('baz')
995
1002
for actual_bzrdir in bzrdir.BzrDir.find_branches(t):
996
1003
self.assertEndsWith(actual_bzrdir.user_url, '/baz/')
1007
1014
self.assertEqual(branch_base,
1008
1015
dir.get_branch_transport(BzrBranchFormat5()).base)
1009
1016
repository_base = t.clone('repository').base
1010
self.assertEqual(repository_base, dir.get_repository_transport(None).base)
1018
repository_base, dir.get_repository_transport(None).base)
1011
1019
repository_format = repository.format_registry.get_default()
1012
1020
self.assertEqual(repository_base,
1013
1021
dir.get_repository_transport(repository_format).base)
1014
1022
checkout_base = t.clone('checkout').base
1015
self.assertEqual(checkout_base, dir.get_workingtree_transport(None).base)
1024
checkout_base, dir.get_workingtree_transport(None).base)
1016
1025
self.assertEqual(checkout_base,
1017
1026
dir.get_workingtree_transport(workingtree_3.WorkingTreeFormat3()).base)
1034
1043
otherdir = controldir.format_registry.make_controldir('knit')
1035
1044
self.assertEqual(otherdir, mydir)
1036
1045
self.assertFalse(otherdir != mydir)
1037
otherdir2 = controldir.format_registry.make_controldir('development-subtree')
1046
otherdir2 = controldir.format_registry.make_controldir(
1047
'development-subtree')
1038
1048
self.assertNotEqual(otherdir2, mydir)
1039
1049
self.assertFalse(otherdir2 == mydir)
1233
1242
def test_dot_bzr_hidden(self):
1234
1243
if sys.platform == 'win32' and not win32utils.has_win32file:
1235
raise TestSkipped('unable to make file hidden without pywin32 library')
1245
'unable to make file hidden without pywin32 library')
1236
1246
b = bzrdir.BzrDir.create('.')
1237
1247
self.build_tree(['a'])
1238
1248
self.assertEqual([b'a'], self.get_ls())
1240
1250
def test_dot_bzr_hidden_with_url(self):
1241
1251
if sys.platform == 'win32' and not win32utils.has_win32file:
1242
raise TestSkipped('unable to make file hidden without pywin32 library')
1253
'unable to make file hidden without pywin32 library')
1243
1254
b = bzrdir.BzrDir.create(urlutils.local_path_to_url('.'))
1244
1255
self.build_tree(['a'])
1245
1256
self.assertEqual([b'a'], self.get_ls())
1389
1401
def test_post_repo_init_hook_repr(self):
1390
1402
param_reprs = []
1391
1403
bzrdir.BzrDir.hooks.install_named_hook('post_repo_init',
1392
lambda params: param_reprs.append(repr(params)), None)
1404
lambda params: param_reprs.append(repr(params)), None)
1393
1405
self.make_repository('foo')
1394
1406
self.assertLength(1, param_reprs)
1395
1407
param_repr = param_reprs[0]
1480
1492
format = SampleBzrFormat()
1481
1493
format.features = {b"foo": b"required"}
1482
1494
self.assertEqual(format.as_string(),
1485
1497
format.features[b"another"] = b"optional"
1486
1498
self.assertEqual(format.as_string(),
1488
b"optional another\n"
1500
b"optional another\n"
1491
1503
def test_network_name(self):
1492
1504
# The network string should include the feature info
1511
1523
def test_from_string_format_string_mismatch(self):
1512
1524
# The first line has to match the format string
1513
1525
self.assertRaises(AssertionError, SampleBzrFormat.from_string,
1514
b"Second line\nrequired foo\n")
1526
b"Second line\nrequired foo\n")
1516
1528
def test_from_string_missing_space(self):
1517
1529
# At least one space is required in the feature lines
1518
1530
self.assertRaises(errors.ParseFormatError, SampleBzrFormat.from_string,
1519
b"First line\nfoo\n")
1531
b"First line\nfoo\n")
1521
1533
def test_from_string_with_spaces(self):
1522
1534
# Feature with spaces (in case we add stuff like this in the future)
1568
1580
self.addCleanup(SampleBzrFormat.unregister_feature, b"nested-trees")
1569
1581
SampleBzrFormat.register_feature(b"nested-trees")
1570
1582
self.assertRaises(bzrdir.FeatureAlreadyRegistered,
1571
SampleBzrFormat.register_feature, b"nested-trees")
1583
SampleBzrFormat.register_feature, b"nested-trees")
1573
1585
def test_feature_with_space(self):
1574
1586
# spaces are not allowed in feature names
1575
1587
self.assertRaises(ValueError, SampleBzrFormat.register_feature,