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.',
104
my_format_registry.register_lazy('lazy', __name__,
105
'DeprecatedBzrDirFormat', 'Format registered lazily',
107
bzr.register_metadir(my_format_registry, 'knit',
108
'breezy.bzr.knitrepo.RepositoryFormatKnit1',
109
'Format using knits',
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
bzrdir.register_metadir(my_format_registry, 'knit',
108
'breezy.repofmt.knitrepo.RepositoryFormatKnit1',
109
'Format using knits',
111
111
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)
112
bzrdir.register_metadir(my_format_registry,
114
'breezy.repofmt.knitrepo.RepositoryFormatKnit3',
115
'Experimental successor to knit. Use at your own risk.',
116
branch_format='breezy.bzr.branch.BzrBranchFormat6',
118
bzrdir.register_metadir(my_format_registry,
120
'breezy.repofmt.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)
125
my_format_registry.register_lazy('hiddenlazy', __name__,
126
'DeprecatedBzrDirFormat', 'Format registered lazily',
127
deprecated=True, hidden=True)
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)
128
128
return my_format_registry
130
130
def test_format_registry(self):
131
131
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')
132
my_bzrdir = my_format_registry.make_bzrdir('lazy')
133
self.assertIsInstance(my_bzrdir, DeprecatedBzrDirFormat)
134
my_bzrdir = my_format_registry.make_bzrdir('deprecated')
135
self.assertIsInstance(my_bzrdir, DeprecatedBzrDirFormat)
136
my_bzrdir = my_format_registry.make_bzrdir('default')
137
self.assertIsInstance(my_bzrdir.repository_format,
138
knitrepo.RepositoryFormatKnit1)
139
my_bzrdir = my_format_registry.make_bzrdir('knit')
140
self.assertIsInstance(my_bzrdir.repository_format,
141
knitrepo.RepositoryFormatKnit1)
142
my_bzrdir = my_format_registry.make_bzrdir('branch6')
143
143
self.assertIsInstance(my_bzrdir.get_branch_format(),
144
144
breezy.bzr.branch.BzrBranchFormat6)
309
308
def test_find_format_unknown_format(self):
310
309
t = self.get_transport()
312
t.put_bytes('.bzr/branch-format', b'')
311
t.put_bytes('.bzr/branch-format', '')
313
312
self.assertRaises(UnknownFormatError,
314
313
bzrdir.BzrDirFormat.find_format,
315
314
_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(bzr.LineEndingError,
322
bzrdir.BzrDirFormat.find_format,
323
_mod_transport.get_transport_from_path('.'))
325
def test_find_format_html(self):
326
t = self.get_transport()
329
'.bzr/branch-format',
330
b'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">')
331
e = self.assertRaises(
332
NotBranchError, bzrdir.BzrDirFormat.find_format,
333
_mod_transport.get_transport_from_path('.'))
335
316
def test_register_unregister_format(self):
336
317
format = SampleBzrDirFormat()
337
318
url = self.get_url()
339
320
format.initialize(url)
340
321
# register a format for it.
341
bzr.BzrProber.formats.register(format.get_format_string(), format)
322
bzrdir.BzrProber.formats.register(format.get_format_string(), format)
342
323
# which bzrdir.Open will refuse (not supported)
343
324
self.assertRaises(UnsupportedFormatError, bzrdir.BzrDir.open, url)
344
325
# which bzrdir.open_containing will refuse (not supported)
345
self.assertRaises(UnsupportedFormatError,
346
bzrdir.BzrDir.open_containing, url)
326
self.assertRaises(UnsupportedFormatError, bzrdir.BzrDir.open_containing, url)
347
327
# but open_downlevel will work
348
328
t = _mod_transport.get_transport_from_url(url)
349
329
self.assertEqual(format.open(t), bzrdir.BzrDir.open_unsupported(url))
350
330
# unregister the format
351
bzr.BzrProber.formats.remove(format.get_format_string())
331
bzrdir.BzrProber.formats.remove(format.get_format_string())
352
332
# now open_downlevel should fail too.
353
self.assertRaises(UnknownFormatError,
354
bzrdir.BzrDir.open_unsupported, url)
333
self.assertRaises(UnknownFormatError, bzrdir.BzrDir.open_unsupported, url)
356
335
def test_create_branch_and_repo_uses_default(self):
357
336
format = SampleBzrDirFormat()
400
379
bzrdir.BzrDir.create_standalone_workingtree,
401
380
self.get_readonly_url('child'), format=format)
402
381
tree = bzrdir.BzrDir.create_standalone_workingtree('child',
404
tree.controldir.open_repository()
383
tree.bzrdir.open_repository()
406
385
def test_create_branch_convenience(self):
407
386
# outside a repo the default convenience output is a repo+branch_tree
408
format = controldir.format_registry.make_controldir('knit')
387
format = controldir.format_registry.make_bzrdir('knit')
409
388
branch = bzrdir.BzrDir.create_branch_convenience('.', format=format)
410
branch.controldir.open_workingtree()
411
branch.controldir.open_repository()
389
branch.bzrdir.open_workingtree()
390
branch.bzrdir.open_repository()
413
392
def test_create_branch_convenience_possible_transports(self):
414
393
"""Check that the optional 'possible_transports' is recognized"""
415
format = controldir.format_registry.make_controldir('knit')
394
format = controldir.format_registry.make_bzrdir('knit')
416
395
t = self.get_transport()
417
396
branch = bzrdir.BzrDir.create_branch_convenience(
418
397
'.', format=format, possible_transports=[t])
419
branch.controldir.open_workingtree()
420
branch.controldir.open_repository()
398
branch.bzrdir.open_workingtree()
399
branch.bzrdir.open_repository()
422
401
def test_create_branch_convenience_root(self):
423
402
"""Creating a branch at the root of a fs should work."""
424
403
self.vfs_transport_factory = memory.MemoryServer
425
404
# outside a repo the default convenience output is a repo+branch_tree
426
format = controldir.format_registry.make_controldir('knit')
405
format = controldir.format_registry.make_bzrdir('knit')
427
406
branch = bzrdir.BzrDir.create_branch_convenience(self.get_url(),
429
408
self.assertRaises(errors.NoWorkingTree,
430
branch.controldir.open_workingtree)
431
branch.controldir.open_repository()
409
branch.bzrdir.open_workingtree)
410
branch.bzrdir.open_repository()
433
412
def test_create_branch_convenience_under_shared_repo(self):
434
413
# inside a repo the default convenience output is a branch+ follow the
435
414
# repo tree policy
436
format = controldir.format_registry.make_controldir('knit')
415
format = controldir.format_registry.make_bzrdir('knit')
437
416
self.make_repository('.', shared=True, format=format)
438
417
branch = bzrdir.BzrDir.create_branch_convenience('child',
440
branch.controldir.open_workingtree()
419
branch.bzrdir.open_workingtree()
441
420
self.assertRaises(errors.NoRepositoryPresent,
442
branch.controldir.open_repository)
421
branch.bzrdir.open_repository)
444
423
def test_create_branch_convenience_under_shared_repo_force_no_tree(self):
445
424
# inside a repo the default convenience output is a branch+ follow the
446
425
# repo tree policy but we can override that
447
format = controldir.format_registry.make_controldir('knit')
426
format = controldir.format_registry.make_bzrdir('knit')
448
427
self.make_repository('.', shared=True, format=format)
449
428
branch = bzrdir.BzrDir.create_branch_convenience('child',
450
force_new_tree=False, format=format)
429
force_new_tree=False, format=format)
451
430
self.assertRaises(errors.NoWorkingTree,
452
branch.controldir.open_workingtree)
431
branch.bzrdir.open_workingtree)
453
432
self.assertRaises(errors.NoRepositoryPresent,
454
branch.controldir.open_repository)
433
branch.bzrdir.open_repository)
456
435
def test_create_branch_convenience_under_shared_repo_no_tree_policy(self):
457
436
# inside a repo the default convenience output is a branch+ follow the
458
437
# repo tree policy
459
format = controldir.format_registry.make_controldir('knit')
438
format = controldir.format_registry.make_bzrdir('knit')
460
439
repo = self.make_repository('.', shared=True, format=format)
461
440
repo.set_make_working_trees(False)
462
441
branch = bzrdir.BzrDir.create_branch_convenience('child',
464
443
self.assertRaises(errors.NoWorkingTree,
465
branch.controldir.open_workingtree)
444
branch.bzrdir.open_workingtree)
466
445
self.assertRaises(errors.NoRepositoryPresent,
467
branch.controldir.open_repository)
446
branch.bzrdir.open_repository)
469
448
def test_create_branch_convenience_under_shared_repo_no_tree_policy_force_tree(self):
470
449
# inside a repo the default convenience output is a branch+ follow the
471
450
# repo tree policy but we can override that
472
format = controldir.format_registry.make_controldir('knit')
451
format = controldir.format_registry.make_bzrdir('knit')
473
452
repo = self.make_repository('.', shared=True, format=format)
474
453
repo.set_make_working_trees(False)
475
454
branch = bzrdir.BzrDir.create_branch_convenience('child',
476
force_new_tree=True, format=format)
477
branch.controldir.open_workingtree()
455
force_new_tree=True, format=format)
456
branch.bzrdir.open_workingtree()
478
457
self.assertRaises(errors.NoRepositoryPresent,
479
branch.controldir.open_repository)
458
branch.bzrdir.open_repository)
481
460
def test_create_branch_convenience_under_shared_repo_force_new_repo(self):
482
461
# inside a repo the default convenience output is overridable to give
483
462
# repo+branch+tree
484
format = controldir.format_registry.make_controldir('knit')
463
format = controldir.format_registry.make_bzrdir('knit')
485
464
self.make_repository('.', shared=True, format=format)
486
465
branch = bzrdir.BzrDir.create_branch_convenience('child',
487
force_new_repo=True, format=format)
488
branch.controldir.open_repository()
489
branch.controldir.open_workingtree()
466
force_new_repo=True, format=format)
467
branch.bzrdir.open_repository()
468
branch.bzrdir.open_workingtree()
492
471
class TestRepositoryAcquisitionPolicy(TestCaseWithTransport):
494
473
def test_acquire_repository_standalone(self):
495
474
"""The default acquisition policy should create a standalone branch."""
496
my_bzrdir = self.make_controldir('.')
475
my_bzrdir = self.make_bzrdir('.')
497
476
repo_policy = my_bzrdir.determine_repository_policy()
498
477
repo, is_new = repo_policy.acquire_repository()
499
self.assertEqual(repo.controldir.root_transport.base,
478
self.assertEqual(repo.bzrdir.root_transport.base,
500
479
my_bzrdir.root_transport.base)
501
480
self.assertFalse(repo.is_shared())
503
482
def test_determine_stacking_policy(self):
504
parent_bzrdir = self.make_controldir('.')
505
child_bzrdir = self.make_controldir('child')
483
parent_bzrdir = self.make_bzrdir('.')
484
child_bzrdir = self.make_bzrdir('child')
506
485
parent_bzrdir.get_config().set_default_stack_on('http://example.org')
507
486
repo_policy = child_bzrdir.determine_repository_policy()
508
487
self.assertEqual('http://example.org', repo_policy._stack_on)
510
489
def test_determine_stacking_policy_relative(self):
511
parent_bzrdir = self.make_controldir('.')
512
child_bzrdir = self.make_controldir('child')
490
parent_bzrdir = self.make_bzrdir('.')
491
child_bzrdir = self.make_bzrdir('child')
513
492
parent_bzrdir.get_config().set_default_stack_on('child2')
514
493
repo_policy = child_bzrdir.determine_repository_policy()
515
494
self.assertEqual('child2', repo_policy._stack_on)
566
544
opened = bzrdir.BzrDir.open(t.base)
567
545
if not isinstance(old_fmt, remote.RemoteBzrDirFormat):
568
546
self.assertEqual(control._format.network_name(),
569
old_fmt.network_name())
547
old_fmt.network_name())
570
548
self.assertEqual(control._format.network_name(),
571
opened._format.network_name())
549
opened._format.network_name())
572
550
self.assertEqual(control.__class__, opened.__class__)
573
551
self.assertLength(1, repo._fallback_repositories)
575
553
def test_sprout_obeys_stacking_policy(self):
576
554
child_branch, new_child_transport = self.prepare_default_stacking()
577
new_child = child_branch.controldir.sprout(new_child_transport.base)
555
new_child = child_branch.bzrdir.sprout(new_child_transport.base)
578
556
self.assertEqual(child_branch.base,
579
557
new_child.open_branch().get_stacked_on_url())
581
559
def test_clone_ignores_policy_for_unsupported_formats(self):
582
560
child_branch, new_child_transport = self.prepare_default_stacking(
583
561
child_format='pack-0.92')
584
new_child = child_branch.controldir.clone_on_transport(
586
self.assertRaises(branch.UnstackableBranchFormat,
562
new_child = child_branch.bzrdir.clone_on_transport(new_child_transport)
563
self.assertRaises(errors.UnstackableBranchFormat,
587
564
new_child.open_branch().get_stacked_on_url)
589
566
def test_sprout_ignores_policy_for_unsupported_formats(self):
590
567
child_branch, new_child_transport = self.prepare_default_stacking(
591
568
child_format='pack-0.92')
592
new_child = child_branch.controldir.sprout(new_child_transport.base)
593
self.assertRaises(branch.UnstackableBranchFormat,
569
new_child = child_branch.bzrdir.sprout(new_child_transport.base)
570
self.assertRaises(errors.UnstackableBranchFormat,
594
571
new_child.open_branch().get_stacked_on_url)
596
573
def test_sprout_upgrades_format_if_stacked_specified(self):
597
574
child_branch, new_child_transport = self.prepare_default_stacking(
598
575
child_format='pack-0.92')
599
new_child = child_branch.controldir.sprout(new_child_transport.base,
601
self.assertEqual(child_branch.controldir.root_transport.base,
576
new_child = child_branch.bzrdir.sprout(new_child_transport.base,
578
self.assertEqual(child_branch.bzrdir.root_transport.base,
602
579
new_child.open_branch().get_stacked_on_url())
603
580
repo = new_child.open_repository()
604
581
self.assertTrue(repo._format.supports_external_lookups)
676
653
self.assertRaises(NotBranchError, bzrdir.BzrDir.open_containing,
677
654
self.get_readonly_url('g/p/q'))
678
655
control = bzrdir.BzrDir.create(self.get_url())
679
branch, relpath = bzrdir.BzrDir.open_containing(
656
branch, relpath = bzrdir.BzrDir.open_containing(self.get_readonly_url(''))
657
self.assertEqual('', relpath)
658
branch, relpath = bzrdir.BzrDir.open_containing(self.get_readonly_url('g/p/q'))
659
self.assertEqual('g/p/q', relpath)
661
def test_open_containing_tree_branch_or_repository_empty(self):
662
self.assertRaises(errors.NotBranchError,
663
bzrdir.BzrDir.open_containing_tree_branch_or_repository,
680
664
self.get_readonly_url(''))
681
self.assertEqual('', relpath)
682
branch, relpath = bzrdir.BzrDir.open_containing(
683
self.get_readonly_url('g/p/q'))
684
self.assertEqual('g/p/q', relpath)
686
def test_open_containing_tree_branch_or_repository_empty(self):
687
self.assertRaises(errors.NotBranchError,
688
bzrdir.BzrDir.open_containing_tree_branch_or_repository,
689
self.get_readonly_url(''))
691
666
def test_open_containing_tree_branch_or_repository_all(self):
692
667
self.make_branch_and_tree('topdir')
866
827
self.assertRaises(NotBranchError, bzrdir.BzrDir.open_from_transport, t)
868
829
def test_sprout_recursive(self):
869
tree = self.make_branch_and_tree('tree1')
870
sub_tree = self.make_branch_and_tree('tree1/subtree')
871
sub_tree.set_root_id(b'subtree-root')
830
tree = self.make_branch_and_tree('tree1',
831
format='development-subtree')
832
sub_tree = self.make_branch_and_tree('tree1/subtree',
833
format='development-subtree')
834
sub_tree.set_root_id('subtree-root')
872
835
tree.add_reference(sub_tree)
873
tree.set_reference_info('subtree', sub_tree.branch.user_url)
874
836
self.build_tree(['tree1/subtree/file'])
875
837
sub_tree.add('file')
876
838
tree.commit('Initial commit')
877
tree2 = tree.controldir.sprout('tree2').open_workingtree()
839
tree2 = tree.bzrdir.sprout('tree2').open_workingtree()
878
840
tree2.lock_read()
879
841
self.addCleanup(tree2.unlock)
880
842
self.assertPathExists('tree2/subtree/file')
881
self.assertEqual('tree-reference', tree2.kind('subtree'))
843
self.assertEqual('tree-reference', tree2.kind('subtree-root'))
883
845
def test_cloning_metadir(self):
884
846
"""Ensure that cloning metadir is suitable"""
885
bzrdir = self.make_controldir('bzrdir')
847
bzrdir = self.make_bzrdir('bzrdir')
886
848
bzrdir.cloning_metadir()
887
849
branch = self.make_branch('branch', format='knit')
888
format = branch.controldir.cloning_metadir()
850
format = branch.bzrdir.cloning_metadir()
889
851
self.assertIsInstance(format.workingtree_format,
890
workingtree_4.WorkingTreeFormat6)
852
workingtree_4.WorkingTreeFormat6)
892
854
def test_sprout_recursive_treeless(self):
893
855
tree = self.make_branch_and_tree('tree1',
894
format='development-subtree')
856
format='development-subtree')
895
857
sub_tree = self.make_branch_and_tree('tree1/subtree',
896
format='development-subtree')
858
format='development-subtree')
897
859
tree.add_reference(sub_tree)
898
tree.set_reference_info('subtree', sub_tree.branch.user_url)
899
860
self.build_tree(['tree1/subtree/file'])
900
861
sub_tree.add('file')
901
862
tree.commit('Initial commit')
902
863
# The following line force the orhaning to reveal bug #634470
903
tree.branch.get_config_stack().set('transform.orphan_policy', 'move')
904
tree.controldir.destroy_workingtree()
864
tree.branch.get_config_stack().set(
865
'bzr.transform.orphan_policy', 'move')
866
tree.bzrdir.destroy_workingtree()
905
867
# FIXME: subtree/.bzr is left here which allows the test to pass (or
906
868
# fail :-( ) -- vila 20100909
907
869
repo = self.make_repository('repo', shared=True,
908
format='development-subtree')
870
format='development-subtree')
909
871
repo.set_make_working_trees(False)
910
872
# FIXME: we just deleted the workingtree and now we want to use it ????
911
873
# At a minimum, we should use tree.branch below (but this fails too
915
877
# by bzrdir.BzrDirMeta1.destroy_workingtree when it ignores the
916
878
# [DeletingParent('Not deleting', u'subtree', None)] conflict). See bug
917
879
# #634470. -- vila 20100909
918
tree.controldir.sprout('repo/tree2')
919
self.assertPathExists('repo/tree2/subtree')
920
self.assertPathDoesNotExist('repo/tree2/subtree/file')
880
self.assertRaises(errors.NotBranchError,
881
tree.bzrdir.sprout, 'repo/tree2')
882
# self.assertPathExists('repo/tree2/subtree')
883
# self.assertPathDoesNotExist('repo/tree2/subtree/file')
922
885
def make_foo_bar_baz(self):
923
foo = bzrdir.BzrDir.create_branch_convenience('foo').controldir
924
bar = self.make_branch('foo/bar').controldir
925
baz = self.make_branch('baz').controldir
886
foo = bzrdir.BzrDir.create_branch_convenience('foo').bzrdir
887
bar = self.make_branch('foo/bar').bzrdir
888
baz = self.make_branch('baz').bzrdir
926
889
return foo, bar, baz
928
def test_find_controldirs(self):
891
def test_find_bzrdirs(self):
929
892
foo, bar, baz = self.make_foo_bar_baz()
930
893
t = self.get_transport()
931
self.assertEqualBzrdirs(
932
[baz, foo, bar], bzrdir.BzrDir.find_controldirs(t))
894
self.assertEqualBzrdirs([baz, foo, bar], bzrdir.BzrDir.find_bzrdirs(t))
934
896
def make_fake_permission_denied_transport(self, transport, paths):
935
897
"""Create a transport that raises PermissionDenied for some paths."""
1059
1019
Metadirs should compare equal iff they have the same repo, branch and
1062
mydir = controldir.format_registry.make_controldir('knit')
1022
mydir = controldir.format_registry.make_bzrdir('knit')
1063
1023
self.assertEqual(mydir, mydir)
1064
1024
self.assertFalse(mydir != mydir)
1065
otherdir = controldir.format_registry.make_controldir('knit')
1025
otherdir = controldir.format_registry.make_bzrdir('knit')
1066
1026
self.assertEqual(otherdir, mydir)
1067
1027
self.assertFalse(otherdir != mydir)
1068
otherdir2 = controldir.format_registry.make_controldir(
1069
'development-subtree')
1028
otherdir2 = controldir.format_registry.make_bzrdir('development-subtree')
1070
1029
self.assertNotEqual(otherdir2, mydir)
1071
1030
self.assertFalse(otherdir2 == mydir)
1073
1032
def test_with_features(self):
1074
1033
tree = self.make_branch_and_tree('tree', format='2a')
1075
tree.controldir.update_feature_flags({b"bar": b"required"})
1076
self.assertRaises(bzrdir.MissingFeature, bzrdir.BzrDir.open, 'tree')
1077
bzrdir.BzrDirMetaFormat1.register_feature(b'bar')
1078
self.addCleanup(bzrdir.BzrDirMetaFormat1.unregister_feature, b'bar')
1034
tree.bzrdir.update_feature_flags({"bar": "required"})
1035
self.assertRaises(errors.MissingFeature, bzrdir.BzrDir.open, 'tree')
1036
bzrdir.BzrDirMetaFormat1.register_feature('bar')
1037
self.addCleanup(bzrdir.BzrDirMetaFormat1.unregister_feature, 'bar')
1079
1038
dir = bzrdir.BzrDir.open('tree')
1080
self.assertEqual(b"required", dir._format.features.get(b"bar"))
1081
tree.controldir.update_feature_flags({
1083
b"nonexistant": None})
1039
self.assertEqual("required", dir._format.features.get("bar"))
1040
tree.bzrdir.update_feature_flags({"bar": None, "nonexistant": None})
1084
1041
dir = bzrdir.BzrDir.open('tree')
1085
1042
self.assertEqual({}, dir._format.features)
1087
1044
def test_needs_conversion_different_working_tree(self):
1088
1045
# meta1dirs need an conversion if any element is not the default.
1089
new_format = controldir.format_registry.make_controldir('dirstate')
1046
new_format = controldir.format_registry.make_bzrdir('dirstate')
1090
1047
tree = self.make_branch_and_tree('tree', format='knit')
1091
self.assertTrue(tree.controldir.needs_format_conversion(
1048
self.assertTrue(tree.bzrdir.needs_format_conversion(
1094
1051
def test_initialize_on_format_uses_smart_transport(self):
1095
1052
self.setup_smart_server_with_call_log()
1096
new_format = controldir.format_registry.make_controldir('dirstate')
1053
new_format = controldir.format_registry.make_bzrdir('dirstate')
1097
1054
transport = self.get_transport('target')
1098
1055
transport.ensure_base()
1099
1056
self.reset_smart_call_log()
1118
1075
def test_create_branch_convenience(self):
1119
1076
# outside a repo the default convenience output is a repo+branch_tree
1120
format = controldir.format_registry.make_controldir('knit')
1077
format = controldir.format_registry.make_bzrdir('knit')
1121
1078
branch = bzrdir.BzrDir.create_branch_convenience(
1122
1079
self.get_url('foo'), format=format)
1123
1080
self.assertRaises(errors.NoWorkingTree,
1124
branch.controldir.open_workingtree)
1125
branch.controldir.open_repository()
1081
branch.bzrdir.open_workingtree)
1082
branch.bzrdir.open_repository()
1127
1084
def test_create_branch_convenience_force_tree_not_local_fails(self):
1128
1085
# outside a repo the default convenience output is a repo+branch_tree
1129
format = controldir.format_registry.make_controldir('knit')
1086
format = controldir.format_registry.make_bzrdir('knit')
1130
1087
self.assertRaises(errors.NotLocalUrl,
1131
bzrdir.BzrDir.create_branch_convenience,
1132
self.get_url('foo'),
1133
force_new_tree=True,
1088
bzrdir.BzrDir.create_branch_convenience,
1089
self.get_url('foo'),
1090
force_new_tree=True,
1135
1092
t = self.get_transport()
1136
1093
self.assertFalse(t.has('foo'))
1138
1095
def test_clone(self):
1139
1096
# clone into a nonlocal path works
1140
format = controldir.format_registry.make_controldir('knit')
1097
format = controldir.format_registry.make_bzrdir('knit')
1141
1098
branch = bzrdir.BzrDir.create_branch_convenience('local',
1143
branch.controldir.open_workingtree()
1144
result = branch.controldir.clone(self.get_url('remote'))
1100
branch.bzrdir.open_workingtree()
1101
result = branch.bzrdir.clone(self.get_url('remote'))
1145
1102
self.assertRaises(errors.NoWorkingTree,
1146
1103
result.open_workingtree)
1147
1104
result.open_branch()
1211
1168
self.assertIsInstance(bdir.root_transport, type(start))
1214
class TestHTTPRedirections(TestHTTPRedirectionsBase,
1215
http_utils.TestCaseWithTwoWebservers):
1171
class TestHTTPRedirections_urllib(TestHTTPRedirections,
1172
http_utils.TestCaseWithTwoWebservers):
1216
1173
"""Tests redirections for urllib implementation"""
1218
_transport = HttpTransport
1220
def _qualified_url(self, host, port):
1221
result = 'http://%s:%s' % (host, port)
1222
self.permit_url(result)
1226
class TestHTTPRedirections_nosmart(TestHTTPRedirectionsBase,
1227
http_utils.TestCaseWithTwoWebservers):
1175
_transport = HttpTransport_urllib
1177
def _qualified_url(self, host, port):
1178
result = 'http+urllib://%s:%s' % (host, port)
1179
self.permit_url(result)
1184
class TestHTTPRedirections_pycurl(TestWithTransport_pycurl,
1185
TestHTTPRedirections,
1186
http_utils.TestCaseWithTwoWebservers):
1187
"""Tests redirections for pycurl implementation"""
1189
def _qualified_url(self, host, port):
1190
result = 'http+pycurl://%s:%s' % (host, port)
1191
self.permit_url(result)
1195
class TestHTTPRedirections_nosmart(TestHTTPRedirections,
1196
http_utils.TestCaseWithTwoWebservers):
1228
1197
"""Tests redirections for the nosmart decorator"""
1230
1199
_transport = NoSmartTransportDecorator
1454
1426
def test_upgrade_from_2a(self):
1455
1427
tree = self.make_branch_and_tree('.', format='2a')
1456
1428
format = bzrdir.BzrDirMetaFormat1Colo()
1457
self.assertTrue(tree.controldir.needs_format_conversion(format))
1458
converter = tree.controldir._format.get_converter(format)
1459
result = converter.convert(tree.controldir, None)
1429
self.assertTrue(tree.bzrdir.needs_format_conversion(format))
1430
converter = tree.bzrdir._format.get_converter(format)
1431
result = converter.convert(tree.bzrdir, None)
1460
1432
self.assertIsInstance(result._format, bzrdir.BzrDirMetaFormat1Colo)
1461
1433
self.assertFalse(result.needs_format_conversion(format))
1463
1435
def test_downgrade_to_2a(self):
1464
1436
tree = self.make_branch_and_tree('.', format='development-colo')
1465
1437
format = bzrdir.BzrDirMetaFormat1()
1466
self.assertTrue(tree.controldir.needs_format_conversion(format))
1467
converter = tree.controldir._format.get_converter(format)
1468
result = converter.convert(tree.controldir, None)
1438
self.assertTrue(tree.bzrdir.needs_format_conversion(format))
1439
converter = tree.bzrdir._format.get_converter(format)
1440
result = converter.convert(tree.bzrdir, None)
1469
1441
self.assertIsInstance(result._format, bzrdir.BzrDirMetaFormat1)
1470
1442
self.assertFalse(result.needs_format_conversion(format))
1472
1444
def test_downgrade_to_2a_too_many_branches(self):
1473
1445
tree = self.make_branch_and_tree('.', format='development-colo')
1474
tree.controldir.create_branch(name="another-colocated-branch")
1475
converter = tree.controldir._format.get_converter(
1446
tree.bzrdir.create_branch(name="another-colocated-branch")
1447
converter = tree.bzrdir._format.get_converter(
1476
1448
bzrdir.BzrDirMetaFormat1())
1477
result = converter.convert(tree.controldir, bzrdir.BzrDirMetaFormat1())
1449
result = converter.convert(tree.bzrdir, bzrdir.BzrDirMetaFormat1())
1478
1450
self.assertIsInstance(result._format, bzrdir.BzrDirMetaFormat1)
1480
1452
def test_nested(self):
1481
1453
tree = self.make_branch_and_tree('.', format='development-colo')
1482
tree.controldir.create_branch(name='foo')
1483
tree.controldir.create_branch(name='fool/bla')
1454
tree.bzrdir.create_branch(name='foo')
1455
tree.bzrdir.create_branch(name='fool/bla')
1484
1456
self.assertRaises(
1485
errors.ParentBranchExists, tree.controldir.create_branch,
1457
errors.ParentBranchExists, tree.bzrdir.create_branch,
1486
1458
name='foo/bar')
1488
1460
def test_parent(self):
1489
1461
tree = self.make_branch_and_tree('.', format='development-colo')
1490
tree.controldir.create_branch(name='fool/bla')
1491
tree.controldir.create_branch(name='foo/bar')
1462
tree.bzrdir.create_branch(name='fool/bla')
1463
tree.bzrdir.create_branch(name='foo/bar')
1492
1464
self.assertRaises(
1493
errors.AlreadyBranchError, tree.controldir.create_branch,
1465
errors.AlreadyBranchError, tree.bzrdir.create_branch,
1496
def test_supports_relative_reference(self):
1497
tree = self.make_branch_and_tree('.', format='development-colo')
1498
target1 = tree.controldir.create_branch(name='target1')
1499
target2 = tree.controldir.create_branch(name='target2')
1500
source = tree.controldir.set_branch_reference(target1, name='source')
1502
target1.user_url, tree.controldir.open_branch('source').user_url)
1503
source.controldir.get_branch_transport(None, 'source').put_bytes(
1504
'location', b'file:,branch=target2')
1506
target2.user_url, tree.controldir.open_branch('source').user_url)
1509
1469
class SampleBzrFormat(bzrdir.BzrFormat):
1512
1472
def get_format_string(cls):
1513
return b"First line\n"
1473
return "First line\n"
1516
1476
class TestBzrFormat(TestCase):
1519
1479
def test_as_string(self):
1520
1480
format = SampleBzrFormat()
1521
format.features = {b"foo": b"required"}
1522
self.assertEqual(format.as_string(),
1525
format.features[b"another"] = b"optional"
1526
self.assertEqual(format.as_string(),
1528
b"optional another\n"
1481
format.features = {"foo": "required"}
1482
self.assertEqual(format.as_string(),
1485
format.features["another"] = "optional"
1486
self.assertEqual(format.as_string(),
1489
"optional another\n")
1531
1491
def test_network_name(self):
1532
1492
# The network string should include the feature info
1533
1493
format = SampleBzrFormat()
1534
format.features = {b"foo": b"required"}
1494
format.features = {"foo": "required"}
1535
1495
self.assertEqual(
1536
b"First line\nrequired foo\n",
1496
"First line\nrequired foo\n",
1537
1497
format.network_name())
1539
1499
def test_from_string_no_features(self):
1541
1501
format = SampleBzrFormat.from_string(
1543
1503
self.assertEqual({}, format.features)
1545
1505
def test_from_string_with_feature(self):
1546
1506
# Proper feature
1547
1507
format = SampleBzrFormat.from_string(
1548
b"First line\nrequired foo\n")
1549
self.assertEqual(b"required", format.features.get(b"foo"))
1508
"First line\nrequired foo\n")
1509
self.assertEqual("required", format.features.get("foo"))
1551
1511
def test_from_string_format_string_mismatch(self):
1552
1512
# The first line has to match the format string
1553
1513
self.assertRaises(AssertionError, SampleBzrFormat.from_string,
1554
b"Second line\nrequired foo\n")
1514
"Second line\nrequired foo\n")
1556
1516
def test_from_string_missing_space(self):
1557
1517
# At least one space is required in the feature lines
1558
1518
self.assertRaises(errors.ParseFormatError, SampleBzrFormat.from_string,
1559
b"First line\nfoo\n")
1519
"First line\nfoo\n")
1561
1521
def test_from_string_with_spaces(self):
1562
1522
# Feature with spaces (in case we add stuff like this in the future)
1563
1523
format = SampleBzrFormat.from_string(
1564
b"First line\nrequired foo with spaces\n")
1565
self.assertEqual(b"required", format.features.get(b"foo with spaces"))
1524
"First line\nrequired foo with spaces\n")
1525
self.assertEqual("required", format.features.get("foo with spaces"))
1567
1527
def test_eq(self):
1568
1528
format1 = SampleBzrFormat()
1569
format1.features = {b"nested-trees": b"optional"}
1529
format1.features = {"nested-trees": "optional"}
1570
1530
format2 = SampleBzrFormat()
1571
format2.features = {b"nested-trees": b"optional"}
1531
format2.features = {"nested-trees": "optional"}
1572
1532
self.assertEqual(format1, format1)
1573
1533
self.assertEqual(format1, format2)
1574
1534
format3 = SampleBzrFormat()
1577
1537
def test_check_support_status_optional(self):
1578
1538
# Optional, so silently ignore
1579
1539
format = SampleBzrFormat()
1580
format.features = {b"nested-trees": b"optional"}
1540
format.features = {"nested-trees": "optional"}
1581
1541
format.check_support_status(True)
1582
self.addCleanup(SampleBzrFormat.unregister_feature, b"nested-trees")
1583
SampleBzrFormat.register_feature(b"nested-trees")
1542
self.addCleanup(SampleBzrFormat.unregister_feature, "nested-trees")
1543
SampleBzrFormat.register_feature("nested-trees")
1584
1544
format.check_support_status(True)
1586
1546
def test_check_support_status_required(self):
1587
1547
# Optional, so trigger an exception
1588
1548
format = SampleBzrFormat()
1589
format.features = {b"nested-trees": b"required"}
1590
self.assertRaises(bzrdir.MissingFeature, format.check_support_status,
1592
self.addCleanup(SampleBzrFormat.unregister_feature, b"nested-trees")
1593
SampleBzrFormat.register_feature(b"nested-trees")
1549
format.features = {"nested-trees": "required"}
1550
self.assertRaises(errors.MissingFeature, format.check_support_status,
1552
self.addCleanup(SampleBzrFormat.unregister_feature, "nested-trees")
1553
SampleBzrFormat.register_feature("nested-trees")
1594
1554
format.check_support_status(True)
1596
1556
def test_check_support_status_unknown(self):
1597
1557
# treat unknown necessity as required
1598
1558
format = SampleBzrFormat()
1599
format.features = {b"nested-trees": b"unknown"}
1600
self.assertRaises(bzrdir.MissingFeature, format.check_support_status,
1602
self.addCleanup(SampleBzrFormat.unregister_feature, b"nested-trees")
1603
SampleBzrFormat.register_feature(b"nested-trees")
1559
format.features = {"nested-trees": "unknown"}
1560
self.assertRaises(errors.MissingFeature, format.check_support_status,
1562
self.addCleanup(SampleBzrFormat.unregister_feature, "nested-trees")
1563
SampleBzrFormat.register_feature("nested-trees")
1604
1564
format.check_support_status(True)
1606
1566
def test_feature_already_registered(self):
1607
1567
# a feature can only be registered once
1608
self.addCleanup(SampleBzrFormat.unregister_feature, b"nested-trees")
1609
SampleBzrFormat.register_feature(b"nested-trees")
1610
self.assertRaises(bzrdir.FeatureAlreadyRegistered,
1611
SampleBzrFormat.register_feature, b"nested-trees")
1568
self.addCleanup(SampleBzrFormat.unregister_feature, "nested-trees")
1569
SampleBzrFormat.register_feature("nested-trees")
1570
self.assertRaises(errors.FeatureAlreadyRegistered,
1571
SampleBzrFormat.register_feature, "nested-trees")
1613
1573
def test_feature_with_space(self):
1614
1574
# spaces are not allowed in feature names
1615
1575
self.assertRaises(ValueError, SampleBzrFormat.register_feature,