1
# Copyright (C) 2006-2010 Canonical Ltd
1
# Copyright (C) 2005, 2006, 2007, 2008, 2009 Canonical Ltd
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
91
class ControlComponent(object):
92
"""Abstract base class for control directory components.
94
This provides interfaces that are common across bzrdirs,
95
repositories, branches, and workingtree control directories.
97
They all expose two urls and transports: the *user* URL is the
98
one that stops above the control directory (eg .bzr) and that
99
should normally be used in messages, and the *control* URL is
100
under that in eg .bzr/checkout and is used to read the control
103
This can be used as a mixin and is intended to fit with
108
def control_transport(self):
109
raise NotImplementedError
112
def control_url(self):
113
return self.control_transport.base
116
def user_transport(self):
117
raise NotImplementedError
121
return self.user_transport.base
124
class BzrDir(ControlComponent):
125
91
"""A .bzr control diretory.
127
93
BzrDir instances let you create or open any of the things that can be
294
260
# copied, and finally if we are copying up to a specific
295
261
# revision_id then we can use the pending-ancestry-result which
296
262
# does not require traversing all of history to describe it.
297
if (result_repo.user_url == result.user_url
298
and not require_stacking and
263
if (result_repo.bzrdir.root_transport.base ==
264
result.root_transport.base and not require_stacking and
299
265
revision_id is not None):
300
266
fetch_spec = graph.PendingAncestryResult(
301
267
[revision_id], local_repo)
388
354
for subdir in sorted(subdirs, reverse=True):
389
355
pending.append(current_transport.clone(subdir))
391
def list_branches(self):
392
"""Return a sequence of all branches local to this control directory.
396
return [self.open_branch()]
397
except errors.NotBranchError:
401
358
def find_branches(transport):
402
359
"""Find all branches under a transport.
414
371
except errors.NoRepositoryPresent:
417
return False, ([], repository)
418
return True, (bzrdir.list_branches(), None)
420
for branches, repo in BzrDir.find_bzrdirs(transport,
374
return False, (None, repository)
376
branch = bzrdir.open_branch()
377
except errors.NotBranchError:
378
return True, (None, None)
380
return True, (branch, None)
382
for branch, repo in BzrDir.find_bzrdirs(transport, evaluate=evaluate):
422
383
if repo is not None:
423
ret.extend(repo.find_branches())
424
if branches is not None:
384
branches.extend(repo.find_branches())
385
if branch is not None:
386
branches.append(branch)
428
389
def destroy_repository(self):
429
390
"""Destroy the repository in this BzrDir"""
430
391
raise NotImplementedError(self.destroy_repository)
432
def create_branch(self, name=None):
393
def create_branch(self):
433
394
"""Create a branch in this BzrDir.
435
:param name: Name of the colocated branch to create, None for
438
396
The bzrdir's format will control what branch format is created.
439
397
For more control see BranchFormatXX.create(a_bzrdir).
441
399
raise NotImplementedError(self.create_branch)
443
def destroy_branch(self, name=None):
444
"""Destroy a branch in this BzrDir.
446
:param name: Name of the branch to destroy, None for the default
401
def destroy_branch(self):
402
"""Destroy the branch in this BzrDir"""
449
403
raise NotImplementedError(self.destroy_branch)
499
453
except errors.NoRepositoryPresent:
500
454
repository = None
502
if (found_bzrdir.user_url != self.user_url
503
and not repository.is_shared()):
456
if ((found_bzrdir.root_transport.base !=
457
self.root_transport.base) and not repository.is_shared()):
504
458
# Don't look higher, can't use a higher shared repo.
505
459
repository = None
621
575
:return: Tuple with old path name and new path name
623
def name_gen(base='backup.bzr'):
625
name = "%s.~%d~" % (base, counter)
626
while self.root_transport.has(name):
628
name = "%s.~%d~" % (base, counter)
631
backup_dir=name_gen()
632
577
pb = ui.ui_factory.nested_progress_bar()
634
579
# FIXME: bug 300001 -- the backup fails if the backup directory
635
580
# already exists, but it should instead either remove it or make
636
581
# a new backup directory.
583
# FIXME: bug 262450 -- the backup directory should have the same
584
# permissions as the .bzr directory (probably a bug in copy_tree)
638
585
old_path = self.root_transport.abspath('.bzr')
639
new_path = self.root_transport.abspath(backup_dir)
586
new_path = self.root_transport.abspath('backup.bzr')
640
587
ui.ui_factory.note('making backup of %s\n to %s' % (old_path, new_path,))
641
self.root_transport.copy_tree('.bzr', backup_dir)
588
self.root_transport.copy_tree('.bzr', 'backup.bzr')
642
589
return (old_path, new_path)
704
651
next_transport = found_bzrdir.root_transport.clone('..')
705
if (found_bzrdir.user_url == next_transport.base):
652
if (found_bzrdir.root_transport.base == next_transport.base):
706
653
# top of the file system
708
655
# find the next containing bzrdir
725
672
repository = found_bzrdir.open_repository()
726
673
except errors.NoRepositoryPresent:
727
674
return None, False
728
if found_bzrdir.user_url == self.user_url:
675
if found_bzrdir.root_transport.base == self.root_transport.base:
729
676
return repository, True
730
677
elif repository.is_shared():
731
678
return repository, True
749
def get_branch_transport(self, branch_format, name=None):
696
def get_branch_transport(self, branch_format):
750
697
"""Get the transport for use by branch format in this BzrDir.
752
699
Note that bzr dirs that do not support format strings will raise
847
794
:param _transport: the transport this dir is based at.
849
796
self._format = _format
850
# these are also under the more standard names of
851
# control_transport and user_transport
852
797
self.transport = _transport.clone('.bzr')
853
798
self.root_transport = _transport
854
799
self._mode_check_done = False
857
def user_transport(self):
858
return self.root_transport
861
def control_transport(self):
862
return self.transport
864
801
def is_control_filename(self, filename):
865
802
"""True if filename is the name of a path which is reserved for bzrdir's.
940
877
BzrDir._check_supported(format, _unsupported)
941
878
return format.open(transport, _found=True)
943
def open_branch(self, name=None, unsupported=False,
944
ignore_fallbacks=False):
880
def open_branch(self, unsupported=False, ignore_fallbacks=False):
945
881
"""Open the branch object at this BzrDir if one is present.
947
883
If unsupported is True, then no longer supported branch formats can
1086
1022
raise NotImplementedError(self.open_workingtree)
1088
def has_branch(self, name=None):
1024
def has_branch(self):
1089
1025
"""Tell if this bzrdir contains a branch.
1091
1027
Note: if you're going to open the branch, you should just go ahead
1373
1309
self.create_hook(hooks.HookPoint('pre_open',
1374
1310
"Invoked before attempting to open a BzrDir with the transport "
1375
1311
"that the open will use.", (1, 14), None))
1376
self.create_hook(hooks.HookPoint('post_repo_init',
1377
"Invoked after a repository has been initialized. "
1378
"post_repo_init is called with a "
1379
"bzrlib.bzrdir.RepoInitHookParams.",
1382
1313
# install the default hooks
1383
1314
BzrDir.hooks = BzrDirHooks()
1386
class RepoInitHookParams(object):
1387
"""Object holding parameters passed to *_repo_init hooks.
1389
There are 4 fields that hooks may wish to access:
1391
:ivar repository: Repository created
1392
:ivar format: Repository format
1393
:ivar bzrdir: The bzrdir for the repository
1394
:ivar shared: The repository is shared
1397
def __init__(self, repository, format, a_bzrdir, shared):
1398
"""Create a group of RepoInitHook parameters.
1400
:param repository: Repository created
1401
:param format: Repository format
1402
:param bzrdir: The bzrdir for the repository
1403
:param shared: The repository is shared
1405
self.repository = repository
1406
self.format = format
1407
self.bzrdir = a_bzrdir
1408
self.shared = shared
1410
def __eq__(self, other):
1411
return self.__dict__ == other.__dict__
1415
return "<%s for %s>" % (self.__class__.__name__,
1418
return "<%s for %s>" % (self.__class__.__name__,
1422
1317
class BzrDirPreSplitOut(BzrDir):
1423
1318
"""A common class for the all-in-one formats."""
1463
1358
tree.clone(result)
1466
def create_branch(self, name=None):
1361
def create_branch(self):
1467
1362
"""See BzrDir.create_branch."""
1468
return self._format.get_branch_format().initialize(self, name=name)
1363
return self._format.get_branch_format().initialize(self)
1470
def destroy_branch(self, name=None):
1365
def destroy_branch(self):
1471
1366
"""See BzrDir.destroy_branch."""
1472
1367
raise errors.UnsupportedOperation(self.destroy_branch, self)
1529
1424
raise errors.UnsupportedOperation(self.destroy_workingtree_metadata,
1532
def get_branch_transport(self, branch_format, name=None):
1427
def get_branch_transport(self, branch_format):
1533
1428
"""See BzrDir.get_branch_transport()."""
1534
if name is not None:
1535
raise errors.NoColocatedBranchSupport(self)
1536
1429
if branch_format is None:
1537
1430
return self.transport
1571
1464
format = BzrDirFormat.get_default_format()
1572
1465
return not isinstance(self._format, format.__class__)
1574
def open_branch(self, name=None, unsupported=False,
1575
ignore_fallbacks=False):
1467
def open_branch(self, unsupported=False, ignore_fallbacks=False):
1576
1468
"""See BzrDir.open_branch."""
1577
1469
from bzrlib.branch import BzrBranchFormat4
1578
1470
format = BzrBranchFormat4()
1579
1471
self._check_supported(format, unsupported)
1580
return format.open(self, name, _found=True)
1472
return format.open(self, _found=True)
1582
1474
def sprout(self, url, revision_id=None, force_new_repo=False,
1583
1475
possible_transports=None, accelerator_tree=None,
1644
1536
This is a deprecated format and may be removed after sept 2006.
1647
def has_workingtree(self):
1648
"""See BzrDir.has_workingtree."""
1651
1539
def open_repository(self):
1652
1540
"""See BzrDir.open_repository."""
1653
1541
from bzrlib.repofmt.weaverepo import RepositoryFormat5
1669
1557
This is a deprecated format and may be removed after sept 2006.
1672
def has_workingtree(self):
1673
"""See BzrDir.has_workingtree."""
1676
1560
def open_repository(self):
1677
1561
"""See BzrDir.open_repository."""
1678
1562
from bzrlib.repofmt.weaverepo import RepositoryFormat6
1700
1584
"""See BzrDir.can_convert_format()."""
1703
def create_branch(self, name=None):
1587
def create_branch(self):
1704
1588
"""See BzrDir.create_branch."""
1705
return self._format.get_branch_format().initialize(self, name=name)
1589
return self._format.get_branch_format().initialize(self)
1707
def destroy_branch(self, name=None):
1591
def destroy_branch(self):
1708
1592
"""See BzrDir.create_branch."""
1709
if name is not None:
1710
raise errors.NoColocatedBranchSupport(self)
1711
1593
self.transport.delete_tree('branch')
1713
1595
def create_repository(self, shared=False):
1756
1638
format = BranchFormat.find_format(self)
1757
1639
return format.get_reference(self)
1759
def get_branch_transport(self, branch_format, name=None):
1641
def get_branch_transport(self, branch_format):
1760
1642
"""See BzrDir.get_branch_transport()."""
1761
if name is not None:
1762
raise errors.NoColocatedBranchSupport(self)
1763
1643
# XXX: this shouldn't implicitly create the directory if it's just
1764
1644
# promising to get a transport -- mbp 20090727
1765
1645
if branch_format is None:
1803
1683
return self.transport.clone('checkout')
1805
def has_workingtree(self):
1806
"""Tell if this bzrdir contains a working tree.
1808
This will still raise an exception if the bzrdir has a workingtree that
1809
is remote & inaccessible.
1811
Note: if you're going to open the working tree, you should just go
1812
ahead and try, and not ask permission first.
1814
from bzrlib.workingtree import WorkingTreeFormat
1816
WorkingTreeFormat.find_format(self)
1817
except errors.NoWorkingTree:
1821
1685
def needs_format_conversion(self, format=None):
1822
1686
"""See BzrDir.needs_format_conversion()."""
1823
1687
if format is None:
1837
1701
except errors.NoRepositoryPresent:
1839
for branch in self.list_branches():
1840
if not isinstance(branch._format,
1704
if not isinstance(self.open_branch()._format,
1841
1705
format.get_branch_format().__class__):
1842
1706
# the branch needs an upgrade.
1708
except errors.NotBranchError:
1845
1711
my_wt = self.open_workingtree(recommend_upgrade=False)
1846
1712
if not isinstance(my_wt._format,
1854
def open_branch(self, name=None, unsupported=False,
1855
ignore_fallbacks=False):
1720
def open_branch(self, unsupported=False, ignore_fallbacks=False):
1856
1721
"""See BzrDir.open_branch."""
1857
1722
format = self.find_branch_format()
1858
1723
self._check_supported(format, unsupported)
1859
return format.open(self, name=name,
1860
_found=True, ignore_fallbacks=ignore_fallbacks)
1724
return format.open(self, _found=True, ignore_fallbacks=ignore_fallbacks)
1862
1726
def open_repository(self, unsupported=False):
1863
1727
"""See BzrDir.open_repository."""
1895
1759
Once a format is deprecated, just deprecate the initialize and open
1896
1760
methods on the format class. Do not deprecate the object, as the
1897
1761
object will be created every system load.
1899
:cvar colocated_branches: Whether this formats supports colocated branches.
1902
1764
_default_format = None
1920
1782
_lock_file_name = 'branch-lock'
1922
colocated_branches = False
1923
"""Whether co-located branches are supported for this control dir format.
1926
1784
# _lock_class must be set in subclasses to the lock type, typ.
1927
1785
# TransportLock or LockDir
1945
1803
def probe_transport(klass, transport):
1946
1804
"""Return the .bzrdir style format present in a directory."""
1948
format_string = transport.get_bytes(".bzr/branch-format")
1806
format_string = transport.get(".bzr/branch-format").read()
1949
1807
except errors.NoSuchFile:
1950
1808
raise errors.NotBranchError(path=transport.base)
2727
2585
def convert(self, to_convert, pb):
2728
2586
"""See Converter.convert()."""
2729
2587
self.bzrdir = to_convert
2731
warnings.warn("pb parameter to convert() is deprecated")
2732
self.pb = ui.ui_factory.nested_progress_bar()
2734
ui.ui_factory.note('starting upgrade from format 4 to 5')
2735
if isinstance(self.bzrdir.transport, local.LocalTransport):
2736
self.bzrdir.get_workingtree_transport(None).delete('stat-cache')
2737
self._convert_to_weaves()
2738
return BzrDir.open(self.bzrdir.user_url)
2589
ui.ui_factory.note('starting upgrade from format 4 to 5')
2590
if isinstance(self.bzrdir.transport, local.LocalTransport):
2591
self.bzrdir.get_workingtree_transport(None).delete('stat-cache')
2592
self._convert_to_weaves()
2593
return BzrDir.open(self.bzrdir.root_transport.base)
2742
2595
def _convert_to_weaves(self):
2743
2596
ui.ui_factory.note('note: upgrade may be faster if all store files are ungzipped first')
2984
2837
def convert(self, to_convert, pb):
2985
2838
"""See Converter.convert()."""
2986
2839
self.bzrdir = to_convert
2987
pb = ui.ui_factory.nested_progress_bar()
2989
ui.ui_factory.note('starting upgrade from format 5 to 6')
2990
self._convert_to_prefixed()
2991
return BzrDir.open(self.bzrdir.user_url)
2841
ui.ui_factory.note('starting upgrade from format 5 to 6')
2842
self._convert_to_prefixed()
2843
return BzrDir.open(self.bzrdir.root_transport.base)
2995
2845
def _convert_to_prefixed(self):
2996
2846
from bzrlib.store import TransportStore
3029
2879
from bzrlib.repofmt.weaverepo import RepositoryFormat7
3030
2880
from bzrlib.branch import BzrBranchFormat5
3031
2881
self.bzrdir = to_convert
3032
self.pb = ui.ui_factory.nested_progress_bar()
3034
2884
self.total = 20 # the steps we know about
3035
2885
self.garbage_inventories = []
3115
2965
'branch-format',
3116
2966
BzrDirMetaFormat1().get_format_string(),
3117
2967
mode=self.file_mode)
3119
return BzrDir.open(self.bzrdir.user_url)
2968
return BzrDir.open(self.bzrdir.root_transport.base)
3121
2970
def make_lock(self, name):
3122
2971
"""Make a lock for the new control dir name."""
3157
3006
def convert(self, to_convert, pb):
3158
3007
"""See Converter.convert()."""
3159
3008
self.bzrdir = to_convert
3160
self.pb = ui.ui_factory.nested_progress_bar()
3163
3012
self.step('checking repository format')
3171
3020
ui.ui_factory.note('starting repository conversion')
3172
3021
converter = CopyConverter(self.target_format.repository_format)
3173
3022
converter.convert(repo, pb)
3174
for branch in self.bzrdir.list_branches():
3024
branch = self.bzrdir.open_branch()
3025
except errors.NotBranchError:
3175
3028
# TODO: conversions of Branch and Tree should be done by
3176
3029
# InterXFormat lookups/some sort of registry.
3177
3030
# Avoid circular imports
3233
3085
def __init__(self):
3234
3086
BzrDirMetaFormat1.__init__(self)
3235
# XXX: It's a bit ugly that the network name is here, because we'd
3236
# like to believe that format objects are stateless or at least
3237
# immutable, However, we do at least avoid mutating the name after
3238
# it's returned. See <https://bugs.edge.launchpad.net/bzr/+bug/504102>
3239
3087
self._network_name = None
3242
return "%s(_network_name=%r)" % (self.__class__.__name__,
3245
3089
def get_format_description(self):
3246
if self._network_name:
3247
real_format = network_format_registry.get(self._network_name)
3248
return 'Remote: ' + real_format.get_format_description()
3249
3090
return 'bzr remote bzrdir'
3251
3092
def get_format_string(self):
3384
3225
args.append(self._serialize_NoneString(repo_format_name))
3385
3226
args.append(self._serialize_NoneTrueFalse(make_working_trees))
3386
3227
args.append(self._serialize_NoneTrueFalse(shared_repo))
3387
request_network_name = self._network_name or \
3228
if self._network_name is None:
3229
self._network_name = \
3388
3230
BzrDirFormat.get_default_format().network_name()
3390
3232
response = client.call('BzrDirFormat.initialize_ex_1.16',
3391
request_network_name, path, *args)
3233
self.network_name(), path, *args)
3392
3234
except errors.UnknownSmartMethod:
3393
3235
client._medium._remember_remote_is_before((1,16))
3394
3236
local_dir_format = BzrDirMetaFormat1()
3644
3486
experimental_pairs.append((key, help))
3646
3488
output += wrapped(key, help, info)
3647
output += "\nSee :doc:`formats-help` for more about storage formats."
3489
output += "\nSee ``bzr help formats`` for more about storage formats."
3648
3490
other_output = ""
3649
3491
if len(experimental_pairs) > 0:
3650
3492
other_output += "Experimental formats are shown below.\n\n"
3704
3546
stack_on = urlutils.rebase_url(self._stack_on,
3705
3547
self._stack_on_pwd,
3548
branch.bzrdir.root_transport.base)
3707
3549
except errors.InvalidRebaseURLs:
3708
3550
stack_on = self._get_full_stack_on()
3838
3680
format_registry.register('weave', BzrDirFormat6,
3839
3681
'Pre-0.8 format. Slower than knit and does not'
3840
3682
' support checkouts or shared repositories.',
3842
3683
deprecated=True)
3843
3684
format_registry.register_metadir('metaweave',
3844
3685
'bzrlib.repofmt.weaverepo.RepositoryFormat7',
3845
3686
'Transitional format in 0.8. Slower than knit.',
3846
3687
branch_format='bzrlib.branch.BzrBranchFormat5',
3847
3688
tree_format='bzrlib.workingtree.WorkingTreeFormat3',
3849
3689
deprecated=True)
3850
3690
format_registry.register_metadir('knit',
3851
3691
'bzrlib.repofmt.knitrepo.RepositoryFormatKnit1',
3852
3692
'Format using knits. Recommended for interoperation with bzr <= 0.14.',
3853
3693
branch_format='bzrlib.branch.BzrBranchFormat5',
3854
3694
tree_format='bzrlib.workingtree.WorkingTreeFormat3',
3856
3695
deprecated=True)
3857
3696
format_registry.register_metadir('dirstate',
3858
3697
'bzrlib.repofmt.knitrepo.RepositoryFormatKnit1',
3862
3701
# this uses bzrlib.workingtree.WorkingTreeFormat4 because importing
3863
3702
# directly from workingtree_4 triggers a circular import.
3864
3703
tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3866
3704
deprecated=True)
3867
3705
format_registry.register_metadir('dirstate-tags',
3868
3706
'bzrlib.repofmt.knitrepo.RepositoryFormatKnit1',
3871
3709
' Incompatible with bzr < 0.15.',
3872
3710
branch_format='bzrlib.branch.BzrBranchFormat6',
3873
3711
tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3875
3712
deprecated=True)
3876
3713
format_registry.register_metadir('rich-root',
3877
3714
'bzrlib.repofmt.knitrepo.RepositoryFormatKnit4',
3880
3717
branch_format='bzrlib.branch.BzrBranchFormat6',
3881
3718
tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3883
3719
deprecated=True)
3884
3720
format_registry.register_metadir('dirstate-with-subtree',
3885
3721
'bzrlib.repofmt.knitrepo.RepositoryFormatKnit3',
3896
3732
help='New in 0.92: Pack-based format with data compatible with '
3897
3733
'dirstate-tags format repositories. Interoperates with '
3898
3734
'bzr repositories before 0.92 but cannot be read by bzr < 0.92. '
3735
'Previously called knitpack-experimental. '
3736
'For more information, see '
3737
'http://doc.bazaar-vcs.org/latest/developers/packrepo.html.',
3900
3738
branch_format='bzrlib.branch.BzrBranchFormat6',
3901
3739
tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3905
3743
help='New in 0.92: Pack-based format with data compatible with '
3906
3744
'dirstate-with-subtree format repositories. Interoperates with '
3907
3745
'bzr repositories before 0.92 but cannot be read by bzr < 0.92. '
3746
'Previously called knitpack-experimental. '
3747
'For more information, see '
3748
'http://doc.bazaar-vcs.org/latest/developers/packrepo.html.',
3909
3749
branch_format='bzrlib.branch.BzrBranchFormat6',
3910
3750
tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3917
3757
'(needed for bzr-svn and bzr-git).',
3918
3758
branch_format='bzrlib.branch.BzrBranchFormat6',
3919
3759
tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3922
3761
format_registry.register_metadir('1.6',
3923
3762
'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack5',
3926
3765
'not present locally.',
3927
3766
branch_format='bzrlib.branch.BzrBranchFormat7',
3928
3767
tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3931
3769
format_registry.register_metadir('1.6.1-rich-root',
3932
3770
'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack5RichRoot',
3934
3772
'(needed for bzr-svn and bzr-git).',
3935
3773
branch_format='bzrlib.branch.BzrBranchFormat7',
3936
3774
tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3939
3776
format_registry.register_metadir('1.9',
3940
3777
'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack6',
3943
3780
'performance for most operations.',
3944
3781
branch_format='bzrlib.branch.BzrBranchFormat7',
3945
3782
tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3948
3784
format_registry.register_metadir('1.9-rich-root',
3949
3785
'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack6RichRoot',
3951
3787
'(needed for bzr-svn and bzr-git).',
3952
3788
branch_format='bzrlib.branch.BzrBranchFormat7',
3953
3789
tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3956
3791
format_registry.register_metadir('1.14',
3957
3792
'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack6',
3973
3808
'to and from rich-root-pack (and anything compatible with '
3974
3809
'rich-root-pack) format repositories. Repositories and branches in '
3975
3810
'this format can only be read by bzr.dev. Please read '
3976
'http://doc.bazaar.canonical.com/latest/developers/development-repo.html '
3811
'http://doc.bazaar-vcs.org/latest/developers/development-repo.html '
3978
3813
branch_format='bzrlib.branch.BzrBranchFormat7',
3979
3814
tree_format='bzrlib.workingtree.WorkingTreeFormat6',
3980
3815
experimental=True,
3984
3818
format_registry.register_metadir('development-subtree',
3985
3819
'bzrlib.repofmt.pack_repo.RepositoryFormatPackDevelopment2Subtree',
3987
3821
'from pack-0.92-subtree (and anything compatible with '
3988
3822
'pack-0.92-subtree) format repositories. Repositories and branches in '
3989
3823
'this format can only be read by bzr.dev. Please read '
3990
'http://doc.bazaar.canonical.com/latest/developers/development-repo.html '
3824
'http://doc.bazaar-vcs.org/latest/developers/development-repo.html '
3992
3826
branch_format='bzrlib.branch.BzrBranchFormat7',
3993
3827
tree_format='bzrlib.workingtree.WorkingTreeFormat6',
3994
3828
experimental=True,
3996
3829
alias=False, # Restore to being an alias when an actual development subtree format is added
3997
3830
# This current non-alias status is simply because we did not introduce a
3998
3831
# chk based subtree format.
4003
3836
'bzrlib.repofmt.groupcompress_repo.RepositoryFormatCHK1',
4004
3837
help='pack-1.9 with 255-way hashed CHK inv, group compress, rich roots '
4006
'http://doc.bazaar.canonical.com/latest/developers/development-repo.html '
3839
'http://doc.bazaar-vcs.org/latest/developers/development-repo.html '
4008
3841
branch_format='bzrlib.branch.BzrBranchFormat7',
4009
3842
tree_format='bzrlib.workingtree.WorkingTreeFormat6',
4015
3848
'bzrlib.repofmt.groupcompress_repo.RepositoryFormatCHK2',
4016
3849
help='pack-1.9 with 255-way hashed CHK inv, bencode revision, group compress, '
4017
3850
'rich roots. Please read '
4018
'http://doc.bazaar.canonical.com/latest/developers/development-repo.html '
3851
'http://doc.bazaar-vcs.org/latest/developers/development-repo.html '
4020
3853
branch_format='bzrlib.branch.BzrBranchFormat7',
4021
3854
tree_format='bzrlib.workingtree.WorkingTreeFormat6',