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('dirstate-with-subtree')
137
self.assertIs(bzrdir.format_registry.get('dirstate-with-subtree'),
138
bzrdir.format_registry.get('default'))
140
repository.RepositoryFormat.get_default_format().__class__,
141
knitrepo.RepositoryFormatKnit3)
143
bzrdir.format_registry.set_default_repository(old_default)
146
class SampleBranch(bzrlib.branch.Branch):
147
"""A dummy branch for guess what, dummy use."""
149
def __init__(self, dir):
153
class SampleBzrDir(bzrdir.BzrDir):
154
"""A sample BzrDir implementation to allow testing static methods."""
156
def create_repository(self, shared=False):
157
"""See BzrDir.create_repository."""
158
return "A repository"
160
def open_repository(self):
161
"""See BzrDir.open_repository."""
162
return "A repository"
164
def create_branch(self):
165
"""See BzrDir.create_branch."""
166
return SampleBranch(self)
168
def create_workingtree(self):
169
"""See BzrDir.create_workingtree."""
173
class SampleBzrDirFormat(bzrdir.BzrDirFormat):
176
this format is initializable, unsupported to aid in testing the
177
open and open_downlevel routines.
180
def get_format_string(self):
181
"""See BzrDirFormat.get_format_string()."""
182
return "Sample .bzr dir format."
184
def initialize(self, url):
185
"""Create a bzr dir."""
186
t = get_transport(url)
188
t.put_bytes('.bzr/branch-format', self.get_format_string())
189
return SampleBzrDir(t, self)
191
def is_supported(self):
194
def open(self, transport, _found=None):
195
return "opened branch."
198
class TestBzrDirFormat(TestCaseWithTransport):
199
"""Tests for the BzrDirFormat facility."""
201
def test_find_format(self):
202
# is the right format object found for a branch?
203
# create a branch with a few known format objects.
204
# this is not quite the same as
205
t = get_transport(self.get_url())
206
self.build_tree(["foo/", "bar/"], transport=t)
207
def check_format(format, url):
208
format.initialize(url)
209
t = get_transport(url)
210
found_format = bzrdir.BzrDirFormat.find_format(t)
211
self.failUnless(isinstance(found_format, format.__class__))
212
check_format(bzrdir.BzrDirFormat5(), "foo")
213
check_format(bzrdir.BzrDirFormat6(), "bar")
215
def test_find_format_nothing_there(self):
216
self.assertRaises(NotBranchError,
217
bzrdir.BzrDirFormat.find_format,
220
def test_find_format_unknown_format(self):
221
t = get_transport(self.get_url())
223
t.put_bytes('.bzr/branch-format', '')
224
self.assertRaises(UnknownFormatError,
225
bzrdir.BzrDirFormat.find_format,
228
def test_register_unregister_format(self):
229
format = SampleBzrDirFormat()
232
format.initialize(url)
233
# register a format for it.
234
bzrdir.BzrDirFormat.register_format(format)
235
# which bzrdir.Open will refuse (not supported)
236
self.assertRaises(UnsupportedFormatError, bzrdir.BzrDir.open, url)
237
# which bzrdir.open_containing will refuse (not supported)
238
self.assertRaises(UnsupportedFormatError, bzrdir.BzrDir.open_containing, url)
239
# but open_downlevel will work
240
t = get_transport(url)
241
self.assertEqual(format.open(t), bzrdir.BzrDir.open_unsupported(url))
242
# unregister the format
243
bzrdir.BzrDirFormat.unregister_format(format)
244
# now open_downlevel should fail too.
245
self.assertRaises(UnknownFormatError, bzrdir.BzrDir.open_unsupported, url)
247
def test_create_repository(self):
248
format = SampleBzrDirFormat()
249
repo = bzrdir.BzrDir.create_repository(self.get_url(), format=format)
250
self.assertEqual('A repository', repo)
252
def test_create_repository_shared(self):
253
old_format = bzrdir.BzrDirFormat.get_default_format()
254
repo = bzrdir.BzrDir.create_repository('.', shared=True)
255
self.assertTrue(repo.is_shared())
257
def test_create_repository_nonshared(self):
258
old_format = bzrdir.BzrDirFormat.get_default_format()
259
repo = bzrdir.BzrDir.create_repository('.')
260
self.assertFalse(repo.is_shared())
262
def test_create_repository_under_shared(self):
263
# an explicit create_repository always does so.
264
# we trust the format is right from the 'create_repository test'
265
format = bzrdir.format_registry.make_bzrdir('knit')
266
self.make_repository('.', shared=True, format=format)
267
repo = bzrdir.BzrDir.create_repository(self.get_url('child'),
269
self.assertTrue(isinstance(repo, repository.Repository))
270
self.assertTrue(repo.bzrdir.root_transport.base.endswith('child/'))
272
def test_create_branch_and_repo_uses_default(self):
273
format = SampleBzrDirFormat()
274
branch = bzrdir.BzrDir.create_branch_and_repo(self.get_url(),
276
self.assertTrue(isinstance(branch, SampleBranch))
278
def test_create_branch_and_repo_under_shared(self):
279
# creating a branch and repo in a shared repo uses the
281
format = bzrdir.format_registry.make_bzrdir('knit')
282
self.make_repository('.', shared=True, format=format)
283
branch = bzrdir.BzrDir.create_branch_and_repo(
284
self.get_url('child'), format=format)
285
self.assertRaises(errors.NoRepositoryPresent,
286
branch.bzrdir.open_repository)
288
def test_create_branch_and_repo_under_shared_force_new(self):
289
# creating a branch and repo in a shared repo can be forced to
291
format = bzrdir.format_registry.make_bzrdir('knit')
292
self.make_repository('.', shared=True, format=format)
293
branch = bzrdir.BzrDir.create_branch_and_repo(self.get_url('child'),
296
branch.bzrdir.open_repository()
298
def test_create_standalone_working_tree(self):
299
format = SampleBzrDirFormat()
300
# note this is deliberately readonly, as this failure should
301
# occur before any writes.
302
self.assertRaises(errors.NotLocalUrl,
303
bzrdir.BzrDir.create_standalone_workingtree,
304
self.get_readonly_url(), format=format)
305
tree = bzrdir.BzrDir.create_standalone_workingtree('.',
307
self.assertEqual('A tree', tree)
309
def test_create_standalone_working_tree_under_shared_repo(self):
310
# create standalone working tree always makes a repo.
311
format = bzrdir.format_registry.make_bzrdir('knit')
312
self.make_repository('.', shared=True, format=format)
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'), format=format)
318
tree = bzrdir.BzrDir.create_standalone_workingtree('child',
320
tree.bzrdir.open_repository()
322
def test_create_branch_convenience(self):
323
# outside a repo the default convenience output is a repo+branch_tree
324
format = bzrdir.format_registry.make_bzrdir('knit')
325
branch = bzrdir.BzrDir.create_branch_convenience('.', format=format)
326
branch.bzrdir.open_workingtree()
327
branch.bzrdir.open_repository()
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
format = bzrdir.format_registry.make_bzrdir('knit')
334
branch = bzrdir.BzrDir.create_branch_convenience(self.get_url(),
336
self.assertRaises(errors.NoWorkingTree,
337
branch.bzrdir.open_workingtree)
338
branch.bzrdir.open_repository()
340
def test_create_branch_convenience_under_shared_repo(self):
341
# inside a repo the default convenience output is a branch+ follow the
343
format = bzrdir.format_registry.make_bzrdir('knit')
344
self.make_repository('.', shared=True, format=format)
345
branch = bzrdir.BzrDir.create_branch_convenience('child',
347
branch.bzrdir.open_workingtree()
348
self.assertRaises(errors.NoRepositoryPresent,
349
branch.bzrdir.open_repository)
351
def test_create_branch_convenience_under_shared_repo_force_no_tree(self):
352
# inside a repo the default convenience output is a branch+ follow the
353
# repo tree policy but we can override that
354
format = bzrdir.format_registry.make_bzrdir('knit')
355
self.make_repository('.', shared=True, format=format)
356
branch = bzrdir.BzrDir.create_branch_convenience('child',
357
force_new_tree=False, format=format)
358
self.assertRaises(errors.NoWorkingTree,
359
branch.bzrdir.open_workingtree)
360
self.assertRaises(errors.NoRepositoryPresent,
361
branch.bzrdir.open_repository)
363
def test_create_branch_convenience_under_shared_repo_no_tree_policy(self):
364
# inside a repo the default convenience output is a branch+ follow the
366
format = bzrdir.format_registry.make_bzrdir('knit')
367
repo = self.make_repository('.', shared=True, format=format)
368
repo.set_make_working_trees(False)
369
branch = bzrdir.BzrDir.create_branch_convenience('child',
371
self.assertRaises(errors.NoWorkingTree,
372
branch.bzrdir.open_workingtree)
373
self.assertRaises(errors.NoRepositoryPresent,
374
branch.bzrdir.open_repository)
376
def test_create_branch_convenience_under_shared_repo_no_tree_policy_force_tree(self):
377
# inside a repo the default convenience output is a branch+ follow the
378
# repo tree policy but we can override that
379
format = bzrdir.format_registry.make_bzrdir('knit')
380
repo = self.make_repository('.', shared=True, format=format)
381
repo.set_make_working_trees(False)
382
branch = bzrdir.BzrDir.create_branch_convenience('child',
383
force_new_tree=True, format=format)
384
branch.bzrdir.open_workingtree()
385
self.assertRaises(errors.NoRepositoryPresent,
386
branch.bzrdir.open_repository)
388
def test_create_branch_convenience_under_shared_repo_force_new_repo(self):
389
# inside a repo the default convenience output is overridable to give
391
format = bzrdir.format_registry.make_bzrdir('knit')
392
self.make_repository('.', shared=True, format=format)
393
branch = bzrdir.BzrDir.create_branch_convenience('child',
394
force_new_repo=True, format=format)
395
branch.bzrdir.open_repository()
396
branch.bzrdir.open_workingtree()
399
class ChrootedTests(TestCaseWithTransport):
400
"""A support class that provides readonly urls outside the local namespace.
402
This is done by checking if self.transport_server is a MemoryServer. if it
403
is then we are chrooted already, if it is not then an HttpServer is used
408
super(ChrootedTests, self).setUp()
409
if not self.transport_server == MemoryServer:
410
self.transport_readonly_server = HttpServer
412
def test_open_containing(self):
413
self.assertRaises(NotBranchError, bzrdir.BzrDir.open_containing,
414
self.get_readonly_url(''))
415
self.assertRaises(NotBranchError, bzrdir.BzrDir.open_containing,
416
self.get_readonly_url('g/p/q'))
417
control = bzrdir.BzrDir.create(self.get_url())
418
branch, relpath = bzrdir.BzrDir.open_containing(self.get_readonly_url(''))
419
self.assertEqual('', relpath)
420
branch, relpath = bzrdir.BzrDir.open_containing(self.get_readonly_url('g/p/q'))
421
self.assertEqual('g/p/q', relpath)
423
def test_open_containing_from_transport(self):
424
self.assertRaises(NotBranchError, bzrdir.BzrDir.open_containing_from_transport,
425
get_transport(self.get_readonly_url('')))
426
self.assertRaises(NotBranchError, bzrdir.BzrDir.open_containing_from_transport,
427
get_transport(self.get_readonly_url('g/p/q')))
428
control = bzrdir.BzrDir.create(self.get_url())
429
branch, relpath = bzrdir.BzrDir.open_containing_from_transport(
430
get_transport(self.get_readonly_url('')))
431
self.assertEqual('', relpath)
432
branch, relpath = bzrdir.BzrDir.open_containing_from_transport(
433
get_transport(self.get_readonly_url('g/p/q')))
434
self.assertEqual('g/p/q', relpath)
436
def test_open_containing_tree_or_branch(self):
437
def local_branch_path(branch):
438
return os.path.realpath(
439
urlutils.local_path_from_url(branch.base))
441
self.make_branch_and_tree('topdir')
442
tree, branch, relpath = bzrdir.BzrDir.open_containing_tree_or_branch(
444
self.assertEqual(os.path.realpath('topdir'),
445
os.path.realpath(tree.basedir))
446
self.assertEqual(os.path.realpath('topdir'),
447
local_branch_path(branch))
448
self.assertIs(tree.bzrdir, branch.bzrdir)
449
self.assertEqual('foo', relpath)
450
self.make_branch('topdir/foo')
451
tree, branch, relpath = bzrdir.BzrDir.open_containing_tree_or_branch(
453
self.assertIs(tree, None)
454
self.assertEqual(os.path.realpath('topdir/foo'),
455
local_branch_path(branch))
456
self.assertEqual('', relpath)
458
def test_open_from_transport(self):
459
# transport pointing at bzrdir should give a bzrdir with root transport
460
# set to the given transport
461
control = bzrdir.BzrDir.create(self.get_url())
462
transport = get_transport(self.get_url())
463
opened_bzrdir = bzrdir.BzrDir.open_from_transport(transport)
464
self.assertEqual(transport.base, opened_bzrdir.root_transport.base)
465
self.assertIsInstance(opened_bzrdir, bzrdir.BzrDir)
467
def test_open_from_transport_no_bzrdir(self):
468
transport = get_transport(self.get_url())
469
self.assertRaises(NotBranchError, bzrdir.BzrDir.open_from_transport,
472
def test_open_from_transport_bzrdir_in_parent(self):
473
control = bzrdir.BzrDir.create(self.get_url())
474
transport = get_transport(self.get_url())
475
transport.mkdir('subdir')
476
transport = transport.clone('subdir')
477
self.assertRaises(NotBranchError, bzrdir.BzrDir.open_from_transport,
480
def test_sprout_recursive(self):
481
tree = self.make_branch_and_tree('tree1', format='dirstate-with-subtree')
482
sub_tree = self.make_branch_and_tree('tree1/subtree',
483
format='dirstate-with-subtree')
484
tree.add_reference(sub_tree)
485
self.build_tree(['tree1/subtree/file'])
487
tree.commit('Initial commit')
488
tree.bzrdir.sprout('tree2')
489
self.failUnlessExists('tree2/subtree/file')
491
def test_cloning_metadir(self):
492
"""Ensure that cloning metadir is suitable"""
493
bzrdir = self.make_bzrdir('bzrdir')
494
bzrdir.cloning_metadir()
495
branch = self.make_branch('branch', format='knit')
496
format = branch.bzrdir.cloning_metadir()
497
self.assertIsInstance(format.workingtree_format,
498
workingtree.WorkingTreeFormat3)
500
def test_sprout_recursive_treeless(self):
501
tree = self.make_branch_and_tree('tree1',
502
format='dirstate-with-subtree')
503
sub_tree = self.make_branch_and_tree('tree1/subtree',
504
format='dirstate-with-subtree')
505
tree.add_reference(sub_tree)
506
self.build_tree(['tree1/subtree/file'])
508
tree.commit('Initial commit')
509
tree.bzrdir.destroy_workingtree()
510
repo = self.make_repository('repo', shared=True,
511
format='dirstate-with-subtree')
512
repo.set_make_working_trees(False)
513
tree.bzrdir.sprout('repo/tree2')
514
self.failUnlessExists('repo/tree2/subtree')
515
self.failIfExists('repo/tree2/subtree/file')
518
class TestMeta1DirFormat(TestCaseWithTransport):
519
"""Tests specific to the meta1 dir format."""
521
def test_right_base_dirs(self):
522
dir = bzrdir.BzrDirMetaFormat1().initialize(self.get_url())
524
branch_base = t.clone('branch').base
525
self.assertEqual(branch_base, dir.get_branch_transport(None).base)
526
self.assertEqual(branch_base,
527
dir.get_branch_transport(bzrlib.branch.BzrBranchFormat5()).base)
528
repository_base = t.clone('repository').base
529
self.assertEqual(repository_base, dir.get_repository_transport(None).base)
530
self.assertEqual(repository_base,
531
dir.get_repository_transport(weaverepo.RepositoryFormat7()).base)
532
checkout_base = t.clone('checkout').base
533
self.assertEqual(checkout_base, dir.get_workingtree_transport(None).base)
534
self.assertEqual(checkout_base,
535
dir.get_workingtree_transport(workingtree.WorkingTreeFormat3()).base)
537
def test_meta1dir_uses_lockdir(self):
538
"""Meta1 format uses a LockDir to guard the whole directory, not a file."""
539
dir = bzrdir.BzrDirMetaFormat1().initialize(self.get_url())
541
self.assertIsDirectory('branch-lock', t)
543
def test_comparison(self):
544
"""Equality and inequality behave properly.
546
Metadirs should compare equal iff they have the same repo, branch and
549
mydir = bzrdir.format_registry.make_bzrdir('knit')
550
self.assertEqual(mydir, mydir)
551
self.assertFalse(mydir != mydir)
552
otherdir = bzrdir.format_registry.make_bzrdir('knit')
553
self.assertEqual(otherdir, mydir)
554
self.assertFalse(otherdir != mydir)
555
otherdir2 = bzrdir.format_registry.make_bzrdir('dirstate-with-subtree')
556
self.assertNotEqual(otherdir2, mydir)
557
self.assertFalse(otherdir2 == mydir)
559
def test_needs_conversion_different_working_tree(self):
560
# meta1dirs need an conversion if any element is not the default.
561
old_format = bzrdir.BzrDirFormat.get_default_format()
563
new_default = bzrdir.format_registry.make_bzrdir('dirstate')
564
bzrdir.BzrDirFormat._set_default_format(new_default)
566
tree = self.make_branch_and_tree('tree', format='knit')
567
self.assertTrue(tree.bzrdir.needs_format_conversion())
569
bzrdir.BzrDirFormat._set_default_format(old_format)
572
class TestFormat5(TestCaseWithTransport):
573
"""Tests specific to the version 5 bzrdir format."""
575
def test_same_lockfiles_between_tree_repo_branch(self):
576
# this checks that only a single lockfiles instance is created
577
# for format 5 objects
578
dir = bzrdir.BzrDirFormat5().initialize(self.get_url())
579
def check_dir_components_use_same_lock(dir):
580
ctrl_1 = dir.open_repository().control_files
581
ctrl_2 = dir.open_branch().control_files
582
ctrl_3 = dir.open_workingtree()._control_files
583
self.assertTrue(ctrl_1 is ctrl_2)
584
self.assertTrue(ctrl_2 is ctrl_3)
585
check_dir_components_use_same_lock(dir)
586
# and if we open it normally.
587
dir = bzrdir.BzrDir.open(self.get_url())
588
check_dir_components_use_same_lock(dir)
590
def test_can_convert(self):
591
# format 5 dirs are convertable
592
dir = bzrdir.BzrDirFormat5().initialize(self.get_url())
593
self.assertTrue(dir.can_convert_format())
595
def test_needs_conversion(self):
596
# format 5 dirs need a conversion if they are not the default.
597
# and they start of not the default.
598
old_format = bzrdir.BzrDirFormat.get_default_format()
599
bzrdir.BzrDirFormat._set_default_format(bzrdir.BzrDirFormat5())
601
dir = bzrdir.BzrDirFormat5().initialize(self.get_url())
602
self.assertFalse(dir.needs_format_conversion())
604
bzrdir.BzrDirFormat._set_default_format(old_format)
605
self.assertTrue(dir.needs_format_conversion())
608
class TestFormat6(TestCaseWithTransport):
609
"""Tests specific to the version 6 bzrdir format."""
611
def test_same_lockfiles_between_tree_repo_branch(self):
612
# this checks that only a single lockfiles instance is created
613
# for format 6 objects
614
dir = bzrdir.BzrDirFormat6().initialize(self.get_url())
615
def check_dir_components_use_same_lock(dir):
616
ctrl_1 = dir.open_repository().control_files
617
ctrl_2 = dir.open_branch().control_files
618
ctrl_3 = dir.open_workingtree()._control_files
619
self.assertTrue(ctrl_1 is ctrl_2)
620
self.assertTrue(ctrl_2 is ctrl_3)
621
check_dir_components_use_same_lock(dir)
622
# and if we open it normally.
623
dir = bzrdir.BzrDir.open(self.get_url())
624
check_dir_components_use_same_lock(dir)
626
def test_can_convert(self):
627
# format 6 dirs are convertable
628
dir = bzrdir.BzrDirFormat6().initialize(self.get_url())
629
self.assertTrue(dir.can_convert_format())
631
def test_needs_conversion(self):
632
# format 6 dirs need an conversion if they are not the default.
633
old_format = bzrdir.BzrDirFormat.get_default_format()
634
bzrdir.BzrDirFormat._set_default_format(bzrdir.BzrDirMetaFormat1())
636
dir = bzrdir.BzrDirFormat6().initialize(self.get_url())
637
self.assertTrue(dir.needs_format_conversion())
639
bzrdir.BzrDirFormat._set_default_format(old_format)
642
class NotBzrDir(bzrlib.bzrdir.BzrDir):
643
"""A non .bzr based control directory."""
645
def __init__(self, transport, format):
646
self._format = format
647
self.root_transport = transport
648
self.transport = transport.clone('.not')
651
class NotBzrDirFormat(bzrlib.bzrdir.BzrDirFormat):
652
"""A test class representing any non-.bzr based disk format."""
654
def initialize_on_transport(self, transport):
655
"""Initialize a new .not dir in the base directory of a Transport."""
656
transport.mkdir('.not')
657
return self.open(transport)
659
def open(self, transport):
660
"""Open this directory."""
661
return NotBzrDir(transport, self)
664
def _known_formats(self):
665
return set([NotBzrDirFormat()])
668
def probe_transport(self, transport):
669
"""Our format is present if the transport ends in '.not/'."""
670
if transport.has('.not'):
671
return NotBzrDirFormat()
674
class TestNotBzrDir(TestCaseWithTransport):
675
"""Tests for using the bzrdir api with a non .bzr based disk format.
677
If/when one of these is in the core, we can let the implementation tests
681
def test_create_and_find_format(self):
682
# create a .notbzr dir
683
format = NotBzrDirFormat()
684
dir = format.initialize(self.get_url())
685
self.assertIsInstance(dir, NotBzrDir)
687
bzrlib.bzrdir.BzrDirFormat.register_control_format(format)
689
found = bzrlib.bzrdir.BzrDirFormat.find_format(
690
get_transport(self.get_url()))
691
self.assertIsInstance(found, NotBzrDirFormat)
693
bzrlib.bzrdir.BzrDirFormat.unregister_control_format(format)
695
def test_included_in_known_formats(self):
696
bzrlib.bzrdir.BzrDirFormat.register_control_format(NotBzrDirFormat)
698
formats = bzrlib.bzrdir.BzrDirFormat.known_formats()
699
for format in formats:
700
if isinstance(format, NotBzrDirFormat):
702
self.fail("No NotBzrDirFormat in %s" % formats)
704
bzrlib.bzrdir.BzrDirFormat.unregister_control_format(NotBzrDirFormat)
707
class NonLocalTests(TestCaseWithTransport):
708
"""Tests for bzrdir static behaviour on non local paths."""
711
super(NonLocalTests, self).setUp()
712
self.transport_server = MemoryServer
714
def test_create_branch_convenience(self):
715
# outside a repo the default convenience output is a repo+branch_tree
716
format = bzrdir.format_registry.make_bzrdir('knit')
717
branch = bzrdir.BzrDir.create_branch_convenience(
718
self.get_url('foo'), format=format)
719
self.assertRaises(errors.NoWorkingTree,
720
branch.bzrdir.open_workingtree)
721
branch.bzrdir.open_repository()
723
def test_create_branch_convenience_force_tree_not_local_fails(self):
724
# outside a repo the default convenience output is a repo+branch_tree
725
format = bzrdir.format_registry.make_bzrdir('knit')
726
self.assertRaises(errors.NotLocalUrl,
727
bzrdir.BzrDir.create_branch_convenience,
731
t = get_transport(self.get_url('.'))
732
self.assertFalse(t.has('foo'))
734
def test_clone(self):
735
# clone into a nonlocal path works
736
format = bzrdir.format_registry.make_bzrdir('knit')
737
branch = bzrdir.BzrDir.create_branch_convenience('local',
739
branch.bzrdir.open_workingtree()
740
result = branch.bzrdir.clone(self.get_url('remote'))
741
self.assertRaises(errors.NoWorkingTree,
742
result.open_workingtree)
744
result.open_repository()
746
def test_checkout_metadir(self):
747
# checkout_metadir has reasonable working tree format even when no
748
# working tree is present
749
self.make_branch('branch-knit2', format='dirstate-with-subtree')
750
my_bzrdir = bzrdir.BzrDir.open(self.get_url('branch-knit2'))
751
checkout_format = my_bzrdir.checkout_metadir()
752
self.assertIsInstance(checkout_format.workingtree_format,
753
workingtree.WorkingTreeFormat3)
756
class TestRemoteSFTP(test_sftp_transport.TestCaseWithSFTPServer):
758
def test_open_containing_tree_or_branch(self):
759
tree = self.make_branch_and_tree('tree')
760
bzrdir.BzrDir.open_containing_tree_or_branch(self.get_url('tree'))