~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_bzrdir.py

  • Committer: Richard Wilbur
  • Date: 2016-02-04 19:07:28 UTC
  • mto: This revision was merged to the branch mainline in revision 6618.
  • Revision ID: richard.wilbur@gmail.com-20160204190728-p0zvfii6zase0fw7
Update COPYING.txt from the original http://www.gnu.org/licenses/gpl-2.0.txt  (Only differences were in whitespace.)  Thanks to Petr Stodulka for pointing out the discrepancy.

Show diffs side-by-side

added added

removed removed

Lines of Context:
26
26
from bzrlib import (
27
27
    branch,
28
28
    bzrdir,
 
29
    config,
29
30
    controldir,
30
31
    errors,
31
32
    help_topics,
34
35
    revision as _mod_revision,
35
36
    osutils,
36
37
    remote,
37
 
    symbol_versioning,
38
38
    transport as _mod_transport,
39
39
    urlutils,
40
40
    win32utils,
41
 
    workingtree,
 
41
    workingtree_3,
 
42
    workingtree_4,
42
43
    )
43
44
import bzrlib.branch
 
45
from bzrlib.branchfmt.fullhistory import BzrBranchFormat5
44
46
from bzrlib.errors import (
45
47
    NotBranchError,
46
48
    NoColocatedBranchSupport,
168
170
        self.assertNotContainsRe(new, 'hidden')
169
171
 
170
172
    def test_set_default_repository(self):
171
 
        default_factory = bzrdir.format_registry.get('default')
172
 
        old_default = [k for k, v in bzrdir.format_registry.iteritems()
 
173
        default_factory = controldir.format_registry.get('default')
 
174
        old_default = [k for k, v in controldir.format_registry.iteritems()
173
175
                       if v == default_factory and k != 'default'][0]
174
 
        bzrdir.format_registry.set_default_repository('dirstate-with-subtree')
 
176
        controldir.format_registry.set_default_repository('dirstate-with-subtree')
175
177
        try:
176
 
            self.assertIs(bzrdir.format_registry.get('dirstate-with-subtree'),
177
 
                          bzrdir.format_registry.get('default'))
 
178
            self.assertIs(controldir.format_registry.get('dirstate-with-subtree'),
 
179
                          controldir.format_registry.get('default'))
178
180
            self.assertIs(
179
181
                repository.format_registry.get_default().__class__,
180
182
                knitrepo.RepositoryFormatKnit3)
181
183
        finally:
182
 
            bzrdir.format_registry.set_default_repository(old_default)
 
184
            controldir.format_registry.set_default_repository(old_default)
183
185
 
184
186
    def test_aliases(self):
185
187
        a_registry = controldir.ControlDirFormatRegistry()
210
212
    """A sample BzrDir implementation to allow testing static methods."""
211
213
 
212
214
    def create_repository(self, shared=False):
213
 
        """See BzrDir.create_repository."""
 
215
        """See ControlDir.create_repository."""
214
216
        return "A repository"
215
217
 
216
218
    def open_repository(self):
217
 
        """See BzrDir.open_repository."""
 
219
        """See ControlDir.open_repository."""
218
220
        return SampleRepository(self)
219
221
 
220
222
    def create_branch(self, name=None):
221
 
        """See BzrDir.create_branch."""
 
223
        """See ControlDir.create_branch."""
222
224
        if name is not None:
223
225
            raise NoColocatedBranchSupport(self)
224
226
        return SampleBranch(self)
225
227
 
226
228
    def create_workingtree(self):
227
 
        """See BzrDir.create_workingtree."""
 
229
        """See ControlDir.create_workingtree."""
228
230
        return "A tree"
229
231
 
230
232
 
251
253
    def open(self, transport, _found=None):
252
254
        return "opened branch."
253
255
 
 
256
    @classmethod
 
257
    def from_string(cls, format_string):
 
258
        return cls()
 
259
 
254
260
 
255
261
class BzrDirFormatTest1(bzrdir.BzrDirMetaFormat1):
256
262
 
284
290
        self.build_tree(["foo/", "bar/"], transport=t)
285
291
        def check_format(format, url):
286
292
            format.initialize(url)
287
 
            t = _mod_transport.get_transport(url)
 
293
            t = _mod_transport.get_transport_from_path(url)
288
294
            found_format = bzrdir.BzrDirFormat.find_format(t)
289
295
            self.assertIsInstance(found_format, format.__class__)
290
296
        check_format(BzrDirFormatTest1(), "foo")
293
299
    def test_find_format_nothing_there(self):
294
300
        self.assertRaises(NotBranchError,
295
301
                          bzrdir.BzrDirFormat.find_format,
296
 
                          _mod_transport.get_transport('.'))
 
302
                          _mod_transport.get_transport_from_path('.'))
297
303
 
298
304
    def test_find_format_unknown_format(self):
299
305
        t = self.get_transport()
301
307
        t.put_bytes('.bzr/branch-format', '')
302
308
        self.assertRaises(UnknownFormatError,
303
309
                          bzrdir.BzrDirFormat.find_format,
304
 
                          _mod_transport.get_transport('.'))
 
310
                          _mod_transport.get_transport_from_path('.'))
