67
64
from bzrlib.transport.http._urllib import HttpTransport_urllib
68
65
from bzrlib.transport.nosmart import NoSmartTransportDecorator
69
66
from bzrlib.transport.readonly import ReadonlyTransportDecorator
70
from bzrlib.repofmt import knitrepo, knitpack_repo
67
from bzrlib.repofmt import knitrepo, weaverepo, pack_repo
73
70
class TestDefaultFormat(TestCase):
75
72
def test_get_set_default_format(self):
76
73
old_format = bzrdir.BzrDirFormat.get_default_format()
77
# default is BzrDirMetaFormat1
78
self.assertIsInstance(old_format, bzrdir.BzrDirMetaFormat1)
74
# default is BzrDirFormat6
75
self.failUnless(isinstance(old_format, bzrdir.BzrDirMetaFormat1))
79
76
controldir.ControlDirFormat._set_default_format(SampleBzrDirFormat())
80
77
# creating a bzr dir should now create an instrumented dir.
82
79
result = bzrdir.BzrDir.create('memory:///')
83
self.assertIsInstance(result, SampleBzrDir)
80
self.failUnless(isinstance(result, SampleBzrDir))
85
82
controldir.ControlDirFormat._set_default_format(old_format)
86
83
self.assertEqual(old_format, bzrdir.BzrDirFormat.get_default_format())
89
class DeprecatedBzrDirFormat(bzrdir.BzrDirFormat):
90
"""A deprecated bzr dir format."""
93
86
class TestFormatRegistry(TestCase):
95
88
def make_format_registry(self):
96
89
my_format_registry = controldir.ControlDirFormatRegistry()
97
my_format_registry.register('deprecated', DeprecatedBzrDirFormat,
98
'Some format. Slower and unawesome and deprecated.',
100
my_format_registry.register_lazy('lazy', 'bzrlib.tests.test_bzrdir',
101
'DeprecatedBzrDirFormat', 'Format registered lazily',
90
my_format_registry.register('weave', bzrdir.BzrDirFormat6,
91
'Pre-0.8 format. Slower and does not support checkouts or shared'
92
' repositories', deprecated=True)
93
my_format_registry.register_lazy('lazy', 'bzrlib.bzrdir',
94
'BzrDirFormat6', 'Format registered lazily', deprecated=True)
103
95
bzrdir.register_metadir(my_format_registry, 'knit',
104
96
'bzrlib.repofmt.knitrepo.RepositoryFormatKnit1',
105
97
'Format using knits',
116
108
'bzrlib.repofmt.knitrepo.RepositoryFormatKnit3',
117
109
'Experimental successor to knit. Use at your own risk.',
118
110
branch_format='bzrlib.branch.BzrBranchFormat6', hidden=True)
119
my_format_registry.register('hiddendeprecated', DeprecatedBzrDirFormat,
120
'Old format. Slower and does not support things. ', hidden=True)
121
my_format_registry.register_lazy('hiddenlazy', 'bzrlib.tests.test_bzrdir',
122
'DeprecatedBzrDirFormat', 'Format registered lazily',
123
deprecated=True, hidden=True)
111
my_format_registry.register('hiddenweave', bzrdir.BzrDirFormat6,
112
'Pre-0.8 format. Slower and does not support checkouts or shared'
113
' repositories', hidden=True)
114
my_format_registry.register_lazy('hiddenlazy', 'bzrlib.bzrdir',
115
'BzrDirFormat6', 'Format registered lazily', deprecated=True,
124
117
return my_format_registry
126
119
def test_format_registry(self):
127
120
my_format_registry = self.make_format_registry()
128
121
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)
122
self.assertIsInstance(my_bzrdir, bzrdir.BzrDirFormat6)
123
my_bzrdir = my_format_registry.make_bzrdir('weave')
124
self.assertIsInstance(my_bzrdir, bzrdir.BzrDirFormat6)
132
125
my_bzrdir = my_format_registry.make_bzrdir('default')
133
126
self.assertIsInstance(my_bzrdir.repository_format,
134
127
knitrepo.RepositoryFormatKnit1)
178
172
self.assertIs(bzrdir.format_registry.get('dirstate-with-subtree'),
179
173
bzrdir.format_registry.get('default'))
181
repository.format_registry.get_default().__class__,
175
repository.RepositoryFormat.get_default_format().__class__,
182
176
knitrepo.RepositoryFormatKnit3)
184
178
bzrdir.format_registry.set_default_repository(old_default)
186
180
def test_aliases(self):
187
181
a_registry = controldir.ControlDirFormatRegistry()
188
a_registry.register('deprecated', DeprecatedBzrDirFormat,
189
'Old format. Slower and does not support stuff',
191
a_registry.register('deprecatedalias', DeprecatedBzrDirFormat,
192
'Old format. Slower and does not support stuff',
193
deprecated=True, alias=True)
194
self.assertEqual(frozenset(['deprecatedalias']), a_registry.aliases())
182
a_registry.register('weave', bzrdir.BzrDirFormat6,
183
'Pre-0.8 format. Slower and does not support checkouts or shared'
184
' repositories', deprecated=True)
185
a_registry.register('weavealias', bzrdir.BzrDirFormat6,
186
'Pre-0.8 format. Slower and does not support checkouts or shared'
187
' repositories', deprecated=True, alias=True)
188
self.assertEqual(frozenset(['weavealias']), a_registry.aliases())
197
191
class SampleBranch(bzrlib.branch.Branch):
254
248
return "opened branch."
257
class BzrDirFormatTest1(bzrdir.BzrDirMetaFormat1):
260
def get_format_string():
261
return "Test format 1"
264
class BzrDirFormatTest2(bzrdir.BzrDirMetaFormat1):
267
def get_format_string():
268
return "Test format 2"
271
251
class TestBzrDirFormat(TestCaseWithTransport):
272
252
"""Tests for the BzrDirFormat facility."""
274
254
def test_find_format(self):
275
255
# is the right format object found for a branch?
276
256
# create a branch with a few known format objects.
277
bzrdir.BzrProber.formats.register(BzrDirFormatTest1.get_format_string(),
279
self.addCleanup(bzrdir.BzrProber.formats.remove,
280
BzrDirFormatTest1.get_format_string())
281
bzrdir.BzrProber.formats.register(BzrDirFormatTest2.get_format_string(),
283
self.addCleanup(bzrdir.BzrProber.formats.remove,
284
BzrDirFormatTest2.get_format_string())
257
# this is not quite the same as
285
258
t = self.get_transport()
286
259
self.build_tree(["foo/", "bar/"], transport=t)
287
260
def check_format(format, url):
288
261
format.initialize(url)
289
t = _mod_transport.get_transport_from_path(url)
262
t = _mod_transport.get_transport(url)
290
263
found_format = bzrdir.BzrDirFormat.find_format(t)
291
self.assertIsInstance(found_format, format.__class__)
292
check_format(BzrDirFormatTest1(), "foo")
293
check_format(BzrDirFormatTest2(), "bar")
264
self.failUnless(isinstance(found_format, format.__class__))
265
check_format(bzrdir.BzrDirFormat5(), "foo")
266
check_format(bzrdir.BzrDirFormat6(), "bar")
295
268
def test_find_format_nothing_there(self):
296
269
self.assertRaises(NotBranchError,
297
270
bzrdir.BzrDirFormat.find_format,
298
_mod_transport.get_transport_from_path('.'))
271
_mod_transport.get_transport('.'))
300
273
def test_find_format_unknown_format(self):
301
274
t = self.get_transport()
312
285
format.initialize(url)
313
286
# register a format for it.
314
bzrdir.BzrProber.formats.register(format.get_format_string(), format)
287
bzrdir.BzrDirFormat.register_format(format)
315
288
# which bzrdir.Open will refuse (not supported)
316
289
self.assertRaises(UnsupportedFormatError, bzrdir.BzrDir.open, url)
317
290
# which bzrdir.open_containing will refuse (not supported)
318
291
self.assertRaises(UnsupportedFormatError, bzrdir.BzrDir.open_containing, url)
319
292
# but open_downlevel will work
320
t = _mod_transport.get_transport_from_url(url)
293
t = _mod_transport.get_transport(url)
321
294
self.assertEqual(format.open(t), bzrdir.BzrDir.open_unsupported(url))
322
295
# unregister the format
323
bzrdir.BzrProber.formats.remove(format.get_format_string())
296
bzrdir.BzrDirFormat.unregister_format(format)
324
297
# now open_downlevel should fail too.
325
298
self.assertRaises(UnknownFormatError, bzrdir.BzrDir.open_unsupported, url)
711
684
def test_open_containing_from_transport(self):
712
685
self.assertRaises(NotBranchError,
713
686
bzrdir.BzrDir.open_containing_from_transport,
714
_mod_transport.get_transport_from_url(self.get_readonly_url('')))
687
_mod_transport.get_transport(self.get_readonly_url('')))
715
688
self.assertRaises(NotBranchError,
716
689
bzrdir.BzrDir.open_containing_from_transport,
717
_mod_transport.get_transport_from_url(
718
self.get_readonly_url('g/p/q')))
690
_mod_transport.get_transport(self.get_readonly_url('g/p/q')))
719
691
control = bzrdir.BzrDir.create(self.get_url())
720
692
branch, relpath = bzrdir.BzrDir.open_containing_from_transport(
721
_mod_transport.get_transport_from_url(
722
self.get_readonly_url('')))
693
_mod_transport.get_transport(self.get_readonly_url('')))
723
694
self.assertEqual('', relpath)
724
695
branch, relpath = bzrdir.BzrDir.open_containing_from_transport(
725
_mod_transport.get_transport_from_url(
726
self.get_readonly_url('g/p/q')))
696
_mod_transport.get_transport(self.get_readonly_url('g/p/q')))
727
697
self.assertEqual('g/p/q', relpath)
729
699
def test_open_containing_tree_or_branch(self):
962
932
dir.get_branch_transport(bzrlib.branch.BzrBranchFormat5()).base)
963
933
repository_base = t.clone('repository').base
964
934
self.assertEqual(repository_base, dir.get_repository_transport(None).base)
965
repository_format = repository.format_registry.get_default()
966
935
self.assertEqual(repository_base,
967
dir.get_repository_transport(repository_format).base)
936
dir.get_repository_transport(weaverepo.RepositoryFormat7()).base)
968
937
checkout_base = t.clone('checkout').base
969
938
self.assertEqual(checkout_base, dir.get_workingtree_transport(None).base)
970
939
self.assertEqual(checkout_base,
971
dir.get_workingtree_transport(workingtree_3.WorkingTreeFormat3()).base)
940
dir.get_workingtree_transport(workingtree.WorkingTreeFormat3()).base)
973
942
def test_meta1dir_uses_lockdir(self):
974
943
"""Meta1 format uses a LockDir to guard the whole directory, not a file."""
1016
985
self.assertEqual(2, rpc_count)
988
class TestFormat5(TestCaseWithTransport):
989
"""Tests specific to the version 5 bzrdir format."""
991
def test_same_lockfiles_between_tree_repo_branch(self):
992
# this checks that only a single lockfiles instance is created
993
# for format 5 objects
994
dir = bzrdir.BzrDirFormat5().initialize(self.get_url())
995
def check_dir_components_use_same_lock(dir):
996
ctrl_1 = dir.open_repository().control_files
997
ctrl_2 = dir.open_branch().control_files
998
ctrl_3 = dir.open_workingtree()._control_files
999
self.assertTrue(ctrl_1 is ctrl_2)
1000
self.assertTrue(ctrl_2 is ctrl_3)
1001
check_dir_components_use_same_lock(dir)
1002
# and if we open it normally.
1003
dir = bzrdir.BzrDir.open(self.get_url())
1004
check_dir_components_use_same_lock(dir)
1006
def test_can_convert(self):
1007
# format 5 dirs are convertable
1008
dir = bzrdir.BzrDirFormat5().initialize(self.get_url())
1009
self.assertTrue(dir.can_convert_format())
1011
def test_needs_conversion(self):
1012
# format 5 dirs need a conversion if they are not the default,
1014
dir = bzrdir.BzrDirFormat5().initialize(self.get_url())
1015
# don't need to convert it to itself
1016
self.assertFalse(dir.needs_format_conversion(bzrdir.BzrDirFormat5()))
1017
# do need to convert it to the current default
1018
self.assertTrue(dir.needs_format_conversion(
1019
bzrdir.BzrDirFormat.get_default_format()))
1022
class TestFormat6(TestCaseWithTransport):
1023
"""Tests specific to the version 6 bzrdir format."""
1025
def test_same_lockfiles_between_tree_repo_branch(self):
1026
# this checks that only a single lockfiles instance is created
1027
# for format 6 objects
1028
dir = bzrdir.BzrDirFormat6().initialize(self.get_url())
1029
def check_dir_components_use_same_lock(dir):
1030
ctrl_1 = dir.open_repository().control_files
1031
ctrl_2 = dir.open_branch().control_files
1032
ctrl_3 = dir.open_workingtree()._control_files
1033
self.assertTrue(ctrl_1 is ctrl_2)
1034
self.assertTrue(ctrl_2 is ctrl_3)
1035
check_dir_components_use_same_lock(dir)
1036
# and if we open it normally.
1037
dir = bzrdir.BzrDir.open(self.get_url())
1038
check_dir_components_use_same_lock(dir)
1040
def test_can_convert(self):
1041
# format 6 dirs are convertable
1042
dir = bzrdir.BzrDirFormat6().initialize(self.get_url())
1043
self.assertTrue(dir.can_convert_format())
1045
def test_needs_conversion(self):
1046
# format 6 dirs need an conversion if they are not the default.
1047
dir = bzrdir.BzrDirFormat6().initialize(self.get_url())
1048
self.assertTrue(dir.needs_format_conversion(
1049
bzrdir.BzrDirFormat.get_default_format()))
1052
class NotBzrDir(bzrlib.bzrdir.BzrDir):
1053
"""A non .bzr based control directory."""
1055
def __init__(self, transport, format):
1056
self._format = format
1057
self.root_transport = transport
1058
self.transport = transport.clone('.not')
1061
class NotBzrDirFormat(bzrlib.bzrdir.BzrDirFormat):
1062
"""A test class representing any non-.bzr based disk format."""
1064
def initialize_on_transport(self, transport):
1065
"""Initialize a new .not dir in the base directory of a Transport."""
1066
transport.mkdir('.not')
1067
return self.open(transport)
1069
def open(self, transport):
1070
"""Open this directory."""
1071
return NotBzrDir(transport, self)
1074
def _known_formats(self):
1075
return set([NotBzrDirFormat()])
1078
class NotBzrDirProber(controldir.Prober):
1080
def probe_transport(self, transport):
1081
"""Our format is present if the transport ends in '.not/'."""
1082
if transport.has('.not'):
1083
return NotBzrDirFormat()
1086
class TestNotBzrDir(TestCaseWithTransport):
1087
"""Tests for using the bzrdir api with a non .bzr based disk format.
1089
If/when one of these is in the core, we can let the implementation tests
1093
def test_create_and_find_format(self):
1094
# create a .notbzr dir
1095
format = NotBzrDirFormat()
1096
dir = format.initialize(self.get_url())
1097
self.assertIsInstance(dir, NotBzrDir)
1099
controldir.ControlDirFormat.register_prober(NotBzrDirProber)
1101
found = bzrlib.bzrdir.BzrDirFormat.find_format(self.get_transport())
1102
self.assertIsInstance(found, NotBzrDirFormat)
1104
controldir.ControlDirFormat.unregister_prober(NotBzrDirProber)
1106
def test_included_in_known_formats(self):
1107
not_format = NotBzrDirFormat()
1108
bzrlib.controldir.ControlDirFormat.register_format(not_format)
1110
formats = bzrlib.bzrdir.BzrDirFormat.known_formats()
1111
for format in formats:
1112
if isinstance(format, NotBzrDirFormat):
1114
self.fail("No NotBzrDirFormat in %s" % formats)
1116
bzrlib.controldir.ControlDirFormat.unregister_format(not_format)
1019
1119
class NonLocalTests(TestCaseWithTransport):
1020
1120
"""Tests for bzrdir static behaviour on non local paths."""
1229
1329
class _TestBranch(bzrlib.branch.Branch):
1230
1330
"""Test Branch implementation for TestBzrDirSprout."""
1232
def __init__(self, transport, *args, **kwargs):
1332
def __init__(self, *args, **kwargs):
1233
1333
self._format = _TestBranchFormat()
1234
self._transport = transport
1235
self.base = transport.base
1236
1334
super(_TestBranch, self).__init__(*args, **kwargs)
1237
1335
self.calls = []
1238
1336
self._parent = None
1240
1338
def sprout(self, *args, **kwargs):
1241
1339
self.calls.append('sprout')
1242
return _TestBranch(self._transport)
1340
return _TestBranch()
1244
1342
def copy_content_into(self, destination, revision_id=None):
1245
1343
self.calls.append('copy_content_into')