60
53
from bzrlib.tests.test_http import TestWithTransport_pycurl
61
54
from bzrlib.transport import (
65
58
from bzrlib.transport.http._urllib import HttpTransport_urllib
66
59
from bzrlib.transport.nosmart import NoSmartTransportDecorator
67
60
from bzrlib.transport.readonly import ReadonlyTransportDecorator
68
from bzrlib.repofmt import knitrepo, pack_repo
61
from bzrlib.repofmt import knitrepo, weaverepo, pack_repo
71
64
class TestDefaultFormat(TestCase):
73
66
def test_get_set_default_format(self):
74
67
old_format = bzrdir.BzrDirFormat.get_default_format()
75
# default is BzrDirMetaFormat1
68
# default is BzrDirFormat6
76
69
self.failUnless(isinstance(old_format, bzrdir.BzrDirMetaFormat1))
77
controldir.ControlDirFormat._set_default_format(SampleBzrDirFormat())
70
bzrdir.BzrDirFormat._set_default_format(SampleBzrDirFormat())
78
71
# creating a bzr dir should now create an instrumented dir.
80
73
result = bzrdir.BzrDir.create('memory:///')
81
74
self.failUnless(isinstance(result, SampleBzrDir))
83
controldir.ControlDirFormat._set_default_format(old_format)
76
bzrdir.BzrDirFormat._set_default_format(old_format)
84
77
self.assertEqual(old_format, bzrdir.BzrDirFormat.get_default_format())
87
class DeprecatedBzrDirFormat(bzrdir.BzrDirFormat):
88
"""A deprecated bzr dir format."""
91
80
class TestFormatRegistry(TestCase):
93
82
def make_format_registry(self):
94
my_format_registry = controldir.ControlDirFormatRegistry()
95
my_format_registry.register('deprecated', DeprecatedBzrDirFormat,
96
'Some format. Slower and unawesome and deprecated.',
98
my_format_registry.register_lazy('lazy', 'bzrlib.tests.test_bzrdir',
99
'DeprecatedBzrDirFormat', 'Format registered lazily',
101
bzrdir.register_metadir(my_format_registry, 'knit',
83
my_format_registry = bzrdir.BzrDirFormatRegistry()
84
my_format_registry.register('weave', bzrdir.BzrDirFormat6,
85
'Pre-0.8 format. Slower and does not support checkouts or shared'
86
' repositories', deprecated=True)
87
my_format_registry.register_lazy('lazy', 'bzrlib.bzrdir',
88
'BzrDirFormat6', 'Format registered lazily', deprecated=True)
89
my_format_registry.register_metadir('knit',
102
90
'bzrlib.repofmt.knitrepo.RepositoryFormatKnit1',
103
91
'Format using knits',
105
93
my_format_registry.set_default('knit')
106
bzrdir.register_metadir(my_format_registry,
94
my_format_registry.register_metadir(
108
96
'bzrlib.repofmt.knitrepo.RepositoryFormatKnit3',
109
97
'Experimental successor to knit. Use at your own risk.',
110
98
branch_format='bzrlib.branch.BzrBranchFormat6',
111
99
experimental=True)
112
bzrdir.register_metadir(my_format_registry,
100
my_format_registry.register_metadir(
114
102
'bzrlib.repofmt.knitrepo.RepositoryFormatKnit3',
115
103
'Experimental successor to knit. Use at your own risk.',
116
104
branch_format='bzrlib.branch.BzrBranchFormat6', hidden=True)
117
my_format_registry.register('hiddendeprecated', DeprecatedBzrDirFormat,
118
'Old format. Slower and does not support things. ', hidden=True)
119
my_format_registry.register_lazy('hiddenlazy', 'bzrlib.tests.test_bzrdir',
120
'DeprecatedBzrDirFormat', 'Format registered lazily',
121
deprecated=True, hidden=True)
105
my_format_registry.register('hiddenweave', bzrdir.BzrDirFormat6,
106
'Pre-0.8 format. Slower and does not support checkouts or shared'
107
' repositories', hidden=True)
108
my_format_registry.register_lazy('hiddenlazy', 'bzrlib.bzrdir',
109
'BzrDirFormat6', 'Format registered lazily', deprecated=True,
122
111
return my_format_registry
124
113
def test_format_registry(self):
125
114
my_format_registry = self.make_format_registry()
126
115
my_bzrdir = my_format_registry.make_bzrdir('lazy')
127
self.assertIsInstance(my_bzrdir, DeprecatedBzrDirFormat)
128
my_bzrdir = my_format_registry.make_bzrdir('deprecated')
129
self.assertIsInstance(my_bzrdir, DeprecatedBzrDirFormat)
116
self.assertIsInstance(my_bzrdir, bzrdir.BzrDirFormat6)
117
my_bzrdir = my_format_registry.make_bzrdir('weave')
118
self.assertIsInstance(my_bzrdir, bzrdir.BzrDirFormat6)
130
119
my_bzrdir = my_format_registry.make_bzrdir('default')
131
120
self.assertIsInstance(my_bzrdir.repository_format,
132
121
knitrepo.RepositoryFormatKnit1)
176
166
self.assertIs(bzrdir.format_registry.get('dirstate-with-subtree'),
177
167
bzrdir.format_registry.get('default'))
179
repository.format_registry.get_default().__class__,
169
repository.RepositoryFormat.get_default_format().__class__,
180
170
knitrepo.RepositoryFormatKnit3)
182
172
bzrdir.format_registry.set_default_repository(old_default)
184
174
def test_aliases(self):
185
a_registry = controldir.ControlDirFormatRegistry()
186
a_registry.register('deprecated', DeprecatedBzrDirFormat,
187
'Old format. Slower and does not support stuff',
189
a_registry.register('deprecatedalias', DeprecatedBzrDirFormat,
190
'Old format. Slower and does not support stuff',
191
deprecated=True, alias=True)
192
self.assertEqual(frozenset(['deprecatedalias']), a_registry.aliases())
175
a_registry = bzrdir.BzrDirFormatRegistry()
176
a_registry.register('weave', bzrdir.BzrDirFormat6,
177
'Pre-0.8 format. Slower and does not support checkouts or shared'
178
' repositories', deprecated=True)
179
a_registry.register('weavealias', bzrdir.BzrDirFormat6,
180
'Pre-0.8 format. Slower and does not support checkouts or shared'
181
' repositories', deprecated=True, alias=True)
182
self.assertEqual(frozenset(['weavealias']), a_registry.aliases())
195
185
class SampleBranch(bzrlib.branch.Branch):
252
242
return "opened branch."
255
class BzrDirFormatTest1(bzrdir.BzrDirMetaFormat1):
258
def get_format_string():
259
return "Test format 1"
262
class BzrDirFormatTest2(bzrdir.BzrDirMetaFormat1):
265
def get_format_string():
266
return "Test format 2"
269
245
class TestBzrDirFormat(TestCaseWithTransport):
270
246
"""Tests for the BzrDirFormat facility."""
272
248
def test_find_format(self):
273
249
# is the right format object found for a branch?
274
250
# create a branch with a few known format objects.
275
bzrdir.BzrDirFormat.register_format(BzrDirFormatTest1())
276
self.addCleanup(bzrdir.BzrDirFormat.unregister_format, BzrDirFormatTest1())
277
bzrdir.BzrDirFormat.register_format(BzrDirFormatTest2())
278
self.addCleanup(bzrdir.BzrDirFormat.unregister_format, BzrDirFormatTest2())
279
t = self.get_transport()
251
# this is not quite the same as
252
t = get_transport(self.get_url())
280
253
self.build_tree(["foo/", "bar/"], transport=t)
281
254
def check_format(format, url):
282
255
format.initialize(url)
283
t = _mod_transport.get_transport(url)
256
t = get_transport(url)
284
257
found_format = bzrdir.BzrDirFormat.find_format(t)
285
258
self.failUnless(isinstance(found_format, format.__class__))
286
check_format(BzrDirFormatTest1(), "foo")
287
check_format(BzrDirFormatTest2(), "bar")
259
check_format(bzrdir.BzrDirFormat5(), "foo")
260
check_format(bzrdir.BzrDirFormat6(), "bar")
289
262
def test_find_format_nothing_there(self):
290
263
self.assertRaises(NotBranchError,
291
264
bzrdir.BzrDirFormat.find_format,
292
_mod_transport.get_transport('.'))
294
267
def test_find_format_unknown_format(self):
295
t = self.get_transport()
268
t = get_transport(self.get_url())
297
270
t.put_bytes('.bzr/branch-format', '')
298
271
self.assertRaises(UnknownFormatError,
299
272
bzrdir.BzrDirFormat.find_format,
300
_mod_transport.get_transport('.'))
302
275
def test_register_unregister_format(self):
303
276
format = SampleBzrDirFormat()
703
676
self.assertEqual(relpath, 'baz')
705
678
def test_open_containing_from_transport(self):
706
self.assertRaises(NotBranchError,
707
bzrdir.BzrDir.open_containing_from_transport,
708
_mod_transport.get_transport(self.get_readonly_url('')))
709
self.assertRaises(NotBranchError,
710
bzrdir.BzrDir.open_containing_from_transport,
711
_mod_transport.get_transport(self.get_readonly_url('g/p/q')))
679
self.assertRaises(NotBranchError, bzrdir.BzrDir.open_containing_from_transport,
680
get_transport(self.get_readonly_url('')))
681
self.assertRaises(NotBranchError, bzrdir.BzrDir.open_containing_from_transport,
682
get_transport(self.get_readonly_url('g/p/q')))
712
683
control = bzrdir.BzrDir.create(self.get_url())
713
684
branch, relpath = bzrdir.BzrDir.open_containing_from_transport(
714
_mod_transport.get_transport(self.get_readonly_url('')))
685
get_transport(self.get_readonly_url('')))
715
686
self.assertEqual('', relpath)
716
687
branch, relpath = bzrdir.BzrDir.open_containing_from_transport(
717
_mod_transport.get_transport(self.get_readonly_url('g/p/q')))
688
get_transport(self.get_readonly_url('g/p/q')))
718
689
self.assertEqual('g/p/q', relpath)
720
691
def test_open_containing_tree_or_branch(self):
764
735
# transport pointing at bzrdir should give a bzrdir with root transport
765
736
# set to the given transport
766
737
control = bzrdir.BzrDir.create(self.get_url())
767
t = self.get_transport()
768
opened_bzrdir = bzrdir.BzrDir.open_from_transport(t)
769
self.assertEqual(t.base, opened_bzrdir.root_transport.base)
738
transport = get_transport(self.get_url())
739
opened_bzrdir = bzrdir.BzrDir.open_from_transport(transport)
740
self.assertEqual(transport.base, opened_bzrdir.root_transport.base)
770
741
self.assertIsInstance(opened_bzrdir, bzrdir.BzrDir)
772
743
def test_open_from_transport_no_bzrdir(self):
773
t = self.get_transport()
774
self.assertRaises(NotBranchError, bzrdir.BzrDir.open_from_transport, t)
744
transport = get_transport(self.get_url())
745
self.assertRaises(NotBranchError, bzrdir.BzrDir.open_from_transport,
776
748
def test_open_from_transport_bzrdir_in_parent(self):
777
749
control = bzrdir.BzrDir.create(self.get_url())
778
t = self.get_transport()
780
t = t.clone('subdir')
781
self.assertRaises(NotBranchError, bzrdir.BzrDir.open_from_transport, t)
750
transport = get_transport(self.get_url())
751
transport.mkdir('subdir')
752
transport = transport.clone('subdir')
753
self.assertRaises(NotBranchError, bzrdir.BzrDir.open_from_transport,
783
756
def test_sprout_recursive(self):
784
757
tree = self.make_branch_and_tree('tree1',
814
787
self.build_tree(['tree1/subtree/file'])
815
788
sub_tree.add('file')
816
789
tree.commit('Initial commit')
817
# The following line force the orhaning to reveal bug #634470
818
tree.branch.get_config().set_user_option(
819
'bzr.transform.orphan_policy', 'move')
820
790
tree.bzrdir.destroy_workingtree()
821
# FIXME: subtree/.bzr is left here which allows the test to pass (or
822
# fail :-( ) -- vila 20100909
823
791
repo = self.make_repository('repo', shared=True,
824
792
format='dirstate-with-subtree')
825
793
repo.set_make_working_trees(False)
826
# FIXME: we just deleted the workingtree and now we want to use it ????
827
# At a minimum, we should use tree.branch below (but this fails too
828
# currently) or stop calling this test 'treeless'. Specifically, I've
829
# turn the line below into an assertRaises when 'subtree/.bzr' is
830
# orphaned and sprout tries to access the branch there (which is left
831
# by bzrdir.BzrDirMeta1.destroy_workingtree when it ignores the
832
# [DeletingParent('Not deleting', u'subtree', None)] conflict). See bug
833
# #634470. -- vila 20100909
834
self.assertRaises(errors.NotBranchError,
835
tree.bzrdir.sprout, 'repo/tree2')
836
# self.failUnlessExists('repo/tree2/subtree')
837
# self.failIfExists('repo/tree2/subtree/file')
794
tree.bzrdir.sprout('repo/tree2')
795
self.failUnlessExists('repo/tree2/subtree')
796
self.failIfExists('repo/tree2/subtree/file')
839
798
def make_foo_bar_baz(self):
840
799
foo = bzrdir.BzrDir.create_branch_convenience('foo').bzrdir
845
804
def test_find_bzrdirs(self):
846
805
foo, bar, baz = self.make_foo_bar_baz()
847
t = self.get_transport()
848
self.assertEqualBzrdirs([baz, foo, bar], bzrdir.BzrDir.find_bzrdirs(t))
850
def make_fake_permission_denied_transport(self, transport, paths):
851
"""Create a transport that raises PermissionDenied for some paths."""
854
raise errors.PermissionDenied(path)
856
path_filter_server = pathfilter.PathFilteringServer(transport, filter)
857
path_filter_server.start_server()
858
self.addCleanup(path_filter_server.stop_server)
859
path_filter_transport = pathfilter.PathFilteringTransport(
860
path_filter_server, '.')
861
return (path_filter_server, path_filter_transport)
863
def assertBranchUrlsEndWith(self, expect_url_suffix, actual_bzrdirs):
864
"""Check that each branch url ends with the given suffix."""
865
for actual_bzrdir in actual_bzrdirs:
866
self.assertEndsWith(actual_bzrdir.user_url, expect_url_suffix)
868
def test_find_bzrdirs_permission_denied(self):
869
foo, bar, baz = self.make_foo_bar_baz()
870
t = self.get_transport()
871
path_filter_server, path_filter_transport = \
872
self.make_fake_permission_denied_transport(t, ['foo'])
874
self.assertBranchUrlsEndWith('/baz/',
875
bzrdir.BzrDir.find_bzrdirs(path_filter_transport))
877
smart_transport = self.make_smart_server('.',
878
backing_server=path_filter_server)
879
self.assertBranchUrlsEndWith('/baz/',
880
bzrdir.BzrDir.find_bzrdirs(smart_transport))
806
transport = get_transport(self.get_url())
807
self.assertEqualBzrdirs([baz, foo, bar],
808
bzrdir.BzrDir.find_bzrdirs(transport))
882
810
def test_find_bzrdirs_list_current(self):
883
811
def list_current(transport):
884
812
return [s for s in transport.list_dir('') if s != 'baz']
886
814
foo, bar, baz = self.make_foo_bar_baz()
887
t = self.get_transport()
888
self.assertEqualBzrdirs(
890
bzrdir.BzrDir.find_bzrdirs(t, list_current=list_current))
815
transport = get_transport(self.get_url())
816
self.assertEqualBzrdirs([foo, bar],
817
bzrdir.BzrDir.find_bzrdirs(transport,
818
list_current=list_current))
892
821
def test_find_bzrdirs_evaluate(self):
893
822
def evaluate(bzrdir):
914
844
root = self.make_repository('', shared=True)
915
845
foo, bar, baz = self.make_foo_bar_baz()
916
846
qux = self.make_bzrdir('foo/qux')
917
t = self.get_transport()
918
branches = bzrdir.BzrDir.find_branches(t)
847
transport = get_transport(self.get_url())
848
branches = bzrdir.BzrDir.find_branches(transport)
919
849
self.assertEqual(baz.root_transport.base, branches[0].base)
920
850
self.assertEqual(foo.root_transport.base, branches[1].base)
921
851
self.assertEqual(bar.root_transport.base, branches[2].base)
923
853
# ensure this works without a top-level repo
924
branches = bzrdir.BzrDir.find_branches(t.clone('foo'))
854
branches = bzrdir.BzrDir.find_branches(transport.clone('foo'))
925
855
self.assertEqual(foo.root_transport.base, branches[0].base)
926
856
self.assertEqual(bar.root_transport.base, branches[1].base)
929
class TestMissingRepoBranchesSkipped(TestCaseWithMemoryTransport):
931
def test_find_bzrdirs_missing_repo(self):
932
t = self.get_transport()
933
arepo = self.make_repository('arepo', shared=True)
934
abranch_url = arepo.user_url + '/abranch'
935
abranch = bzrdir.BzrDir.create(abranch_url).create_branch()
936
t.delete_tree('arepo/.bzr')
937
self.assertRaises(errors.NoRepositoryPresent,
938
branch.Branch.open, abranch_url)
939
self.make_branch('baz')
940
for actual_bzrdir in bzrdir.BzrDir.find_branches(t):
941
self.assertEndsWith(actual_bzrdir.user_url, '/baz/')
944
859
class TestMeta1DirFormat(TestCaseWithTransport):
945
860
"""Tests specific to the meta1 dir format."""
1118
1030
dir = format.initialize(self.get_url())
1119
1031
self.assertIsInstance(dir, NotBzrDir)
1120
1032
# now probe for it.
1121
controldir.ControlDirFormat.register_prober(NotBzrDirProber)
1033
bzrlib.bzrdir.BzrDirFormat.register_control_format(format)
1123
found = bzrlib.bzrdir.BzrDirFormat.find_format(self.get_transport())
1035
found = bzrlib.bzrdir.BzrDirFormat.find_format(
1036
get_transport(self.get_url()))
1124
1037
self.assertIsInstance(found, NotBzrDirFormat)
1126
controldir.ControlDirFormat.unregister_prober(NotBzrDirProber)
1039
bzrlib.bzrdir.BzrDirFormat.unregister_control_format(format)
1128
1041
def test_included_in_known_formats(self):
1129
not_format = NotBzrDirFormat()
1130
bzrlib.controldir.ControlDirFormat.register_format(not_format)
1042
bzrlib.bzrdir.BzrDirFormat.register_control_format(NotBzrDirFormat)
1132
1044
formats = bzrlib.bzrdir.BzrDirFormat.known_formats()
1133
1045
for format in formats:
1450
1351
self.assertIsInstance(params, RepoInitHookParams)
1451
1352
self.assertTrue(hasattr(params, 'bzrdir'))
1452
1353
self.assertTrue(hasattr(params, 'repository'))
1454
def test_post_repo_init_hook_repr(self):
1456
bzrdir.BzrDir.hooks.install_named_hook('post_repo_init',
1457
lambda params: param_reprs.append(repr(params)), None)
1458
self.make_repository('foo')
1459
self.assertLength(1, param_reprs)
1460
param_repr = param_reprs[0]
1461
self.assertStartsWith(param_repr, '<RepoInitHookParams for ')
1464
class TestGenerateBackupName(TestCaseWithMemoryTransport):
1465
# FIXME: This may need to be unified with test_osutils.TestBackupNames or
1466
# moved to per_bzrdir or per_transport for better coverage ?
1470
super(TestGenerateBackupName, self).setUp()
1471
self._transport = self.get_transport()
1472
bzrdir.BzrDir.create(self.get_url(),
1473
possible_transports=[self._transport])
1474
self._bzrdir = bzrdir.BzrDir.open_from_transport(self._transport)
1476
def test_deprecated_generate_backup_name(self):
1477
res = self.applyDeprecated(
1478
symbol_versioning.deprecated_in((2, 3, 0)),
1479
self._bzrdir.generate_backup_name, 'whatever')
1482
self.assertEqual("a.~1~", self._bzrdir._available_backup_name("a"))
1484
def test_exiting(self):
1485
self._transport.put_bytes("a.~1~", "some content")
1486
self.assertEqual("a.~2~", self._bzrdir._available_backup_name("a"))