1177
903
format.require_stacking()
1180
def checkout_metadir(self):
1181
return self.cloning_metadir()
1183
def sprout(self, url, revision_id=None, force_new_repo=False,
1184
recurse='down', possible_transports=None,
1185
accelerator_tree=None, hardlink=False, stacked=False,
1186
source_branch=None, create_tree_if_local=True):
1187
"""Create a copy of this bzrdir prepared for use as a new line of
1190
If url's last component does not exist, it will be created.
1192
Attributes related to the identity of the source branch like
1193
branch nickname will be cleaned, a working tree is created
1194
whether one existed before or not; and a local branch is always
1197
if revision_id is not None, then the clone operation may tune
1198
itself to download less data.
1199
:param accelerator_tree: A tree which can be used for retrieving file
1200
contents more quickly than the revision tree, i.e. a workingtree.
1201
The revision tree will be used for cases where accelerator_tree's
1202
content is different.
1203
:param hardlink: If true, hard-link files from accelerator_tree,
1205
:param stacked: If true, create a stacked branch referring to the
1206
location of this control directory.
1207
:param create_tree_if_local: If true, a working-tree will be created
1208
when working locally.
1210
target_transport = get_transport(url, possible_transports)
1211
target_transport.ensure_base()
1212
cloning_format = self.cloning_metadir(stacked)
1213
# Create/update the result branch
1214
result = cloning_format.initialize_on_transport(target_transport)
1215
# if a stacked branch wasn't requested, we don't create one
1216
# even if the origin was stacked
1217
stacked_branch_url = None
1218
if source_branch is not None:
1220
stacked_branch_url = self.root_transport.base
1221
source_repository = source_branch.repository
1224
source_branch = self.open_branch()
1225
source_repository = source_branch.repository
1227
stacked_branch_url = self.root_transport.base
1228
except errors.NotBranchError:
1229
source_branch = None
1231
source_repository = self.open_repository()
1232
except errors.NoRepositoryPresent:
1233
source_repository = None
1234
repository_policy = result.determine_repository_policy(
1235
force_new_repo, stacked_branch_url, require_stacking=stacked)
1236
result_repo, is_new_repo = repository_policy.acquire_repository()
1237
if is_new_repo and revision_id is not None and not stacked:
1238
fetch_spec = graph.PendingAncestryResult(
1239
[revision_id], source_repository)
1242
if source_repository is not None:
1243
# Fetch while stacked to prevent unstacked fetch from
1245
if fetch_spec is None:
1246
result_repo.fetch(source_repository, revision_id=revision_id)
1248
result_repo.fetch(source_repository, fetch_spec=fetch_spec)
1250
if source_branch is None:
1251
# this is for sprouting a bzrdir without a branch; is that
1253
# Not especially, but it's part of the contract.
1254
result_branch = result.create_branch()
1256
result_branch = source_branch.sprout(result,
1257
revision_id=revision_id, repository_policy=repository_policy)
1258
mutter("created new branch %r" % (result_branch,))
1260
# Create/update the result working tree
1261
if (create_tree_if_local and
1262
isinstance(target_transport, local.LocalTransport) and
1263
(result_repo is None or result_repo.make_working_trees())):
1264
wt = result.create_workingtree(accelerator_tree=accelerator_tree,
1268
if wt.path2id('') is None:
1270
wt.set_root_id(self.open_workingtree.get_root_id())
1271
except errors.NoWorkingTree:
1277
if recurse == 'down':
1279
basis = wt.basis_tree()
1281
subtrees = basis.iter_references()
1282
elif result_branch is not None:
1283
basis = result_branch.basis_tree()
1285
subtrees = basis.iter_references()
1286
elif source_branch is not None:
1287
basis = source_branch.basis_tree()
1289
subtrees = basis.iter_references()
1294
for path, file_id in subtrees:
1295
target = urlutils.join(url, urlutils.escape(path))
1296
sublocation = source_branch.reference_parent(file_id, path)
1297
sublocation.bzrdir.sprout(target,
1298
basis.get_reference_revision(file_id, path),
1299
force_new_repo=force_new_repo, recurse=recurse,
1302
if basis is not None:
1306
def push_branch(self, source, revision_id=None, overwrite=False,
1307
remember=False, create_prefix=False):
1308
"""Push the source branch into this BzrDir."""
1310
# If we can open a branch, use its direct repository, otherwise see
1311
# if there is a repository without a branch.
1313
br_to = self.open_branch()
1314
except errors.NotBranchError:
1315
# Didn't find a branch, can we find a repository?
1316
repository_to = self.find_repository()
1318
# Found a branch, so we must have found a repository
1319
repository_to = br_to.repository
1321
push_result = PushResult()
1322
push_result.source_branch = source
1324
# We have a repository but no branch, copy the revisions, and then
1326
repository_to.fetch(source.repository, revision_id=revision_id)
1327
br_to = source.clone(self, revision_id=revision_id)
1328
if source.get_push_location() is None or remember:
1329
source.set_push_location(br_to.base)
1330
push_result.stacked_on = None
1331
push_result.branch_push_result = None
1332
push_result.old_revno = None
1333
push_result.old_revid = _mod_revision.NULL_REVISION
1334
push_result.target_branch = br_to
1335
push_result.master_branch = None
1336
push_result.workingtree_updated = False
1338
# We have successfully opened the branch, remember if necessary:
1339
if source.get_push_location() is None or remember:
1340
source.set_push_location(br_to.base)
1342
tree_to = self.open_workingtree()
1343
except errors.NotLocalUrl:
1344
push_result.branch_push_result = source.push(br_to,
1345
overwrite, stop_revision=revision_id)
1346
push_result.workingtree_updated = False
1347
except errors.NoWorkingTree:
1348
push_result.branch_push_result = source.push(br_to,
1349
overwrite, stop_revision=revision_id)
1350
push_result.workingtree_updated = None # Not applicable
1352
tree_to.lock_write()
1354
push_result.branch_push_result = source.push(
1355
tree_to.branch, overwrite, stop_revision=revision_id)
1359
push_result.workingtree_updated = True
1360
push_result.old_revno = push_result.branch_push_result.old_revno
1361
push_result.old_revid = push_result.branch_push_result.old_revid
1362
push_result.target_branch = \
1363
push_result.branch_push_result.target_branch
907
def create(cls, base, format=None, possible_transports=None):
908
"""Create a new BzrDir at the url 'base'.
910
:param format: If supplied, the format of branch to create. If not
911
supplied, the default is used.
912
:param possible_transports: If supplied, a list of transports that
913
can be reused to share a remote connection.
915
if cls is not BzrDir:
916
raise AssertionError("BzrDir.create always creates the"
917
"default format, not one of %r" % cls)
918
t = _mod_transport.get_transport(base, possible_transports)
921
format = controldir.ControlDirFormat.get_default_format()
922
return format.initialize_on_transport(t)
924
def get_branch_transport(self, branch_format, name=None):
925
"""Get the transport for use by branch format in this BzrDir.
927
Note that bzr dirs that do not support format strings will raise
928
IncompatibleFormat if the branch format they are given has
929
a format string, and vice versa.
931
If branch_format is None, the transport is returned with no
932
checking. If it is not None, then the returned transport is
933
guaranteed to point to an existing directory ready for use.
935
raise NotImplementedError(self.get_branch_transport)
937
def get_repository_transport(self, repository_format):
938
"""Get the transport for use by repository format in this BzrDir.
940
Note that bzr dirs that do not support format strings will raise
941
IncompatibleFormat if the repository format they are given has
942
a format string, and vice versa.
944
If repository_format is None, the transport is returned with no
945
checking. If it is not None, then the returned transport is
946
guaranteed to point to an existing directory ready for use.
948
raise NotImplementedError(self.get_repository_transport)
950
def get_workingtree_transport(self, tree_format):
951
"""Get the transport for use by workingtree format in this BzrDir.
953
Note that bzr dirs that do not support format strings will raise
954
IncompatibleFormat if the workingtree format they are given has a
955
format string, and vice versa.
957
If workingtree_format is None, the transport is returned with no
958
checking. If it is not None, then the returned transport is
959
guaranteed to point to an existing directory ready for use.
961
raise NotImplementedError(self.get_workingtree_transport)
1367
964
class BzrDirHooks(hooks.Hooks):
3223
2704
return to_convert
3226
# This is not in remote.py because it's relatively small, and needs to be
3227
# registered. Putting it in remote.py creates a circular import problem.
3228
# we can make it a lazy object if the control formats is turned into something
3230
class RemoteBzrDirFormat(BzrDirMetaFormat1):
3231
"""Format representing bzrdirs accessed via a smart server"""
3234
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
self._network_name = None
3242
return "%s(_network_name=%r)" % (self.__class__.__name__,
3245
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
return 'bzr remote bzrdir'
3251
def get_format_string(self):
3252
raise NotImplementedError(self.get_format_string)
3254
def network_name(self):
3255
if self._network_name:
3256
return self._network_name
3258
raise AssertionError("No network name set.")
3261
def probe_transport(klass, transport):
3262
"""Return a RemoteBzrDirFormat object if it looks possible."""
3264
medium = transport.get_smart_medium()
3265
except (NotImplementedError, AttributeError,
3266
errors.TransportNotPossible, errors.NoSmartMedium,
3267
errors.SmartProtocolError):
3268
# no smart server, so not a branch for this format type.
3269
raise errors.NotBranchError(path=transport.base)
3271
# Decline to open it if the server doesn't support our required
3272
# version (3) so that the VFS-based transport will do it.
3273
if medium.should_probe():
3275
server_version = medium.protocol_version()
3276
except errors.SmartProtocolError:
3277
# Apparently there's no usable smart server there, even though
3278
# the medium supports the smart protocol.
3279
raise errors.NotBranchError(path=transport.base)
3280
if server_version != '2':
3281
raise errors.NotBranchError(path=transport.base)
3284
def initialize_on_transport(self, transport):
3286
# hand off the request to the smart server
3287
client_medium = transport.get_smart_medium()
3288
except errors.NoSmartMedium:
3289
# TODO: lookup the local format from a server hint.
3290
local_dir_format = BzrDirMetaFormat1()
3291
return local_dir_format.initialize_on_transport(transport)
3292
client = _SmartClient(client_medium)
3293
path = client.remote_path_from_transport(transport)
3295
response = client.call('BzrDirFormat.initialize', path)
3296
except errors.ErrorFromSmartServer, err:
3297
remote._translate_error(err, path=path)
3298
if response[0] != 'ok':
3299
raise errors.SmartProtocolError('unexpected response code %s' % (response,))
3300
format = RemoteBzrDirFormat()
3301
self._supply_sub_formats_to(format)
3302
return remote.RemoteBzrDir(transport, format)
3304
def parse_NoneTrueFalse(self, arg):
3311
raise AssertionError("invalid arg %r" % arg)
3313
def _serialize_NoneTrueFalse(self, arg):
3320
def _serialize_NoneString(self, arg):
3323
def initialize_on_transport_ex(self, transport, use_existing_dir=False,
3324
create_prefix=False, force_new_repo=False, stacked_on=None,
3325
stack_on_pwd=None, repo_format_name=None, make_working_trees=None,
3328
# hand off the request to the smart server
3329
client_medium = transport.get_smart_medium()
3330
except errors.NoSmartMedium:
3333
# Decline to open it if the server doesn't support our required
3334
# version (3) so that the VFS-based transport will do it.
3335
if client_medium.should_probe():
3337
server_version = client_medium.protocol_version()
3338
if server_version != '2':
3342
except errors.SmartProtocolError:
3343
# Apparently there's no usable smart server there, even though
3344
# the medium supports the smart protocol.
3349
client = _SmartClient(client_medium)
3350
path = client.remote_path_from_transport(transport)
3351
if client_medium._is_remote_before((1, 16)):
3354
# TODO: lookup the local format from a server hint.
3355
local_dir_format = BzrDirMetaFormat1()
3356
self._supply_sub_formats_to(local_dir_format)
3357
return local_dir_format.initialize_on_transport_ex(transport,
3358
use_existing_dir=use_existing_dir, create_prefix=create_prefix,
3359
force_new_repo=force_new_repo, stacked_on=stacked_on,
3360
stack_on_pwd=stack_on_pwd, repo_format_name=repo_format_name,
3361
make_working_trees=make_working_trees, shared_repo=shared_repo,
3363
return self._initialize_on_transport_ex_rpc(client, path, transport,
3364
use_existing_dir, create_prefix, force_new_repo, stacked_on,
3365
stack_on_pwd, repo_format_name, make_working_trees, shared_repo)
3367
def _initialize_on_transport_ex_rpc(self, client, path, transport,
3368
use_existing_dir, create_prefix, force_new_repo, stacked_on,
3369
stack_on_pwd, repo_format_name, make_working_trees, shared_repo):
3371
args.append(self._serialize_NoneTrueFalse(use_existing_dir))
3372
args.append(self._serialize_NoneTrueFalse(create_prefix))
3373
args.append(self._serialize_NoneTrueFalse(force_new_repo))
3374
args.append(self._serialize_NoneString(stacked_on))
3375
# stack_on_pwd is often/usually our transport
3378
stack_on_pwd = transport.relpath(stack_on_pwd)
3379
if not stack_on_pwd:
3381
except errors.PathNotChild:
3383
args.append(self._serialize_NoneString(stack_on_pwd))
3384
args.append(self._serialize_NoneString(repo_format_name))
3385
args.append(self._serialize_NoneTrueFalse(make_working_trees))
3386
args.append(self._serialize_NoneTrueFalse(shared_repo))
3387
request_network_name = self._network_name or \
3388
BzrDirFormat.get_default_format().network_name()
3390
response = client.call('BzrDirFormat.initialize_ex_1.16',
3391
request_network_name, path, *args)
3392
except errors.UnknownSmartMethod:
3393
client._medium._remember_remote_is_before((1,16))
3394
local_dir_format = BzrDirMetaFormat1()
3395
self._supply_sub_formats_to(local_dir_format)
3396
return local_dir_format.initialize_on_transport_ex(transport,
3397
use_existing_dir=use_existing_dir, create_prefix=create_prefix,
3398
force_new_repo=force_new_repo, stacked_on=stacked_on,
3399
stack_on_pwd=stack_on_pwd, repo_format_name=repo_format_name,
3400
make_working_trees=make_working_trees, shared_repo=shared_repo,
3402
except errors.ErrorFromSmartServer, err:
3403
remote._translate_error(err, path=path)
3404
repo_path = response[0]
3405
bzrdir_name = response[6]
3406
require_stacking = response[7]
3407
require_stacking = self.parse_NoneTrueFalse(require_stacking)
3408
format = RemoteBzrDirFormat()
3409
format._network_name = bzrdir_name
3410
self._supply_sub_formats_to(format)
3411
bzrdir = remote.RemoteBzrDir(transport, format, _client=client)
3413
repo_format = remote.response_tuple_to_repo_format(response[1:])
3414
if repo_path == '.':
3417
repo_bzrdir_format = RemoteBzrDirFormat()
3418
repo_bzrdir_format._network_name = response[5]
3419
repo_bzr = remote.RemoteBzrDir(transport.clone(repo_path),
3423
final_stack = response[8] or None
3424
final_stack_pwd = response[9] or None
3426
final_stack_pwd = urlutils.join(
3427
transport.base, final_stack_pwd)
3428
remote_repo = remote.RemoteRepository(repo_bzr, repo_format)
3429
if len(response) > 10:
3430
# Updated server verb that locks remotely.
3431
repo_lock_token = response[10] or None
3432
remote_repo.lock_write(repo_lock_token, _skip_rpc=True)
3434
remote_repo.dont_leave_lock_in_place()
3436
remote_repo.lock_write()
3437
policy = UseExistingRepository(remote_repo, final_stack,
3438
final_stack_pwd, require_stacking)
3439
policy.acquire_repository()
3443
bzrdir._format.set_branch_format(self.get_branch_format())
3444
if require_stacking:
3445
# The repo has already been created, but we need to make sure that
3446
# we'll make a stackable branch.
3447
bzrdir._format.require_stacking(_skip_repo=True)
3448
return remote_repo, bzrdir, require_stacking, policy
3450
def _open(self, transport):
3451
return remote.RemoteBzrDir(transport, self)
3453
def __eq__(self, other):
3454
if not isinstance(other, RemoteBzrDirFormat):
3456
return self.get_format_description() == other.get_format_description()
3458
def __return_repository_format(self):
3459
# Always return a RemoteRepositoryFormat object, but if a specific bzr
3460
# repository format has been asked for, tell the RemoteRepositoryFormat
3461
# that it should use that for init() etc.
3462
result = remote.RemoteRepositoryFormat()
3463
custom_format = getattr(self, '_repository_format', None)
3465
if isinstance(custom_format, remote.RemoteRepositoryFormat):
3466
return custom_format
3468
# We will use the custom format to create repositories over the
3469
# wire; expose its details like rich_root_data for code to
3471
result._custom_format = custom_format
3474
def get_branch_format(self):
3475
result = BzrDirMetaFormat1.get_branch_format(self)
3476
if not isinstance(result, remote.RemoteBranchFormat):
3477
new_result = remote.RemoteBranchFormat()
3478
new_result._custom_format = result
3480
self.set_branch_format(new_result)
3484
repository_format = property(__return_repository_format,
3485
BzrDirMetaFormat1._set_repository_format) #.im_func)
3488
BzrDirFormat.register_control_server_format(RemoteBzrDirFormat)
3491
class BzrDirFormatInfo(object):
3493
def __init__(self, native, deprecated, hidden, experimental):
3494
self.deprecated = deprecated
3495
self.native = native
3496
self.hidden = hidden
3497
self.experimental = experimental
3500
class BzrDirFormatRegistry(registry.Registry):
3501
"""Registry of user-selectable BzrDir subformats.
3503
Differs from BzrDirFormat._control_formats in that it provides sub-formats,
3504
e.g. BzrDirMeta1 with weave repository. Also, it's more user-oriented.
3508
"""Create a BzrDirFormatRegistry."""
3509
self._aliases = set()
3510
self._registration_order = list()
3511
super(BzrDirFormatRegistry, self).__init__()
3514
"""Return a set of the format names which are aliases."""
3515
return frozenset(self._aliases)
3517
def register_metadir(self, key,
3518
repository_format, help, native=True, deprecated=False,
3524
"""Register a metadir subformat.
3526
These all use a BzrDirMetaFormat1 bzrdir, but can be parameterized
3527
by the Repository/Branch/WorkingTreeformats.
3529
:param repository_format: The fully-qualified repository format class
3531
:param branch_format: Fully-qualified branch format class name as
3533
:param tree_format: Fully-qualified tree format class name as
3536
# This should be expanded to support setting WorkingTree and Branch
3537
# formats, once BzrDirMetaFormat1 supports that.
3538
def _load(full_name):
3539
mod_name, factory_name = full_name.rsplit('.', 1)
3541
mod = __import__(mod_name, globals(), locals(),
3543
except ImportError, e:
3544
raise ImportError('failed to load %s: %s' % (full_name, e))
3546
factory = getattr(mod, factory_name)
3547
except AttributeError:
3548
raise AttributeError('no factory %s in module %r'
3553
bd = BzrDirMetaFormat1()
3554
if branch_format is not None:
3555
bd.set_branch_format(_load(branch_format))
3556
if tree_format is not None:
3557
bd.workingtree_format = _load(tree_format)
3558
if repository_format is not None:
3559
bd.repository_format = _load(repository_format)
3561
self.register(key, helper, help, native, deprecated, hidden,
3562
experimental, alias)
3564
def register(self, key, factory, help, native=True, deprecated=False,
3565
hidden=False, experimental=False, alias=False):
3566
"""Register a BzrDirFormat factory.
3568
The factory must be a callable that takes one parameter: the key.
3569
It must produce an instance of the BzrDirFormat when called.
3571
This function mainly exists to prevent the info object from being
3574
registry.Registry.register(self, key, factory, help,
3575
BzrDirFormatInfo(native, deprecated, hidden, experimental))
3577
self._aliases.add(key)
3578
self._registration_order.append(key)
3580
def register_lazy(self, key, module_name, member_name, help, native=True,
3581
deprecated=False, hidden=False, experimental=False, alias=False):
3582
registry.Registry.register_lazy(self, key, module_name, member_name,
3583
help, BzrDirFormatInfo(native, deprecated, hidden, experimental))
3585
self._aliases.add(key)
3586
self._registration_order.append(key)
3588
def set_default(self, key):
3589
"""Set the 'default' key to be a clone of the supplied key.
3591
This method must be called once and only once.
3593
registry.Registry.register(self, 'default', self.get(key),
3594
self.get_help(key), info=self.get_info(key))
3595
self._aliases.add('default')
3597
def set_default_repository(self, key):
3598
"""Set the FormatRegistry default and Repository default.
3600
This is a transitional method while Repository.set_default_format
3603
if 'default' in self:
3604
self.remove('default')
3605
self.set_default(key)
3606
format = self.get('default')()
3608
def make_bzrdir(self, key):
3609
return self.get(key)()
3611
def help_topic(self, topic):
3613
default_realkey = None
3614
default_help = self.get_help('default')
3616
for key in self._registration_order:
3617
if key == 'default':
3619
help = self.get_help(key)
3620
if help == default_help:
3621
default_realkey = key
3623
help_pairs.append((key, help))
3625
def wrapped(key, help, info):
3627
help = '(native) ' + help
3628
return ':%s:\n%s\n\n' % (key,
3629
textwrap.fill(help, initial_indent=' ',
3630
subsequent_indent=' ',
3631
break_long_words=False))
3632
if default_realkey is not None:
3633
output += wrapped(default_realkey, '(default) %s' % default_help,
3634
self.get_info('default'))
3635
deprecated_pairs = []
3636
experimental_pairs = []
3637
for key, help in help_pairs:
3638
info = self.get_info(key)
3641
elif info.deprecated:
3642
deprecated_pairs.append((key, help))
3643
elif info.experimental:
3644
experimental_pairs.append((key, help))
3646
output += wrapped(key, help, info)
3647
output += "\nSee :doc:`formats-help` for more about storage formats."
3649
if len(experimental_pairs) > 0:
3650
other_output += "Experimental formats are shown below.\n\n"
3651
for key, help in experimental_pairs:
3652
info = self.get_info(key)
3653
other_output += wrapped(key, help, info)
3656
"No experimental formats are available.\n\n"
3657
if len(deprecated_pairs) > 0:
3658
other_output += "\nDeprecated formats are shown below.\n\n"
3659
for key, help in deprecated_pairs:
3660
info = self.get_info(key)
3661
other_output += wrapped(key, help, info)
3664
"\nNo deprecated formats are available.\n\n"
3666
"\nSee :doc:`formats-help` for more about storage formats."
3668
if topic == 'other-formats':
2707
controldir.ControlDirFormat.register_server_prober(RemoteBzrProber)
3674
2710
class RepositoryAcquisitionPolicy(object):
3828
2864
return self._repository, False
3831
# Please register new formats after old formats so that formats
3832
# appear in chronological order and format descriptions can build
3834
format_registry = BzrDirFormatRegistry()
2867
def register_metadir(registry, key,
2868
repository_format, help, native=True, deprecated=False,
2874
"""Register a metadir subformat.
2876
These all use a BzrDirMetaFormat1 bzrdir, but can be parameterized
2877
by the Repository/Branch/WorkingTreeformats.
2879
:param repository_format: The fully-qualified repository format class
2881
:param branch_format: Fully-qualified branch format class name as
2883
:param tree_format: Fully-qualified tree format class name as
2886
# This should be expanded to support setting WorkingTree and Branch
2887
# formats, once BzrDirMetaFormat1 supports that.
2888
def _load(full_name):
2889
mod_name, factory_name = full_name.rsplit('.', 1)
2891
factory = pyutils.get_named_object(mod_name, factory_name)
2892
except ImportError, e:
2893
raise ImportError('failed to load %s: %s' % (full_name, e))
2894
except AttributeError:
2895
raise AttributeError('no factory %s in module %r'
2896
% (full_name, sys.modules[mod_name]))
2900
bd = BzrDirMetaFormat1()
2901
if branch_format is not None:
2902
bd.set_branch_format(_load(branch_format))
2903
if tree_format is not None:
2904
bd.workingtree_format = _load(tree_format)
2905
if repository_format is not None:
2906
bd.repository_format = _load(repository_format)
2908
registry.register(key, helper, help, native, deprecated, hidden,
2909
experimental, alias)
3835
2911
# The pre-0.8 formats have their repository format network name registered in
3836
2912
# repository.py. MetaDir formats have their repository format network name
3837
2913
# inferred from their disk format string.
3838
format_registry.register('weave', BzrDirFormat6,
2914
controldir.format_registry.register('weave', BzrDirFormat6,
3839
2915
'Pre-0.8 format. Slower than knit and does not'
3840
2916
' support checkouts or shared repositories.',
3842
2918
deprecated=True)
3843
format_registry.register_metadir('metaweave',
2919
register_metadir(controldir.format_registry, 'metaweave',
3844
2920
'bzrlib.repofmt.weaverepo.RepositoryFormat7',
3845
2921
'Transitional format in 0.8. Slower than knit.',
3846
2922
branch_format='bzrlib.branch.BzrBranchFormat5',
3847
2923
tree_format='bzrlib.workingtree.WorkingTreeFormat3',
3849
2925
deprecated=True)
3850
format_registry.register_metadir('knit',
2926
register_metadir(controldir.format_registry, 'knit',
3851
2927
'bzrlib.repofmt.knitrepo.RepositoryFormatKnit1',
3852
2928
'Format using knits. Recommended for interoperation with bzr <= 0.14.',
3853
2929
branch_format='bzrlib.branch.BzrBranchFormat5',
3854
2930
tree_format='bzrlib.workingtree.WorkingTreeFormat3',
3856
2932
deprecated=True)
3857
format_registry.register_metadir('dirstate',
2933
register_metadir(controldir.format_registry, 'dirstate',
3858
2934
'bzrlib.repofmt.knitrepo.RepositoryFormatKnit1',
3859
2935
help='New in 0.15: Fast local operations. Compatible with bzr 0.8 and '
3860
2936
'above when accessed over the network.',