305
311
 
306
312
    def test_register_unregister_format(self):
307
313
        format = SampleBzrDirFormat()
315
321
        # which bzrdir.open_containing will refuse (not supported)
316
322
        self.assertRaises(UnsupportedFormatError, bzrdir.BzrDir.open_containing, url)
317
323
        # but open_downlevel will work
318
 
        t = _mod_transport.get_transport(url)
 
324
        t = _mod_transport.get_transport_from_url(url)
319
325
        self.assertEqual(format.open(t), bzrdir.BzrDir.open_unsupported(url))
320
326
        # unregister the format
321
327
        bzrdir.BzrProber.formats.remove(format.get_format_string())
331
337
    def test_create_branch_and_repo_under_shared(self):
332
338
        # creating a branch and repo in a shared repo uses the
333
339
        # shared repository
334
 
        format = bzrdir.format_registry.make_bzrdir('knit')
 
340
        format = controldir.format_registry.make_bzrdir('knit')
335
341
        self.make_repository('.', shared=True, format=format)
336
342
        branch = bzrdir.BzrDir.create_branch_and_repo(
337
343
            self.get_url('child'), format=format)
341
347
    def test_create_branch_and_repo_under_shared_force_new(self):
342
348
        # creating a branch and repo in a shared repo can be forced to
343
349
        # make a new repo
344
 
        format = bzrdir.format_registry.make_bzrdir('knit')
 
350
        format = controldir.format_registry.make_bzrdir('knit')
345
351
        self.make_repository('.', shared=True, format=format)
