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('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_lazy('lazy', 'bzrlib.bzrdir',
66
'BzrDirFormat6', 'Format registered lazily', 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('lazy')
80
self.assertIsInstance(my_bzrdir, bzrdir.BzrDirFormat6)
81
my_bzrdir = my_format_registry.make_bzrdir('weave')
82
self.assertIsInstance(my_bzrdir, bzrdir.BzrDirFormat6)
83
my_bzrdir = my_format_registry.make_bzrdir('default')
84
self.assertIsInstance(my_bzrdir.repository_format,
85
repository.RepositoryFormatKnit1)
86
my_bzrdir = my_format_registry.make_bzrdir('knit')
87
self.assertIsInstance(my_bzrdir.repository_format,
88
repository.RepositoryFormatKnit1)
89
my_bzrdir = my_format_registry.make_bzrdir('metaweave')
90
self.assertIsInstance(my_bzrdir.repository_format,
91
repository.RepositoryFormat7)
93
def test_get_help(self):
94
my_format_registry = self.make_format_registry()
95
self.assertEqual('Format registered lazily',
96
my_format_registry.get_help('lazy'))
97
self.assertEqual('Format using knits',
98
my_format_registry.get_help('knit'))
99
self.assertEqual('Format using knits',
100
my_format_registry.get_help('default'))
101
self.assertEqual('Pre-0.8 format. Slower and does not support'
102
' checkouts or shared repositories',
103
my_format_registry.get_help('weave'))
105
def test_help_topic(self):
106
topics = help_topics.HelpTopicRegistry()
107
topics.register('formats', self.make_format_registry().help_topic,
109
topic = topics.get_detail('formats')
110
new, deprecated = topic.split('Deprecated formats')
111
self.assertContainsRe(new, 'Bazaar directory formats')
112
self.assertContainsRe(new,
113
' knit/default:\n \(native\) Format using knits\n')
114
self.assertContainsRe(deprecated,
115
' lazy:\n \(native\) Format registered lazily\n')
117
class SampleBranch(bzrlib.branch.Branch):
118
"""A dummy branch for guess what, dummy use."""
120
def __init__(self, dir):
124
class SampleBzrDir(bzrdir.BzrDir):
125
"""A sample BzrDir implementation to allow testing static methods."""
127
def create_repository(self, shared=False):
128
"""See BzrDir.create_repository."""
129
return "A repository"
131
def open_repository(self):
132
"""See BzrDir.open_repository."""
133
return "A repository"
135
def create_branch(self):
136
"""See BzrDir.create_branch."""
137
return SampleBranch(self)
139
def create_workingtree(self):
140
"""See BzrDir.create_workingtree."""
144
class SampleBzrDirFormat(bzrdir.BzrDirFormat):
147
this format is initializable, unsupported to aid in testing the
148
open and open_downlevel routines.
151
def get_format_string(self):
152
"""See BzrDirFormat.get_format_string()."""
153
return "Sample .bzr dir format."
155
def initialize(self, url):
156
"""Create a bzr dir."""
157
t = get_transport(url)
159
t.put_bytes('.bzr/branch-format', self.get_format_string())
160
return SampleBzrDir(t, self)
162
def is_supported(self):
165
def open(self, transport, _found=None):
166
return "opened branch."
169
class TestBzrDirFormat(TestCaseWithTransport):
170
"""Tests for the BzrDirFormat facility."""
172
def test_find_format(self):
173
# is the right format object found for a branch?
174
# create a branch with a few known format objects.
175
# this is not quite the same as
176
t = get_transport(self.get_url())
177
self.build_tree(["foo/", "bar/"], transport=t)
178
def check_format(format, url):
179
format.initialize(url)
180
t = get_transport(url)
181
found_format = bzrdir.BzrDirFormat.find_format(t)
182
self.failUnless(isinstance(found_format, format.__class__))
183
check_format(bzrdir.BzrDirFormat5(), "foo")
184
check_format(bzrdir.BzrDirFormat6(), "bar")
186
def test_find_format_nothing_there(self):
187
self.assertRaises(NotBranchError,
188
bzrdir.BzrDirFormat.find_format,
191
def test_find_format_unknown_format(self):
192
t = get_transport(self.get_url())
194
t.put_bytes('.bzr/branch-format', '')
195
self.assertRaises(UnknownFormatError,
196
bzrdir.BzrDirFormat.find_format,
199
def test_register_unregister_format(self):
200
format = SampleBzrDirFormat()
203
format.initialize(url)
204
# register a format for it.
205
bzrdir.BzrDirFormat.register_format(format)
206
# which bzrdir.Open will refuse (not supported)
207
self.assertRaises(UnsupportedFormatError, bzrdir.BzrDir.open, url)
208
# which bzrdir.open_containing will refuse (not supported)
209
self.assertRaises(UnsupportedFormatError, bzrdir.BzrDir.open_containing, url)
210
# but open_downlevel will work
211
t = get_transport(url)
212
self.assertEqual(format.open(t), bzrdir.BzrDir.open_unsupported(url))
213
# unregister the format
214
bzrdir.BzrDirFormat.unregister_format(format)
215
# now open_downlevel should fail too.
216
self.assertRaises(UnknownFormatError, bzrdir.BzrDir.open_unsupported, url)
218
def test_create_repository(self):
219
format = SampleBzrDirFormat()
220
old_format = bzrdir.BzrDirFormat.get_default_format()
221
bzrdir.BzrDirFormat.set_default_format(format)
223
repo = bzrdir.BzrDir.create_repository(self.get_url())
224
self.assertEqual('A repository', repo)
226
bzrdir.BzrDirFormat.set_default_format(old_format)
228
def test_create_repository_shared(self):
229
old_format = bzrdir.BzrDirFormat.get_default_format()
230
repo = bzrdir.BzrDir.create_repository('.', shared=True)
231
self.assertTrue(repo.is_shared())
233
def test_create_repository_nonshared(self):
234
old_format = bzrdir.BzrDirFormat.get_default_format()
235
repo = bzrdir.BzrDir.create_repository('.')
236
self.assertFalse(repo.is_shared())
238
def test_create_repository_under_shared(self):
239
# an explicit create_repository always does so.
240
# we trust the format is right from the 'create_repository test'
241
old_format = bzrdir.BzrDirFormat.get_default_format()
242
bzrdir.BzrDirFormat.set_default_format(bzrdir.BzrDirMetaFormat1())
244
self.make_repository('.', shared=True)
245
repo = bzrdir.BzrDir.create_repository(self.get_url('child'))
246
self.assertTrue(isinstance(repo, repository.Repository))
247
self.assertTrue(repo.bzrdir.root_transport.base.endswith('child/'))
249
bzrdir.BzrDirFormat.set_default_format(old_format)
251
def test_create_branch_and_repo_uses_default(self):
252
format = SampleBzrDirFormat()
253
old_format = bzrdir.BzrDirFormat.get_default_format()
254
bzrdir.BzrDirFormat.set_default_format(format)
256
branch = bzrdir.BzrDir.create_branch_and_repo(self.get_url())
257
self.assertTrue(isinstance(branch, SampleBranch))
259
bzrdir.BzrDirFormat.set_default_format(old_format)
261
def test_create_branch_and_repo_under_shared(self):
262
# creating a branch and repo in a shared repo uses the
264
old_format = bzrdir.BzrDirFormat.get_default_format()
265
bzrdir.BzrDirFormat.set_default_format(bzrdir.BzrDirMetaFormat1())
267
self.make_repository('.', shared=True)
268
branch = bzrdir.BzrDir.create_branch_and_repo(self.get_url('child'))
269
self.assertRaises(errors.NoRepositoryPresent,
270
branch.bzrdir.open_repository)
272
bzrdir.BzrDirFormat.set_default_format(old_format)
274
def test_create_branch_and_repo_under_shared_force_new(self):
275
# creating a branch and repo in a shared repo can be forced to
277
old_format = bzrdir.BzrDirFormat.get_default_format()
278
bzrdir.BzrDirFormat.set_default_format(bzrdir.BzrDirMetaFormat1())
280
self.make_repository('.', shared=True)
281
branch = bzrdir.BzrDir.create_branch_and_repo(self.get_url('child'),
283
branch.bzrdir.open_repository()
285
bzrdir.BzrDirFormat.set_default_format(old_format)
287
def test_create_standalone_working_tree(self):
288
format = SampleBzrDirFormat()
289
old_format = bzrdir.BzrDirFormat.get_default_format()
290
bzrdir.BzrDirFormat.set_default_format(format)
292
# note this is deliberately readonly, as this failure should
293
# occur before any writes.
294
self.assertRaises(errors.NotLocalUrl,
295
bzrdir.BzrDir.create_standalone_workingtree,
296
self.get_readonly_url())
297
tree = bzrdir.BzrDir.create_standalone_workingtree('.')
298
self.assertEqual('A tree', tree)
300
bzrdir.BzrDirFormat.set_default_format(old_format)
302
def test_create_standalone_working_tree_under_shared_repo(self):
303
# create standalone working tree always makes a repo.
304
old_format = bzrdir.BzrDirFormat.get_default_format()
305
bzrdir.BzrDirFormat.set_default_format(bzrdir.BzrDirMetaFormat1())
307
self.make_repository('.', shared=True)
308
# note this is deliberately readonly, as this failure should
309
# occur before any writes.
310
self.assertRaises(errors.NotLocalUrl,
311
bzrdir.BzrDir.create_standalone_workingtree,
312
self.get_readonly_url('child'))
313
tree = bzrdir.BzrDir.create_standalone_workingtree('child')
314
tree.bzrdir.open_repository()
316
bzrdir.BzrDirFormat.set_default_format(old_format)
318
def test_create_branch_convenience(self):
319
# outside a repo the default convenience output is a repo+branch_tree
320
old_format = bzrdir.BzrDirFormat.get_default_format()
321
bzrdir.BzrDirFormat.set_default_format(bzrdir.BzrDirMetaFormat1())
323
branch = bzrdir.BzrDir.create_branch_convenience('.')
324
branch.bzrdir.open_workingtree()
325
branch.bzrdir.open_repository()
327
bzrdir.BzrDirFormat.set_default_format(old_format)
329
def test_create_branch_convenience_root(self):
330
"""Creating a branch at the root of a fs should work."""
331
self.transport_server = MemoryServer
332
# outside a repo the default convenience output is a repo+branch_tree
333
old_format = bzrdir.BzrDirFormat.get_default_format()
334
bzrdir.BzrDirFormat.set_default_format(bzrdir.BzrDirMetaFormat1())
336
branch = bzrdir.BzrDir.create_branch_convenience(self.get_url())
337
self.assertRaises(errors.NoWorkingTree,
338
branch.bzrdir.open_workingtree)
339
branch.bzrdir.open_repository()
341
bzrdir.BzrDirFormat.set_default_format(old_format)
343
def test_create_branch_convenience_under_shared_repo(self):
344
# inside a repo the default convenience output is a branch+ follow the
346
old_format = bzrdir.BzrDirFormat.get_default_format()
347
bzrdir.BzrDirFormat.set_default_format(bzrdir.BzrDirMetaFormat1())
349
self.make_repository('.', shared=True)
350
branch = bzrdir.BzrDir.create_branch_convenience('child')
351
branch.bzrdir.open_workingtree()
352
self.assertRaises(errors.NoRepositoryPresent,
353
branch.bzrdir.open_repository)
355
bzrdir.BzrDirFormat.set_default_format(old_format)
357
def test_create_branch_convenience_under_shared_repo_force_no_tree(self):
358
# inside a repo the default convenience output is a branch+ follow the
359
# repo tree policy but we can override that
360
old_format = bzrdir.BzrDirFormat.get_default_format()
361
bzrdir.BzrDirFormat.set_default_format(bzrdir.BzrDirMetaFormat1())
363
self.make_repository('.', shared=True)
364
branch = bzrdir.BzrDir.create_branch_convenience('child',
365
force_new_tree=False)
366
self.assertRaises(errors.NoWorkingTree,
367
branch.bzrdir.open_workingtree)
368
self.assertRaises(errors.NoRepositoryPresent,
369
branch.bzrdir.open_repository)
371
bzrdir.BzrDirFormat.set_default_format(old_format)
373
def test_create_branch_convenience_under_shared_repo_no_tree_policy(self):
374
# inside a repo the default convenience output is a branch+ follow the
376
old_format = bzrdir.BzrDirFormat.get_default_format()
377
bzrdir.BzrDirFormat.set_default_format(bzrdir.BzrDirMetaFormat1())
379
repo = self.make_repository('.', shared=True)
380
repo.set_make_working_trees(False)
381
branch = bzrdir.BzrDir.create_branch_convenience('child')
382
self.assertRaises(errors.NoWorkingTree,
383
branch.bzrdir.open_workingtree)
384
self.assertRaises(errors.NoRepositoryPresent,
385
branch.bzrdir.open_repository)
387
bzrdir.BzrDirFormat.set_default_format(old_format)
389
def test_create_branch_convenience_under_shared_repo_no_tree_policy_force_tree(self):
390
# inside a repo the default convenience output is a branch+ follow the
391
# repo tree policy but we can override that
392
old_format = bzrdir.BzrDirFormat.get_default_format()
393
bzrdir.BzrDirFormat.set_default_format(bzrdir.BzrDirMetaFormat1())
395
repo = self.make_repository('.', shared=True)
396
repo.set_make_working_trees(False)
397
branch = bzrdir.BzrDir.create_branch_convenience('child',
399
branch.bzrdir.open_workingtree()
400
self.assertRaises(errors.NoRepositoryPresent,
401
branch.bzrdir.open_repository)
403
bzrdir.BzrDirFormat.set_default_format(old_format)
405
def test_create_branch_convenience_under_shared_repo_force_new_repo(self):
406
# inside a repo the default convenience output is overridable to give
408
old_format = bzrdir.BzrDirFormat.get_default_format()
409
bzrdir.BzrDirFormat.set_default_format(bzrdir.BzrDirMetaFormat1())
411
self.make_repository('.', shared=True)
412
branch = bzrdir.BzrDir.create_branch_convenience('child',
414
branch.bzrdir.open_repository()
415
branch.bzrdir.open_workingtree()
417
bzrdir.BzrDirFormat.set_default_format(old_format)
420
class ChrootedTests(TestCaseWithTransport):
421
"""A support class that provides readonly urls outside the local namespace.
423
This is done by checking if self.transport_server is a MemoryServer. if it
424
is then we are chrooted already, if it is not then an HttpServer is used
429
super(ChrootedTests, self).setUp()
430
if not self.transport_server == MemoryServer:
431
self.transport_readonly_server = HttpServer
433
def test_open_containing(self):
434
self.assertRaises(NotBranchError, bzrdir.BzrDir.open_containing,
435
self.get_readonly_url(''))
436
self.assertRaises(NotBranchError, bzrdir.BzrDir.open_containing,
437
self.get_readonly_url('g/p/q'))
438
control = bzrdir.BzrDir.create(self.get_url())
439
branch, relpath = bzrdir.BzrDir.open_containing(self.get_readonly_url(''))
440
self.assertEqual('', relpath)
441
branch, relpath = bzrdir.BzrDir.open_containing(self.get_readonly_url('g/p/q'))
442
self.assertEqual('g/p/q', relpath)
444
def test_open_containing_from_transport(self):
445
self.assertRaises(NotBranchError, bzrdir.BzrDir.open_containing_from_transport,
446
get_transport(self.get_readonly_url('')))
447
self.assertRaises(NotBranchError, bzrdir.BzrDir.open_containing_from_transport,
448
get_transport(self.get_readonly_url('g/p/q')))
449
control = bzrdir.BzrDir.create(self.get_url())
450
branch, relpath = bzrdir.BzrDir.open_containing_from_transport(
451
get_transport(self.get_readonly_url('')))
452
self.assertEqual('', relpath)
453
branch, relpath = bzrdir.BzrDir.open_containing_from_transport(
454
get_transport(self.get_readonly_url('g/p/q')))
455
self.assertEqual('g/p/q', relpath)
457
def test_open_from_transport(self):
458
# transport pointing at bzrdir should give a bzrdir with root transport
459
# set to the given transport
460
control = bzrdir.BzrDir.create(self.get_url())
461
transport = get_transport(self.get_url())
462
opened_bzrdir = bzrdir.BzrDir.open_from_transport(transport)
463
self.assertEqual(transport.base, opened_bzrdir.root_transport.base)
464
self.assertIsInstance(opened_bzrdir, bzrdir.BzrDir)
466
def test_open_from_transport_no_bzrdir(self):
467
transport = get_transport(self.get_url())
468
self.assertRaises(NotBranchError, bzrdir.BzrDir.open_from_transport,
471
def test_open_from_transport_bzrdir_in_parent(self):
472
control = bzrdir.BzrDir.create(self.get_url())
473
transport = get_transport(self.get_url())
474
transport.mkdir('subdir')
475
transport = transport.clone('subdir')
476
self.assertRaises(NotBranchError, bzrdir.BzrDir.open_from_transport,
480
class TestMeta1DirFormat(TestCaseWithTransport):
481
"""Tests specific to the meta1 dir format."""
483
def test_right_base_dirs(self):
484
dir = bzrdir.BzrDirMetaFormat1().initialize(self.get_url())
486
branch_base = t.clone('branch').base
487
self.assertEqual(branch_base, dir.get_branch_transport(None).base)
488
self.assertEqual(branch_base,
489
dir.get_branch_transport(bzrlib.branch.BzrBranchFormat5()).base)
490
repository_base = t.clone('repository').base
491
self.assertEqual(repository_base, dir.get_repository_transport(None).base)
492
self.assertEqual(repository_base,
493
dir.get_repository_transport(repository.RepositoryFormat7()).base)
494
checkout_base = t.clone('checkout').base
495
self.assertEqual(checkout_base, dir.get_workingtree_transport(None).base)
496
self.assertEqual(checkout_base,
497
dir.get_workingtree_transport(workingtree.WorkingTreeFormat3()).base)
499
def test_meta1dir_uses_lockdir(self):
500
"""Meta1 format uses a LockDir to guard the whole directory, not a file."""
501
dir = bzrdir.BzrDirMetaFormat1().initialize(self.get_url())
503
self.assertIsDirectory('branch-lock', t)
506
class TestFormat5(TestCaseWithTransport):
507
"""Tests specific to the version 5 bzrdir format."""
509
def test_same_lockfiles_between_tree_repo_branch(self):
510
# this checks that only a single lockfiles instance is created
511
# for format 5 objects
512
dir = bzrdir.BzrDirFormat5().initialize(self.get_url())
513
def check_dir_components_use_same_lock(dir):
514
ctrl_1 = dir.open_repository().control_files
515
ctrl_2 = dir.open_branch().control_files
516
ctrl_3 = dir.open_workingtree()._control_files
517
self.assertTrue(ctrl_1 is ctrl_2)
518
self.assertTrue(ctrl_2 is ctrl_3)
519
check_dir_components_use_same_lock(dir)
520
# and if we open it normally.
521
dir = bzrdir.BzrDir.open(self.get_url())
522
check_dir_components_use_same_lock(dir)
524
def test_can_convert(self):
525
# format 5 dirs are convertable
526
dir = bzrdir.BzrDirFormat5().initialize(self.get_url())
527
self.assertTrue(dir.can_convert_format())
529
def test_needs_conversion(self):
530
# format 5 dirs need a conversion if they are not the default.
531
# and they start of not the default.
532
old_format = bzrdir.BzrDirFormat.get_default_format()
533
bzrdir.BzrDirFormat.set_default_format(bzrdir.BzrDirFormat5())
535
dir = bzrdir.BzrDirFormat5().initialize(self.get_url())
536
self.assertFalse(dir.needs_format_conversion())
538
bzrdir.BzrDirFormat.set_default_format(old_format)
539
self.assertTrue(dir.needs_format_conversion())
542
class TestFormat6(TestCaseWithTransport):
543
"""Tests specific to the version 6 bzrdir format."""
545
def test_same_lockfiles_between_tree_repo_branch(self):
546
# this checks that only a single lockfiles instance is created
547
# for format 6 objects
548
dir = bzrdir.BzrDirFormat6().initialize(self.get_url())
549
def check_dir_components_use_same_lock(dir):
550
ctrl_1 = dir.open_repository().control_files
551
ctrl_2 = dir.open_branch().control_files
552
ctrl_3 = dir.open_workingtree()._control_files
553
self.assertTrue(ctrl_1 is ctrl_2)
554
self.assertTrue(ctrl_2 is ctrl_3)
555
check_dir_components_use_same_lock(dir)
556
# and if we open it normally.
557
dir = bzrdir.BzrDir.open(self.get_url())
558
check_dir_components_use_same_lock(dir)
560
def test_can_convert(self):
561
# format 6 dirs are convertable
562
dir = bzrdir.BzrDirFormat6().initialize(self.get_url())
563
self.assertTrue(dir.can_convert_format())
565
def test_needs_conversion(self):
566
# format 6 dirs need an conversion if they are not the default.
567
old_format = bzrdir.BzrDirFormat.get_default_format()
568
bzrdir.BzrDirFormat.set_default_format(bzrdir.BzrDirMetaFormat1())
570
dir = bzrdir.BzrDirFormat6().initialize(self.get_url())
571
self.assertTrue(dir.needs_format_conversion())
573
bzrdir.BzrDirFormat.set_default_format(old_format)
576
class NotBzrDir(bzrlib.bzrdir.BzrDir):
577
"""A non .bzr based control directory."""
579
def __init__(self, transport, format):
580
self._format = format
581
self.root_transport = transport
582
self.transport = transport.clone('.not')
585
class NotBzrDirFormat(bzrlib.bzrdir.BzrDirFormat):
586
"""A test class representing any non-.bzr based disk format."""
588
def initialize_on_transport(self, transport):
589
"""Initialize a new .not dir in the base directory of a Transport."""
590
transport.mkdir('.not')
591
return self.open(transport)
593
def open(self, transport):
594
"""Open this directory."""
595
return NotBzrDir(transport, self)
598
def _known_formats(self):
599
return set([NotBzrDirFormat()])
602
def probe_transport(self, transport):
603
"""Our format is present if the transport ends in '.not/'."""
604
if transport.has('.not'):
605
return NotBzrDirFormat()
608
class TestNotBzrDir(TestCaseWithTransport):
609
"""Tests for using the bzrdir api with a non .bzr based disk format.
611
If/when one of these is in the core, we can let the implementation tests
615
def test_create_and_find_format(self):
616
# create a .notbzr dir
617
format = NotBzrDirFormat()
618
dir = format.initialize(self.get_url())
619
self.assertIsInstance(dir, NotBzrDir)
621
bzrlib.bzrdir.BzrDirFormat.register_control_format(format)
623
found = bzrlib.bzrdir.BzrDirFormat.find_format(
624
get_transport(self.get_url()))
625
self.assertIsInstance(found, NotBzrDirFormat)
627
bzrlib.bzrdir.BzrDirFormat.unregister_control_format(format)
629
def test_included_in_known_formats(self):
630
bzrlib.bzrdir.BzrDirFormat.register_control_format(NotBzrDirFormat)
632
formats = bzrlib.bzrdir.BzrDirFormat.known_formats()
633
for format in formats:
634
if isinstance(format, NotBzrDirFormat):
636
self.fail("No NotBzrDirFormat in %s" % formats)
638
bzrlib.bzrdir.BzrDirFormat.unregister_control_format(NotBzrDirFormat)
641
class NonLocalTests(TestCaseWithTransport):
642
"""Tests for bzrdir static behaviour on non local paths."""
645
super(NonLocalTests, self).setUp()
646
self.transport_server = MemoryServer
648
def test_create_branch_convenience(self):
649
# outside a repo the default convenience output is a repo+branch_tree
650
old_format = bzrdir.BzrDirFormat.get_default_format()
651
bzrdir.BzrDirFormat.set_default_format(bzrdir.BzrDirMetaFormat1())
653
branch = bzrdir.BzrDir.create_branch_convenience(self.get_url('foo'))
654
self.assertRaises(errors.NoWorkingTree,
655
branch.bzrdir.open_workingtree)
656
branch.bzrdir.open_repository()
658
bzrdir.BzrDirFormat.set_default_format(old_format)
660
def test_create_branch_convenience_force_tree_not_local_fails(self):
661
# outside a repo the default convenience output is a repo+branch_tree
662
old_format = bzrdir.BzrDirFormat.get_default_format()
663
bzrdir.BzrDirFormat.set_default_format(bzrdir.BzrDirMetaFormat1())
665
self.assertRaises(errors.NotLocalUrl,
666
bzrdir.BzrDir.create_branch_convenience,
669
t = get_transport(self.get_url('.'))
670
self.assertFalse(t.has('foo'))
672
bzrdir.BzrDirFormat.set_default_format(old_format)
674
def test_clone(self):
675
# clone into a nonlocal path works
676
old_format = bzrdir.BzrDirFormat.get_default_format()
677
bzrdir.BzrDirFormat.set_default_format(bzrdir.BzrDirMetaFormat1())
679
branch = bzrdir.BzrDir.create_branch_convenience('local')
681
bzrdir.BzrDirFormat.set_default_format(old_format)
682
branch.bzrdir.open_workingtree()
683
result = branch.bzrdir.clone(self.get_url('remote'))
684
self.assertRaises(errors.NoWorkingTree,
685
result.open_workingtree)
687
result.open_repository()