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.RepositoryFormatKnit3',
82
'Experimental successor to knit. Use at your own risk.',
83
branch_format='bzrlib.branch.BzrBranchFormat6')
84
return my_format_registry
86
def test_format_registry(self):
87
my_format_registry = self.make_format_registry()
88
my_bzrdir = my_format_registry.make_bzrdir('lazy')
89
self.assertIsInstance(my_bzrdir, bzrdir.BzrDirFormat6)
90
my_bzrdir = my_format_registry.make_bzrdir('weave')
91
self.assertIsInstance(my_bzrdir, bzrdir.BzrDirFormat6)
92
my_bzrdir = my_format_registry.make_bzrdir('default')
93
self.assertIsInstance(my_bzrdir.repository_format,
94
knitrepo.RepositoryFormatKnit1)
95
my_bzrdir = my_format_registry.make_bzrdir('knit')
96
self.assertIsInstance(my_bzrdir.repository_format,
97
knitrepo.RepositoryFormatKnit1)
98
my_bzrdir = my_format_registry.make_bzrdir('branch6')
99
self.assertIsInstance(my_bzrdir.get_branch_format(),
100
bzrlib.branch.BzrBranchFormat6)
102
def test_get_help(self):
103
my_format_registry = self.make_format_registry()
104
self.assertEqual('Format registered lazily',
105
my_format_registry.get_help('lazy'))
106
self.assertEqual('Format using knits',
107
my_format_registry.get_help('knit'))
108
self.assertEqual('Format using knits',
109
my_format_registry.get_help('default'))
110
self.assertEqual('Pre-0.8 format. Slower and does not support'
111
' checkouts or shared repositories',
112
my_format_registry.get_help('weave'))
114
def test_help_topic(self):
115
topics = help_topics.HelpTopicRegistry()
116
topics.register('formats', self.make_format_registry().help_topic,
118
topic = topics.get_detail('formats')
119
new, deprecated = topic.split('Deprecated formats')
120
self.assertContainsRe(new, 'Bazaar directory formats')
121
self.assertContainsRe(new,
122
' knit/default:\n \(native\) Format using knits\n')
123
self.assertContainsRe(deprecated,
124
' lazy:\n \(native\) Format registered lazily\n')
126
def test_set_default_repository(self):
127
default_factory = bzrdir.format_registry.get('default')
128
old_default = [k for k, v in bzrdir.format_registry.iteritems()
129
if v == default_factory and k != 'default'][0]
130
bzrdir.format_registry.set_default_repository('dirstate-with-subtree')
132
self.assertIs(bzrdir.format_registry.get('dirstate-with-subtree'),
133
bzrdir.format_registry.get('default'))
135
repository.RepositoryFormat.get_default_format().__class__,
136
knitrepo.RepositoryFormatKnit3)
138
bzrdir.format_registry.set_default_repository(old_default)
141
class SampleBranch(bzrlib.branch.Branch):
142
"""A dummy branch for guess what, dummy use."""
144
def __init__(self, dir):
148
class SampleBzrDir(bzrdir.BzrDir):
149
"""A sample BzrDir implementation to allow testing static methods."""
151
def create_repository(self, shared=False):
152
"""See BzrDir.create_repository."""
153
return "A repository"
155
def open_repository(self):
156
"""See BzrDir.open_repository."""
157
return "A repository"
159
def create_branch(self):
160
"""See BzrDir.create_branch."""
161
return SampleBranch(self)
163
def create_workingtree(self):
164
"""See BzrDir.create_workingtree."""
168
class SampleBzrDirFormat(bzrdir.BzrDirFormat):
171
this format is initializable, unsupported to aid in testing the
172
open and open_downlevel routines.
175
def get_format_string(self):
176
"""See BzrDirFormat.get_format_string()."""
177
return "Sample .bzr dir format."
179
def initialize(self, url):
180
"""Create a bzr dir."""
181
t = get_transport(url)
183
t.put_bytes('.bzr/branch-format', self.get_format_string())
184
return SampleBzrDir(t, self)
186
def is_supported(self):
189
def open(self, transport, _found=None):
190
return "opened branch."
193
class TestBzrDirFormat(TestCaseWithTransport):
194
"""Tests for the BzrDirFormat facility."""
196
def test_find_format(self):
197
# is the right format object found for a branch?
198
# create a branch with a few known format objects.
199
# this is not quite the same as
200
t = get_transport(self.get_url())
201
self.build_tree(["foo/", "bar/"], transport=t)
202
def check_format(format, url):
203
format.initialize(url)
204
t = get_transport(url)
205
found_format = bzrdir.BzrDirFormat.find_format(t)
206
self.failUnless(isinstance(found_format, format.__class__))
207
check_format(bzrdir.BzrDirFormat5(), "foo")
208
check_format(bzrdir.BzrDirFormat6(), "bar")
210
def test_find_format_nothing_there(self):
211
self.assertRaises(NotBranchError,
212
bzrdir.BzrDirFormat.find_format,
215
def test_find_format_unknown_format(self):
216
t = get_transport(self.get_url())
218
t.put_bytes('.bzr/branch-format', '')
219
self.assertRaises(UnknownFormatError,
220
bzrdir.BzrDirFormat.find_format,
223
def test_register_unregister_format(self):
224
format = SampleBzrDirFormat()
227
format.initialize(url)
228
# register a format for it.
229
bzrdir.BzrDirFormat.register_format(format)
230
# which bzrdir.Open will refuse (not supported)
231
self.assertRaises(UnsupportedFormatError, bzrdir.BzrDir.open, url)
232
# which bzrdir.open_containing will refuse (not supported)
233
self.assertRaises(UnsupportedFormatError, bzrdir.BzrDir.open_containing, url)
234
# but open_downlevel will work
235
t = get_transport(url)
236
self.assertEqual(format.open(t), bzrdir.BzrDir.open_unsupported(url))
237
# unregister the format
238
bzrdir.BzrDirFormat.unregister_format(format)
239
# now open_downlevel should fail too.
240
self.assertRaises(UnknownFormatError, bzrdir.BzrDir.open_unsupported, url)
242
def test_create_repository(self):
243
format = SampleBzrDirFormat()
244
repo = bzrdir.BzrDir.create_repository(self.get_url(), format=format)
245
self.assertEqual('A repository', repo)
247
def test_create_repository_shared(self):
248
old_format = bzrdir.BzrDirFormat.get_default_format()
249
repo = bzrdir.BzrDir.create_repository('.', shared=True)
250
self.assertTrue(repo.is_shared())
252
def test_create_repository_nonshared(self):
253
old_format = bzrdir.BzrDirFormat.get_default_format()
254
repo = bzrdir.BzrDir.create_repository('.')
255
self.assertFalse(repo.is_shared())
257
def test_create_repository_under_shared(self):
258
# an explicit create_repository always does so.
259
# we trust the format is right from the 'create_repository test'
260
format = bzrdir.format_registry.make_bzrdir('knit')
261
self.make_repository('.', shared=True, format=format)
262
repo = bzrdir.BzrDir.create_repository(self.get_url('child'),
264
self.assertTrue(isinstance(repo, repository.Repository))
265
self.assertTrue(repo.bzrdir.root_transport.base.endswith('child/'))
267
def test_create_branch_and_repo_uses_default(self):
268
format = SampleBzrDirFormat()
269
branch = bzrdir.BzrDir.create_branch_and_repo(self.get_url(),
271
self.assertTrue(isinstance(branch, SampleBranch))
273
def test_create_branch_and_repo_under_shared(self):
274
# creating a branch and repo in a shared repo uses the
276
format = bzrdir.format_registry.make_bzrdir('knit')
277
self.make_repository('.', shared=True, format=format)
278
branch = bzrdir.BzrDir.create_branch_and_repo(
279
self.get_url('child'), format=format)
280
self.assertRaises(errors.NoRepositoryPresent,
281
branch.bzrdir.open_repository)
283
def test_create_branch_and_repo_under_shared_force_new(self):
284
# creating a branch and repo in a shared repo can be forced to
286
format = bzrdir.format_registry.make_bzrdir('knit')
287
self.make_repository('.', shared=True, format=format)
288
branch = bzrdir.BzrDir.create_branch_and_repo(self.get_url('child'),
291
branch.bzrdir.open_repository()
293
def test_create_standalone_working_tree(self):
294
format = SampleBzrDirFormat()
295
# note this is deliberately readonly, as this failure should
296
# occur before any writes.
297
self.assertRaises(errors.NotLocalUrl,
298
bzrdir.BzrDir.create_standalone_workingtree,
299
self.get_readonly_url(), format=format)
300
tree = bzrdir.BzrDir.create_standalone_workingtree('.',
302
self.assertEqual('A tree', tree)
304
def test_create_standalone_working_tree_under_shared_repo(self):
305
# create standalone working tree always makes a repo.
306
format = bzrdir.format_registry.make_bzrdir('knit')
307
self.make_repository('.', shared=True, format=format)
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'), format=format)
313
tree = bzrdir.BzrDir.create_standalone_workingtree('child',
315
tree.bzrdir.open_repository()
317
def test_create_branch_convenience(self):
318
# outside a repo the default convenience output is a repo+branch_tree
319
format = bzrdir.format_registry.make_bzrdir('knit')
320
branch = bzrdir.BzrDir.create_branch_convenience('.', format=format)
321
branch.bzrdir.open_workingtree()
322
branch.bzrdir.open_repository()
324
def test_create_branch_convenience_root(self):
325
"""Creating a branch at the root of a fs should work."""
326
self.transport_server = MemoryServer
327
# outside a repo the default convenience output is a repo+branch_tree
328
format = bzrdir.format_registry.make_bzrdir('knit')
329
branch = bzrdir.BzrDir.create_branch_convenience(self.get_url(),
331
self.assertRaises(errors.NoWorkingTree,
332
branch.bzrdir.open_workingtree)
333
branch.bzrdir.open_repository()
335
def test_create_branch_convenience_under_shared_repo(self):
336
# inside a repo the default convenience output is a branch+ follow the
338
format = bzrdir.format_registry.make_bzrdir('knit')
339
self.make_repository('.', shared=True, format=format)
340
branch = bzrdir.BzrDir.create_branch_convenience('child',
342
branch.bzrdir.open_workingtree()
343
self.assertRaises(errors.NoRepositoryPresent,
344
branch.bzrdir.open_repository)
346
def test_create_branch_convenience_under_shared_repo_force_no_tree(self):
347
# inside a repo the default convenience output is a branch+ follow the
348
# repo tree policy but we can override that
349
format = bzrdir.format_registry.make_bzrdir('knit')
350
self.make_repository('.', shared=True, format=format)
351
branch = bzrdir.BzrDir.create_branch_convenience('child',
352
force_new_tree=False, format=format)
353
self.assertRaises(errors.NoWorkingTree,
354
branch.bzrdir.open_workingtree)
355
self.assertRaises(errors.NoRepositoryPresent,
356
branch.bzrdir.open_repository)
358
def test_create_branch_convenience_under_shared_repo_no_tree_policy(self):
359
# inside a repo the default convenience output is a branch+ follow the
361
format = bzrdir.format_registry.make_bzrdir('knit')
362
repo = self.make_repository('.', shared=True, format=format)
363
repo.set_make_working_trees(False)
364
branch = bzrdir.BzrDir.create_branch_convenience('child',
366
self.assertRaises(errors.NoWorkingTree,
367
branch.bzrdir.open_workingtree)
368
self.assertRaises(errors.NoRepositoryPresent,
369
branch.bzrdir.open_repository)
371
def test_create_branch_convenience_under_shared_repo_no_tree_policy_force_tree(self):
372
# inside a repo the default convenience output is a branch+ follow the
373
# repo tree policy but we can override that
374
format = bzrdir.format_registry.make_bzrdir('knit')
375
repo = self.make_repository('.', shared=True, format=format)
376
repo.set_make_working_trees(False)
377
branch = bzrdir.BzrDir.create_branch_convenience('child',
378
force_new_tree=True, format=format)
379
branch.bzrdir.open_workingtree()
380
self.assertRaises(errors.NoRepositoryPresent,
381
branch.bzrdir.open_repository)
383
def test_create_branch_convenience_under_shared_repo_force_new_repo(self):
384
# inside a repo the default convenience output is overridable to give
386
format = bzrdir.format_registry.make_bzrdir('knit')
387
self.make_repository('.', shared=True, format=format)
388
branch = bzrdir.BzrDir.create_branch_convenience('child',
389
force_new_repo=True, format=format)
390
branch.bzrdir.open_repository()
391
branch.bzrdir.open_workingtree()
394
class ChrootedTests(TestCaseWithTransport):
395
"""A support class that provides readonly urls outside the local namespace.
397
This is done by checking if self.transport_server is a MemoryServer. if it
398
is then we are chrooted already, if it is not then an HttpServer is used
403
super(ChrootedTests, self).setUp()
404
if not self.transport_server == MemoryServer:
405
self.transport_readonly_server = HttpServer
407
def test_open_containing(self):
408
self.assertRaises(NotBranchError, bzrdir.BzrDir.open_containing,
409
self.get_readonly_url(''))
410
self.assertRaises(NotBranchError, bzrdir.BzrDir.open_containing,
411
self.get_readonly_url('g/p/q'))
412
control = bzrdir.BzrDir.create(self.get_url())
413
branch, relpath = bzrdir.BzrDir.open_containing(self.get_readonly_url(''))
414
self.assertEqual('', relpath)
415
branch, relpath = bzrdir.BzrDir.open_containing(self.get_readonly_url('g/p/q'))
416
self.assertEqual('g/p/q', relpath)
418
def test_open_containing_from_transport(self):
419
self.assertRaises(NotBranchError, bzrdir.BzrDir.open_containing_from_transport,
420
get_transport(self.get_readonly_url('')))
421
self.assertRaises(NotBranchError, bzrdir.BzrDir.open_containing_from_transport,
422
get_transport(self.get_readonly_url('g/p/q')))
423
control = bzrdir.BzrDir.create(self.get_url())
424
branch, relpath = bzrdir.BzrDir.open_containing_from_transport(
425
get_transport(self.get_readonly_url('')))
426
self.assertEqual('', relpath)
427
branch, relpath = bzrdir.BzrDir.open_containing_from_transport(
428
get_transport(self.get_readonly_url('g/p/q')))
429
self.assertEqual('g/p/q', relpath)
431
def test_open_containing_tree_or_branch(self):
432
def local_branch_path(branch):
433
return os.path.realpath(
434
urlutils.local_path_from_url(branch.base))
436
self.make_branch_and_tree('topdir')
437
tree, branch, relpath = bzrdir.BzrDir.open_containing_tree_or_branch(
439
self.assertEqual(os.path.realpath('topdir'),
440
os.path.realpath(tree.basedir))
441
self.assertEqual(os.path.realpath('topdir'),
442
local_branch_path(branch))
443
self.assertIs(tree.bzrdir, branch.bzrdir)
444
self.assertEqual('foo', relpath)
445
self.make_branch('topdir/foo')
446
tree, branch, relpath = bzrdir.BzrDir.open_containing_tree_or_branch(
448
self.assertIs(tree, None)
449
self.assertEqual(os.path.realpath('topdir/foo'),
450
local_branch_path(branch))
451
self.assertEqual('', relpath)
453
def test_open_from_transport(self):
454
# transport pointing at bzrdir should give a bzrdir with root transport
455
# set to the given transport
456
control = bzrdir.BzrDir.create(self.get_url())
457
transport = get_transport(self.get_url())
458
opened_bzrdir = bzrdir.BzrDir.open_from_transport(transport)
459
self.assertEqual(transport.base, opened_bzrdir.root_transport.base)
460
self.assertIsInstance(opened_bzrdir, bzrdir.BzrDir)
462
def test_open_from_transport_no_bzrdir(self):
463
transport = get_transport(self.get_url())
464
self.assertRaises(NotBranchError, bzrdir.BzrDir.open_from_transport,
467
def test_open_from_transport_bzrdir_in_parent(self):
468
control = bzrdir.BzrDir.create(self.get_url())
469
transport = get_transport(self.get_url())
470
transport.mkdir('subdir')
471
transport = transport.clone('subdir')
472
self.assertRaises(NotBranchError, bzrdir.BzrDir.open_from_transport,
475
def test_sprout_recursive(self):
476
tree = self.make_branch_and_tree('tree1', format='dirstate-with-subtree')
477
sub_tree = self.make_branch_and_tree('tree1/subtree',
478
format='dirstate-with-subtree')
479
tree.add_reference(sub_tree)
480
self.build_tree(['tree1/subtree/file'])
482
tree.commit('Initial commit')
483
tree.bzrdir.sprout('tree2')
484
self.failUnlessExists('tree2/subtree/file')
486
def test_cloning_metadir(self):
487
"""Ensure that cloning metadir is suitable"""
488
bzrdir = self.make_bzrdir('bzrdir')
489
bzrdir.cloning_metadir()
490
branch = self.make_branch('branch', format='knit')
491
format = branch.bzrdir.cloning_metadir()
492
self.assertIsInstance(format.workingtree_format,
493
workingtree.WorkingTreeFormat3)
495
def test_sprout_recursive_treeless(self):
496
tree = self.make_branch_and_tree('tree1',
497
format='dirstate-with-subtree')
498
sub_tree = self.make_branch_and_tree('tree1/subtree',
499
format='dirstate-with-subtree')
500
tree.add_reference(sub_tree)
501
self.build_tree(['tree1/subtree/file'])
503
tree.commit('Initial commit')
504
tree.bzrdir.destroy_workingtree()
505
repo = self.make_repository('repo', shared=True,
506
format='dirstate-with-subtree')
507
repo.set_make_working_trees(False)
508
tree.bzrdir.sprout('repo/tree2')
509
self.failUnlessExists('repo/tree2/subtree')
510
self.failIfExists('repo/tree2/subtree/file')
513
class TestMeta1DirFormat(TestCaseWithTransport):
514
"""Tests specific to the meta1 dir format."""
516
def test_right_base_dirs(self):
517
dir = bzrdir.BzrDirMetaFormat1().initialize(self.get_url())
519
branch_base = t.clone('branch').base
520
self.assertEqual(branch_base, dir.get_branch_transport(None).base)
521
self.assertEqual(branch_base,
522
dir.get_branch_transport(bzrlib.branch.BzrBranchFormat5()).base)
523
repository_base = t.clone('repository').base
524
self.assertEqual(repository_base, dir.get_repository_transport(None).base)
525
self.assertEqual(repository_base,
526
dir.get_repository_transport(weaverepo.RepositoryFormat7()).base)
527
checkout_base = t.clone('checkout').base
528
self.assertEqual(checkout_base, dir.get_workingtree_transport(None).base)
529
self.assertEqual(checkout_base,
530
dir.get_workingtree_transport(workingtree.WorkingTreeFormat3()).base)
532
def test_meta1dir_uses_lockdir(self):
533
"""Meta1 format uses a LockDir to guard the whole directory, not a file."""
534
dir = bzrdir.BzrDirMetaFormat1().initialize(self.get_url())
536
self.assertIsDirectory('branch-lock', t)
538
def test_comparison(self):
539
"""Equality and inequality behave properly.
541
Metadirs should compare equal iff they have the same repo, branch and
544
mydir = bzrdir.format_registry.make_bzrdir('knit')
545
self.assertEqual(mydir, mydir)
546
self.assertFalse(mydir != mydir)
547
otherdir = bzrdir.format_registry.make_bzrdir('knit')
548
self.assertEqual(otherdir, mydir)
549
self.assertFalse(otherdir != mydir)
550
otherdir2 = bzrdir.format_registry.make_bzrdir('dirstate-with-subtree')
551
self.assertNotEqual(otherdir2, mydir)
552
self.assertFalse(otherdir2 == mydir)
554
def test_needs_conversion_different_working_tree(self):
555
# meta1dirs need an conversion if any element is not the default.
556
old_format = bzrdir.BzrDirFormat.get_default_format()
558
new_default = bzrdir.format_registry.make_bzrdir('dirstate')
559
bzrdir.BzrDirFormat._set_default_format(new_default)
561
tree = self.make_branch_and_tree('tree', format='knit')
562
self.assertTrue(tree.bzrdir.needs_format_conversion())
564
bzrdir.BzrDirFormat._set_default_format(old_format)
567
class TestFormat5(TestCaseWithTransport):
568
"""Tests specific to the version 5 bzrdir format."""
570
def test_same_lockfiles_between_tree_repo_branch(self):
571
# this checks that only a single lockfiles instance is created
572
# for format 5 objects
573
dir = bzrdir.BzrDirFormat5().initialize(self.get_url())
574
def check_dir_components_use_same_lock(dir):
575
ctrl_1 = dir.open_repository().control_files
576
ctrl_2 = dir.open_branch().control_files
577
ctrl_3 = dir.open_workingtree()._control_files
578
self.assertTrue(ctrl_1 is ctrl_2)
579
self.assertTrue(ctrl_2 is ctrl_3)
580
check_dir_components_use_same_lock(dir)
581
# and if we open it normally.
582
dir = bzrdir.BzrDir.open(self.get_url())
583
check_dir_components_use_same_lock(dir)
585
def test_can_convert(self):
586
# format 5 dirs are convertable
587
dir = bzrdir.BzrDirFormat5().initialize(self.get_url())
588
self.assertTrue(dir.can_convert_format())
590
def test_needs_conversion(self):
591
# format 5 dirs need a conversion if they are not the default.
592
# and they start of not the default.
593
old_format = bzrdir.BzrDirFormat.get_default_format()
594
bzrdir.BzrDirFormat._set_default_format(bzrdir.BzrDirFormat5())
596
dir = bzrdir.BzrDirFormat5().initialize(self.get_url())
597
self.assertFalse(dir.needs_format_conversion())
599
bzrdir.BzrDirFormat._set_default_format(old_format)
600
self.assertTrue(dir.needs_format_conversion())
603
class TestFormat6(TestCaseWithTransport):
604
"""Tests specific to the version 6 bzrdir format."""
606
def test_same_lockfiles_between_tree_repo_branch(self):
607
# this checks that only a single lockfiles instance is created
608
# for format 6 objects
609
dir = bzrdir.BzrDirFormat6().initialize(self.get_url())
610
def check_dir_components_use_same_lock(dir):
611
ctrl_1 = dir.open_repository().control_files
612
ctrl_2 = dir.open_branch().control_files
613
ctrl_3 = dir.open_workingtree()._control_files
614
self.assertTrue(ctrl_1 is ctrl_2)
615
self.assertTrue(ctrl_2 is ctrl_3)
616
check_dir_components_use_same_lock(dir)
617
# and if we open it normally.
618
dir = bzrdir.BzrDir.open(self.get_url())
619
check_dir_components_use_same_lock(dir)
621
def test_can_convert(self):
622
# format 6 dirs are convertable
623
dir = bzrdir.BzrDirFormat6().initialize(self.get_url())
624
self.assertTrue(dir.can_convert_format())
626
def test_needs_conversion(self):
627
# format 6 dirs need an conversion if they are not the default.
628
old_format = bzrdir.BzrDirFormat.get_default_format()
629
bzrdir.BzrDirFormat._set_default_format(bzrdir.BzrDirMetaFormat1())
631
dir = bzrdir.BzrDirFormat6().initialize(self.get_url())
632
self.assertTrue(dir.needs_format_conversion())
634
bzrdir.BzrDirFormat._set_default_format(old_format)
637
class NotBzrDir(bzrlib.bzrdir.BzrDir):
638
"""A non .bzr based control directory."""
640
def __init__(self, transport, format):
641
self._format = format
642
self.root_transport = transport
643
self.transport = transport.clone('.not')
646
class NotBzrDirFormat(bzrlib.bzrdir.BzrDirFormat):
647
"""A test class representing any non-.bzr based disk format."""
649
def initialize_on_transport(self, transport):
650
"""Initialize a new .not dir in the base directory of a Transport."""
651
transport.mkdir('.not')
652
return self.open(transport)
654
def open(self, transport):
655
"""Open this directory."""
656
return NotBzrDir(transport, self)
659
def _known_formats(self):
660
return set([NotBzrDirFormat()])
663
def probe_transport(self, transport):
664
"""Our format is present if the transport ends in '.not/'."""
665
if transport.has('.not'):
666
return NotBzrDirFormat()
669
class TestNotBzrDir(TestCaseWithTransport):
670
"""Tests for using the bzrdir api with a non .bzr based disk format.
672
If/when one of these is in the core, we can let the implementation tests
676
def test_create_and_find_format(self):
677
# create a .notbzr dir
678
format = NotBzrDirFormat()
679
dir = format.initialize(self.get_url())
680
self.assertIsInstance(dir, NotBzrDir)
682
bzrlib.bzrdir.BzrDirFormat.register_control_format(format)
684
found = bzrlib.bzrdir.BzrDirFormat.find_format(
685
get_transport(self.get_url()))
686
self.assertIsInstance(found, NotBzrDirFormat)
688
bzrlib.bzrdir.BzrDirFormat.unregister_control_format(format)
690
def test_included_in_known_formats(self):
691
bzrlib.bzrdir.BzrDirFormat.register_control_format(NotBzrDirFormat)
693
formats = bzrlib.bzrdir.BzrDirFormat.known_formats()
694
for format in formats:
695
if isinstance(format, NotBzrDirFormat):
697
self.fail("No NotBzrDirFormat in %s" % formats)
699
bzrlib.bzrdir.BzrDirFormat.unregister_control_format(NotBzrDirFormat)
702
class NonLocalTests(TestCaseWithTransport):
703
"""Tests for bzrdir static behaviour on non local paths."""
706
super(NonLocalTests, self).setUp()
707
self.transport_server = MemoryServer
709
def test_create_branch_convenience(self):
710
# outside a repo the default convenience output is a repo+branch_tree
711
format = bzrdir.format_registry.make_bzrdir('knit')
712
branch = bzrdir.BzrDir.create_branch_convenience(
713
self.get_url('foo'), format=format)
714
self.assertRaises(errors.NoWorkingTree,
715
branch.bzrdir.open_workingtree)
716
branch.bzrdir.open_repository()
718
def test_create_branch_convenience_force_tree_not_local_fails(self):
719
# outside a repo the default convenience output is a repo+branch_tree
720
format = bzrdir.format_registry.make_bzrdir('knit')
721
self.assertRaises(errors.NotLocalUrl,
722
bzrdir.BzrDir.create_branch_convenience,
726
t = get_transport(self.get_url('.'))
727
self.assertFalse(t.has('foo'))
729
def test_clone(self):
730
# clone into a nonlocal path works
731
format = bzrdir.format_registry.make_bzrdir('knit')
732
branch = bzrdir.BzrDir.create_branch_convenience('local',
734
branch.bzrdir.open_workingtree()
735
result = branch.bzrdir.clone(self.get_url('remote'))
736
self.assertRaises(errors.NoWorkingTree,
737
result.open_workingtree)
739
result.open_repository()
741
def test_checkout_metadir(self):
742
# checkout_metadir has reasonable working tree format even when no
743
# working tree is present
744
self.make_branch('branch-knit2', format='dirstate-with-subtree')
745
my_bzrdir = bzrdir.BzrDir.open(self.get_url('branch-knit2'))
746
checkout_format = my_bzrdir.checkout_metadir()
747
self.assertIsInstance(checkout_format.workingtree_format,
748
workingtree.WorkingTreeFormat3)
751
class TestRemoteSFTP(test_sftp_transport.TestCaseWithSFTPServer):
753
def test_open_containing_tree_or_branch(self):
754
tree = self.make_branch_and_tree('tree')
755
bzrdir.BzrDir.open_containing_tree_or_branch(self.get_url('tree'))