233
232
t = _mod_transport.get_transport(url)
236
def find_bzrdirs(transport, evaluate=None, list_current=None):
237
"""Find bzrdirs recursively from current location.
239
This is intended primarily as a building block for more sophisticated
240
functionality, like finding trees under a directory, or finding
241
branches that use a given repository.
243
:param evaluate: An optional callable that yields recurse, value,
244
where recurse controls whether this bzrdir is recursed into
245
and value is the value to yield. By default, all bzrdirs
246
are recursed into, and the return value is the bzrdir.
247
:param list_current: if supplied, use this function to list the current
248
directory, instead of Transport.list_dir
249
:return: a generator of found bzrdirs, or whatever evaluate returns.
251
if list_current is None:
252
def list_current(transport):
253
return transport.list_dir('')
255
def evaluate(bzrdir):
258
pending = [transport]
259
while len(pending) > 0:
260
current_transport = pending.pop()
263
bzrdir = BzrDir.open_from_transport(current_transport)
264
except (errors.NotBranchError, errors.PermissionDenied):
267
recurse, value = evaluate(bzrdir)
270
subdirs = list_current(current_transport)
271
except (errors.NoSuchFile, errors.PermissionDenied):
274
for subdir in sorted(subdirs, reverse=True):
275
pending.append(current_transport.clone(subdir))
278
def find_branches(transport):
279
"""Find all branches under a transport.
281
This will find all branches below the transport, including branches
282
inside other branches. Where possible, it will use
283
Repository.find_branches.
285
To list all the branches that use a particular Repository, see
286
Repository.find_branches
288
def evaluate(bzrdir):
290
repository = bzrdir.open_repository()
291
except errors.NoRepositoryPresent:
294
return False, ([], repository)
295
return True, (bzrdir.list_branches(), None)
297
for branches, repo in BzrDir.find_bzrdirs(transport,
300
ret.extend(repo.find_branches())
301
if branches is not None:
306
def create_branch_and_repo(base, force_new_repo=False, format=None):
307
"""Create a new BzrDir, Branch and Repository at the url 'base'.
309
This will use the current default BzrDirFormat unless one is
310
specified, and use whatever
311
repository format that that uses via bzrdir.create_branch and
312
create_repository. If a shared repository is available that is used
315
The created Branch object is returned.
317
:param base: The URL to create the branch at.
318
:param force_new_repo: If True a new repository is always created.
319
:param format: If supplied, the format of branch to create. If not
320
supplied, the default is used.
322
bzrdir = BzrDir.create(base, format)
323
bzrdir._find_or_create_repository(force_new_repo)
324
return bzrdir.create_branch()
236
326
def determine_repository_policy(self, force_new_repo=False, stack_on=None,
237
327
stack_on_pwd=None, require_stacking=False):
238
328
"""Return an object representing a policy to use.
549
def create_branch_convenience(base, force_new_repo=False,
550
force_new_tree=None, format=None,
551
possible_transports=None):
552
"""Create a new BzrDir, Branch and Repository at the url 'base'.
554
This is a convenience function - it will use an existing repository
555
if possible, can be told explicitly whether to create a working tree or
558
This will use the current default BzrDirFormat unless one is
559
specified, and use whatever
560
repository format that that uses via bzrdir.create_branch and
561
create_repository. If a shared repository is available that is used
562
preferentially. Whatever repository is used, its tree creation policy
565
The created Branch object is returned.
566
If a working tree cannot be made due to base not being a file:// url,
567
no error is raised unless force_new_tree is True, in which case no
568
data is created on disk and NotLocalUrl is raised.
570
:param base: The URL to create the branch at.
571
:param force_new_repo: If True a new repository is always created.
572
:param force_new_tree: If True or False force creation of a tree or
573
prevent such creation respectively.
574
:param format: Override for the bzrdir format to create.
575
:param possible_transports: An optional reusable transports list.
578
# check for non local urls
579
t = _mod_transport.get_transport(base, possible_transports)
580
if not isinstance(t, local.LocalTransport):
581
raise errors.NotLocalUrl(base)
582
bzrdir = BzrDir.create(base, format, possible_transports)
583
repo = bzrdir._find_or_create_repository(force_new_repo)
584
result = bzrdir.create_branch()
585
if force_new_tree or (repo.make_working_trees() and
586
force_new_tree is None):
588
bzrdir.create_workingtree()
589
except errors.NotLocalUrl:
594
def create_standalone_workingtree(base, format=None):
595
"""Create a new BzrDir, WorkingTree, Branch and Repository at 'base'.
597
'base' must be a local path or a file:// url.
599
This will use the current default BzrDirFormat unless one is
600
specified, and use whatever
601
repository format that that uses for bzrdirformat.create_workingtree,
602
create_branch and create_repository.
604
:param format: Override for the bzrdir format to create.
605
:return: The WorkingTree object.
607
t = _mod_transport.get_transport(base)
608
if not isinstance(t, local.LocalTransport):
609
raise errors.NotLocalUrl(base)
610
bzrdir = BzrDir.create_branch_and_repo(base,
612
format=format).bzrdir
613
return bzrdir.create_workingtree()
465
615
@deprecated_method(deprecated_in((2, 3, 0)))
466
616
def generate_backup_name(self, base):
467
617
return self._available_backup_name(base)
664
813
# add new tests for it to the appropriate place.
665
814
return filename == '.bzr' or filename.startswith('.bzr/')
817
def open_unsupported(base):
818
"""Open a branch which is not supported."""
819
return BzrDir.open(base, _unsupported=True)
822
def open(base, _unsupported=False, possible_transports=None):
823
"""Open an existing bzrdir, rooted at 'base' (url).
825
:param _unsupported: a private parameter to the BzrDir class.
827
t = _mod_transport.get_transport(base, possible_transports)
828
return BzrDir.open_from_transport(t, _unsupported=_unsupported)
831
def open_from_transport(transport, _unsupported=False,
832
_server_formats=True):
833
"""Open a bzrdir within a particular directory.
835
:param transport: Transport containing the bzrdir.
836
:param _unsupported: private.
838
for hook in BzrDir.hooks['pre_open']:
840
# Keep initial base since 'transport' may be modified while following
842
base = transport.base
843
def find_format(transport):
844
return transport, controldir.ControlDirFormat.find_format(
845
transport, _server_formats=_server_formats)
847
def redirected(transport, e, redirection_notice):
848
redirected_transport = transport._redirected_to(e.source, e.target)
849
if redirected_transport is None:
850
raise errors.NotBranchError(base)
851
note('%s is%s redirected to %s',
852
transport.base, e.permanently, redirected_transport.base)
853
return redirected_transport
856
transport, format = do_catching_redirections(find_format,
859
except errors.TooManyRedirections:
860
raise errors.NotBranchError(base)
862
format.check_support_status(_unsupported)
863
return format.open(transport, _found=True)
866
def open_containing(url, possible_transports=None):
867
"""Open an existing branch which contains url.
869
:param url: url to search from.
871
See open_containing_from_transport for more detail.
873
transport = _mod_transport.get_transport(url, possible_transports)
874
return BzrDir.open_containing_from_transport(transport)
877
def open_containing_from_transport(a_transport):
878
"""Open an existing branch which contains a_transport.base.
880
This probes for a branch at a_transport, and searches upwards from there.
882
Basically we keep looking up until we find the control directory or
883
run into the root. If there isn't one, raises NotBranchError.
884
If there is one and it is either an unrecognised format or an unsupported
885
format, UnknownFormatError or UnsupportedFormatError are raised.
886
If there is one, it is returned, along with the unused portion of url.
888
:return: The BzrDir that contains the path, and a Unicode path
889
for the rest of the URL.
891
# this gets the normalised url back. I.e. '.' -> the full path.
892
url = a_transport.base
895
result = BzrDir.open_from_transport(a_transport)
896
return result, urlutils.unescape(a_transport.relpath(url))
897
except errors.NotBranchError, e:
900
new_t = a_transport.clone('..')
901
except errors.InvalidURLJoin:
902
# reached the root, whatever that may be
903
raise errors.NotBranchError(path=url)
904
if new_t.base == a_transport.base:
905
# reached the root, whatever that may be
906
raise errors.NotBranchError(path=url)
910
def open_tree_or_branch(klass, location):
911
"""Return the branch and working tree at a location.
913
If there is no tree at the location, tree will be None.
914
If there is no branch at the location, an exception will be
916
:return: (tree, branch)
918
bzrdir = klass.open(location)
919
return bzrdir._get_tree_branch()
922
def open_containing_tree_or_branch(klass, location):
923
"""Return the branch and working tree contained by a location.
925
Returns (tree, branch, relpath).
926
If there is no tree at containing the location, tree will be None.
927
If there is no branch containing the location, an exception will be
929
relpath is the portion of the path that is contained by the branch.
931
bzrdir, relpath = klass.open_containing(location)
932
tree, branch = bzrdir._get_tree_branch()
933
return tree, branch, relpath
936
def open_containing_tree_branch_or_repository(klass, location):
937
"""Return the working tree, branch and repo contained by a location.
939
Returns (tree, branch, repository, relpath).
940
If there is no tree containing the location, tree will be None.
941
If there is no branch containing the location, branch will be None.
942
If there is no repository containing the location, repository will be
944
relpath is the portion of the path that is contained by the innermost
947
If no tree, branch or repository is found, a NotBranchError is raised.
949
bzrdir, relpath = klass.open_containing(location)
951
tree, branch = bzrdir._get_tree_branch()
952
except errors.NotBranchError:
954
repo = bzrdir.find_repository()
955
return None, None, repo, relpath
956
except (errors.NoRepositoryPresent):
957
raise errors.NotBranchError(location)
958
return tree, branch, branch.repository, relpath
667
960
def _cloning_metadir(self):
668
961
"""Produce a metadir suitable for cloning with.
767
1078
raise NotImplementedError(self.get_workingtree_transport)
770
def create(cls, base, format=None, possible_transports=None):
771
"""Create a new BzrDir at the url 'base'.
773
:param format: If supplied, the format of branch to create. If not
774
supplied, the default is used.
775
:param possible_transports: If supplied, a list of transports that
776
can be reused to share a remote connection.
1081
class BzrDirHooks(hooks.Hooks):
1082
"""Hooks for BzrDir operations."""
1085
"""Create the default hooks."""
1086
hooks.Hooks.__init__(self, "bzrlib.bzrdir", "BzrDir.hooks")
1087
self.add_hook('pre_open',
1088
"Invoked before attempting to open a BzrDir with the transport "
1089
"that the open will use.", (1, 14))
1090
self.add_hook('post_repo_init',
1091
"Invoked after a repository has been initialized. "
1092
"post_repo_init is called with a "
1093
"bzrlib.bzrdir.RepoInitHookParams.",
1096
# install the default hooks
1097
BzrDir.hooks = BzrDirHooks()
1100
class RepoInitHookParams(object):
1101
"""Object holding parameters passed to `*_repo_init` hooks.
1103
There are 4 fields that hooks may wish to access:
1105
:ivar repository: Repository created
1106
:ivar format: Repository format
1107
:ivar bzrdir: The bzrdir for the repository
1108
:ivar shared: The repository is shared
1111
def __init__(self, repository, format, a_bzrdir, shared):
1112
"""Create a group of RepoInitHook parameters.
1114
:param repository: Repository created
1115
:param format: Repository format
1116
:param bzrdir: The bzrdir for the repository
1117
:param shared: The repository is shared
778
if cls is not BzrDir:
779
raise AssertionError("BzrDir.create always creates the "
780
"default format, not one of %r" % cls)
781
return controldir.ControlDir.create(base, format=format,
782
possible_transports=possible_transports)
1119
self.repository = repository
1120
self.format = format
1121
self.bzrdir = a_bzrdir
1122
self.shared = shared
1124
def __eq__(self, other):
1125
return self.__dict__ == other.__dict__
784
1127
def __repr__(self):
785
return "<%s at %r>" % (self.__class__.__name__, self.user_url)
1129
return "<%s for %s>" % (self.__class__.__name__,
1132
return "<%s for %s>" % (self.__class__.__name__,
788
1136
class BzrDirMeta1(BzrDir):
984
1321
return config.TransportConfig(self.transport, 'control.conf')
987
class BzrDirMeta1Colo(BzrDirMeta1):
988
"""BzrDirMeta1 with support for colocated branches.
990
This format is experimental, and will eventually be merged back into
994
def __init__(self, _transport, _format):
995
super(BzrDirMeta1Colo, self).__init__(_transport, _format)
996
self.control_files = lockable_files.LockableFiles(self.control_transport,
997
self._format._lock_file_name, self._format._lock_class)
999
def _get_branch_path(self, name):
1000
"""Obtain the branch path to use.
1002
This uses the API specified branch name first, and then falls back to
1003
the branch name specified in the URL. If neither of those is specified,
1004
it uses the default branch.
1006
:param name: Optional branch name to use
1007
:return: Relative path to branch
1011
return urlutils.join('branches', name.encode("utf-8"))
1013
def _read_branch_list(self):
1014
"""Read the branch list.
1016
:return: List of utf-8 encoded branch names.
1019
f = self.control_transport.get('branch-list')
1020
except errors.NoSuchFile:
1026
ret.append(name.rstrip("\n"))
1031
def _write_branch_list(self, branches):
1032
"""Write out the branch list.
1034
:param branches: List of utf-8 branch names to write
1036
self.transport.put_bytes('branch-list',
1037
"".join([name+"\n" for name in branches]))
1039
def destroy_branch(self, name=None):
1040
"""See BzrDir.create_branch."""
1042
name = self._get_selected_branch()
1043
path = self._get_branch_path(name)
1044
if name is not None:
1045
self.control_files.lock_write()
1047
branches = self._read_branch_list()
1049
branches.remove(name.encode("utf-8"))
1051
raise errors.NotBranchError(name)
1052
self._write_branch_list(branches)
1054
self.control_files.unlock()
1055
self.transport.delete_tree(path)
1057
def list_branches(self):
1058
"""See ControlDir.list_branches."""
1062
ret.append(self.open_branch())
1063
except (errors.NotBranchError, errors.NoRepositoryPresent):
1066
# colocated branches
1067
ret.extend([self.open_branch(name.decode("utf-8")) for name in
1068
self._read_branch_list()])
1072
def get_branch_transport(self, branch_format, name=None):
1073
"""See BzrDir.get_branch_transport()."""
1074
path = self._get_branch_path(name)
1075
# XXX: this shouldn't implicitly create the directory if it's just
1076
# promising to get a transport -- mbp 20090727
1077
if branch_format is None:
1078
return self.transport.clone(path)
1080
branch_format.get_format_string()
1081
except NotImplementedError:
1082
raise errors.IncompatibleFormat(branch_format, self._format)
1083
if name is not None:
1085
self.transport.mkdir('branches', mode=self._get_mkdir_mode())
1086
except errors.FileExists:
1088
branches = self._read_branch_list()
1089
utf8_name = name.encode("utf-8")
1090
if not utf8_name in branches:
1091
self.control_files.lock_write()
1093
branches = self._read_branch_list()
1094
branches.append(utf8_name)
1095
self._write_branch_list(branches)
1097
self.control_files.unlock()
1099
self.transport.mkdir(path, mode=self._get_mkdir_mode())
1100
except errors.FileExists:
1102
return self.transport.clone(path)
1105
1324
class BzrProber(controldir.Prober):
1106
1325
"""Prober for formats that use a .bzr/ control directory."""
1622
1829
controldir.ControlDirFormat._default_format = BzrDirMetaFormat1()
1625
class BzrDirMetaFormat1Colo(BzrDirMetaFormat1):
1626
"""BzrDirMeta1 format with support for colocated branches."""
1628
colocated_branches = True
1631
def get_format_string(cls):
1632
"""See BzrDirFormat.get_format_string()."""
1633
return "Bazaar meta directory, format 1 (with colocated branches)\n"
1635
def get_format_description(self):
1636
"""See BzrDirFormat.get_format_description()."""
1637
return "Meta directory format 1 with support for colocated branches"
1639
def _open(self, transport):
1640
"""See BzrDirFormat._open."""
1641
# Create a new format instance because otherwise initialisation of new
1642
# metadirs share the global default format object leading to alias
1644
format = BzrDirMetaFormat1Colo()
1645
self._supply_sub_formats_to(format)
1646
return BzrDirMeta1Colo(transport, format)
1649
BzrProber.formats.register(BzrDirMetaFormat1Colo.get_format_string(),
1650
BzrDirMetaFormat1Colo)
1653
1832
class ConvertMetaToMeta(controldir.Converter):
1654
1833
"""Converts the components of metadirs."""
1728
1907
return to_convert
1731
class ConvertMetaToColo(controldir.Converter):
1732
"""Add colocated branch support."""
1734
def __init__(self, target_format):
1735
"""Create a converter.that upgrades a metadir to the colo format.
1737
:param target_format: The final metadir format that is desired.
1739
self.target_format = target_format
1741
def convert(self, to_convert, pb):
1742
"""See Converter.convert()."""
1743
to_convert.transport.put_bytes('branch-format',
1744
self.target_format.get_format_string())
1745
return BzrDir.open_from_transport(to_convert.root_transport)
1748
class ConvertMetaRemoveColo(controldir.Converter):
1749
"""Remove colocated branch support from a bzrdir."""
1751
def __init__(self, target_format):
1752
"""Create a converter.that downgrades a colocated branch metadir
1753
to a regular metadir.
1755
:param target_format: The final metadir format that is desired.
1757
self.target_format = target_format
1759
def convert(self, to_convert, pb):
1760
"""See Converter.convert()."""
1761
to_convert.control_files.lock_write()
1763
branches = to_convert.list_branches()
1764
if len(branches) > 1:
1765
raise errors.BzrError("remove all but a single "
1766
"colocated branch when downgrading")
1768
to_convert.control_files.unlock()
1769
to_convert.transport.put_bytes('branch-format',
1770
self.target_format.get_format_string())
1771
return BzrDir.open_from_transport(to_convert.root_transport)
1774
1910
controldir.ControlDirFormat.register_server_prober(RemoteBzrProber)
1885
2020
require_stacking)
1886
2021
self._bzrdir = bzrdir
1888
def acquire_repository(self, make_working_trees=None, shared=False,
1889
possible_transports=None):
2023
def acquire_repository(self, make_working_trees=None, shared=False):
1890
2024
"""Implementation of RepositoryAcquisitionPolicy.acquire_repository
1892
2026
Creates the desired repository in the bzrdir we already have.
1894
if possible_transports is None:
1895
possible_transports = []
1897
possible_transports = list(possible_transports)
1898
possible_transports.append(self._bzrdir.root_transport)
1899
2028
stack_on = self._get_full_stack_on()
1901
2030
format = self._bzrdir._format
1902
2031
format.require_stacking(stack_on=stack_on,
1903
possible_transports=possible_transports)
2032
possible_transports=[self._bzrdir.root_transport])
1904
2033
if not self._require_stacking:
1905
2034
# We have picked up automatic stacking somewhere.
1906
note(gettext('Using default stacking branch {0} at {1}').format(
1907
self._stack_on, self._stack_on_pwd))
2035
note('Using default stacking branch %s at %s', self._stack_on,
1908
2037
repository = self._bzrdir.create_repository(shared=shared)
1909
2038
self._add_fallback(repository,
1910
possible_transports=possible_transports)
2039
possible_transports=[self._bzrdir.transport])
1911
2040
if make_working_trees is not None:
1912
2041
repository.set_make_working_trees(make_working_trees)
1913
2042
return repository, True
2000
2121
deprecated=True)
2001
2122
register_metadir(controldir.format_registry, 'dirstate',
2002
2123
'bzrlib.repofmt.knitrepo.RepositoryFormatKnit1',
2003
help='Format using dirstate for working trees. '
2004
'Compatible with bzr 0.8 and '
2005
'above when accessed over the network. Introduced in bzr 0.15.',
2124
help='New in 0.15: Fast local operations. Compatible with bzr 0.8 and '
2125
'above when accessed over the network.',
2006
2126
branch_format='bzrlib.branch.BzrBranchFormat5',
2007
2127
tree_format='bzrlib.workingtree_4.WorkingTreeFormat4',
2009
2129
deprecated=True)
2010
2130
register_metadir(controldir.format_registry, 'dirstate-tags',
2011
2131
'bzrlib.repofmt.knitrepo.RepositoryFormatKnit1',
2012
help='Variant of dirstate with support for tags. '
2013
'Introduced in bzr 0.15.',
2132
help='New in 0.15: Fast local operations and improved scaling for '
2133
'network operations. Additionally adds support for tags.'
2134
' Incompatible with bzr < 0.15.',
2014
2135
branch_format='bzrlib.branch.BzrBranchFormat6',
2015
2136
tree_format='bzrlib.workingtree_4.WorkingTreeFormat4',
2017
2138
deprecated=True)
2018
2139
register_metadir(controldir.format_registry, 'rich-root',
2019
2140
'bzrlib.repofmt.knitrepo.RepositoryFormatKnit4',
2020
help='Variant of dirstate with better handling of tree roots. '
2021
'Introduced in bzr 1.0',
2141
help='New in 1.0. Better handling of tree roots. Incompatible with'
2022
2143
branch_format='bzrlib.branch.BzrBranchFormat6',
2023
2144
tree_format='bzrlib.workingtree_4.WorkingTreeFormat4',
2025
2146
deprecated=True)
2026
2147
register_metadir(controldir.format_registry, 'dirstate-with-subtree',
2027
2148
'bzrlib.repofmt.knitrepo.RepositoryFormatKnit3',
2028
help='Variant of dirstate with support for nested trees. '
2029
'Introduced in 0.15.',
2149
help='New in 0.15: Fast local operations and improved scaling for '
2150
'network operations. Additionally adds support for versioning nested '
2151
'bzr branches. Incompatible with bzr < 0.15.',
2030
2152
branch_format='bzrlib.branch.BzrBranchFormat6',
2031
2153
tree_format='bzrlib.workingtree_4.WorkingTreeFormat4',
2032
2154
experimental=True,
2035
2157
register_metadir(controldir.format_registry, 'pack-0.92',
2036
2158
'bzrlib.repofmt.knitpack_repo.RepositoryFormatKnitPack1',
2037
help='Pack-based format used in 1.x series. Introduced in 0.92. '
2038
'Interoperates with bzr repositories before 0.92 but cannot be '
2039
'read by bzr < 0.92. '
2159
help='New in 0.92: Pack-based format with data compatible with '
2160
'dirstate-tags format repositories. Interoperates with '
2161
'bzr repositories before 0.92 but cannot be read by bzr < 0.92. '
2041
2163
branch_format='bzrlib.branch.BzrBranchFormat6',
2042
2164
tree_format='bzrlib.workingtree_4.WorkingTreeFormat4',
2045
2166
register_metadir(controldir.format_registry, 'pack-0.92-subtree',
2046
2167
'bzrlib.repofmt.knitpack_repo.RepositoryFormatKnitPack3',
2047
help='Pack-based format used in 1.x series, with subtree support. '
2048
'Introduced in 0.92. Interoperates with '
2168
help='New in 0.92: Pack-based format with data compatible with '
2169
'dirstate-with-subtree format repositories. Interoperates with '
2049
2170
'bzr repositories before 0.92 but cannot be read by bzr < 0.92. '
2051
2172
branch_format='bzrlib.branch.BzrBranchFormat6',
2052
2173
tree_format='bzrlib.workingtree_4.WorkingTreeFormat4',
2055
2175
experimental=True,
2057
2177
register_metadir(controldir.format_registry, 'rich-root-pack',
2058
2178
'bzrlib.repofmt.knitpack_repo.RepositoryFormatKnitPack4',
2059
help='A variant of pack-0.92 that supports rich-root data '
2060
'(needed for bzr-svn and bzr-git). Introduced in 1.0.',
2179
help='New in 1.0: A variant of pack-0.92 that supports rich-root data '
2180
'(needed for bzr-svn and bzr-git).',
2061
2181
branch_format='bzrlib.branch.BzrBranchFormat6',
2062
2182
tree_format='bzrlib.workingtree_4.WorkingTreeFormat4',
2066
2185
register_metadir(controldir.format_registry, '1.6',
2067
2186
'bzrlib.repofmt.knitpack_repo.RepositoryFormatKnitPack5',
2153
register_metadir(controldir.format_registry, 'development-colo',
2154
'bzrlib.repofmt.groupcompress_repo.RepositoryFormat2a',
2155
help='The 2a format with experimental support for colocated branches.\n',
2156
branch_format='bzrlib.branch.BzrBranchFormat7',
2157
tree_format='bzrlib.workingtree_4.WorkingTreeFormat6',
2159
bzrdir_format=BzrDirMetaFormat1Colo,
2163
2264
# And the development formats above will have aliased one of the following:
2165
2266
# Finally, the current format.
2166
2267
register_metadir(controldir.format_registry, '2a',
2167
2268
'bzrlib.repofmt.groupcompress_repo.RepositoryFormat2a',
2168
help='Format for the bzr 2.0 series.\n'
2269
help='First format for bzr 2.0 series.\n'
2169
2270
'Uses group-compress storage.\n'
2170
2271
'Provides rich roots which are a one-way transition.\n',
2171
2272
# 'storage in packs, 255-way hashed CHK inventory, bencode revision, group compress, '