1
# Copyright (C) 2005, 2006 Canonical Ltd
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
# GNU General Public License for more details.
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
"""Tests for the BzrDir facility and any format specific tests.
19
For interface contract tests, see tests/bzr_dir_implementations.
22
from StringIO import StringIO
28
import bzrlib.bzrdir as bzrdir
29
import bzrlib.errors as errors
30
from bzrlib.errors import (NotBranchError,
32
UnsupportedFormatError,
34
import bzrlib.repository as repository
35
from bzrlib.tests import TestCase, TestCaseWithTransport
36
from bzrlib.tests.HttpServer import HttpServer
37
from bzrlib.transport import get_transport
38
from bzrlib.transport.memory import MemoryServer
39
import bzrlib.workingtree as workingtree
42
class TestDefaultFormat(TestCase):
44
def test_get_set_default_format(self):
45
old_format = bzrdir.BzrDirFormat.get_default_format()
46
# default is BzrDirFormat6
47
self.failUnless(isinstance(old_format, bzrdir.BzrDirMetaFormat1))
48
bzrdir.BzrDirFormat.set_default_format(SampleBzrDirFormat())
49
# creating a bzr dir should now create an instrumented dir.
51
result = bzrdir.BzrDir.create('memory:///')
52
self.failUnless(isinstance(result, SampleBzrDir))
54
bzrdir.BzrDirFormat.set_default_format(old_format)
55
self.assertEqual(old_format, bzrdir.BzrDirFormat.get_default_format())
58
class TestFormatRegistry(TestCase):
60
def make_format_registry(self):
61
my_format_registry = bzrdir.BzrDirFormatRegistry()
62
my_format_registry.register_factory('weave', bzrdir.BzrDirFormat6,
63
'Pre-0.8 format. Slower and does not support checkouts or shared'
64
' repositories', deprecated=True)
65
my_format_registry.register('direct', lambda x: bzrdir.BzrDirFormat6(),
66
'Format registered directly', deprecated=True)
67
my_format_registry.register_metadir('knit', 'RepositoryFormatKnit1',
69
my_format_registry.set_default('knit')
70
my_format_registry.register_metadir('metaweave', 'RepositoryFormat7',
71
'Transitional format in 0.8. Slower than knit.', deprecated=True)
72
my_format_registry.register_metadir('experimental-knit2',
73
'RepositoryFormatKnit2',
74
'Experimental successor to knit. Use at your own risk.')
75
return my_format_registry
77
def test_format_registry(self):
78
my_format_registry = self.make_format_registry()
79
my_bzrdir = my_format_registry.make_bzrdir('direct')
80
self.assertTrue(isinstance(my_bzrdir, bzrdir.BzrDirFormat6))
81
my_bzrdir = my_format_registry.make_bzrdir('weave')
82
self.assertTrue(isinstance(my_bzrdir, bzrdir.BzrDirFormat6))
83
my_bzrdir = my_format_registry.make_bzrdir('default')
84
self.assertTrue(isinstance(my_bzrdir.repository_format,
85
repository.RepositoryFormatKnit1))
86
my_bzrdir = my_format_registry.make_bzrdir('knit')
87
self.assertTrue(isinstance(my_bzrdir.repository_format,
88
repository.RepositoryFormatKnit1))
89
my_bzrdir = my_format_registry.make_bzrdir('metaweave')
90
self.assertTrue(isinstance(my_bzrdir.repository_format,
91
repository.RepositoryFormat7))
94
my_format_registry = bzrdir.BzrDirFormatRegistry()
95
self.assertRaises(NotImplementedError,
96
my_format_registry.register_lazy)
98
def test_get_help(self):
99
my_format_registry = self.make_format_registry()
100
self.assertEqual('Format registered directly',
101
my_format_registry.get_help('direct'))
102
self.assertEqual('Format using knits',
103
my_format_registry.get_help('knit'))
104
self.assertEqual('Format using knits',
105
my_format_registry.get_help('default'))
106
self.assertEqual('Pre-0.8 format. Slower and does not support'
107
' checkouts or shared repositories',
108
my_format_registry.get_help('weave'))
110
def test_help_topic(self):
111
topics = help_topics.HelpTopicRegistry()
112
topics.register('formats', self.make_format_registry().help_topic,
114
topic = topics.get_detail('formats')
115
new, deprecated = topic.split('Deprecated formats')
116
self.assertContainsRe(new, 'Bazaar directory formats')
117
self.assertContainsRe(new,
118
' knit/default:\n \(native\) Format using knits\n')
119
self.assertContainsRe(deprecated,
120
' direct:\n \(native\) Format registered directly\n')
122
class SampleBranch(bzrlib.branch.Branch):
123
"""A dummy branch for guess what, dummy use."""
125
def __init__(self, dir):
129
class SampleBzrDir(bzrdir.BzrDir):
130
"""A sample BzrDir implementation to allow testing static methods."""
132
def create_repository(self, shared=False):
133
"""See BzrDir.create_repository."""
134
return "A repository"
136
def open_repository(self):
137
"""See BzrDir.open_repository."""
138
return "A repository"
140
def create_branch(self):
141
"""See BzrDir.create_branch."""
142
return SampleBranch(self)
144
def create_workingtree(self):
145
"""See BzrDir.create_workingtree."""
149
class SampleBzrDirFormat(bzrdir.BzrDirFormat):
152
this format is initializable, unsupported to aid in testing the
153
open and open_downlevel routines.
156
def get_format_string(self):
157
"""See BzrDirFormat.get_format_string()."""
158
return "Sample .bzr dir format."
160
def initialize(self, url):
161
"""Create a bzr dir."""
162
t = get_transport(url)
164
t.put_bytes('.bzr/branch-format', self.get_format_string())
165
return SampleBzrDir(t, self)
167
def is_supported(self):
170
def open(self, transport, _found=None):
171
return "opened branch."
174
class TestBzrDirFormat(TestCaseWithTransport):
175
"""Tests for the BzrDirFormat facility."""
177
def test_find_format(self):
178
# is the right format object found for a branch?
179
# create a branch with a few known format objects.
180
# this is not quite the same as
181
t = get_transport(self.get_url())
182
self.build_tree(["foo/", "bar/"], transport=t)
183
def check_format(format, url):
184
format.initialize(url)
185
t = get_transport(url)
186
found_format = bzrdir.BzrDirFormat.find_format(t)
187
self.failUnless(isinstance(found_format, format.__class__))
188
check_format(bzrdir.BzrDirFormat5(), "foo")
189
check_format(bzrdir.BzrDirFormat6(), "bar")
191
def test_find_format_nothing_there(self):
192
self.assertRaises(NotBranchError,
193
bzrdir.BzrDirFormat.find_format,
196
def test_find_format_unknown_format(self):
197
t = get_transport(self.get_url())
199
t.put_bytes('.bzr/branch-format', '')
200
self.assertRaises(UnknownFormatError,
201
bzrdir.BzrDirFormat.find_format,
204
def test_register_unregister_format(self):
205
format = SampleBzrDirFormat()
208
format.initialize(url)
209
# register a format for it.
210
bzrdir.BzrDirFormat.register_format(format)
211
# which bzrdir.Open will refuse (not supported)
212
self.assertRaises(UnsupportedFormatError, bzrdir.BzrDir.open, url)
213
# which bzrdir.open_containing will refuse (not supported)
214
self.assertRaises(UnsupportedFormatError, bzrdir.BzrDir.open_containing, url)
215
# but open_downlevel will work
216
t = get_transport(url)
217
self.assertEqual(format.open(t), bzrdir.BzrDir.open_unsupported(url))
218
# unregister the format
219
bzrdir.BzrDirFormat.unregister_format(format)
220
# now open_downlevel should fail too.
221
self.assertRaises(UnknownFormatError, bzrdir.BzrDir.open_unsupported, url)
223
def test_create_repository(self):
224
format = SampleBzrDirFormat()
225
old_format = bzrdir.BzrDirFormat.get_default_format()
226
bzrdir.BzrDirFormat.set_default_format(format)
228
repo = bzrdir.BzrDir.create_repository(self.get_url())
229
self.assertEqual('A repository', repo)
231
bzrdir.BzrDirFormat.set_default_format(old_format)
233
def test_create_repository_shared(self):
234
old_format = bzrdir.BzrDirFormat.get_default_format()
235
repo = bzrdir.BzrDir.create_repository('.', shared=True)
236
self.assertTrue(repo.is_shared())
238
def test_create_repository_nonshared(self):
239
old_format = bzrdir.BzrDirFormat.get_default_format()
240
repo = bzrdir.BzrDir.create_repository('.')
241
self.assertFalse(repo.is_shared())
243
def test_create_repository_under_shared(self):
244
# an explicit create_repository always does so.
245
# we trust the format is right from the 'create_repository test'
246
old_format = bzrdir.BzrDirFormat.get_default_format()
247
bzrdir.BzrDirFormat.set_default_format(bzrdir.BzrDirMetaFormat1())
249
self.make_repository('.', shared=True)
250
repo = bzrdir.BzrDir.create_repository(self.get_url('child'))
251
self.assertTrue(isinstance(repo, repository.Repository))
252
self.assertTrue(repo.bzrdir.root_transport.base.endswith('child/'))
254
bzrdir.BzrDirFormat.set_default_format(old_format)
256
def test_create_branch_and_repo_uses_default(self):
257
format = SampleBzrDirFormat()
258
old_format = bzrdir.BzrDirFormat.get_default_format()
259
bzrdir.BzrDirFormat.set_default_format(format)
261
branch = bzrdir.BzrDir.create_branch_and_repo(self.get_url())
262
self.assertTrue(isinstance(branch, SampleBranch))
264
bzrdir.BzrDirFormat.set_default_format(old_format)
266
def test_create_branch_and_repo_under_shared(self):
267
# creating a branch and repo in a shared repo uses the
269
old_format = bzrdir.BzrDirFormat.get_default_format()
270
bzrdir.BzrDirFormat.set_default_format(bzrdir.BzrDirMetaFormat1())
272
self.make_repository('.', shared=True)
273
branch = bzrdir.BzrDir.create_branch_and_repo(self.get_url('child'))
274
self.assertRaises(errors.NoRepositoryPresent,
275
branch.bzrdir.open_repository)
277
bzrdir.BzrDirFormat.set_default_format(old_format)
279
def test_create_branch_and_repo_under_shared_force_new(self):
280
# creating a branch and repo in a shared repo can be forced to
282
old_format = bzrdir.BzrDirFormat.get_default_format()
283
bzrdir.BzrDirFormat.set_default_format(bzrdir.BzrDirMetaFormat1())
285
self.make_repository('.', shared=True)
286
branch = bzrdir.BzrDir.create_branch_and_repo(self.get_url('child'),
288
branch.bzrdir.open_repository()
290
bzrdir.BzrDirFormat.set_default_format(old_format)
292
def test_create_standalone_working_tree(self):
293
format = SampleBzrDirFormat()
294
old_format = bzrdir.BzrDirFormat.get_default_format()
295
bzrdir.BzrDirFormat.set_default_format(format)
297
# note this is deliberately readonly, as this failure should
298
# occur before any writes.
299
self.assertRaises(errors.NotLocalUrl,
300
bzrdir.BzrDir.create_standalone_workingtree,
301
self.get_readonly_url())
302
tree = bzrdir.BzrDir.create_standalone_workingtree('.')
303
self.assertEqual('A tree', tree)
305
bzrdir.BzrDirFormat.set_default_format(old_format)
307
def test_create_standalone_working_tree_under_shared_repo(self):
308
# create standalone working tree always makes a repo.
309
old_format = bzrdir.BzrDirFormat.get_default_format()
310
bzrdir.BzrDirFormat.set_default_format(bzrdir.BzrDirMetaFormat1())
312
self.make_repository('.', shared=True)
313
# note this is deliberately readonly, as this failure should
314
# occur before any writes.
315
self.assertRaises(errors.NotLocalUrl,
316
bzrdir.BzrDir.create_standalone_workingtree,
317
self.get_readonly_url('child'))
318
tree = bzrdir.BzrDir.create_standalone_workingtree('child')
319
tree.bzrdir.open_repository()
321
bzrdir.BzrDirFormat.set_default_format(old_format)
323
def test_create_branch_convenience(self):
324
# outside a repo the default convenience output is a repo+branch_tree
325
old_format = bzrdir.BzrDirFormat.get_default_format()
326
bzrdir.BzrDirFormat.set_default_format(bzrdir.BzrDirMetaFormat1())
328
branch = bzrdir.BzrDir.create_branch_convenience('.')
329
branch.bzrdir.open_workingtree()
330
branch.bzrdir.open_repository()
332
bzrdir.BzrDirFormat.set_default_format(old_format)
334
def test_create_branch_convenience_root(self):
335
"""Creating a branch at the root of a fs should work."""
336
self.transport_server = MemoryServer
337
# outside a repo the default convenience output is a repo+branch_tree
338
old_format = bzrdir.BzrDirFormat.get_default_format()
339
bzrdir.BzrDirFormat.set_default_format(bzrdir.BzrDirMetaFormat1())
341
branch = bzrdir.BzrDir.create_branch_convenience(self.get_url())
342
self.assertRaises(errors.NoWorkingTree,
343
branch.bzrdir.open_workingtree)
344
branch.bzrdir.open_repository()
346
bzrdir.BzrDirFormat.set_default_format(old_format)
348
def test_create_branch_convenience_under_shared_repo(self):
349
# inside a repo the default convenience output is a branch+ follow the
351
old_format = bzrdir.BzrDirFormat.get_default_format()
352
bzrdir.BzrDirFormat.set_default_format(bzrdir.BzrDirMetaFormat1())
354
self.make_repository('.', shared=True)
355
branch = bzrdir.BzrDir.create_branch_convenience('child')
356
branch.bzrdir.open_workingtree()
357
self.assertRaises(errors.NoRepositoryPresent,
358
branch.bzrdir.open_repository)
360
bzrdir.BzrDirFormat.set_default_format(old_format)
362
def test_create_branch_convenience_under_shared_repo_force_no_tree(self):
363
# inside a repo the default convenience output is a branch+ follow the
364
# repo tree policy but we can override that
365
old_format = bzrdir.BzrDirFormat.get_default_format()
366
bzrdir.BzrDirFormat.set_default_format(bzrdir.BzrDirMetaFormat1())
368
self.make_repository('.', shared=True)
369
branch = bzrdir.BzrDir.create_branch_convenience('child',
370
force_new_tree=False)
371
self.assertRaises(errors.NoWorkingTree,
372
branch.bzrdir.open_workingtree)
373
self.assertRaises(errors.NoRepositoryPresent,
374
branch.bzrdir.open_repository)
376
bzrdir.BzrDirFormat.set_default_format(old_format)
378
def test_create_branch_convenience_under_shared_repo_no_tree_policy(self):
379
# inside a repo the default convenience output is a branch+ follow the
381
old_format = bzrdir.BzrDirFormat.get_default_format()
382
bzrdir.BzrDirFormat.set_default_format(bzrdir.BzrDirMetaFormat1())
384
repo = self.make_repository('.', shared=True)
385
repo.set_make_working_trees(False)
386
branch = bzrdir.BzrDir.create_branch_convenience('child')
387
self.assertRaises(errors.NoWorkingTree,
388
branch.bzrdir.open_workingtree)
389
self.assertRaises(errors.NoRepositoryPresent,
390
branch.bzrdir.open_repository)
392
bzrdir.BzrDirFormat.set_default_format(old_format)
394
def test_create_branch_convenience_under_shared_repo_no_tree_policy_force_tree(self):
395
# inside a repo the default convenience output is a branch+ follow the
396
# repo tree policy but we can override that
397
old_format = bzrdir.BzrDirFormat.get_default_format()
398
bzrdir.BzrDirFormat.set_default_format(bzrdir.BzrDirMetaFormat1())
400
repo = self.make_repository('.', shared=True)
401
repo.set_make_working_trees(False)
402
branch = bzrdir.BzrDir.create_branch_convenience('child',
404
branch.bzrdir.open_workingtree()
405
self.assertRaises(errors.NoRepositoryPresent,
406
branch.bzrdir.open_repository)
408
bzrdir.BzrDirFormat.set_default_format(old_format)
410
def test_create_branch_convenience_under_shared_repo_force_new_repo(self):
411
# inside a repo the default convenience output is overridable to give
413
old_format = bzrdir.BzrDirFormat.get_default_format()
414
bzrdir.BzrDirFormat.set_default_format(bzrdir.BzrDirMetaFormat1())
416
self.make_repository('.', shared=True)
417
branch = bzrdir.BzrDir.create_branch_convenience('child',
419
branch.bzrdir.open_repository()
420
branch.bzrdir.open_workingtree()
422
bzrdir.BzrDirFormat.set_default_format(old_format)
425
class ChrootedTests(TestCaseWithTransport):
426
"""A support class that provides readonly urls outside the local namespace.
428
This is done by checking if self.transport_server is a MemoryServer. if it
429
is then we are chrooted already, if it is not then an HttpServer is used
434
super(ChrootedTests, self).setUp()
435
if not self.transport_server == MemoryServer:
436
self.transport_readonly_server = HttpServer
438
def test_open_containing(self):
439
self.assertRaises(NotBranchError, bzrdir.BzrDir.open_containing,
440
self.get_readonly_url(''))
441
self.assertRaises(NotBranchError, bzrdir.BzrDir.open_containing,
442
self.get_readonly_url('g/p/q'))
443
control = bzrdir.BzrDir.create(self.get_url())
444
branch, relpath = bzrdir.BzrDir.open_containing(self.get_readonly_url(''))
445
self.assertEqual('', relpath)
446
branch, relpath = bzrdir.BzrDir.open_containing(self.get_readonly_url('g/p/q'))
447
self.assertEqual('g/p/q', relpath)
449
def test_open_containing_from_transport(self):
450
self.assertRaises(NotBranchError, bzrdir.BzrDir.open_containing_from_transport,
451
get_transport(self.get_readonly_url('')))
452
self.assertRaises(NotBranchError, bzrdir.BzrDir.open_containing_from_transport,
453
get_transport(self.get_readonly_url('g/p/q')))
454
control = bzrdir.BzrDir.create(self.get_url())
455
branch, relpath = bzrdir.BzrDir.open_containing_from_transport(
456
get_transport(self.get_readonly_url('')))
457
self.assertEqual('', relpath)
458
branch, relpath = bzrdir.BzrDir.open_containing_from_transport(
459
get_transport(self.get_readonly_url('g/p/q')))
460
self.assertEqual('g/p/q', relpath)
462
def test_open_from_transport(self):
463
# transport pointing at bzrdir should give a bzrdir with root transport
464
# set to the given transport
465
control = bzrdir.BzrDir.create(self.get_url())
466
transport = get_transport(self.get_url())
467
opened_bzrdir = bzrdir.BzrDir.open_from_transport(transport)
468
self.assertEqual(transport.base, opened_bzrdir.root_transport.base)
469
self.assertIsInstance(opened_bzrdir, bzrdir.BzrDir)
471
def test_open_from_transport_no_bzrdir(self):
472
transport = get_transport(self.get_url())
473
self.assertRaises(NotBranchError, bzrdir.BzrDir.open_from_transport,
476
def test_open_from_transport_bzrdir_in_parent(self):
477
control = bzrdir.BzrDir.create(self.get_url())
478
transport = get_transport(self.get_url())
479
transport.mkdir('subdir')
480
transport = transport.clone('subdir')
481
self.assertRaises(NotBranchError, bzrdir.BzrDir.open_from_transport,
485
class TestMeta1DirFormat(TestCaseWithTransport):
486
"""Tests specific to the meta1 dir format."""
488
def test_right_base_dirs(self):
489
dir = bzrdir.BzrDirMetaFormat1().initialize(self.get_url())
491
branch_base = t.clone('branch').base
492
self.assertEqual(branch_base, dir.get_branch_transport(None).base)
493
self.assertEqual(branch_base,
494
dir.get_branch_transport(bzrlib.branch.BzrBranchFormat5()).base)
495
repository_base = t.clone('repository').base
496
self.assertEqual(repository_base, dir.get_repository_transport(None).base)
497
self.assertEqual(repository_base,
498
dir.get_repository_transport(repository.RepositoryFormat7()).base)
499
checkout_base = t.clone('checkout').base
500
self.assertEqual(checkout_base, dir.get_workingtree_transport(None).base)
501
self.assertEqual(checkout_base,
502
dir.get_workingtree_transport(workingtree.WorkingTreeFormat3()).base)
504
def test_meta1dir_uses_lockdir(self):
505
"""Meta1 format uses a LockDir to guard the whole directory, not a file."""
506
dir = bzrdir.BzrDirMetaFormat1().initialize(self.get_url())
508
self.assertIsDirectory('branch-lock', t)
511
class TestFormat5(TestCaseWithTransport):
512
"""Tests specific to the version 5 bzrdir format."""
514
def test_same_lockfiles_between_tree_repo_branch(self):
515
# this checks that only a single lockfiles instance is created
516
# for format 5 objects
517
dir = bzrdir.BzrDirFormat5().initialize(self.get_url())
518
def check_dir_components_use_same_lock(dir):
519
ctrl_1 = dir.open_repository().control_files
520
ctrl_2 = dir.open_branch().control_files
521
ctrl_3 = dir.open_workingtree()._control_files
522
self.assertTrue(ctrl_1 is ctrl_2)
523
self.assertTrue(ctrl_2 is ctrl_3)
524
check_dir_components_use_same_lock(dir)
525
# and if we open it normally.
526
dir = bzrdir.BzrDir.open(self.get_url())
527
check_dir_components_use_same_lock(dir)
529
def test_can_convert(self):
530
# format 5 dirs are convertable
531
dir = bzrdir.BzrDirFormat5().initialize(self.get_url())
532
self.assertTrue(dir.can_convert_format())
534
def test_needs_conversion(self):
535
# format 5 dirs need a conversion if they are not the default.
536
# and they start of not the default.
537
old_format = bzrdir.BzrDirFormat.get_default_format()
538
bzrdir.BzrDirFormat.set_default_format(bzrdir.BzrDirFormat5())
540
dir = bzrdir.BzrDirFormat5().initialize(self.get_url())
541
self.assertFalse(dir.needs_format_conversion())
543
bzrdir.BzrDirFormat.set_default_format(old_format)
544
self.assertTrue(dir.needs_format_conversion())
547
class TestFormat6(TestCaseWithTransport):
548
"""Tests specific to the version 6 bzrdir format."""
550
def test_same_lockfiles_between_tree_repo_branch(self):
551
# this checks that only a single lockfiles instance is created
552
# for format 6 objects
553
dir = bzrdir.BzrDirFormat6().initialize(self.get_url())
554
def check_dir_components_use_same_lock(dir):
555
ctrl_1 = dir.open_repository().control_files
556
ctrl_2 = dir.open_branch().control_files
557
ctrl_3 = dir.open_workingtree()._control_files
558
self.assertTrue(ctrl_1 is ctrl_2)
559
self.assertTrue(ctrl_2 is ctrl_3)
560
check_dir_components_use_same_lock(dir)
561
# and if we open it normally.
562
dir = bzrdir.BzrDir.open(self.get_url())
563
check_dir_components_use_same_lock(dir)
565
def test_can_convert(self):
566
# format 6 dirs are convertable
567
dir = bzrdir.BzrDirFormat6().initialize(self.get_url())
568
self.assertTrue(dir.can_convert_format())
570
def test_needs_conversion(self):
571
# format 6 dirs need an conversion if they are not the default.
572
old_format = bzrdir.BzrDirFormat.get_default_format()
573
bzrdir.BzrDirFormat.set_default_format(bzrdir.BzrDirMetaFormat1())
575
dir = bzrdir.BzrDirFormat6().initialize(self.get_url())
576
self.assertTrue(dir.needs_format_conversion())
578
bzrdir.BzrDirFormat.set_default_format(old_format)
581
class NotBzrDir(bzrlib.bzrdir.BzrDir):
582
"""A non .bzr based control directory."""
584
def __init__(self, transport, format):
585
self._format = format
586
self.root_transport = transport
587
self.transport = transport.clone('.not')
590
class NotBzrDirFormat(bzrlib.bzrdir.BzrDirFormat):
591
"""A test class representing any non-.bzr based disk format."""
593
def initialize_on_transport(self, transport):
594
"""Initialize a new .not dir in the base directory of a Transport."""
595
transport.mkdir('.not')
596
return self.open(transport)
598
def open(self, transport):
599
"""Open this directory."""
600
return NotBzrDir(transport, self)
603
def _known_formats(self):
604
return set([NotBzrDirFormat()])
607
def probe_transport(self, transport):
608
"""Our format is present if the transport ends in '.not/'."""
609
if transport.has('.not'):
610
return NotBzrDirFormat()
613
class TestNotBzrDir(TestCaseWithTransport):
614
"""Tests for using the bzrdir api with a non .bzr based disk format.
616
If/when one of these is in the core, we can let the implementation tests
620
def test_create_and_find_format(self):
621
# create a .notbzr dir
622
format = NotBzrDirFormat()
623
dir = format.initialize(self.get_url())
624
self.assertIsInstance(dir, NotBzrDir)
626
bzrlib.bzrdir.BzrDirFormat.register_control_format(format)
628
found = bzrlib.bzrdir.BzrDirFormat.find_format(
629
get_transport(self.get_url()))
630
self.assertIsInstance(found, NotBzrDirFormat)
632
bzrlib.bzrdir.BzrDirFormat.unregister_control_format(format)
634
def test_included_in_known_formats(self):
635
bzrlib.bzrdir.BzrDirFormat.register_control_format(NotBzrDirFormat)
637
formats = bzrlib.bzrdir.BzrDirFormat.known_formats()
638
for format in formats:
639
if isinstance(format, NotBzrDirFormat):
641
self.fail("No NotBzrDirFormat in %s" % formats)
643
bzrlib.bzrdir.BzrDirFormat.unregister_control_format(NotBzrDirFormat)
646
class NonLocalTests(TestCaseWithTransport):
647
"""Tests for bzrdir static behaviour on non local paths."""
650
super(NonLocalTests, self).setUp()
651
self.transport_server = MemoryServer
653
def test_create_branch_convenience(self):
654
# outside a repo the default convenience output is a repo+branch_tree
655
old_format = bzrdir.BzrDirFormat.get_default_format()
656
bzrdir.BzrDirFormat.set_default_format(bzrdir.BzrDirMetaFormat1())
658
branch = bzrdir.BzrDir.create_branch_convenience(self.get_url('foo'))
659
self.assertRaises(errors.NoWorkingTree,
660
branch.bzrdir.open_workingtree)
661
branch.bzrdir.open_repository()
663
bzrdir.BzrDirFormat.set_default_format(old_format)
665
def test_create_branch_convenience_force_tree_not_local_fails(self):
666
# outside a repo the default convenience output is a repo+branch_tree
667
old_format = bzrdir.BzrDirFormat.get_default_format()
668
bzrdir.BzrDirFormat.set_default_format(bzrdir.BzrDirMetaFormat1())
670
self.assertRaises(errors.NotLocalUrl,
671
bzrdir.BzrDir.create_branch_convenience,
674
t = get_transport(self.get_url('.'))
675
self.assertFalse(t.has('foo'))
677
bzrdir.BzrDirFormat.set_default_format(old_format)
679
def test_clone(self):
680
# clone into a nonlocal path works
681
old_format = bzrdir.BzrDirFormat.get_default_format()
682
bzrdir.BzrDirFormat.set_default_format(bzrdir.BzrDirMetaFormat1())
684
branch = bzrdir.BzrDir.create_branch_convenience('local')
686
bzrdir.BzrDirFormat.set_default_format(old_format)
687
branch.bzrdir.open_workingtree()
688
result = branch.bzrdir.clone(self.get_url('remote'))
689
self.assertRaises(errors.NoWorkingTree,
690
result.open_workingtree)
692
result.open_repository()