346
352
        branch = bzrdir.BzrDir.create_branch_and_repo(self.get_url('child'),
347
353
                                                      force_new_repo=True,
361
367
 
362
368
    def test_create_standalone_working_tree_under_shared_repo(self):
363
369
        # create standalone working tree always makes a repo.
364
 
        format = bzrdir.format_registry.make_bzrdir('knit')
 
370
        format = controldir.format_registry.make_bzrdir('knit')
365
371
        self.make_repository('.', shared=True, format=format)
366
372
        # note this is deliberately readonly, as this failure should
367
373
        # occur before any writes.
374
380
 
375
381
    def test_create_branch_convenience(self):
376
382
        # outside a repo the default convenience output is a repo+branch_tree
377
 
        format = bzrdir.format_registry.make_bzrdir('knit')
 
383
        format = controldir.format_registry.make_bzrdir('knit')
378
384
        branch = bzrdir.BzrDir.create_branch_convenience('.', format=format)
379
385
        branch.bzrdir.open_workingtree()
380
386
        branch.bzrdir.open_repository()
381
387
 
382
388
    def test_create_branch_convenience_possible_transports(self):
383
389
        """Check that the optional 'possible_transports' is recognized"""
384
 
        format = bzrdir.format_registry.make_bzrdir('knit')
 
390
        format = controldir.format_registry.make_bzrdir('knit')
385
391
        t = self.get_transport()
386
392
        branch = bzrdir.BzrDir.create_branch_convenience(
387
393
            '.', format=format, possible_transports=[t])
392
398
        """Creating a branch at the root of a fs should work."""
393
399
        self.vfs_transport_factory = memory.MemoryServer
394
400
        # outside a repo the default convenience output is a repo+branch_tree
395
 
        format = bzrdir.format_registry.make_bzrdir('knit')
 
401
        format = controldir.format_registry.make_bzrdir('knit')
396
402
        branch = bzrdir.BzrDir.create_branch_convenience(self.get_url(),
397
403
                                                         format=format)
398
404
        self.assertRaises(errors.NoWorkingTree,
402
408
    def test_create_branch_convenience_under_shared_repo(self):
403
409
        # inside a repo the default convenience output is a branch+ follow the
404
410
        # repo tree policy
405
 
        format = bzrdir.format_registry.make_bzrdir('knit')
 
411
        format = controldir.format_registry.make_bzrdir('knit')
406
412
        self.make_repository('.', shared=True, format=format)
407
413
        branch = bzrdir.BzrDir.create_branch_convenience('child',
408
414
            format=format)
413
419
    def test_create_branch_convenience_under_shared_repo_force_no_tree(self):
414
420
        # inside a repo the default convenience output is a branch+ follow the
415
421
        # repo tree policy but we can override that
416
 
        format = bzrdir.format_registry.make_bzrdir('knit')
 
422
        format = controldir.format_registry.make_bzrdir('knit')
417
423
        self.make_repository('.', shared=True, format=format)
418
424
        branch = bzrdir.BzrDir.create_branch_convenience('child',
419
425
            force_new_tree=False, format=format)
425
431
    def test_create_branch_convenience_under_shared_repo_no_tree_policy(self):
426
432
        # inside a repo the default convenience output is a branch+ follow the
427
433
        # repo tree policy
428
 
        format = bzrdir.format_registry.make_bzrdir('knit')
 
434
        format = controldir.format_registry.make_bzrdir('knit')
429
435
        repo = self.make_repository('.', shared=True, format=format)
430
436
        repo.set_make_working_trees(False)
431
437
        branch = bzrdir.BzrDir.create_branch_convenience('child',
438
444
    def test_create_branch_convenience_under_shared_repo_no_tree_policy_force_tree(self):
439
445
        # inside a repo the default convenience output is a branch+ follow the
440
446
        # repo tree policy but we can override that
441
 
        format = bzrdir.format_registry.make_bzrdir('knit')
 
447
        format = controldir.format_registry.make_bzrdir('knit')
442
448
        repo = self.make_repository('.', shared=True, format=format)
443
449
        repo.set_make_working_trees(False)
444
450
        branch = bzrdir.BzrDir.create_branch_convenience('child',
450
456
    def test_create_branch_convenience_under_shared_repo_force_new_repo(self):
451
457
        # inside a repo the default convenience output is overridable to give
452
458
        # repo+branch+tree
453
 
        format = bzrdir.format_registry.make_bzrdir('knit')
 
459
        format = controldir.format_registry.make_bzrdir('knit')
454
460
        self.make_repository('.', shared=True, format=format)
455
461
        branch = bzrdir.BzrDir.create_branch_convenience('child',
456
462
            force_new_repo=True, format=format)
511
517
        # Clone source into directory
512
518
        target = source_bzrdir.clone(self.get_url('parent/target'))
513
519
 
 
520
    def test_format_initialize_on_transport_ex_stacked_on(self):
 
521
        # trunk is a stackable format.  Note that its in the same server area
 
522
        # which is what launchpad does, but not sufficient to exercise the
 
523
        # general case.
 
524
        trunk = self.make_branch('trunk', format='1.9')
 
525
        t = self.get_transport('stacked')
 
526
        old_fmt = controldir.format_registry.make_bzrdir('pack-0.92')
 
527
        repo_name = old_fmt.repository_format.network_name()
 
528
        # Should end up with a 1.9 format (stackable)
 
529
        repo, control, require_stacking, repo_policy = \
 
530
            old_fmt.initialize_on_transport_ex(t,
 
531
                    repo_format_name=repo_name, stacked_on='../trunk',
 
532
                    stack_on_pwd=t.base)
 
533
        if repo is not None:
 
534
            # Repositories are open write-locked
 
535
            self.assertTrue(repo.is_write_locked())
 
536
            self.addCleanup(repo.unlock)
 
537
        else:
 
538
            repo = control.open_repository()
 
539
        self.assertIsInstance(control, bzrdir.BzrDir)
 
540
        opened = bzrdir.BzrDir.open(t.base)
 
541
        if not isinstance(old_fmt, remote.RemoteBzrDirFormat):
 
542
            self.assertEqual(control._format.network_name(),
 
543
                old_fmt.network_name())
 
544
            self.assertEqual(control._format.network_name(),
 
545
                opened._format.network_name())
 
546
        self.assertEqual(control.__class__, opened.__class__)
 
547
        self.assertLength(1, repo._fallback_repositories)
 
548
 
514
549
    def test_sprout_obeys_stacking_policy(self):
515
550
        child_branch, new_child_transport = self.prepare_default_stacking()
516
551
        new_child = child_branch.bzrdir.sprout(new_child_transport.base)
709
744
    def test_open_containing_from_transport(self):
710
745
        self.assertRaises(NotBranchError,
711
746
            bzrdir.BzrDir.open_containing_from_transport,
712
 
            _mod_transport.get_transport(self.get_readonly_url('')))
 
747
            _mod_transport.get_transport_from_url(self.get_readonly_url('')))
713
748
        self.assertRaises(NotBranchError,
714
749
            bzrdir.BzrDir.open_containing_from_transport,
715
 
            _mod_transport.get_transport(self.get_readonly_url('g/p/q')))
 
750
            _mod_transport.get_transport_from_url(
 
751
                self.get_readonly_url('g/p/q')))
716
752
        control = bzrdir.BzrDir.create(self.get_url())
717
753
        branch, relpath = bzrdir.BzrDir.open_containing_from_transport(
718
 
            _mod_transport.get_transport(self.get_readonly_url('')))
 
754
            _mod_transport.get_transport_from_url(
 
755
                self.get_readonly_url('')))
719
756
        self.assertEqual('', relpath)
720
757
        branch, relpath = bzrdir.BzrDir.open_containing_from_transport(
721
 
            _mod_transport.get_transport(self.get_readonly_url('g/p/q')))
 
758
            _mod_transport.get_transport_from_url(
 
759
                self.get_readonly_url('g/p/q')))
