1
# Copyright (C) 2005, 2006, 2007 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.
23
from StringIO import StringIO
35
from bzrlib.errors import (NotBranchError,
37
UnsupportedFormatError,
39
from bzrlib.tests import TestCase, TestCaseWithTransport, test_sftp_transport
40
from bzrlib.tests.HttpServer import HttpServer
41
from bzrlib.transport import get_transport
42
from bzrlib.transport.memory import MemoryServer
43
from bzrlib.repofmt import knitrepo, weaverepo
46
class TestDefaultFormat(TestCase):
48
def test_get_set_default_format(self):
49
old_format = bzrdir.BzrDirFormat.get_default_format()
50
# default is BzrDirFormat6
51
self.failUnless(isinstance(old_format, bzrdir.BzrDirMetaFormat1))
52
self.applyDeprecated(symbol_versioning.zero_fourteen,
53
bzrdir.BzrDirFormat.set_default_format,
55
# creating a bzr dir should now create an instrumented dir.
57
result = bzrdir.BzrDir.create('memory:///')
58
self.failUnless(isinstance(result, SampleBzrDir))
60
self.applyDeprecated(symbol_versioning.zero_fourteen,
61
bzrdir.BzrDirFormat.set_default_format, old_format)
62
self.assertEqual(old_format, bzrdir.BzrDirFormat.get_default_format())
65
class TestFormatRegistry(TestCase):
67
def make_format_registry(self):
68
my_format_registry = bzrdir.BzrDirFormatRegistry()
69
my_format_registry.register('weave', bzrdir.BzrDirFormat6,
70
'Pre-0.8 format. Slower and does not support checkouts or shared'
71
' repositories', deprecated=True)
72
my_format_registry.register_lazy('lazy', 'bzrlib.bzrdir',
73
'BzrDirFormat6', 'Format registered lazily', deprecated=True)
74
my_format_registry.register_metadir('knit',
75
'bzrlib.repofmt.knitrepo.RepositoryFormatKnit1',
78
my_format_registry.set_default('knit')
79
my_format_registry.register_metadir(
81
'bzrlib.repofmt.knitrepo.RepositoryFormatKnit2',
82
'Experimental successor to knit. Use at your own risk.',
84
my_format_registry.register_metadir(
86
'bzrlib.repofmt.knitrepo.RepositoryFormatKnit2',
87
'Experimental successor to knit. Use at your own risk.',
88
branch_format='bzrlib.branch.BzrBranchFormat6')
89
return my_format_registry
91
def test_format_registry(self):
92
my_format_registry = self.make_format_registry()
93
my_bzrdir = my_format_registry.make_bzrdir('lazy')
94
self.assertIsInstance(my_bzrdir, bzrdir.BzrDirFormat6)
95
my_bzrdir = my_format_registry.make_bzrdir('weave')
96
self.assertIsInstance(my_bzrdir, bzrdir.BzrDirFormat6)
97
my_bzrdir = my_format_registry.make_bzrdir('default')
98
self.assertIsInstance(my_bzrdir.repository_format,
99
knitrepo.RepositoryFormatKnit1)
100
my_bzrdir = my_format_registry.make_bzrdir('knit')
101
self.assertIsInstance(my_bzrdir.repository_format,
102
knitrepo.RepositoryFormatKnit1)
103
my_bzrdir = my_format_registry.make_bzrdir('branch6')
104
self.assertIsInstance(my_bzrdir.get_branch_format(),
105
bzrlib.branch.BzrBranchFormat6)
107
def test_get_help(self):
108
my_format_registry = self.make_format_registry()
109
self.assertEqual('Format registered lazily',
110
my_format_registry.get_help('lazy'))
111
self.assertEqual('Format using knits',
112
my_format_registry.get_help('knit'))
113
self.assertEqual('Format using knits',
114
my_format_registry.get_help('default'))
115
self.assertEqual('Pre-0.8 format. Slower and does not support'
116
' checkouts or shared repositories',
117
my_format_registry.get_help('weave'))
119
def test_help_topic(self):
120
topics = help_topics.HelpTopicRegistry()
121
topics.register('formats', self.make_format_registry().help_topic,
123
topic = topics.get_detail('formats')
124
new, deprecated = topic.split('Deprecated formats')
125
self.assertContainsRe(new, 'Bazaar directory formats')
126
self.assertContainsRe(new,
127
' knit/default:\n \(native\) Format using knits\n')
128
self.assertContainsRe(deprecated,
129
' lazy:\n \(native\) Format registered lazily\n')
131
def test_set_default_repository(self):
132
default_factory = bzrdir.format_registry.get('default')
133
old_default = [k for k, v in bzrdir.format_registry.iteritems()
134
if v == default_factory and k != 'default'][0]
135
bzrdir.format_registry.set_default_repository('experimental-knit2')
137
self.assertIs(bzrdir.format_registry.get('experimental-knit2'),
138
bzrdir.format_registry.get('default'))
140
repository.RepositoryFormat.get_default_format().__class__,
141
knitrepo.RepositoryFormatKnit2)
143
bzrdir.format_registry.set_default_repository(old_default)
145
class SampleBranch(bzrlib.branch.Branch):
146
"""A dummy branch for guess what, dummy use."""
148
def __init__(self, dir):
152
class SampleBzrDir(bzrdir.BzrDir):
153
"""A sample BzrDir implementation to allow testing static methods."""
155
def create_repository(self, shared=False):
156
"""See BzrDir.create_repository."""
157
return "A repository"
159
def open_repository(self):
160
"""See BzrDir.open_repository."""
161
return "A repository"
163
def create_branch(self):
164
"""See BzrDir.create_branch."""
165
return SampleBranch(self)
167
def create_workingtree(self):
168
"""See BzrDir.create_workingtree."""
172
class SampleBzrDirFormat(bzrdir.BzrDirFormat):
175
this format is initializable, unsupported to aid in testing the
176
open and open_downlevel routines.
179
def get_format_string(self):
180
"""See BzrDirFormat.get_format_string()."""
181
return "Sample .bzr dir format."
183
def initialize(self, url):
184
"""Create a bzr dir."""
185
t = get_transport(url)
187
t.put_bytes('.bzr/branch-format', self.get_format_string())
188
return SampleBzrDir(t, self)
190
def is_supported(self):
193
def open(self, transport, _found=None):
194
return "opened branch."
197
class TestBzrDirFormat(TestCaseWithTransport):
198
"""Tests for the BzrDirFormat facility."""
200
def test_find_format(self):
201
# is the right format object found for a branch?
202
# create a branch with a few known format objects.
203
# this is not quite the same as
204
t = get_transport(self.get_url())
205
self.build_tree(["foo/", "bar/"], transport=t)
206
def check_format(format, url):
207
format.initialize(url)
208
t = get_transport(url)
209
found_format = bzrdir.BzrDirFormat.find_format(t)
210
self.failUnless(isinstance(found_format, format.__class__))
211
check_format(bzrdir.BzrDirFormat5(), "foo")
212
check_format(bzrdir.BzrDirFormat6(), "bar")
214
def test_find_format_nothing_there(self):
215
self.assertRaises(NotBranchError,
216
bzrdir.BzrDirFormat.find_format,
219
def test_find_format_unknown_format(self):
220
t = get_transport(self.get_url())
222
t.put_bytes('.bzr/branch-format', '')
223
self.assertRaises(UnknownFormatError,
224
bzrdir.BzrDirFormat.find_format,
227
def test_register_unregister_format(self):
228
format = SampleBzrDirFormat()
231
format.initialize(url)
232
# register a format for it.
233
bzrdir.BzrDirFormat.register_format(format)
234
# which bzrdir.Open will refuse (not supported)
235
self.assertRaises(UnsupportedFormatError, bzrdir.BzrDir.open, url)
236
# which bzrdir.open_containing will refuse (not supported)
237
self.assertRaises(UnsupportedFormatError, bzrdir.BzrDir.open_containing, url)
238
# but open_downlevel will work
239
t = get_transport(url)
240
self.assertEqual(format.open(t), bzrdir.BzrDir.open_unsupported(url))
241
# unregister the format
242
bzrdir.BzrDirFormat.unregister_format(format)
243
# now open_downlevel should fail too.
244
self.assertRaises(UnknownFormatError, bzrdir.BzrDir.open_unsupported, url)
246
def test_create_repository(self):
247
format = SampleBzrDirFormat()
248
repo = bzrdir.BzrDir.create_repository(self.get_url(), format=format)
249
self.assertEqual('A repository', repo)
251
def test_create_repository_shared(self):
252
old_format = bzrdir.BzrDirFormat.get_default_format()
253
repo = bzrdir.BzrDir.create_repository('.', shared=True)
254
self.assertTrue(repo.is_shared())
256
def test_create_repository_nonshared(self):
257
old_format = bzrdir.BzrDirFormat.get_default_format()
258
repo = bzrdir.BzrDir.create_repository('.')
259
self.assertFalse(repo.is_shared())
261
def test_create_repository_under_shared(self):
262
# an explicit create_repository always does so.
263
# we trust the format is right from the 'create_repository test'
264
format = bzrdir.format_registry.make_bzrdir('knit')
265
self.make_repository('.', shared=True, format=format)
266
repo = bzrdir.BzrDir.create_repository(self.get_url('child'),
268
self.assertTrue(isinstance(repo, repository.Repository))
269
self.assertTrue(repo.bzrdir.root_transport.base.endswith('child/'))
271
def test_create_branch_and_repo_uses_default(self):
272
format = SampleBzrDirFormat()
273
branch = bzrdir.BzrDir.create_branch_and_repo(self.get_url(),
275
self.assertTrue(isinstance(branch, SampleBranch))
277
def test_create_branch_and_repo_under_shared(self):
278
# creating a branch and repo in a shared repo uses the
280
format = bzrdir.format_registry.make_bzrdir('knit')
281
self.make_repository('.', shared=True, format=format)
282
branch = bzrdir.BzrDir.create_branch_and_repo(
283
self.get_url('child'), format=format)
284
self.assertRaises(errors.NoRepositoryPresent,
285
branch.bzrdir.open_repository)
287
def test_create_branch_and_repo_under_shared_force_new(self):
288
# creating a branch and repo in a shared repo can be forced to
290
format = bzrdir.format_registry.make_bzrdir('knit')
291
self.make_repository('.', shared=True, format=format)
292
branch = bzrdir.BzrDir.create_branch_and_repo(self.get_url('child'),
295
branch.bzrdir.open_repository()
297
def test_create_standalone_working_tree(self):
298
format = SampleBzrDirFormat()
299
# note this is deliberately readonly, as this failure should
300
# occur before any writes.
301
self.assertRaises(errors.NotLocalUrl,
302
bzrdir.BzrDir.create_standalone_workingtree,
303
self.get_readonly_url(), format=format)
304
tree = bzrdir.BzrDir.create_standalone_workingtree('.',
306
self.assertEqual('A tree', tree)
308
def test_create_standalone_working_tree_under_shared_repo(self):
309
# create standalone working tree always makes a repo.
310
format = bzrdir.format_registry.make_bzrdir('knit')
311
self.make_repository('.', shared=True, format=format)
312
# note this is deliberately readonly, as this failure should
313
# occur before any writes.
314
self.assertRaises(errors.NotLocalUrl,
315
bzrdir.BzrDir.create_standalone_workingtree,
316
self.get_readonly_url('child'), format=format)
317
tree = bzrdir.BzrDir.create_standalone_workingtree('child',
319
tree.bzrdir.open_repository()
321
def test_create_branch_convenience(self):
322
# outside a repo the default convenience output is a repo+branch_tree
323
format = bzrdir.format_registry.make_bzrdir('knit')
324
branch = bzrdir.BzrDir.create_branch_convenience('.', format=format)
325
branch.bzrdir.open_workingtree()
326
branch.bzrdir.open_repository()
328
def test_create_branch_convenience_root(self):
329
"""Creating a branch at the root of a fs should work."""
330
self.transport_server = MemoryServer
331
# outside a repo the default convenience output is a repo+branch_tree
332
format = bzrdir.format_registry.make_bzrdir('knit')
333
branch = bzrdir.BzrDir.create_branch_convenience(self.get_url(),
335
self.assertRaises(errors.NoWorkingTree,
336
branch.bzrdir.open_workingtree)
337
branch.bzrdir.open_repository()
339
def test_create_branch_convenience_under_shared_repo(self):
340
# inside a repo the default convenience output is a branch+ follow the
342
format = bzrdir.format_registry.make_bzrdir('knit')
343
self.make_repository('.', shared=True, format=format)
344
branch = bzrdir.BzrDir.create_branch_convenience('child',
346
branch.bzrdir.open_workingtree()
347
self.assertRaises(errors.NoRepositoryPresent,
348
branch.bzrdir.open_repository)
350
def test_create_branch_convenience_under_shared_repo_force_no_tree(self):
351
# inside a repo the default convenience output is a branch+ follow the
352
# repo tree policy but we can override that
353
format = bzrdir.format_registry.make_bzrdir('knit')
354
self.make_repository('.', shared=True, format=format)
355
branch = bzrdir.BzrDir.create_branch_convenience('child',
356
force_new_tree=False, format=format)
357
self.assertRaises(errors.NoWorkingTree,
358
branch.bzrdir.open_workingtree)
359
self.assertRaises(errors.NoRepositoryPresent,
360
branch.bzrdir.open_repository)
362
def test_create_branch_convenience_under_shared_repo_no_tree_policy(self):
363
# inside a repo the default convenience output is a branch+ follow the
365
format = bzrdir.format_registry.make_bzrdir('knit')
366
repo = self.make_repository('.', shared=True, format=format)
367
repo.set_make_working_trees(False)
368
branch = bzrdir.BzrDir.create_branch_convenience('child',
370
self.assertRaises(errors.NoWorkingTree,
371
branch.bzrdir.open_workingtree)
372
self.assertRaises(errors.NoRepositoryPresent,
373
branch.bzrdir.open_repository)
375
def test_create_branch_convenience_under_shared_repo_no_tree_policy_force_tree(self):
376
# inside a repo the default convenience output is a branch+ follow the
377
# repo tree policy but we can override that
378
format = bzrdir.format_registry.make_bzrdir('knit')
379
repo = self.make_repository('.', shared=True, format=format)
380
repo.set_make_working_trees(False)
381
branch = bzrdir.BzrDir.create_branch_convenience('child',
382
force_new_tree=True, format=format)
383
branch.bzrdir.open_workingtree()
384
self.assertRaises(errors.NoRepositoryPresent,
385
branch.bzrdir.open_repository)
387
def test_create_branch_convenience_under_shared_repo_force_new_repo(self):
388
# inside a repo the default convenience output is overridable to give
390
format = bzrdir.format_registry.make_bzrdir('knit')
391
self.make_repository('.', shared=True, format=format)
392
branch = bzrdir.BzrDir.create_branch_convenience('child',
393
force_new_repo=True, format=format)
394
branch.bzrdir.open_repository()
395
branch.bzrdir.open_workingtree()
398
class ChrootedTests(TestCaseWithTransport):
399
"""A support class that provides readonly urls outside the local namespace.
401
This is done by checking if self.transport_server is a MemoryServer. if it
402
is then we are chrooted already, if it is not then an HttpServer is used
407
super(ChrootedTests, self).setUp()
408
if not self.transport_server == MemoryServer:
409
self.transport_readonly_server = HttpServer
411
def test_open_containing(self):
412
self.assertRaises(NotBranchError, bzrdir.BzrDir.open_containing,
413
self.get_readonly_url(''))
414
self.assertRaises(NotBranchError, bzrdir.BzrDir.open_containing,
415
self.get_readonly_url('g/p/q'))
416
control = bzrdir.BzrDir.create(self.get_url())
417
branch, relpath = bzrdir.BzrDir.open_containing(self.get_readonly_url(''))
418
self.assertEqual('', relpath)
419
branch, relpath = bzrdir.BzrDir.open_containing(self.get_readonly_url('g/p/q'))
420
self.assertEqual('g/p/q', relpath)
422
def test_open_containing_from_transport(self):
423
self.assertRaises(NotBranchError, bzrdir.BzrDir.open_containing_from_transport,
424
get_transport(self.get_readonly_url('')))
425
self.assertRaises(NotBranchError, bzrdir.BzrDir.open_containing_from_transport,
426
get_transport(self.get_readonly_url('g/p/q')))
427
control = bzrdir.BzrDir.create(self.get_url())
428
branch, relpath = bzrdir.BzrDir.open_containing_from_transport(
429
get_transport(self.get_readonly_url('')))
430
self.assertEqual('', relpath)
431
branch, relpath = bzrdir.BzrDir.open_containing_from_transport(
432
get_transport(self.get_readonly_url('g/p/q')))
433
self.assertEqual('g/p/q', relpath)
435
def test_open_containing_tree_or_branch(self):
436
def local_branch_path(branch):
437
return os.path.realpath(
438
urlutils.local_path_from_url(branch.base))
440
self.make_branch_and_tree('topdir')
441
tree, branch, relpath = bzrdir.BzrDir.open_containing_tree_or_branch(
443
self.assertEqual(os.path.realpath('topdir'),
444
os.path.realpath(tree.basedir))
445
self.assertEqual(os.path.realpath('topdir'),
446
local_branch_path(branch))
447
self.assertIs(tree.bzrdir, branch.bzrdir)
448
self.assertEqual('foo', relpath)
449
self.make_branch('topdir/foo')
450
tree, branch, relpath = bzrdir.BzrDir.open_containing_tree_or_branch(
452
self.assertIs(tree, None)
453
self.assertEqual(os.path.realpath('topdir/foo'),
454
local_branch_path(branch))
455
self.assertEqual('', 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,
479
def test_sprout_recursive(self):
480
tree = self.make_branch_and_tree('tree1', format='experimental-reference-dirstate')
481
sub_tree = self.make_branch_and_tree('tree1/subtree',
482
format='experimental-reference-dirstate')
483
tree.add_reference(sub_tree)
484
self.build_tree(['tree1/subtree/file'])
486
tree.commit('Initial commit')
487
tree.bzrdir.sprout('tree2')
488
self.failUnlessExists('tree2/subtree/file')
490
def test_cloning_metadir(self):
491
"""Ensure that cloning metadir is suitable"""
492
bzrdir = self.make_bzrdir('bzrdir')
493
bzrdir.cloning_metadir()
494
branch = self.make_branch('branch', format='knit')
495
format = branch.bzrdir.cloning_metadir()
496
self.assertIsInstance(format.workingtree_format,
497
workingtree.WorkingTreeFormat3)
499
def test_sprout_recursive_treeless(self):
500
tree = self.make_branch_and_tree('tree1', format='experimental-reference-dirstate')
501
sub_tree = self.make_branch_and_tree('tree1/subtree',
502
format='experimental-reference-dirstate')
503
tree.add_reference(sub_tree)
504
self.build_tree(['tree1/subtree/file'])
506
tree.commit('Initial commit')
507
tree.bzrdir.destroy_workingtree()
508
repo = self.make_repository('repo', shared=True,
509
format='experimental-reference-dirstate')
510
repo.set_make_working_trees(False)
511
tree.bzrdir.sprout('repo/tree2')
512
self.failUnlessExists('repo/tree2/subtree')
513
self.failIfExists('repo/tree2/subtree/file')
516
class TestMeta1DirFormat(TestCaseWithTransport):
517
"""Tests specific to the meta1 dir format."""
519
def test_right_base_dirs(self):
520
dir = bzrdir.BzrDirMetaFormat1().initialize(self.get_url())
522
branch_base = t.clone('branch').base
523
self.assertEqual(branch_base, dir.get_branch_transport(None).base)
524
self.assertEqual(branch_base,
525
dir.get_branch_transport(bzrlib.branch.BzrBranchFormat5()).base)
526
repository_base = t.clone('repository').base
527
self.assertEqual(repository_base, dir.get_repository_transport(None).base)
528
self.assertEqual(repository_base,
529
dir.get_repository_transport(weaverepo.RepositoryFormat7()).base)
530
checkout_base = t.clone('checkout').base
531
self.assertEqual(checkout_base, dir.get_workingtree_transport(None).base)
532
self.assertEqual(checkout_base,
533
dir.get_workingtree_transport(workingtree.WorkingTreeFormat3()).base)
535
def test_meta1dir_uses_lockdir(self):
536
"""Meta1 format uses a LockDir to guard the whole directory, not a file."""
537
dir = bzrdir.BzrDirMetaFormat1().initialize(self.get_url())
539
self.assertIsDirectory('branch-lock', t)
541
def test_comparison(self):
542
"""Equality and inequality behave properly.
544
Metadirs should compare equal iff they have the same repo, branch and
547
mydir = bzrdir.format_registry.make_bzrdir('knit')
548
self.assertEqual(mydir, mydir)
549
self.assertFalse(mydir != mydir)
550
otherdir = bzrdir.format_registry.make_bzrdir('knit')
551
self.assertEqual(otherdir, mydir)
552
self.assertFalse(otherdir != mydir)
553
otherdir2 = bzrdir.format_registry.make_bzrdir('experimental-knit2')
554
self.assertNotEqual(otherdir2, mydir)
555
self.assertFalse(otherdir2 == mydir)
558
class TestFormat5(TestCaseWithTransport):
559
"""Tests specific to the version 5 bzrdir format."""
561
def test_same_lockfiles_between_tree_repo_branch(self):
562
# this checks that only a single lockfiles instance is created
563
# for format 5 objects
564
dir = bzrdir.BzrDirFormat5().initialize(self.get_url())
565
def check_dir_components_use_same_lock(dir):
566
ctrl_1 = dir.open_repository().control_files
567
ctrl_2 = dir.open_branch().control_files
568
ctrl_3 = dir.open_workingtree()._control_files
569
self.assertTrue(ctrl_1 is ctrl_2)
570
self.assertTrue(ctrl_2 is ctrl_3)
571
check_dir_components_use_same_lock(dir)
572
# and if we open it normally.
573
dir = bzrdir.BzrDir.open(self.get_url())
574
check_dir_components_use_same_lock(dir)
576
def test_can_convert(self):
577
# format 5 dirs are convertable
578
dir = bzrdir.BzrDirFormat5().initialize(self.get_url())
579
self.assertTrue(dir.can_convert_format())
581
def test_needs_conversion(self):
582
# format 5 dirs need a conversion if they are not the default.
583
# and they start of not the default.
584
old_format = bzrdir.BzrDirFormat.get_default_format()
585
bzrdir.BzrDirFormat._set_default_format(bzrdir.BzrDirFormat5())
587
dir = bzrdir.BzrDirFormat5().initialize(self.get_url())
588
self.assertFalse(dir.needs_format_conversion())
590
bzrdir.BzrDirFormat._set_default_format(old_format)
591
self.assertTrue(dir.needs_format_conversion())
594
class TestFormat6(TestCaseWithTransport):
595
"""Tests specific to the version 6 bzrdir format."""
597
def test_same_lockfiles_between_tree_repo_branch(self):
598
# this checks that only a single lockfiles instance is created
599
# for format 6 objects
600
dir = bzrdir.BzrDirFormat6().initialize(self.get_url())
601
def check_dir_components_use_same_lock(dir):
602
ctrl_1 = dir.open_repository().control_files
603
ctrl_2 = dir.open_branch().control_files
604
ctrl_3 = dir.open_workingtree()._control_files
605
self.assertTrue(ctrl_1 is ctrl_2)
606
self.assertTrue(ctrl_2 is ctrl_3)
607
check_dir_components_use_same_lock(dir)
608
# and if we open it normally.
609
dir = bzrdir.BzrDir.open(self.get_url())
610
check_dir_components_use_same_lock(dir)
612
def test_can_convert(self):
613
# format 6 dirs are convertable
614
dir = bzrdir.BzrDirFormat6().initialize(self.get_url())
615
self.assertTrue(dir.can_convert_format())
617
def test_needs_conversion(self):
618
# format 6 dirs need an conversion if they are not the default.
619
old_format = bzrdir.BzrDirFormat.get_default_format()
620
bzrdir.BzrDirFormat._set_default_format(bzrdir.BzrDirMetaFormat1())
622
dir = bzrdir.BzrDirFormat6().initialize(self.get_url())
623
self.assertTrue(dir.needs_format_conversion())
625
bzrdir.BzrDirFormat._set_default_format(old_format)
628
class NotBzrDir(bzrlib.bzrdir.BzrDir):
629
"""A non .bzr based control directory."""
631
def __init__(self, transport, format):
632
self._format = format
633
self.root_transport = transport
634
self.transport = transport.clone('.not')
637
class NotBzrDirFormat(bzrlib.bzrdir.BzrDirFormat):
638
"""A test class representing any non-.bzr based disk format."""
640
def initialize_on_transport(self, transport):
641
"""Initialize a new .not dir in the base directory of a Transport."""
642
transport.mkdir('.not')
643
return self.open(transport)
645
def open(self, transport):
646
"""Open this directory."""
647
return NotBzrDir(transport, self)
650
def _known_formats(self):
651
return set([NotBzrDirFormat()])
654
def probe_transport(self, transport):
655
"""Our format is present if the transport ends in '.not/'."""
656
if transport.has('.not'):
657
return NotBzrDirFormat()
660
class TestNotBzrDir(TestCaseWithTransport):
661
"""Tests for using the bzrdir api with a non .bzr based disk format.
663
If/when one of these is in the core, we can let the implementation tests
667
def test_create_and_find_format(self):
668
# create a .notbzr dir
669
format = NotBzrDirFormat()
670
dir = format.initialize(self.get_url())
671
self.assertIsInstance(dir, NotBzrDir)
673
bzrlib.bzrdir.BzrDirFormat.register_control_format(format)
675
found = bzrlib.bzrdir.BzrDirFormat.find_format(
676
get_transport(self.get_url()))
677
self.assertIsInstance(found, NotBzrDirFormat)
679
bzrlib.bzrdir.BzrDirFormat.unregister_control_format(format)
681
def test_included_in_known_formats(self):
682
bzrlib.bzrdir.BzrDirFormat.register_control_format(NotBzrDirFormat)
684
formats = bzrlib.bzrdir.BzrDirFormat.known_formats()
685
for format in formats:
686
if isinstance(format, NotBzrDirFormat):
688
self.fail("No NotBzrDirFormat in %s" % formats)
690
bzrlib.bzrdir.BzrDirFormat.unregister_control_format(NotBzrDirFormat)
693
class NonLocalTests(TestCaseWithTransport):
694
"""Tests for bzrdir static behaviour on non local paths."""
697
super(NonLocalTests, self).setUp()
698
self.transport_server = MemoryServer
700
def test_create_branch_convenience(self):
701
# outside a repo the default convenience output is a repo+branch_tree
702
format = bzrdir.format_registry.make_bzrdir('knit')
703
branch = bzrdir.BzrDir.create_branch_convenience(
704
self.get_url('foo'), format=format)
705
self.assertRaises(errors.NoWorkingTree,
706
branch.bzrdir.open_workingtree)
707
branch.bzrdir.open_repository()
709
def test_create_branch_convenience_force_tree_not_local_fails(self):
710
# outside a repo the default convenience output is a repo+branch_tree
711
format = bzrdir.format_registry.make_bzrdir('knit')
712
self.assertRaises(errors.NotLocalUrl,
713
bzrdir.BzrDir.create_branch_convenience,
717
t = get_transport(self.get_url('.'))
718
self.assertFalse(t.has('foo'))
720
def test_clone(self):
721
# clone into a nonlocal path works
722
format = bzrdir.format_registry.make_bzrdir('knit')
723
branch = bzrdir.BzrDir.create_branch_convenience('local',
725
branch.bzrdir.open_workingtree()
726
result = branch.bzrdir.clone(self.get_url('remote'))
727
self.assertRaises(errors.NoWorkingTree,
728
result.open_workingtree)
730
result.open_repository()
732
def test_checkout_metadir(self):
733
# checkout_metadir has reasonable working tree format even when no
734
# working tree is present
735
self.make_branch('branch-knit2', format='experimental-knit2')
736
my_bzrdir = bzrdir.BzrDir.open(self.get_url('branch-knit2'))
737
checkout_format = my_bzrdir.checkout_metadir()
738
self.assertIsInstance(checkout_format.workingtree_format,
739
workingtree.WorkingTreeFormat3)
742
class TestRemoteSFTP(test_sftp_transport.TestCaseWithSFTPServer):
744
def test_open_containing_tree_or_branch(self):
745
tree = self.make_branch_and_tree('tree')
746
bzrdir.BzrDir.open_containing_tree_or_branch(self.get_url('tree'))