68
71
def test_get_set_default_format(self):
69
72
old_format = bzrdir.BzrDirFormat.get_default_format()
70
# default is BzrDirFormat6
71
self.failUnless(isinstance(old_format, bzrdir.BzrDirMetaFormat1))
72
bzrdir.BzrDirFormat._set_default_format(SampleBzrDirFormat())
73
self.assertIsInstance(old_format, bzrdir.BzrDirMetaFormat1)
74
controldir.ControlDirFormat._set_default_format(SampleBzrDirFormat())
73
75
# creating a bzr dir should now create an instrumented dir.
75
77
result = bzrdir.BzrDir.create('memory:///')
76
self.failUnless(isinstance(result, SampleBzrDir))
78
self.assertIsInstance(result, SampleBzrDir)
78
bzrdir.BzrDirFormat._set_default_format(old_format)
80
controldir.ControlDirFormat._set_default_format(old_format)
79
81
self.assertEqual(old_format, bzrdir.BzrDirFormat.get_default_format())
82
84
class TestFormatRegistry(TestCase):
84
86
def make_format_registry(self):
85
my_format_registry = bzrdir.BzrDirFormatRegistry()
87
my_format_registry = controldir.ControlDirFormatRegistry()
86
88
my_format_registry.register('weave', bzrdir.BzrDirFormat6,
87
89
'Pre-0.8 format. Slower and does not support checkouts or shared'
88
90
' repositories', deprecated=True)
89
91
my_format_registry.register_lazy('lazy', 'bzrlib.bzrdir',
90
92
'BzrDirFormat6', 'Format registered lazily', deprecated=True)
91
my_format_registry.register_metadir('knit',
93
bzrdir.register_metadir(my_format_registry, 'knit',
92
94
'bzrlib.repofmt.knitrepo.RepositoryFormatKnit1',
93
95
'Format using knits',
95
97
my_format_registry.set_default('knit')
96
my_format_registry.register_metadir(
98
bzrdir.register_metadir(my_format_registry,
98
100
'bzrlib.repofmt.knitrepo.RepositoryFormatKnit3',
99
101
'Experimental successor to knit. Use at your own risk.',
100
102
branch_format='bzrlib.branch.BzrBranchFormat6',
101
103
experimental=True)
102
my_format_registry.register_metadir(
104
bzrdir.register_metadir(my_format_registry,
104
106
'bzrlib.repofmt.knitrepo.RepositoryFormatKnit3',
105
107
'Experimental successor to knit. Use at your own risk.',
174
176
bzrdir.format_registry.set_default_repository(old_default)
176
178
def test_aliases(self):
177
a_registry = bzrdir.BzrDirFormatRegistry()
179
a_registry = controldir.ControlDirFormatRegistry()
178
180
a_registry.register('weave', bzrdir.BzrDirFormat6,
179
181
'Pre-0.8 format. Slower and does not support checkouts or shared'
180
182
' repositories', deprecated=True)
251
253
# is the right format object found for a branch?
252
254
# create a branch with a few known format objects.
253
255
# this is not quite the same as
254
t = get_transport(self.get_url())
256
t = self.get_transport()
255
257
self.build_tree(["foo/", "bar/"], transport=t)
256
258
def check_format(format, url):
257
259
format.initialize(url)
258
t = get_transport(url)
260
t = _mod_transport.get_transport(url)
259
261
found_format = bzrdir.BzrDirFormat.find_format(t)
260
self.failUnless(isinstance(found_format, format.__class__))
262
self.assertIsInstance(found_format, format.__class__)
261
263
check_format(bzrdir.BzrDirFormat5(), "foo")
262
264
check_format(bzrdir.BzrDirFormat6(), "bar")
264
266
def test_find_format_nothing_there(self):
265
267
self.assertRaises(NotBranchError,
266
268
bzrdir.BzrDirFormat.find_format,
269
_mod_transport.get_transport('.'))
269
271
def test_find_format_unknown_format(self):
270
t = get_transport(self.get_url())
272
t = self.get_transport()
272
274
t.put_bytes('.bzr/branch-format', '')
273
275
self.assertRaises(UnknownFormatError,
274
276
bzrdir.BzrDirFormat.find_format,
277
_mod_transport.get_transport('.'))
277
279
def test_register_unregister_format(self):
278
280
format = SampleBzrDirFormat()
286
288
# which bzrdir.open_containing will refuse (not supported)
287
289
self.assertRaises(UnsupportedFormatError, bzrdir.BzrDir.open_containing, url)
288
290
# but open_downlevel will work
289
t = get_transport(url)
291
t = _mod_transport.get_transport(url)
290
292
self.assertEqual(format.open(t), bzrdir.BzrDir.open_unsupported(url))
291
293
# unregister the format
292
294
bzrdir.BzrDirFormat.unregister_format(format)
678
680
self.assertEqual(relpath, 'baz')
680
682
def test_open_containing_from_transport(self):
681
self.assertRaises(NotBranchError, bzrdir.BzrDir.open_containing_from_transport,
682
get_transport(self.get_readonly_url('')))
683
self.assertRaises(NotBranchError, bzrdir.BzrDir.open_containing_from_transport,
684
get_transport(self.get_readonly_url('g/p/q')))
683
self.assertRaises(NotBranchError,
684
bzrdir.BzrDir.open_containing_from_transport,
685
_mod_transport.get_transport(self.get_readonly_url('')))
686
self.assertRaises(NotBranchError,
687
bzrdir.BzrDir.open_containing_from_transport,
688
_mod_transport.get_transport(self.get_readonly_url('g/p/q')))
685
689
control = bzrdir.BzrDir.create(self.get_url())
686
690
branch, relpath = bzrdir.BzrDir.open_containing_from_transport(
687
get_transport(self.get_readonly_url('')))
691
_mod_transport.get_transport(self.get_readonly_url('')))
688
692
self.assertEqual('', relpath)
689
693
branch, relpath = bzrdir.BzrDir.open_containing_from_transport(
690
get_transport(self.get_readonly_url('g/p/q')))
694
_mod_transport.get_transport(self.get_readonly_url('g/p/q')))
691
695
self.assertEqual('g/p/q', relpath)
693
697
def test_open_containing_tree_or_branch(self):
737
741
# transport pointing at bzrdir should give a bzrdir with root transport
738
742
# set to the given transport
739
743
control = bzrdir.BzrDir.create(self.get_url())
740
transport = get_transport(self.get_url())
741
opened_bzrdir = bzrdir.BzrDir.open_from_transport(transport)
742
self.assertEqual(transport.base, opened_bzrdir.root_transport.base)
744
t = self.get_transport()
745
opened_bzrdir = bzrdir.BzrDir.open_from_transport(t)
746
self.assertEqual(t.base, opened_bzrdir.root_transport.base)
743
747
self.assertIsInstance(opened_bzrdir, bzrdir.BzrDir)
745
749
def test_open_from_transport_no_bzrdir(self):
746
transport = get_transport(self.get_url())
747
self.assertRaises(NotBranchError, bzrdir.BzrDir.open_from_transport,
750
t = self.get_transport()
751
self.assertRaises(NotBranchError, bzrdir.BzrDir.open_from_transport, t)
750
753
def test_open_from_transport_bzrdir_in_parent(self):
751
754
control = bzrdir.BzrDir.create(self.get_url())
752
transport = get_transport(self.get_url())
753
transport.mkdir('subdir')
754
transport = transport.clone('subdir')
755
self.assertRaises(NotBranchError, bzrdir.BzrDir.open_from_transport,
755
t = self.get_transport()
757
t = t.clone('subdir')
758
self.assertRaises(NotBranchError, bzrdir.BzrDir.open_from_transport, t)
758
760
def test_sprout_recursive(self):
759
761
tree = self.make_branch_and_tree('tree1',
768
770
tree2 = tree.bzrdir.sprout('tree2').open_workingtree()
769
771
tree2.lock_read()
770
772
self.addCleanup(tree2.unlock)
771
self.failUnlessExists('tree2/subtree/file')
773
self.assertPathExists('tree2/subtree/file')
772
774
self.assertEqual('tree-reference', tree2.kind('subtree-root'))
774
776
def test_cloning_metadir(self):
789
791
self.build_tree(['tree1/subtree/file'])
790
792
sub_tree.add('file')
791
793
tree.commit('Initial commit')
794
# The following line force the orhaning to reveal bug #634470
795
tree.branch.get_config().set_user_option(
796
'bzr.transform.orphan_policy', 'move')
792
797
tree.bzrdir.destroy_workingtree()
798
# FIXME: subtree/.bzr is left here which allows the test to pass (or
799
# fail :-( ) -- vila 20100909
793
800
repo = self.make_repository('repo', shared=True,
794
801
format='dirstate-with-subtree')
795
802
repo.set_make_working_trees(False)
796
tree.bzrdir.sprout('repo/tree2')
797
self.failUnlessExists('repo/tree2/subtree')
798
self.failIfExists('repo/tree2/subtree/file')
803
# FIXME: we just deleted the workingtree and now we want to use it ????
804
# At a minimum, we should use tree.branch below (but this fails too
805
# currently) or stop calling this test 'treeless'. Specifically, I've
806
# turn the line below into an assertRaises when 'subtree/.bzr' is
807
# orphaned and sprout tries to access the branch there (which is left
808
# by bzrdir.BzrDirMeta1.destroy_workingtree when it ignores the
809
# [DeletingParent('Not deleting', u'subtree', None)] conflict). See bug
810
# #634470. -- vila 20100909
811
self.assertRaises(errors.NotBranchError,
812
tree.bzrdir.sprout, 'repo/tree2')
813
# self.assertPathExists('repo/tree2/subtree')
814
# self.assertPathDoesNotExist('repo/tree2/subtree/file')
800
816
def make_foo_bar_baz(self):
801
817
foo = bzrdir.BzrDir.create_branch_convenience('foo').bzrdir
806
822
def test_find_bzrdirs(self):
807
823
foo, bar, baz = self.make_foo_bar_baz()
808
transport = get_transport(self.get_url())
809
self.assertEqualBzrdirs([baz, foo, bar],
810
bzrdir.BzrDir.find_bzrdirs(transport))
824
t = self.get_transport()
825
self.assertEqualBzrdirs([baz, foo, bar], bzrdir.BzrDir.find_bzrdirs(t))
812
827
def make_fake_permission_denied_transport(self, transport, paths):
813
828
"""Create a transport that raises PermissionDenied for some paths."""
830
845
def test_find_bzrdirs_permission_denied(self):
831
846
foo, bar, baz = self.make_foo_bar_baz()
832
transport = get_transport(self.get_url())
847
t = self.get_transport()
833
848
path_filter_server, path_filter_transport = \
834
self.make_fake_permission_denied_transport(transport, ['foo'])
849
self.make_fake_permission_denied_transport(t, ['foo'])
835
850
# local transport
836
851
self.assertBranchUrlsEndWith('/baz/',
837
852
bzrdir.BzrDir.find_bzrdirs(path_filter_transport))
846
861
return [s for s in transport.list_dir('') if s != 'baz']
848
863
foo, bar, baz = self.make_foo_bar_baz()
849
transport = get_transport(self.get_url())
850
self.assertEqualBzrdirs([foo, bar],
851
bzrdir.BzrDir.find_bzrdirs(transport,
852
list_current=list_current))
864
t = self.get_transport()
865
self.assertEqualBzrdirs(
867
bzrdir.BzrDir.find_bzrdirs(t, list_current=list_current))
854
869
def test_find_bzrdirs_evaluate(self):
855
870
def evaluate(bzrdir):
861
876
return False, bzrdir.root_transport.base
863
878
foo, bar, baz = self.make_foo_bar_baz()
864
transport = get_transport(self.get_url())
879
t = self.get_transport()
865
880
self.assertEqual([baz.root_transport.base, foo.root_transport.base],
866
list(bzrdir.BzrDir.find_bzrdirs(transport,
881
list(bzrdir.BzrDir.find_bzrdirs(t, evaluate=evaluate)))
869
883
def assertEqualBzrdirs(self, first, second):
870
884
first = list(first)
877
891
root = self.make_repository('', shared=True)
878
892
foo, bar, baz = self.make_foo_bar_baz()
879
893
qux = self.make_bzrdir('foo/qux')
880
transport = get_transport(self.get_url())
881
branches = bzrdir.BzrDir.find_branches(transport)
894
t = self.get_transport()
895
branches = bzrdir.BzrDir.find_branches(t)
882
896
self.assertEqual(baz.root_transport.base, branches[0].base)
883
897
self.assertEqual(foo.root_transport.base, branches[1].base)
884
898
self.assertEqual(bar.root_transport.base, branches[2].base)
886
900
# ensure this works without a top-level repo
887
branches = bzrdir.BzrDir.find_branches(transport.clone('foo'))
901
branches = bzrdir.BzrDir.find_branches(t.clone('foo'))
888
902
self.assertEqual(foo.root_transport.base, branches[0].base)
889
903
self.assertEqual(bar.root_transport.base, branches[1].base)
892
906
class TestMissingRepoBranchesSkipped(TestCaseWithMemoryTransport):
894
908
def test_find_bzrdirs_missing_repo(self):
895
transport = get_transport(self.get_url())
909
t = self.get_transport()
896
910
arepo = self.make_repository('arepo', shared=True)
897
911
abranch_url = arepo.user_url + '/abranch'
898
912
abranch = bzrdir.BzrDir.create(abranch_url).create_branch()
899
transport.delete_tree('arepo/.bzr')
913
t.delete_tree('arepo/.bzr')
900
914
self.assertRaises(errors.NoRepositoryPresent,
901
915
branch.Branch.open, abranch_url)
902
916
self.make_branch('baz')
903
for actual_bzrdir in bzrdir.BzrDir.find_branches(transport):
917
for actual_bzrdir in bzrdir.BzrDir.find_branches(t):
904
918
self.assertEndsWith(actual_bzrdir.user_url, '/baz/')
1058
1072
def _known_formats(self):
1059
1073
return set([NotBzrDirFormat()])
1076
class NotBzrDirProber(controldir.Prober):
1062
1078
def probe_transport(self, transport):
1063
1079
"""Our format is present if the transport ends in '.not/'."""
1064
1080
if transport.has('.not'):
1078
1094
dir = format.initialize(self.get_url())
1079
1095
self.assertIsInstance(dir, NotBzrDir)
1080
1096
# now probe for it.
1081
bzrlib.bzrdir.BzrDirFormat.register_control_format(format)
1097
controldir.ControlDirFormat.register_prober(NotBzrDirProber)
1083
found = bzrlib.bzrdir.BzrDirFormat.find_format(
1084
get_transport(self.get_url()))
1099
found = bzrlib.bzrdir.BzrDirFormat.find_format(self.get_transport())
1085
1100
self.assertIsInstance(found, NotBzrDirFormat)
1087
bzrlib.bzrdir.BzrDirFormat.unregister_control_format(format)
1102
controldir.ControlDirFormat.unregister_prober(NotBzrDirProber)
1089
1104
def test_included_in_known_formats(self):
1090
bzrlib.bzrdir.BzrDirFormat.register_control_format(NotBzrDirFormat)
1105
not_format = NotBzrDirFormat()
1106
bzrlib.controldir.ControlDirFormat.register_format(not_format)
1092
1108
formats = bzrlib.bzrdir.BzrDirFormat.known_formats()
1093
1109
for format in formats:
1411
1433
param_repr = param_reprs[0]
1412
1434
self.assertStartsWith(param_repr, '<RepoInitHookParams for ')
1437
class TestGenerateBackupName(TestCaseWithMemoryTransport):
1438
# FIXME: This may need to be unified with test_osutils.TestBackupNames or
1439
# moved to per_bzrdir or per_transport for better coverage ?
1443
super(TestGenerateBackupName, self).setUp()
1444
self._transport = self.get_transport()
1445
bzrdir.BzrDir.create(self.get_url(),
1446
possible_transports=[self._transport])
1447
self._bzrdir = bzrdir.BzrDir.open_from_transport(self._transport)
1449
def test_deprecated_generate_backup_name(self):
1450
res = self.applyDeprecated(
1451
symbol_versioning.deprecated_in((2, 3, 0)),
1452
self._bzrdir.generate_backup_name, 'whatever')
1455
self.assertEqual("a.~1~", self._bzrdir._available_backup_name("a"))
1457
def test_exiting(self):
1458
self._transport.put_bytes("a.~1~", "some content")
1459
self.assertEqual("a.~2~", self._bzrdir._available_backup_name("a"))