722
760
        self.assertEqual('g/p/q', relpath)
723
761
 
724
762
    def test_open_containing_tree_or_branch(self):
786
824
 
787
825
    def test_sprout_recursive(self):
788
826
        tree = self.make_branch_and_tree('tree1',
789
 
                                         format='dirstate-with-subtree')
 
827
                                         format='development-subtree')
790
828
        sub_tree = self.make_branch_and_tree('tree1/subtree',
791
 
            format='dirstate-with-subtree')
 
829
            format='development-subtree')
792
830
        sub_tree.set_root_id('subtree-root')
793
831
        tree.add_reference(sub_tree)
794
832
        self.build_tree(['tree1/subtree/file'])
807
845
        branch = self.make_branch('branch', format='knit')
808
846
        format = branch.bzrdir.cloning_metadir()
809
847
        self.assertIsInstance(format.workingtree_format,
810
 
            workingtree.WorkingTreeFormat3)
 
848
            workingtree_4.WorkingTreeFormat6)
811
849
 
812
850
    def test_sprout_recursive_treeless(self):
813
851
        tree = self.make_branch_and_tree('tree1',
814
 
            format='dirstate-with-subtree')
 
852
            format='development-subtree')
815
853
        sub_tree = self.make_branch_and_tree('tree1/subtree',
816
 
            format='dirstate-with-subtree')
 
854
            format='development-subtree')
817
855
        tree.add_reference(sub_tree)
818
856
        self.build_tree(['tree1/subtree/file'])
819
857
        sub_tree.add('file')
820
858
        tree.commit('Initial commit')
821
859
        # The following line force the orhaning to reveal bug #634470
822
 
        tree.branch.get_config().set_user_option(
 
860
        tree.branch.get_config_stack().set(
823
861
            'bzr.transform.orphan_policy', 'move')
824
862
        tree.bzrdir.destroy_workingtree()
825
863
        # FIXME: subtree/.bzr is left here which allows the test to pass (or
826
864
        # fail :-( ) -- vila 20100909
827
865
        repo = self.make_repository('repo', shared=True,
828
 
            format='dirstate-with-subtree')
 
866
            format='development-subtree')
829
867
        repo.set_make_working_trees(False)
830
868
        # FIXME: we just deleted the workingtree and now we want to use it ????
831
869
        # At a minimum, we should use tree.branch below (but this fails too
897
935
        def evaluate(bzrdir):
898
936
            try:
899
937
                repo = bzrdir.open_repository()
900
 
            except NoRepositoryPresent:
 
938
            except errors.NoRepositoryPresent:
901
939
                return True, bzrdir.root_transport.base
902
940
            else:
903
941
                return False, bzrdir.root_transport.base
954
992
        branch_base = t.clone('branch').base
