99
95
def make_format_registry(self):
100
96
my_format_registry = controldir.ControlDirFormatRegistry()
101
97
my_format_registry.register('deprecated', DeprecatedBzrDirFormat,
102
'Some format. Slower and unawesome and deprecated.',
104
my_format_registry.register_lazy('lazy', 'breezy.tests.test_bzrdir',
105
'DeprecatedBzrDirFormat', 'Format registered lazily',
107
bzr.register_metadir(my_format_registry, 'knit',
108
'breezy.bzr.knitrepo.RepositoryFormatKnit1',
109
'Format using knits',
98
'Some format. Slower and unawesome and deprecated.',
100
my_format_registry.register_lazy('lazy', 'brzlib.tests.test_bzrdir',
101
'DeprecatedBzrDirFormat', 'Format registered lazily',
103
bzrdir.register_metadir(my_format_registry, 'knit',
104
'brzlib.repofmt.knitrepo.RepositoryFormatKnit1',
105
'Format using knits',
111
107
my_format_registry.set_default('knit')
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',
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)
108
bzrdir.register_metadir(my_format_registry,
110
'brzlib.repofmt.knitrepo.RepositoryFormatKnit3',
111
'Experimental successor to knit. Use at your own risk.',
112
branch_format='brzlib.branch.BzrBranchFormat6',
114
bzrdir.register_metadir(my_format_registry,
116
'brzlib.repofmt.knitrepo.RepositoryFormatKnit3',
117
'Experimental successor to knit. Use at your own risk.',
118
branch_format='brzlib.branch.BzrBranchFormat6', hidden=True)
123
119
my_format_registry.register('hiddendeprecated', DeprecatedBzrDirFormat,
124
'Old format. Slower and does not support things. ', hidden=True)
125
my_format_registry.register_lazy('hiddenlazy', 'breezy.tests.test_bzrdir',
126
'DeprecatedBzrDirFormat', 'Format registered lazily',
127
deprecated=True, hidden=True)
120
'Old format. Slower and does not support things. ', hidden=True)
121
my_format_registry.register_lazy('hiddenlazy', 'brzlib.tests.test_bzrdir',
122
'DeprecatedBzrDirFormat', 'Format registered lazily',
123
deprecated=True, hidden=True)
128
124
return my_format_registry
130
126
def test_format_registry(self):
131
127
my_format_registry = self.make_format_registry()
132
my_bzrdir = my_format_registry.make_controldir('lazy')
133
self.assertIsInstance(my_bzrdir, DeprecatedBzrDirFormat)
134
my_bzrdir = my_format_registry.make_controldir('deprecated')
135
self.assertIsInstance(my_bzrdir, DeprecatedBzrDirFormat)
136
my_bzrdir = my_format_registry.make_controldir('default')
137
self.assertIsInstance(my_bzrdir.repository_format,
138
knitrepo.RepositoryFormatKnit1)
139
my_bzrdir = my_format_registry.make_controldir('knit')
140
self.assertIsInstance(my_bzrdir.repository_format,
141
knitrepo.RepositoryFormatKnit1)
142
my_bzrdir = my_format_registry.make_controldir('branch6')
128
my_bzrdir = my_format_registry.make_bzrdir('lazy')
129
self.assertIsInstance(my_bzrdir, DeprecatedBzrDirFormat)
130
my_bzrdir = my_format_registry.make_bzrdir('deprecated')
131
self.assertIsInstance(my_bzrdir, DeprecatedBzrDirFormat)
132
my_bzrdir = my_format_registry.make_bzrdir('default')
133
self.assertIsInstance(my_bzrdir.repository_format,
134
knitrepo.RepositoryFormatKnit1)
135
my_bzrdir = my_format_registry.make_bzrdir('knit')
136
self.assertIsInstance(my_bzrdir.repository_format,
137
knitrepo.RepositoryFormatKnit1)
138
my_bzrdir = my_format_registry.make_bzrdir('branch6')
143
139
self.assertIsInstance(my_bzrdir.get_branch_format(),
144
breezy.bzr.branch.BzrBranchFormat6)
140
brzlib.branch.BzrBranchFormat6)
146
142
def test_get_help(self):
147
143
my_format_registry = self.make_format_registry()
309
304
def test_find_format_unknown_format(self):
310
305
t = self.get_transport()
312
t.put_bytes('.bzr/branch-format', b'')
307
t.put_bytes('.bzr/branch-format', '')
313
308
self.assertRaises(UnknownFormatError,
314
309
bzrdir.BzrDirFormat.find_format,
315
310
_mod_transport.get_transport_from_path('.'))
317
def test_find_format_line_endings(self):
318
t = self.get_transport()
320
t.put_bytes('.bzr/branch-format', b'Corrupt line endings\r\n')
321
self.assertRaises(errors.LineEndingError,
322
bzrdir.BzrDirFormat.find_format,
323
_mod_transport.get_transport_from_path('.'))
325
312
def test_register_unregister_format(self):
326
313
format = SampleBzrDirFormat()
327
314
url = self.get_url()
329
316
format.initialize(url)
330
317
# register a format for it.
331
bzr.BzrProber.formats.register(format.get_format_string(), format)
318
bzrdir.BzrProber.formats.register(format.get_format_string(), format)
332
319
# which bzrdir.Open will refuse (not supported)
333
320
self.assertRaises(UnsupportedFormatError, bzrdir.BzrDir.open, url)
334
321
# which bzrdir.open_containing will refuse (not supported)
335
self.assertRaises(UnsupportedFormatError,
336
bzrdir.BzrDir.open_containing, url)
322
self.assertRaises(UnsupportedFormatError, bzrdir.BzrDir.open_containing, url)
337
323
# but open_downlevel will work
338
324
t = _mod_transport.get_transport_from_url(url)
339
325
self.assertEqual(format.open(t), bzrdir.BzrDir.open_unsupported(url))
340
326
# unregister the format
341
bzr.BzrProber.formats.remove(format.get_format_string())
327
bzrdir.BzrProber.formats.remove(format.get_format_string())
342
328
# now open_downlevel should fail too.
343
self.assertRaises(UnknownFormatError,
344
bzrdir.BzrDir.open_unsupported, url)
329
self.assertRaises(UnknownFormatError, bzrdir.BzrDir.open_unsupported, url)
346
331
def test_create_branch_and_repo_uses_default(self):
347
332
format = SampleBzrDirFormat()
390
375
bzrdir.BzrDir.create_standalone_workingtree,
391
376
self.get_readonly_url('child'), format=format)
392
377
tree = bzrdir.BzrDir.create_standalone_workingtree('child',
394
tree.controldir.open_repository()
379
tree.bzrdir.open_repository()
396
381
def test_create_branch_convenience(self):
397
382
# outside a repo the default convenience output is a repo+branch_tree
398
format = controldir.format_registry.make_controldir('knit')
383
format = controldir.format_registry.make_bzrdir('knit')
399
384
branch = bzrdir.BzrDir.create_branch_convenience('.', format=format)
400
branch.controldir.open_workingtree()
401
branch.controldir.open_repository()
385
branch.bzrdir.open_workingtree()
386
branch.bzrdir.open_repository()
403
388
def test_create_branch_convenience_possible_transports(self):
404
389
"""Check that the optional 'possible_transports' is recognized"""
405
format = controldir.format_registry.make_controldir('knit')
390
format = controldir.format_registry.make_bzrdir('knit')
406
391
t = self.get_transport()
407
392
branch = bzrdir.BzrDir.create_branch_convenience(
408
393
'.', format=format, possible_transports=[t])
409
branch.controldir.open_workingtree()
410
branch.controldir.open_repository()
394
branch.bzrdir.open_workingtree()
395
branch.bzrdir.open_repository()
412
397
def test_create_branch_convenience_root(self):
413
398
"""Creating a branch at the root of a fs should work."""
414
399
self.vfs_transport_factory = memory.MemoryServer
415
400
# outside a repo the default convenience output is a repo+branch_tree
416
format = controldir.format_registry.make_controldir('knit')
401
format = controldir.format_registry.make_bzrdir('knit')
417
402
branch = bzrdir.BzrDir.create_branch_convenience(self.get_url(),
419
404
self.assertRaises(errors.NoWorkingTree,
420
branch.controldir.open_workingtree)
421
branch.controldir.open_repository()
405
branch.bzrdir.open_workingtree)
406
branch.bzrdir.open_repository()
423
408
def test_create_branch_convenience_under_shared_repo(self):
424
409
# inside a repo the default convenience output is a branch+ follow the
425
410
# repo tree policy
426
format = controldir.format_registry.make_controldir('knit')
411
format = controldir.format_registry.make_bzrdir('knit')
427
412
self.make_repository('.', shared=True, format=format)
428
413
branch = bzrdir.BzrDir.create_branch_convenience('child',
430
branch.controldir.open_workingtree()
415
branch.bzrdir.open_workingtree()
431
416
self.assertRaises(errors.NoRepositoryPresent,
432
branch.controldir.open_repository)
417
branch.bzrdir.open_repository)
434
419
def test_create_branch_convenience_under_shared_repo_force_no_tree(self):
435
420
# inside a repo the default convenience output is a branch+ follow the
436
421
# repo tree policy but we can override that
437
format = controldir.format_registry.make_controldir('knit')
422
format = controldir.format_registry.make_bzrdir('knit')
438
423
self.make_repository('.', shared=True, format=format)
439
424
branch = bzrdir.BzrDir.create_branch_convenience('child',
440
force_new_tree=False, format=format)
425
force_new_tree=False, format=format)
441
426
self.assertRaises(errors.NoWorkingTree,
442
branch.controldir.open_workingtree)
427
branch.bzrdir.open_workingtree)
443
428
self.assertRaises(errors.NoRepositoryPresent,
444
branch.controldir.open_repository)
429
branch.bzrdir.open_repository)
446
431
def test_create_branch_convenience_under_shared_repo_no_tree_policy(self):
447
432
# inside a repo the default convenience output is a branch+ follow the
448
433
# repo tree policy
449
format = controldir.format_registry.make_controldir('knit')
434
format = controldir.format_registry.make_bzrdir('knit')
450
435
repo = self.make_repository('.', shared=True, format=format)
451
436
repo.set_make_working_trees(False)
452
437
branch = bzrdir.BzrDir.create_branch_convenience('child',
454
439
self.assertRaises(errors.NoWorkingTree,
455
branch.controldir.open_workingtree)
440
branch.bzrdir.open_workingtree)
456
441
self.assertRaises(errors.NoRepositoryPresent,
457
branch.controldir.open_repository)
442
branch.bzrdir.open_repository)
459
444
def test_create_branch_convenience_under_shared_repo_no_tree_policy_force_tree(self):
460
445
# inside a repo the default convenience output is a branch+ follow the
461
446
# repo tree policy but we can override that
462
format = controldir.format_registry.make_controldir('knit')
447
format = controldir.format_registry.make_bzrdir('knit')
463
448
repo = self.make_repository('.', shared=True, format=format)
464
449
repo.set_make_working_trees(False)
465
450
branch = bzrdir.BzrDir.create_branch_convenience('child',
466
force_new_tree=True, format=format)
467
branch.controldir.open_workingtree()
451
force_new_tree=True, format=format)
452
branch.bzrdir.open_workingtree()
468
453
self.assertRaises(errors.NoRepositoryPresent,
469
branch.controldir.open_repository)
454
branch.bzrdir.open_repository)
471
456
def test_create_branch_convenience_under_shared_repo_force_new_repo(self):
472
457
# inside a repo the default convenience output is overridable to give
473
458
# repo+branch+tree
474
format = controldir.format_registry.make_controldir('knit')
459
format = controldir.format_registry.make_bzrdir('knit')
475
460
self.make_repository('.', shared=True, format=format)
476
461
branch = bzrdir.BzrDir.create_branch_convenience('child',
477
force_new_repo=True, format=format)
478
branch.controldir.open_repository()
479
branch.controldir.open_workingtree()
462
force_new_repo=True, format=format)
463
branch.bzrdir.open_repository()
464
branch.bzrdir.open_workingtree()
482
467
class TestRepositoryAcquisitionPolicy(TestCaseWithTransport):
484
469
def test_acquire_repository_standalone(self):
485
470
"""The default acquisition policy should create a standalone branch."""
486
my_bzrdir = self.make_controldir('.')
471
my_bzrdir = self.make_bzrdir('.')
487
472
repo_policy = my_bzrdir.determine_repository_policy()
488
473
repo, is_new = repo_policy.acquire_repository()
489
self.assertEqual(repo.controldir.root_transport.base,
474
self.assertEqual(repo.bzrdir.root_transport.base,
490
475
my_bzrdir.root_transport.base)
491
476
self.assertFalse(repo.is_shared())
493
478
def test_determine_stacking_policy(self):
494
parent_bzrdir = self.make_controldir('.')
495
child_bzrdir = self.make_controldir('child')
479
parent_bzrdir = self.make_bzrdir('.')
480
child_bzrdir = self.make_bzrdir('child')
496
481
parent_bzrdir.get_config().set_default_stack_on('http://example.org')
497
482
repo_policy = child_bzrdir.determine_repository_policy()
498
483
self.assertEqual('http://example.org', repo_policy._stack_on)
500
485
def test_determine_stacking_policy_relative(self):
501
parent_bzrdir = self.make_controldir('.')
502
child_bzrdir = self.make_controldir('child')
486
parent_bzrdir = self.make_bzrdir('.')
487
child_bzrdir = self.make_bzrdir('child')
503
488
parent_bzrdir.get_config().set_default_stack_on('child2')
504
489
repo_policy = child_bzrdir.determine_repository_policy()
505
490
self.assertEqual('child2', repo_policy._stack_on)
556
540
opened = bzrdir.BzrDir.open(t.base)
557
541
if not isinstance(old_fmt, remote.RemoteBzrDirFormat):
558
542
self.assertEqual(control._format.network_name(),
559
old_fmt.network_name())
543
old_fmt.network_name())
560
544
self.assertEqual(control._format.network_name(),
561
opened._format.network_name())
545
opened._format.network_name())
562
546
self.assertEqual(control.__class__, opened.__class__)
563
547
self.assertLength(1, repo._fallback_repositories)
565
549
def test_sprout_obeys_stacking_policy(self):
566
550
child_branch, new_child_transport = self.prepare_default_stacking()
567
new_child = child_branch.controldir.sprout(new_child_transport.base)
551
new_child = child_branch.bzrdir.sprout(new_child_transport.base)
568
552
self.assertEqual(child_branch.base,
569
553
new_child.open_branch().get_stacked_on_url())
571
555
def test_clone_ignores_policy_for_unsupported_formats(self):
572
556
child_branch, new_child_transport = self.prepare_default_stacking(
573
557
child_format='pack-0.92')
574
new_child = child_branch.controldir.clone_on_transport(
576
self.assertRaises(branch.UnstackableBranchFormat,
558
new_child = child_branch.bzrdir.clone_on_transport(new_child_transport)
559
self.assertRaises(errors.UnstackableBranchFormat,
577
560
new_child.open_branch().get_stacked_on_url)
579
562
def test_sprout_ignores_policy_for_unsupported_formats(self):
580
563
child_branch, new_child_transport = self.prepare_default_stacking(
581
564
child_format='pack-0.92')
582
new_child = child_branch.controldir.sprout(new_child_transport.base)
583
self.assertRaises(branch.UnstackableBranchFormat,
565
new_child = child_branch.bzrdir.sprout(new_child_transport.base)
566
self.assertRaises(errors.UnstackableBranchFormat,
584
567
new_child.open_branch().get_stacked_on_url)
586
569
def test_sprout_upgrades_format_if_stacked_specified(self):
587
570
child_branch, new_child_transport = self.prepare_default_stacking(
588
571
child_format='pack-0.92')
589
new_child = child_branch.controldir.sprout(new_child_transport.base,
591
self.assertEqual(child_branch.controldir.root_transport.base,
572
new_child = child_branch.bzrdir.sprout(new_child_transport.base,
574
self.assertEqual(child_branch.bzrdir.root_transport.base,
592
575
new_child.open_branch().get_stacked_on_url())
593
576
repo = new_child.open_repository()
594
577
self.assertTrue(repo._format.supports_external_lookups)
666
649
self.assertRaises(NotBranchError, bzrdir.BzrDir.open_containing,
667
650
self.get_readonly_url('g/p/q'))
668
651
control = bzrdir.BzrDir.create(self.get_url())
669
branch, relpath = bzrdir.BzrDir.open_containing(
652
branch, relpath = bzrdir.BzrDir.open_containing(self.get_readonly_url(''))
653
self.assertEqual('', relpath)
654
branch, relpath = bzrdir.BzrDir.open_containing(self.get_readonly_url('g/p/q'))
655
self.assertEqual('g/p/q', relpath)
657
def test_open_containing_tree_branch_or_repository_empty(self):
658
self.assertRaises(errors.NotBranchError,
659
bzrdir.BzrDir.open_containing_tree_branch_or_repository,
670
660
self.get_readonly_url(''))
671
self.assertEqual('', relpath)
672
branch, relpath = bzrdir.BzrDir.open_containing(
673
self.get_readonly_url('g/p/q'))
674
self.assertEqual('g/p/q', relpath)
676
def test_open_containing_tree_branch_or_repository_empty(self):
677
self.assertRaises(errors.NotBranchError,
678
bzrdir.BzrDir.open_containing_tree_branch_or_repository,
679
self.get_readonly_url(''))
681
662
def test_open_containing_tree_branch_or_repository_all(self):
682
663
self.make_branch_and_tree('topdir')
842
823
self.assertRaises(NotBranchError, bzrdir.BzrDir.open_from_transport, t)
844
825
def test_sprout_recursive(self):
845
tree = self.make_branch_and_tree('tree1')
846
sub_tree = self.make_branch_and_tree('tree1/subtree')
847
sub_tree.set_root_id(b'subtree-root')
826
tree = self.make_branch_and_tree('tree1',
827
format='development-subtree')
828
sub_tree = self.make_branch_and_tree('tree1/subtree',
829
format='development-subtree')
830
sub_tree.set_root_id('subtree-root')
848
831
tree.add_reference(sub_tree)
849
tree.set_reference_info('subtree', sub_tree.branch.user_url)
850
832
self.build_tree(['tree1/subtree/file'])
851
833
sub_tree.add('file')
852
834
tree.commit('Initial commit')
853
tree2 = tree.controldir.sprout('tree2').open_workingtree()
835
tree2 = tree.bzrdir.sprout('tree2').open_workingtree()
854
836
tree2.lock_read()
855
837
self.addCleanup(tree2.unlock)
856
838
self.assertPathExists('tree2/subtree/file')
857
self.assertEqual('tree-reference', tree2.kind('subtree'))
839
self.assertEqual('tree-reference', tree2.kind('subtree-root'))
859
841
def test_cloning_metadir(self):
860
842
"""Ensure that cloning metadir is suitable"""
861
bzrdir = self.make_controldir('bzrdir')
843
bzrdir = self.make_bzrdir('bzrdir')
862
844
bzrdir.cloning_metadir()
863
845
branch = self.make_branch('branch', format='knit')
864
format = branch.controldir.cloning_metadir()
846
format = branch.bzrdir.cloning_metadir()
865
847
self.assertIsInstance(format.workingtree_format,
866
workingtree_4.WorkingTreeFormat6)
848
workingtree_4.WorkingTreeFormat6)
868
850
def test_sprout_recursive_treeless(self):
869
851
tree = self.make_branch_and_tree('tree1',
870
format='development-subtree')
852
format='development-subtree')
871
853
sub_tree = self.make_branch_and_tree('tree1/subtree',
872
format='development-subtree')
854
format='development-subtree')
873
855
tree.add_reference(sub_tree)
874
tree.set_reference_info('subtree', sub_tree.branch.user_url)
875
856
self.build_tree(['tree1/subtree/file'])
876
857
sub_tree.add('file')
877
858
tree.commit('Initial commit')
878
859
# The following line force the orhaning to reveal bug #634470
879
tree.branch.get_config_stack().set('transform.orphan_policy', 'move')
880
tree.controldir.destroy_workingtree()
860
tree.branch.get_config_stack().set(
861
'bzr.transform.orphan_policy', 'move')
862
tree.bzrdir.destroy_workingtree()
881
863
# FIXME: subtree/.bzr is left here which allows the test to pass (or
882
864
# fail :-( ) -- vila 20100909
883
865
repo = self.make_repository('repo', shared=True,
884
format='development-subtree')
866
format='development-subtree')
885
867
repo.set_make_working_trees(False)
886
868
# FIXME: we just deleted the workingtree and now we want to use it ????
887
869
# At a minimum, we should use tree.branch below (but this fails too
891
873
# by bzrdir.BzrDirMeta1.destroy_workingtree when it ignores the
892
874
# [DeletingParent('Not deleting', u'subtree', None)] conflict). See bug
893
875
# #634470. -- vila 20100909
894
tree.controldir.sprout('repo/tree2')
895
self.assertPathExists('repo/tree2/subtree')
896
self.assertPathDoesNotExist('repo/tree2/subtree/file')
876
self.assertRaises(errors.NotBranchError,
877
tree.bzrdir.sprout, 'repo/tree2')
878
# self.assertPathExists('repo/tree2/subtree')
879
# self.assertPathDoesNotExist('repo/tree2/subtree/file')
898
881
def make_foo_bar_baz(self):
899
foo = bzrdir.BzrDir.create_branch_convenience('foo').controldir
900
bar = self.make_branch('foo/bar').controldir
901
baz = self.make_branch('baz').controldir
882
foo = bzrdir.BzrDir.create_branch_convenience('foo').bzrdir
883
bar = self.make_branch('foo/bar').bzrdir
884
baz = self.make_branch('baz').bzrdir
902
885
return foo, bar, baz
904
def test_find_controldirs(self):
887
def test_find_bzrdirs(self):
905
888
foo, bar, baz = self.make_foo_bar_baz()
906
889
t = self.get_transport()
907
self.assertEqualBzrdirs(
908
[baz, foo, bar], bzrdir.BzrDir.find_controldirs(t))
890
self.assertEqualBzrdirs([baz, foo, bar], bzrdir.BzrDir.find_bzrdirs(t))
910
892
def make_fake_permission_denied_transport(self, transport, paths):
911
893
"""Create a transport that raises PermissionDenied for some paths."""
1035
1015
Metadirs should compare equal iff they have the same repo, branch and
1038
mydir = controldir.format_registry.make_controldir('knit')
1018
mydir = controldir.format_registry.make_bzrdir('knit')
1039
1019
self.assertEqual(mydir, mydir)
1040
1020
self.assertFalse(mydir != mydir)
1041
otherdir = controldir.format_registry.make_controldir('knit')
1021
otherdir = controldir.format_registry.make_bzrdir('knit')
1042
1022
self.assertEqual(otherdir, mydir)
1043
1023
self.assertFalse(otherdir != mydir)
1044
otherdir2 = controldir.format_registry.make_controldir(
1045
'development-subtree')
1024
otherdir2 = controldir.format_registry.make_bzrdir('development-subtree')
1046
1025
self.assertNotEqual(otherdir2, mydir)
1047
1026
self.assertFalse(otherdir2 == mydir)
1049
1028
def test_with_features(self):
1050
1029
tree = self.make_branch_and_tree('tree', format='2a')
1051
tree.controldir.update_feature_flags({b"bar": b"required"})
1052
self.assertRaises(bzrdir.MissingFeature, bzrdir.BzrDir.open, 'tree')
1053
bzrdir.BzrDirMetaFormat1.register_feature(b'bar')
1054
self.addCleanup(bzrdir.BzrDirMetaFormat1.unregister_feature, b'bar')
1030
tree.bzrdir.update_feature_flags({"bar": "required"})
1031
self.assertRaises(errors.MissingFeature, bzrdir.BzrDir.open, 'tree')
1032
bzrdir.BzrDirMetaFormat1.register_feature('bar')
1033
self.addCleanup(bzrdir.BzrDirMetaFormat1.unregister_feature, 'bar')
1055
1034
dir = bzrdir.BzrDir.open('tree')
1056
self.assertEqual(b"required", dir._format.features.get(b"bar"))
1057
tree.controldir.update_feature_flags({
1059
b"nonexistant": None})
1035
self.assertEqual("required", dir._format.features.get("bar"))
1036
tree.bzrdir.update_feature_flags({"bar": None, "nonexistant": None})
1060
1037
dir = bzrdir.BzrDir.open('tree')
1061
1038
self.assertEqual({}, dir._format.features)
1063
1040
def test_needs_conversion_different_working_tree(self):
1064
1041
# meta1dirs need an conversion if any element is not the default.
1065
new_format = controldir.format_registry.make_controldir('dirstate')
1042
new_format = controldir.format_registry.make_bzrdir('dirstate')
1066
1043
tree = self.make_branch_and_tree('tree', format='knit')
1067
self.assertTrue(tree.controldir.needs_format_conversion(
1044
self.assertTrue(tree.bzrdir.needs_format_conversion(
1070
1047
def test_initialize_on_format_uses_smart_transport(self):
1071
1048
self.setup_smart_server_with_call_log()
1072
new_format = controldir.format_registry.make_controldir('dirstate')
1049
new_format = controldir.format_registry.make_bzrdir('dirstate')
1073
1050
transport = self.get_transport('target')
1074
1051
transport.ensure_base()
1075
1052
self.reset_smart_call_log()
1094
1071
def test_create_branch_convenience(self):
1095
1072
# outside a repo the default convenience output is a repo+branch_tree
1096
format = controldir.format_registry.make_controldir('knit')
1073
format = controldir.format_registry.make_bzrdir('knit')
1097
1074
branch = bzrdir.BzrDir.create_branch_convenience(
1098
1075
self.get_url('foo'), format=format)
1099
1076
self.assertRaises(errors.NoWorkingTree,
1100
branch.controldir.open_workingtree)
1101
branch.controldir.open_repository()
1077
branch.bzrdir.open_workingtree)
1078
branch.bzrdir.open_repository()
1103
1080
def test_create_branch_convenience_force_tree_not_local_fails(self):
1104
1081
# outside a repo the default convenience output is a repo+branch_tree
1105
format = controldir.format_registry.make_controldir('knit')
1082
format = controldir.format_registry.make_bzrdir('knit')
1106
1083
self.assertRaises(errors.NotLocalUrl,
1107
bzrdir.BzrDir.create_branch_convenience,
1108
self.get_url('foo'),
1109
force_new_tree=True,
1084
bzrdir.BzrDir.create_branch_convenience,
1085
self.get_url('foo'),
1086
force_new_tree=True,
1111
1088
t = self.get_transport()
1112
1089
self.assertFalse(t.has('foo'))
1114
1091
def test_clone(self):
1115
1092
# clone into a nonlocal path works
1116
format = controldir.format_registry.make_controldir('knit')
1093
format = controldir.format_registry.make_bzrdir('knit')
1117
1094
branch = bzrdir.BzrDir.create_branch_convenience('local',
1119
branch.controldir.open_workingtree()
1120
result = branch.controldir.clone(self.get_url('remote'))
1096
branch.bzrdir.open_workingtree()
1097
result = branch.bzrdir.clone(self.get_url('remote'))
1121
1098
self.assertRaises(errors.NoWorkingTree,
1122
1099
result.open_workingtree)
1123
1100
result.open_branch()
1187
1164
self.assertIsInstance(bdir.root_transport, type(start))
1190
class TestHTTPRedirections(TestHTTPRedirectionsBase,
1191
http_utils.TestCaseWithTwoWebservers):
1167
class TestHTTPRedirections_urllib(TestHTTPRedirections,
1168
http_utils.TestCaseWithTwoWebservers):
1192
1169
"""Tests redirections for urllib implementation"""
1194
_transport = HttpTransport
1196
def _qualified_url(self, host, port):
1197
result = 'http://%s:%s' % (host, port)
1198
self.permit_url(result)
1202
class TestHTTPRedirections_nosmart(TestHTTPRedirectionsBase,
1203
http_utils.TestCaseWithTwoWebservers):
1171
_transport = HttpTransport_urllib
1173
def _qualified_url(self, host, port):
1174
result = 'http+urllib://%s:%s' % (host, port)
1175
self.permit_url(result)
1180
class TestHTTPRedirections_pycurl(TestWithTransport_pycurl,
1181
TestHTTPRedirections,
1182
http_utils.TestCaseWithTwoWebservers):
1183
"""Tests redirections for pycurl implementation"""
1185
def _qualified_url(self, host, port):
1186
result = 'http+pycurl://%s:%s' % (host, port)
1187
self.permit_url(result)
1191
class TestHTTPRedirections_nosmart(TestHTTPRedirections,
1192
http_utils.TestCaseWithTwoWebservers):
1204
1193
"""Tests redirections for the nosmart decorator"""
1206
1195
_transport = NoSmartTransportDecorator
1430
1422
def test_upgrade_from_2a(self):
1431
1423
tree = self.make_branch_and_tree('.', format='2a')
1432
1424
format = bzrdir.BzrDirMetaFormat1Colo()
1433
self.assertTrue(tree.controldir.needs_format_conversion(format))
1434
converter = tree.controldir._format.get_converter(format)
1435
result = converter.convert(tree.controldir, None)
1425
self.assertTrue(tree.bzrdir.needs_format_conversion(format))
1426
converter = tree.bzrdir._format.get_converter(format)
1427
result = converter.convert(tree.bzrdir, None)
1436
1428
self.assertIsInstance(result._format, bzrdir.BzrDirMetaFormat1Colo)
1437
1429
self.assertFalse(result.needs_format_conversion(format))
1439
1431
def test_downgrade_to_2a(self):
1440
1432
tree = self.make_branch_and_tree('.', format='development-colo')
1441
1433
format = bzrdir.BzrDirMetaFormat1()
1442
self.assertTrue(tree.controldir.needs_format_conversion(format))
1443
converter = tree.controldir._format.get_converter(format)
1444
result = converter.convert(tree.controldir, None)
1434
self.assertTrue(tree.bzrdir.needs_format_conversion(format))
1435
converter = tree.bzrdir._format.get_converter(format)
1436
result = converter.convert(tree.bzrdir, None)
1445
1437
self.assertIsInstance(result._format, bzrdir.BzrDirMetaFormat1)
1446
1438
self.assertFalse(result.needs_format_conversion(format))
1448
1440
def test_downgrade_to_2a_too_many_branches(self):
1449
1441
tree = self.make_branch_and_tree('.', format='development-colo')
1450
tree.controldir.create_branch(name="another-colocated-branch")
1451
converter = tree.controldir._format.get_converter(
1442
tree.bzrdir.create_branch(name="another-colocated-branch")
1443
converter = tree.bzrdir._format.get_converter(
1452
1444
bzrdir.BzrDirMetaFormat1())
1453
result = converter.convert(tree.controldir, bzrdir.BzrDirMetaFormat1())
1445
result = converter.convert(tree.bzrdir, bzrdir.BzrDirMetaFormat1())
1454
1446
self.assertIsInstance(result._format, bzrdir.BzrDirMetaFormat1)
1456
1448
def test_nested(self):
1457
1449
tree = self.make_branch_and_tree('.', format='development-colo')
1458
tree.controldir.create_branch(name='foo')
1459
tree.controldir.create_branch(name='fool/bla')
1450
tree.bzrdir.create_branch(name='foo')
1451
tree.bzrdir.create_branch(name='fool/bla')
1460
1452
self.assertRaises(
1461
errors.ParentBranchExists, tree.controldir.create_branch,
1453
errors.ParentBranchExists, tree.bzrdir.create_branch,
1462
1454
name='foo/bar')
1464
1456
def test_parent(self):
1465
1457
tree = self.make_branch_and_tree('.', format='development-colo')
1466
tree.controldir.create_branch(name='fool/bla')
1467
tree.controldir.create_branch(name='foo/bar')
1458
tree.bzrdir.create_branch(name='fool/bla')
1459
tree.bzrdir.create_branch(name='foo/bar')
1468
1460
self.assertRaises(
1469
errors.AlreadyBranchError, tree.controldir.create_branch,
1461
errors.AlreadyBranchError, tree.bzrdir.create_branch,
1472
def test_supports_relative_reference(self):
1473
tree = self.make_branch_and_tree('.', format='development-colo')
1474
target1 = tree.controldir.create_branch(name='target1')
1475
target2 = tree.controldir.create_branch(name='target2')
1476
source = tree.controldir.set_branch_reference(target1, name='source')
1478
target1.user_url, tree.controldir.open_branch('source').user_url)
1479
source.controldir.get_branch_transport(None, 'source').put_bytes(
1480
'location', b'file:,branch=target2')
1482
target2.user_url, tree.controldir.open_branch('source').user_url)
1485
1465
class SampleBzrFormat(bzrdir.BzrFormat):
1488
1468
def get_format_string(cls):
1489
return b"First line\n"
1469
return "First line\n"
1492
1472
class TestBzrFormat(TestCase):
1495
1475
def test_as_string(self):
1496
1476
format = SampleBzrFormat()
1497
format.features = {b"foo": b"required"}
1498
self.assertEqual(format.as_string(),
1501
format.features[b"another"] = b"optional"
1502
self.assertEqual(format.as_string(),
1504
b"optional another\n"
1477
format.features = {"foo": "required"}
1478
self.assertEqual(format.as_string(),
1481
format.features["another"] = "optional"
1482
self.assertEqual(format.as_string(),
1485
"optional another\n")
1507
1487
def test_network_name(self):
1508
1488
# The network string should include the feature info
1509
1489
format = SampleBzrFormat()
1510
format.features = {b"foo": b"required"}
1490
format.features = {"foo": "required"}
1511
1491
self.assertEqual(
1512
b"First line\nrequired foo\n",
1492
"First line\nrequired foo\n",
1513
1493
format.network_name())
1515
1495
def test_from_string_no_features(self):
1517
1497
format = SampleBzrFormat.from_string(
1519
1499
self.assertEqual({}, format.features)
1521
1501
def test_from_string_with_feature(self):
1522
1502
# Proper feature
1523
1503
format = SampleBzrFormat.from_string(
1524
b"First line\nrequired foo\n")
1525
self.assertEqual(b"required", format.features.get(b"foo"))
1504
"First line\nrequired foo\n")
1505
self.assertEqual("required", format.features.get("foo"))
1527
1507
def test_from_string_format_string_mismatch(self):
1528
1508
# The first line has to match the format string
1529
1509
self.assertRaises(AssertionError, SampleBzrFormat.from_string,
1530
b"Second line\nrequired foo\n")
1510
"Second line\nrequired foo\n")
1532
1512
def test_from_string_missing_space(self):
1533
1513
# At least one space is required in the feature lines
1534
1514
self.assertRaises(errors.ParseFormatError, SampleBzrFormat.from_string,
1535
b"First line\nfoo\n")
1515
"First line\nfoo\n")
1537
1517
def test_from_string_with_spaces(self):
1538
1518
# Feature with spaces (in case we add stuff like this in the future)
1539
1519
format = SampleBzrFormat.from_string(
1540
b"First line\nrequired foo with spaces\n")
1541
self.assertEqual(b"required", format.features.get(b"foo with spaces"))
1520
"First line\nrequired foo with spaces\n")
1521
self.assertEqual("required", format.features.get("foo with spaces"))
1543
1523
def test_eq(self):
1544
1524
format1 = SampleBzrFormat()
1545
format1.features = {b"nested-trees": b"optional"}
1525
format1.features = {"nested-trees": "optional"}
1546
1526
format2 = SampleBzrFormat()
1547
format2.features = {b"nested-trees": b"optional"}
1527
format2.features = {"nested-trees": "optional"}
1548
1528
self.assertEqual(format1, format1)
1549
1529
self.assertEqual(format1, format2)
1550
1530
format3 = SampleBzrFormat()
1553
1533
def test_check_support_status_optional(self):
1554
1534
# Optional, so silently ignore
1555
1535
format = SampleBzrFormat()
1556
format.features = {b"nested-trees": b"optional"}
1536
format.features = {"nested-trees": "optional"}
1557
1537
format.check_support_status(True)
1558
self.addCleanup(SampleBzrFormat.unregister_feature, b"nested-trees")
1559
SampleBzrFormat.register_feature(b"nested-trees")
1538
self.addCleanup(SampleBzrFormat.unregister_feature, "nested-trees")
1539
SampleBzrFormat.register_feature("nested-trees")
1560
1540
format.check_support_status(True)
1562
1542
def test_check_support_status_required(self):
1563
1543
# Optional, so trigger an exception
1564
1544
format = SampleBzrFormat()
1565
format.features = {b"nested-trees": b"required"}
1566
self.assertRaises(bzrdir.MissingFeature, format.check_support_status,
1568
self.addCleanup(SampleBzrFormat.unregister_feature, b"nested-trees")
1569
SampleBzrFormat.register_feature(b"nested-trees")
1545
format.features = {"nested-trees": "required"}
1546
self.assertRaises(errors.MissingFeature, format.check_support_status,
1548
self.addCleanup(SampleBzrFormat.unregister_feature, "nested-trees")
1549
SampleBzrFormat.register_feature("nested-trees")
1570
1550
format.check_support_status(True)
1572
1552
def test_check_support_status_unknown(self):
1573
1553
# treat unknown necessity as required
1574
1554
format = SampleBzrFormat()
1575
format.features = {b"nested-trees": b"unknown"}
1576
self.assertRaises(bzrdir.MissingFeature, format.check_support_status,
1578
self.addCleanup(SampleBzrFormat.unregister_feature, b"nested-trees")
1579
SampleBzrFormat.register_feature(b"nested-trees")
1555
format.features = {"nested-trees": "unknown"}
1556
self.assertRaises(errors.MissingFeature, format.check_support_status,
1558
self.addCleanup(SampleBzrFormat.unregister_feature, "nested-trees")
1559
SampleBzrFormat.register_feature("nested-trees")
1580
1560
format.check_support_status(True)
1582
1562
def test_feature_already_registered(self):
1583
1563
# a feature can only be registered once
1584
self.addCleanup(SampleBzrFormat.unregister_feature, b"nested-trees")
1585
SampleBzrFormat.register_feature(b"nested-trees")
1586
self.assertRaises(bzrdir.FeatureAlreadyRegistered,
1587
SampleBzrFormat.register_feature, b"nested-trees")
1564
self.addCleanup(SampleBzrFormat.unregister_feature, "nested-trees")
1565
SampleBzrFormat.register_feature("nested-trees")
1566
self.assertRaises(errors.FeatureAlreadyRegistered,
1567
SampleBzrFormat.register_feature, "nested-trees")
1589
1569
def test_feature_with_space(self):
1590
1570
# spaces are not allowed in feature names
1591
1571
self.assertRaises(ValueError, SampleBzrFormat.register_feature,