62
52
from bzrlib.tests.test_http import TestWithTransport_pycurl
63
from bzrlib.transport import (
53
from bzrlib.transport import get_transport
67
54
from bzrlib.transport.http._urllib import HttpTransport_urllib
55
from bzrlib.transport.memory import MemoryServer
68
56
from bzrlib.transport.nosmart import NoSmartTransportDecorator
69
57
from bzrlib.transport.readonly import ReadonlyTransportDecorator
70
from bzrlib.repofmt import knitrepo, knitpack_repo
58
from bzrlib.repofmt import knitrepo, weaverepo, pack_repo
73
61
class TestDefaultFormat(TestCase):
75
63
def test_get_set_default_format(self):
76
64
old_format = bzrdir.BzrDirFormat.get_default_format()
77
# default is BzrDirMetaFormat1
78
self.assertIsInstance(old_format, bzrdir.BzrDirMetaFormat1)
79
controldir.ControlDirFormat._set_default_format(SampleBzrDirFormat())
65
# default is BzrDirFormat6
66
self.failUnless(isinstance(old_format, bzrdir.BzrDirMetaFormat1))
67
bzrdir.BzrDirFormat._set_default_format(SampleBzrDirFormat())
80
68
# creating a bzr dir should now create an instrumented dir.
82
70
result = bzrdir.BzrDir.create('memory:///')
83
self.assertIsInstance(result, SampleBzrDir)
71
self.failUnless(isinstance(result, SampleBzrDir))
85
controldir.ControlDirFormat._set_default_format(old_format)
73
bzrdir.BzrDirFormat._set_default_format(old_format)
86
74
self.assertEqual(old_format, bzrdir.BzrDirFormat.get_default_format())
89
class DeprecatedBzrDirFormat(bzrdir.BzrDirFormat):
90
"""A deprecated bzr dir format."""
93
77
class TestFormatRegistry(TestCase):
95
79
def make_format_registry(self):
96
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',
103
bzrdir.register_metadir(my_format_registry, 'knit',
80
my_format_registry = bzrdir.BzrDirFormatRegistry()
81
my_format_registry.register('weave', bzrdir.BzrDirFormat6,
82
'Pre-0.8 format. Slower and does not support checkouts or shared'
83
' repositories', deprecated=True)
84
my_format_registry.register_lazy('lazy', 'bzrlib.bzrdir',
85
'BzrDirFormat6', 'Format registered lazily', deprecated=True)
86
my_format_registry.register_metadir('knit',
104
87
'bzrlib.repofmt.knitrepo.RepositoryFormatKnit1',
105
88
'Format using knits',
107
90
my_format_registry.set_default('knit')
108
bzrdir.register_metadir(my_format_registry,
91
my_format_registry.register_metadir(
110
93
'bzrlib.repofmt.knitrepo.RepositoryFormatKnit3',
111
94
'Experimental successor to knit. Use at your own risk.',
112
95
branch_format='bzrlib.branch.BzrBranchFormat6',
113
96
experimental=True)
114
bzrdir.register_metadir(my_format_registry,
97
my_format_registry.register_metadir(
116
99
'bzrlib.repofmt.knitrepo.RepositoryFormatKnit3',
117
100
'Experimental successor to knit. Use at your own risk.',
118
101
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)
102
my_format_registry.register('hiddenweave', bzrdir.BzrDirFormat6,
103
'Pre-0.8 format. Slower and does not support checkouts or shared'
104
' repositories', hidden=True)
105
my_format_registry.register_lazy('hiddenlazy', 'bzrlib.bzrdir',
106
'BzrDirFormat6', 'Format registered lazily', deprecated=True,
124
108
return my_format_registry
126
110
def test_format_registry(self):
127
111
my_format_registry = self.make_format_registry()
128
112
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)
113
self.assertIsInstance(my_bzrdir, bzrdir.BzrDirFormat6)
114
my_bzrdir = my_format_registry.make_bzrdir('weave')
115
self.assertIsInstance(my_bzrdir, bzrdir.BzrDirFormat6)
132
116
my_bzrdir = my_format_registry.make_bzrdir('default')
133
117
self.assertIsInstance(my_bzrdir.repository_format,
134
118
knitrepo.RepositoryFormatKnit1)
178
163
self.assertIs(bzrdir.format_registry.get('dirstate-with-subtree'),
179
164
bzrdir.format_registry.get('default'))
181
repository.format_registry.get_default().__class__,
166
repository.RepositoryFormat.get_default_format().__class__,
182
167
knitrepo.RepositoryFormatKnit3)
184
169
bzrdir.format_registry.set_default_repository(old_default)
186
171
def test_aliases(self):
187
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())
172
a_registry = bzrdir.BzrDirFormatRegistry()
173
a_registry.register('weave', bzrdir.BzrDirFormat6,
174
'Pre-0.8 format. Slower and does not support checkouts or shared'
175
' repositories', deprecated=True)
176
a_registry.register('weavealias', bzrdir.BzrDirFormat6,
177
'Pre-0.8 format. Slower and does not support checkouts or shared'
178
' repositories', deprecated=True, alias=True)
179
self.assertEqual(frozenset(['weavealias']), a_registry.aliases())
197
182
class SampleBranch(bzrlib.branch.Branch):
254
237
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
240
class TestBzrDirFormat(TestCaseWithTransport):
272
241
"""Tests for the BzrDirFormat facility."""
274
243
def test_find_format(self):
275
244
# is the right format object found for a branch?
276
245
# 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())
285
t = self.get_transport()
246
# this is not quite the same as
247
t = get_transport(self.get_url())
286
248
self.build_tree(["foo/", "bar/"], transport=t)
287
249
def check_format(format, url):
288
250
format.initialize(url)
289
t = _mod_transport.get_transport(url)
251
t = get_transport(url)
290
252
found_format = bzrdir.BzrDirFormat.find_format(t)
291
self.assertIsInstance(found_format, format.__class__)
292
check_format(BzrDirFormatTest1(), "foo")
293
check_format(BzrDirFormatTest2(), "bar")
253
self.failUnless(isinstance(found_format, format.__class__))
254
check_format(bzrdir.BzrDirFormat5(), "foo")
255
check_format(bzrdir.BzrDirFormat6(), "bar")
295
257
def test_find_format_nothing_there(self):
296
258
self.assertRaises(NotBranchError,
297
259
bzrdir.BzrDirFormat.find_format,
298
_mod_transport.get_transport('.'))
300
262
def test_find_format_unknown_format(self):
301
t = self.get_transport()
263
t = get_transport(self.get_url())
303
265
t.put_bytes('.bzr/branch-format', '')
304
266
self.assertRaises(UnknownFormatError,
305
267
bzrdir.BzrDirFormat.find_format,
306
_mod_transport.get_transport('.'))
308
270
def test_register_unregister_format(self):
309
271
format = SampleBzrDirFormat()
312
274
format.initialize(url)
313
275
# register a format for it.
314
bzrdir.BzrProber.formats.register(format.get_format_string(), format)
276
bzrdir.BzrDirFormat.register_format(format)
315
277
# which bzrdir.Open will refuse (not supported)
316
278
self.assertRaises(UnsupportedFormatError, bzrdir.BzrDir.open, url)
317
279
# which bzrdir.open_containing will refuse (not supported)
318
280
self.assertRaises(UnsupportedFormatError, bzrdir.BzrDir.open_containing, url)
319
281
# but open_downlevel will work
320
t = _mod_transport.get_transport(url)
282
t = get_transport(url)
321
283
self.assertEqual(format.open(t), bzrdir.BzrDir.open_unsupported(url))
322
284
# unregister the format
323
bzrdir.BzrProber.formats.remove(format.get_format_string())
285
bzrdir.BzrDirFormat.unregister_format(format)
324
286
# now open_downlevel should fail too.
325
287
self.assertRaises(UnknownFormatError, bzrdir.BzrDir.open_unsupported, url)
709
670
self.assertEqual(relpath, 'baz')
711
672
def test_open_containing_from_transport(self):
712
self.assertRaises(NotBranchError,
713
bzrdir.BzrDir.open_containing_from_transport,
714
_mod_transport.get_transport(self.get_readonly_url('')))
715
self.assertRaises(NotBranchError,
716
bzrdir.BzrDir.open_containing_from_transport,
717
_mod_transport.get_transport(self.get_readonly_url('g/p/q')))
673
self.assertRaises(NotBranchError, bzrdir.BzrDir.open_containing_from_transport,
674
get_transport(self.get_readonly_url('')))
675
self.assertRaises(NotBranchError, bzrdir.BzrDir.open_containing_from_transport,
676
get_transport(self.get_readonly_url('g/p/q')))
718
677
control = bzrdir.BzrDir.create(self.get_url())
719
678
branch, relpath = bzrdir.BzrDir.open_containing_from_transport(
720
_mod_transport.get_transport(self.get_readonly_url('')))
679
get_transport(self.get_readonly_url('')))
721
680
self.assertEqual('', relpath)
722
681
branch, relpath = bzrdir.BzrDir.open_containing_from_transport(
723
_mod_transport.get_transport(self.get_readonly_url('g/p/q')))
682
get_transport(self.get_readonly_url('g/p/q')))
724
683
self.assertEqual('g/p/q', relpath)
726
685
def test_open_containing_tree_or_branch(self):
770
729
# transport pointing at bzrdir should give a bzrdir with root transport
771
730
# set to the given transport
772
731
control = bzrdir.BzrDir.create(self.get_url())
773
t = self.get_transport()
774
opened_bzrdir = bzrdir.BzrDir.open_from_transport(t)
775
self.assertEqual(t.base, opened_bzrdir.root_transport.base)
732
transport = get_transport(self.get_url())
733
opened_bzrdir = bzrdir.BzrDir.open_from_transport(transport)
734
self.assertEqual(transport.base, opened_bzrdir.root_transport.base)
776
735
self.assertIsInstance(opened_bzrdir, bzrdir.BzrDir)
778
737
def test_open_from_transport_no_bzrdir(self):
779
t = self.get_transport()
780
self.assertRaises(NotBranchError, bzrdir.BzrDir.open_from_transport, t)
738
transport = get_transport(self.get_url())
739
self.assertRaises(NotBranchError, bzrdir.BzrDir.open_from_transport,
782
742
def test_open_from_transport_bzrdir_in_parent(self):
783
743
control = bzrdir.BzrDir.create(self.get_url())
784
t = self.get_transport()
786
t = t.clone('subdir')
787
self.assertRaises(NotBranchError, bzrdir.BzrDir.open_from_transport, t)
744
transport = get_transport(self.get_url())
745
transport.mkdir('subdir')
746
transport = transport.clone('subdir')
747
self.assertRaises(NotBranchError, bzrdir.BzrDir.open_from_transport,
789
750
def test_sprout_recursive(self):
790
751
tree = self.make_branch_and_tree('tree1',
820
781
self.build_tree(['tree1/subtree/file'])
821
782
sub_tree.add('file')
822
783
tree.commit('Initial commit')
823
# The following line force the orhaning to reveal bug #634470
824
tree.branch.get_config().set_user_option(
825
'bzr.transform.orphan_policy', 'move')
826
784
tree.bzrdir.destroy_workingtree()
827
# FIXME: subtree/.bzr is left here which allows the test to pass (or
828
# fail :-( ) -- vila 20100909
829
785
repo = self.make_repository('repo', shared=True,
830
786
format='dirstate-with-subtree')
831
787
repo.set_make_working_trees(False)
832
# FIXME: we just deleted the workingtree and now we want to use it ????
833
# At a minimum, we should use tree.branch below (but this fails too
834
# currently) or stop calling this test 'treeless'. Specifically, I've
835
# turn the line below into an assertRaises when 'subtree/.bzr' is
836
# orphaned and sprout tries to access the branch there (which is left
837
# by bzrdir.BzrDirMeta1.destroy_workingtree when it ignores the
838
# [DeletingParent('Not deleting', u'subtree', None)] conflict). See bug
839
# #634470. -- vila 20100909
840
self.assertRaises(errors.NotBranchError,
841
tree.bzrdir.sprout, 'repo/tree2')
842
# self.assertPathExists('repo/tree2/subtree')
843
# self.assertPathDoesNotExist('repo/tree2/subtree/file')
788
tree.bzrdir.sprout('repo/tree2')
789
self.failUnlessExists('repo/tree2/subtree')
790
self.failIfExists('repo/tree2/subtree/file')
845
792
def make_foo_bar_baz(self):
846
793
foo = bzrdir.BzrDir.create_branch_convenience('foo').bzrdir
851
798
def test_find_bzrdirs(self):
852
799
foo, bar, baz = self.make_foo_bar_baz()
853
t = self.get_transport()
854
self.assertEqualBzrdirs([baz, foo, bar], bzrdir.BzrDir.find_bzrdirs(t))
856
def make_fake_permission_denied_transport(self, transport, paths):
857
"""Create a transport that raises PermissionDenied for some paths."""
860
raise errors.PermissionDenied(path)
862
path_filter_server = pathfilter.PathFilteringServer(transport, filter)
863
path_filter_server.start_server()
864
self.addCleanup(path_filter_server.stop_server)
865
path_filter_transport = pathfilter.PathFilteringTransport(
866
path_filter_server, '.')
867
return (path_filter_server, path_filter_transport)
869
def assertBranchUrlsEndWith(self, expect_url_suffix, actual_bzrdirs):
870
"""Check that each branch url ends with the given suffix."""
871
for actual_bzrdir in actual_bzrdirs:
872
self.assertEndsWith(actual_bzrdir.user_url, expect_url_suffix)
874
def test_find_bzrdirs_permission_denied(self):
875
foo, bar, baz = self.make_foo_bar_baz()
876
t = self.get_transport()
877
path_filter_server, path_filter_transport = \
878
self.make_fake_permission_denied_transport(t, ['foo'])
880
self.assertBranchUrlsEndWith('/baz/',
881
bzrdir.BzrDir.find_bzrdirs(path_filter_transport))
883
smart_transport = self.make_smart_server('.',
884
backing_server=path_filter_server)
885
self.assertBranchUrlsEndWith('/baz/',
886
bzrdir.BzrDir.find_bzrdirs(smart_transport))
800
transport = get_transport(self.get_url())
801
self.assertEqualBzrdirs([baz, foo, bar],
802
bzrdir.BzrDir.find_bzrdirs(transport))
888
804
def test_find_bzrdirs_list_current(self):
889
805
def list_current(transport):
890
806
return [s for s in transport.list_dir('') if s != 'baz']
892
808
foo, bar, baz = self.make_foo_bar_baz()
893
t = self.get_transport()
894
self.assertEqualBzrdirs(
896
bzrdir.BzrDir.find_bzrdirs(t, list_current=list_current))
809
transport = get_transport(self.get_url())
810
self.assertEqualBzrdirs([foo, bar],
811
bzrdir.BzrDir.find_bzrdirs(transport,
812
list_current=list_current))
898
815
def test_find_bzrdirs_evaluate(self):
899
816
def evaluate(bzrdir):
920
838
root = self.make_repository('', shared=True)
921
839
foo, bar, baz = self.make_foo_bar_baz()
922
840
qux = self.make_bzrdir('foo/qux')
923
t = self.get_transport()
924
branches = bzrdir.BzrDir.find_branches(t)
841
transport = get_transport(self.get_url())
842
branches = bzrdir.BzrDir.find_branches(transport)
925
843
self.assertEqual(baz.root_transport.base, branches[0].base)
926
844
self.assertEqual(foo.root_transport.base, branches[1].base)
927
845
self.assertEqual(bar.root_transport.base, branches[2].base)
929
847
# ensure this works without a top-level repo
930
branches = bzrdir.BzrDir.find_branches(t.clone('foo'))
848
branches = bzrdir.BzrDir.find_branches(transport.clone('foo'))
931
849
self.assertEqual(foo.root_transport.base, branches[0].base)
932
850
self.assertEqual(bar.root_transport.base, branches[1].base)
935
class TestMissingRepoBranchesSkipped(TestCaseWithMemoryTransport):
937
def test_find_bzrdirs_missing_repo(self):
938
t = self.get_transport()
939
arepo = self.make_repository('arepo', shared=True)
940
abranch_url = arepo.user_url + '/abranch'
941
abranch = bzrdir.BzrDir.create(abranch_url).create_branch()
942
t.delete_tree('arepo/.bzr')
943
self.assertRaises(errors.NoRepositoryPresent,
944
branch.Branch.open, abranch_url)
945
self.make_branch('baz')
946
for actual_bzrdir in bzrdir.BzrDir.find_branches(t):
947
self.assertEndsWith(actual_bzrdir.user_url, '/baz/')
950
853
class TestMeta1DirFormat(TestCaseWithTransport):
951
854
"""Tests specific to the meta1 dir format."""
1013
915
self.assertEqual(2, rpc_count)
918
class TestFormat5(TestCaseWithTransport):
919
"""Tests specific to the version 5 bzrdir format."""
921
def test_same_lockfiles_between_tree_repo_branch(self):
922
# this checks that only a single lockfiles instance is created
923
# for format 5 objects
924
dir = bzrdir.BzrDirFormat5().initialize(self.get_url())
925
def check_dir_components_use_same_lock(dir):
926
ctrl_1 = dir.open_repository().control_files
927
ctrl_2 = dir.open_branch().control_files
928
ctrl_3 = dir.open_workingtree()._control_files
929
self.assertTrue(ctrl_1 is ctrl_2)
930
self.assertTrue(ctrl_2 is ctrl_3)
931
check_dir_components_use_same_lock(dir)
932
# and if we open it normally.
933
dir = bzrdir.BzrDir.open(self.get_url())
934
check_dir_components_use_same_lock(dir)
936
def test_can_convert(self):
937
# format 5 dirs are convertable
938
dir = bzrdir.BzrDirFormat5().initialize(self.get_url())
939
self.assertTrue(dir.can_convert_format())
941
def test_needs_conversion(self):
942
# format 5 dirs need a conversion if they are not the default,
944
dir = bzrdir.BzrDirFormat5().initialize(self.get_url())
945
# don't need to convert it to itself
946
self.assertFalse(dir.needs_format_conversion(bzrdir.BzrDirFormat5()))
947
# do need to convert it to the current default
948
self.assertTrue(dir.needs_format_conversion(
949
bzrdir.BzrDirFormat.get_default_format()))
952
class TestFormat6(TestCaseWithTransport):
953
"""Tests specific to the version 6 bzrdir format."""
955
def test_same_lockfiles_between_tree_repo_branch(self):
956
# this checks that only a single lockfiles instance is created
957
# for format 6 objects
958
dir = bzrdir.BzrDirFormat6().initialize(self.get_url())
959
def check_dir_components_use_same_lock(dir):
960
ctrl_1 = dir.open_repository().control_files
961
ctrl_2 = dir.open_branch().control_files
962
ctrl_3 = dir.open_workingtree()._control_files
963
self.assertTrue(ctrl_1 is ctrl_2)
964
self.assertTrue(ctrl_2 is ctrl_3)
965
check_dir_components_use_same_lock(dir)
966
# and if we open it normally.
967
dir = bzrdir.BzrDir.open(self.get_url())
968
check_dir_components_use_same_lock(dir)
970
def test_can_convert(self):
971
# format 6 dirs are convertable
972
dir = bzrdir.BzrDirFormat6().initialize(self.get_url())
973
self.assertTrue(dir.can_convert_format())
975
def test_needs_conversion(self):
976
# format 6 dirs need an conversion if they are not the default.
977
dir = bzrdir.BzrDirFormat6().initialize(self.get_url())
978
self.assertTrue(dir.needs_format_conversion(
979
bzrdir.BzrDirFormat.get_default_format()))
982
class NotBzrDir(bzrlib.bzrdir.BzrDir):
983
"""A non .bzr based control directory."""
985
def __init__(self, transport, format):
986
self._format = format
987
self.root_transport = transport
988
self.transport = transport.clone('.not')
991
class NotBzrDirFormat(bzrlib.bzrdir.BzrDirFormat):
992
"""A test class representing any non-.bzr based disk format."""
994
def initialize_on_transport(self, transport):
995
"""Initialize a new .not dir in the base directory of a Transport."""
996
transport.mkdir('.not')
997
return self.open(transport)
999
def open(self, transport):
1000
"""Open this directory."""
1001
return NotBzrDir(transport, self)
1004
def _known_formats(self):
1005
return set([NotBzrDirFormat()])
1008
def probe_transport(self, transport):
1009
"""Our format is present if the transport ends in '.not/'."""
1010
if transport.has('.not'):
1011
return NotBzrDirFormat()
1014
class TestNotBzrDir(TestCaseWithTransport):
1015
"""Tests for using the bzrdir api with a non .bzr based disk format.
1017
If/when one of these is in the core, we can let the implementation tests
1021
def test_create_and_find_format(self):
1022
# create a .notbzr dir
1023
format = NotBzrDirFormat()
1024
dir = format.initialize(self.get_url())
1025
self.assertIsInstance(dir, NotBzrDir)
1027
bzrlib.bzrdir.BzrDirFormat.register_control_format(format)
1029
found = bzrlib.bzrdir.BzrDirFormat.find_format(
1030
get_transport(self.get_url()))
1031
self.assertIsInstance(found, NotBzrDirFormat)
1033
bzrlib.bzrdir.BzrDirFormat.unregister_control_format(format)
1035
def test_included_in_known_formats(self):
1036
bzrlib.bzrdir.BzrDirFormat.register_control_format(NotBzrDirFormat)
1038
formats = bzrlib.bzrdir.BzrDirFormat.known_formats()
1039
for format in formats:
1040
if isinstance(format, NotBzrDirFormat):
1042
self.fail("No NotBzrDirFormat in %s" % formats)
1044
bzrlib.bzrdir.BzrDirFormat.unregister_control_format(NotBzrDirFormat)
1016
1047
class NonLocalTests(TestCaseWithTransport):
1017
1048
"""Tests for bzrdir static behaviour on non local paths."""
1019
1050
def setUp(self):
1020
1051
super(NonLocalTests, self).setUp()
1021
self.vfs_transport_factory = memory.MemoryServer
1052
self.vfs_transport_factory = MemoryServer
1023
1054
def test_create_branch_convenience(self):
1024
1055
# outside a repo the default convenience output is a repo+branch_tree
1226
1247
class _TestBranch(bzrlib.branch.Branch):
1227
1248
"""Test Branch implementation for TestBzrDirSprout."""
1229
def __init__(self, transport, *args, **kwargs):
1250
def __init__(self, *args, **kwargs):
1230
1251
self._format = _TestBranchFormat()
1231
self._transport = transport
1232
self.base = transport.base
1233
1252
super(_TestBranch, self).__init__(*args, **kwargs)
1234
1253
self.calls = []
1235
1254
self._parent = None
1237
1256
def sprout(self, *args, **kwargs):
1238
1257
self.calls.append('sprout')
1239
return _TestBranch(self._transport)
1258
return _TestBranch()
1241
1260
def copy_content_into(self, destination, revision_id=None):
1242
1261
self.calls.append('copy_content_into')
1244
def last_revision(self):
1245
return _mod_revision.NULL_REVISION
1247
1263
def get_parent(self):
1248
1264
return self._parent
1250
def _get_config(self):
1251
return config.TransportConfig(self._transport, 'branch.conf')
1253
1266
def set_parent(self, parent):
1254
1267
self._parent = parent
1256
def lock_read(self):
1257
return lock.LogicalLockResult(self.unlock)
1263
1270
class TestBzrDirSprout(TestCaseWithMemoryTransport):
1318
1325
url = transport.base
1319
1326
err = self.assertRaises(errors.BzrError, bzrdir.BzrDir.open, url)
1320
1327
self.assertEqual('fail', err._preformatted_string)
1322
def test_post_repo_init(self):
1323
from bzrlib.bzrdir import RepoInitHookParams
1325
bzrdir.BzrDir.hooks.install_named_hook('post_repo_init',
1327
self.make_repository('foo')
1328
self.assertLength(1, calls)
1330
self.assertIsInstance(params, RepoInitHookParams)
1331
self.assertTrue(hasattr(params, 'bzrdir'))
1332
self.assertTrue(hasattr(params, 'repository'))
1334
def test_post_repo_init_hook_repr(self):
1336
bzrdir.BzrDir.hooks.install_named_hook('post_repo_init',
1337
lambda params: param_reprs.append(repr(params)), None)
1338
self.make_repository('foo')
1339
self.assertLength(1, param_reprs)
1340
param_repr = param_reprs[0]
1341
self.assertStartsWith(param_repr, '<RepoInitHookParams for ')
1344
class TestGenerateBackupName(TestCaseWithMemoryTransport):
1345
# FIXME: This may need to be unified with test_osutils.TestBackupNames or
1346
# moved to per_bzrdir or per_transport for better coverage ?
1350
super(TestGenerateBackupName, self).setUp()
1351
self._transport = self.get_transport()
1352
bzrdir.BzrDir.create(self.get_url(),
1353
possible_transports=[self._transport])
1354
self._bzrdir = bzrdir.BzrDir.open_from_transport(self._transport)
1356
def test_deprecated_generate_backup_name(self):
1357
res = self.applyDeprecated(
1358
symbol_versioning.deprecated_in((2, 3, 0)),
1359
self._bzrdir.generate_backup_name, 'whatever')
1362
self.assertEqual("a.~1~", self._bzrdir._available_backup_name("a"))
1364
def test_exiting(self):
1365
self._transport.put_bytes("a.~1~", "some content")
1366
self.assertEqual("a.~2~", self._bzrdir._available_backup_name("a"))