955
993
        self.assertEqual(branch_base, dir.get_branch_transport(None).base)
956
994
        self.assertEqual(branch_base,
957
 
                         dir.get_branch_transport(bzrlib.branch.BzrBranchFormat5()).base)
 
995
                         dir.get_branch_transport(BzrBranchFormat5()).base)
958
996
        repository_base = t.clone('repository').base
959
997
        self.assertEqual(repository_base, dir.get_repository_transport(None).base)
960
998
        repository_format = repository.format_registry.get_default()
963
1001
        checkout_base = t.clone('checkout').base
964
1002
        self.assertEqual(checkout_base, dir.get_workingtree_transport(None).base)
965
1003
        self.assertEqual(checkout_base,
966
 
                         dir.get_workingtree_transport(workingtree.WorkingTreeFormat3()).base)
 
1004
                         dir.get_workingtree_transport(workingtree_3.WorkingTreeFormat3()).base)
967
1005
 
968
1006
    def test_meta1dir_uses_lockdir(self):
969
1007
        """Meta1 format uses a LockDir to guard the whole directory, not a file."""
977
1015
        Metadirs should compare equal iff they have the same repo, branch and
978
1016
        tree formats.
979
1017
        """
980
 
        mydir = bzrdir.format_registry.make_bzrdir('knit')
 
1018
        mydir = controldir.format_registry.make_bzrdir('knit')
981
1019
        self.assertEqual(mydir, mydir)
982
1020
        self.assertFalse(mydir != mydir)
983
 
        otherdir = bzrdir.format_registry.make_bzrdir('knit')
 
1021
        otherdir = controldir.format_registry.make_bzrdir('knit')
984
1022
        self.assertEqual(otherdir, mydir)
985
1023
        self.assertFalse(otherdir != mydir)
986
 
        otherdir2 = bzrdir.format_registry.make_bzrdir('dirstate-with-subtree')
 
1024
        otherdir2 = controldir.format_registry.make_bzrdir('development-subtree')
987
1025
        self.assertNotEqual(otherdir2, mydir)
988
1026
        self.assertFalse(otherdir2 == mydir)
989
1027
 
 
1028
    def test_with_features(self):
 
1029
        tree = self.make_branch_and_tree('tree', format='2a')
 
1030
        tree.bzrdir.update_feature_flags({"bar": "required"})
 
1031
        self.assertRaises(errors.MissingFeature, bzrdir.BzrDir.open, 'tree')
 
1032
        bzrdir.BzrDirMetaFormat1.register_feature('bar')
 
1033
        self.addCleanup(bzrdir.BzrDirMetaFormat1.unregister_feature, 'bar')
 
1034
        dir = bzrdir.BzrDir.open('tree')
 
1035
        self.assertEquals("required", dir._format.features.get("bar"))
 
1036
        tree.bzrdir.update_feature_flags({"bar": None, "nonexistant": None})
 
1037
        dir = bzrdir.BzrDir.open('tree')
 
1038
        self.assertEquals({}, dir._format.features)
 
1039
 
990
1040
    def test_needs_conversion_different_working_tree(self):
991
1041
        # meta1dirs need an conversion if any element is not the default.
992
 
        new_format = bzrdir.format_registry.make_bzrdir('dirstate')
 
1042
        new_format = controldir.format_registry.make_bzrdir('dirstate')
993
1043
        tree = self.make_branch_and_tree('tree', format='knit')
994
1044
        self.assertTrue(tree.bzrdir.needs_format_conversion(
995
1045
            new_format))
996
1046
 
997
1047
    def test_initialize_on_format_uses_smart_transport(self):
998
1048
        self.setup_smart_server_with_call_log()
999
 
        new_format = bzrdir.format_registry.make_bzrdir('dirstate')
 
1049
        new_format = controldir.format_registry.make_bzrdir('dirstate')
1000
1050
        transport = self.get_transport('target')
1001
1051
        transport.ensure_base()
1002
1052
        self.reset_smart_call_log()
1020
1070
 
1021
1071
    def test_create_branch_convenience(self):
1022
1072
        # outside a repo the default convenience output is a repo+branch_tree
1023
 
        format = bzrdir.format_registry.make_bzrdir('knit')
 
1073
        format = controldir.format_registry.make_bzrdir('knit')
1024
1074
        branch = bzrdir.BzrDir.create_branch_convenience(
1025
1075
            self.get_url('foo'), format=format)
1026
1076
        self.assertRaises(errors.NoWorkingTree,
1029
1079
 
1030
1080
    def test_create_branch_convenience_force_tree_not_local_fails(self):
1031
1081
        # outside a repo the default convenience output is a repo+branch_tree
1032
 
        format = bzrdir.format_registry.make_bzrdir('knit')
 
1082
        format = controldir.format_registry.make_bzrdir('knit')
1033
1083
        self.assertRaises(errors.NotLocalUrl,
1034
1084
            bzrdir.BzrDir.create_branch_convenience,
1035
1085
            self.get_url('foo'),
1040
1090
 
1041
1091
    def test_clone(self):
1042
1092
        # clone into a nonlocal path works
1043
 
        format = bzrdir.format_registry.make_bzrdir('knit')
 
1093
        format = controldir.format_registry.make_bzrdir('knit')
1044
1094
        branch = bzrdir.BzrDir.create_branch_convenience('local',
1045
1095
                                                         format=format)
1046
1096
        branch.bzrdir.open_workingtree()
1057
1107
        my_bzrdir = bzrdir.BzrDir.open(self.get_url('branch-knit2'))
1058
1108
        checkout_format = my_bzrdir.checkout_metadir()
1059
1109
        self.assertIsInstance(checkout_format.workingtree_format,
1060
 
                              workingtree.WorkingTreeFormat3)
 
1110
                              workingtree_4.WorkingTreeFormat4)
1061
1111
 
1062
1112
 
1063
1113
class TestHTTPRedirections(object):
1207
1257
 
1208
1258
    def __init__(self, *args, **kwargs):
1209
1259
        super(_TestBzrDir, self).__init__(*args, **kwargs)
1210
 
        self.test_branch = _TestBranch()
 
1260
        self.test_branch = _TestBranch(self.transport)
1211
1261
        self.test_branch.repository = self.create_repository()
1212
1262
 
1213
 
    def open_branch(self, unsupported=False):
 
1263
    def open_branch(self, unsupported=False, possible_transports=None):
1214
1264
        return self.test_branch
1215
1265
 
1216
1266
    def cloning_metadir(self, require_stacking=False):
1224
1274
class _TestBranch(bzrlib.branch.Branch):
1225
1275
    """Test Branch implementation for TestBzrDirSprout."""
1226
1276
 
1227
 
    def __init__(self, *args, **kwargs):
 
1277
    def __init__(self, transport, *args, **kwargs):
1228
1278
        self._format = _TestBranchFormat()
 
1279
        self._transport = transport
 
1280
        self.base = transport.base
1229
1281
        super(_TestBranch, self).__init__(*args, **kwargs)
1230
1282
        self.calls = []
1231
1283
        self._parent = None
1232
1284
 
1233
1285
    def sprout(self, *args, **kwargs):
1234
1286
        self.calls.append('sprout')
1235
 
        return _TestBranch()
 
1287
        return _TestBranch(self._transport)
1236
1288
 
1237
1289
    def copy_content_into(self, destination, revision_id=None):
1238
1290
        self.calls.append('copy_content_into')
1243
1295
    def get_parent(self):
1244
1296
        return self._parent
1245
1297
 
 
1298
    def _get_config(self):
 
1299
        return config.TransportConfig(self._transport, 'branch.conf')
 
1300
 
 
1301
    def _get_config_store(self):
 
1302
        return config.BranchStore(self)
 
1303
 
1246
1304
    def set_parent(self, parent):
1247
1305
        self._parent = parent
1248
1306
 
1313
1371
        self.assertEqual('fail', err._preformatted_string)
1314
1372
 
1315
1373
    def test_post_repo_init(self):
1316
 
        from bzrlib.bzrdir import RepoInitHookParams
 
1374
        from bzrlib.controldir import RepoInitHookParams
1317
1375
        calls = []
1318
1376
        bzrdir.BzrDir.hooks.install_named_hook('post_repo_init',
1319
1377
            calls.append, None)
1346
1404
            possible_transports=[self._transport])
1347
1405
        self._bzrdir = bzrdir.BzrDir.open_from_transport(self._transport)
1348
1406
 
1349
 
    def test_deprecated_generate_backup_name(self):
1350
 
        res = self.applyDeprecated(
1351
 
                symbol_versioning.deprecated_in((2, 3, 0)),
1352
 
                self._bzrdir.generate_backup_name, 'whatever')
1353
 
 
1354
1407
    def test_new(self):
1355
1408
        self.assertEqual("a.~1~", self._bzrdir._available_backup_name("a"))
1356
1409
 
1358
1411
        self._transport.put_bytes("a.~1~", "some content")
1359
1412
        self.assertEqual("a.~2~", self._bzrdir._available_backup_name("a"))
1360
1413
 
 
1414
 
 
1415
class TestMeta1DirColoFormat(TestCaseWithTransport):
 
1416
    """Tests specific to the meta1 dir with colocated branches format."""
 
1417
 
 
1418
    def test_supports_colo(self):
 
1419
        format = bzrdir.BzrDirMetaFormat1Colo()
 
1420
        self.assertTrue(format.colocated_branches)
 
1421
 
 
1422
    def test_upgrade_from_2a(self):
 
1423
        tree = self.make_branch_and_tree('.', format='2a')
 
1424
        format = bzrdir.BzrDirMetaFormat1Colo()
 
1425
        self.assertTrue(tree.bzrdir.needs_format_conversion(format))
 
1426
        converter = tree.bzrdir._format.get_converter(format)
 
1427
        result = converter.convert(tree.bzrdir, None)
 
1428
        self.assertIsInstance(result._format, bzrdir.BzrDirMetaFormat1Colo)
 
1429
        self.assertFalse(result.needs_format_conversion(format))
 
1430
 
 
1431
    def test_downgrade_to_2a(self):
 
1432
        tree = self.make_branch_and_tree('.', format='development-colo')
 
1433
        format = bzrdir.BzrDirMetaFormat1()
 
1434
        self.assertTrue(tree.bzrdir.needs_format_conversion(format))
 
1435
        converter = tree.bzrdir._format.get_converter(format)
 
1436
        result = converter.convert(tree.bzrdir, None)
 
1437
        self.assertIsInstance(result._format, bzrdir.BzrDirMetaFormat1)
 
1438
        self.assertFalse(result.needs_format_conversion(format))
 
1439
 
 
1440
    def test_downgrade_to_2a_too_many_branches(self):
 
1441
        tree = self.make_branch_and_tree('.', format='development-colo')
 
1442
        tree.bzrdir.create_branch(name="another-colocated-branch")
 
1443
        converter = tree.bzrdir._format.get_converter(
 
1444
            bzrdir.BzrDirMetaFormat1())
 
1445
        result = converter.convert(tree.bzrdir, bzrdir.BzrDirMetaFormat1())
 
1446
        self.assertIsInstance(result._format, bzrdir.BzrDirMetaFormat1)
 
1447
 
 
1448
    def test_nested(self):
 
1449
        tree = self.make_branch_and_tree('.', format='development-colo')
 
1450
        tree.bzrdir.create_branch(name='foo')
 
1451
        tree.bzrdir.create_branch(name='fool/bla')
 
1452
        self.assertRaises(
 
1453
            errors.ParentBranchExists, tree.bzrdir.create_branch,
 
1454
            name='foo/bar')
 
1455
 
 
1456
    def test_parent(self):
 
1457
        tree = self.make_branch_and_tree('.', format='development-colo')
 
1458
        tree.bzrdir.create_branch(name='fool/bla')
 
1459
        tree.bzrdir.create_branch(name='foo/bar')
 
1460
        self.assertRaises(
 
1461
            errors.AlreadyBranchError, tree.bzrdir.create_branch,
 
1462
            name='foo')
 
1463
 
 
1464
 
 
1465
class SampleBzrFormat(bzrdir.BzrFormat):
 
1466
 
 
1467
    @classmethod
 
1468
    def get_format_string(cls):
 
1469
        return "First line\n"
 
1470
 
 
1471
 
 
1472
class TestBzrFormat(TestCase):
 
1473
    """Tests for BzrFormat."""
 
1474
 
 
1475
    def test_as_string(self):
 
1476
        format = SampleBzrFormat()
 
1477
        format.features = {"foo": "required"}
 
1478
        self.assertEquals(format.as_string(),
 
1479
            "First line\n"
 
1480
            "required foo\n")
 
1481
        format.features["another"] = "optional"
 
1482
        self.assertEquals(format.as_string(),
 
1483
            "First line\n"
 
1484
            "required foo\n"
 
1485
            "optional another\n")
 
1486
 
 
1487
    def test_network_name(self):
 
1488
        # The network string should include the feature info
 
1489
        format = SampleBzrFormat()
 
1490
        format.features = {"foo": "required"}
 
1491
        self.assertEquals(
 
1492
            "First line\nrequired foo\n",
 
1493
            format.network_name())
 
1494
 
 
1495
    def test_from_string_no_features(self):
 
1496
        # No features
 
1497
        format = SampleBzrFormat.from_string(
 
1498
            "First line\n")
 
1499
        self.assertEquals({}, format.features)
 
1500
 
 
1501
    def test_from_string_with_feature(self):
 
1502
        # Proper feature
 
1503
        format = SampleBzrFormat.from_string(
 
1504
            "First line\nrequired foo\n")
 
1505
        self.assertEquals("required", format.features.get("foo"))
 
1506
 
 
1507
    def test_from_string_format_string_mismatch(self):
 
1508
        # The first line has to match the format string
 
1509
        self.assertRaises(AssertionError, SampleBzrFormat.from_string,
 
1510
            "Second line\nrequired foo\n")
 
1511
 
 
1512
    def test_from_string_missing_space(self):
 
1513
        # At least one space is required in the feature lines
 
1514
        self.assertRaises(errors.ParseFormatError, SampleBzrFormat.from_string,
 
1515
            "First line\nfoo\n")
 
1516
 
 
1517
    def test_from_string_with_spaces(self):
 
1518
        # Feature with spaces (in case we add stuff like this in the future)
 
1519
        format = SampleBzrFormat.from_string(
 
1520
            "First line\nrequired foo with spaces\n")
 
1521
        self.assertEquals("required", format.features.get("foo with spaces"))
 
1522
 
 
1523
    def test_eq(self):
 
1524
        format1 = SampleBzrFormat()
 
1525
        format1.features = {"nested-trees": "optional"}
 
1526
        format2 = SampleBzrFormat()
 
1527
        format2.features = {"nested-trees": "optional"}
 
1528
        self.assertEquals(format1, format1)
 
1529
        self.assertEquals(format1, format2)
 
1530
        format3 = SampleBzrFormat()
 
1531
        self.assertNotEquals(format1, format3)
 
1532
 
 
1533
    def test_check_support_status_optional(self):
 
1534
        # Optional, so silently ignore
 
1535
        format = SampleBzrFormat()
 
1536
        format.features = {"nested-trees": "optional"}
 
1537
        format.check_support_status(True)
 
1538
        self.addCleanup(SampleBzrFormat.unregister_feature, "nested-trees")
 
1539
        SampleBzrFormat.register_feature("nested-trees")
 
1540
        format.check_support_status(True)
 
1541
 
 
1542
    def test_check_support_status_required(self):
 
1543
        # Optional, so trigger an exception
 
1544
        format = SampleBzrFormat()
 
1545
        format.features = {"nested-trees": "required"}
 
1546
        self.assertRaises(errors.MissingFeature, format.check_support_status,
 
1547
            True)
 
1548
        self.addCleanup(SampleBzrFormat.unregister_feature, "nested-trees")
 
1549
        SampleBzrFormat.register_feature("nested-trees")
 
1550
        format.check_support_status(True)
 
1551
 
 
1552
    def test_check_support_status_unknown(self):
 
1553
        # treat unknown necessity as required
 
1554
        format = SampleBzrFormat()
 
1555
        format.features = {"nested-trees": "unknown"}
 
1556
        self.assertRaises(errors.MissingFeature, format.check_support_status,
 
1557
            True)
 
1558
        self.addCleanup(SampleBzrFormat.unregister_feature, "nested-trees")
 
1559
        SampleBzrFormat.register_feature("nested-trees")
 
1560
        format.check_support_status(True)
 
1561
 
 
1562
    def test_feature_already_registered(self):
 
1563
        # a feature can only be registered once
 
1564
        self.addCleanup(SampleBzrFormat.unregister_feature, "nested-trees")
 
1565
        SampleBzrFormat.register_feature("nested-trees")
 
1566
        self.assertRaises(errors.FeatureAlreadyRegistered,
 
1567
            SampleBzrFormat.register_feature, "nested-trees")
 
1568
 
 
1569
    def test_feature_with_space(self):
 
1570
        # spaces are not allowed in feature names
 
1571
        self.assertRaises(ValueError, SampleBzrFormat.register_feature,
 
1572
            "nested trees")