267
215
errors.UnstackableRepositoryFormat,
268
216
errors.NotStacked):
270
# Bug: We create a metadir without knowing if it can support stacking,
271
# we should look up the policy needs first, or just use it as a hint,
220
# may need to copy content in
221
repository_policy = result.determine_repository_policy(
222
force_new_repo, stacked_on, self.root_transport.base,
223
require_stacking=require_stacking)
274
224
make_working_trees = local_repo.make_working_trees()
275
want_shared = local_repo.is_shared()
276
repo_format_name = format.repository_format.network_name()
278
make_working_trees = False
280
repo_format_name = None
282
result_repo, result, require_stacking, repository_policy = \
283
format.initialize_on_transport_ex(transport,
284
use_existing_dir=use_existing_dir, create_prefix=create_prefix,
285
force_new_repo=force_new_repo, stacked_on=stacked_on,
286
stack_on_pwd=self.root_transport.base,
287
repo_format_name=repo_format_name,
288
make_working_trees=make_working_trees, shared_repo=want_shared)
291
# If the result repository is in the same place as the
292
# resulting bzr dir, it will have no content, further if the
293
# result is not stacked then we know all content should be
294
# copied, and finally if we are copying up to a specific
295
# revision_id then we can use the pending-ancestry-result which
296
# 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
299
revision_id is not None):
300
fetch_spec = graph.PendingAncestryResult(
301
[revision_id], local_repo)
302
result_repo.fetch(local_repo, fetch_spec=fetch_spec)
304
result_repo.fetch(local_repo, revision_id=revision_id)
308
if result_repo is not None:
309
raise AssertionError('result_repo not None(%r)' % result_repo)
225
result_repo, is_new_repo = repository_policy.acquire_repository(
226
make_working_trees, local_repo.is_shared())
227
if not require_stacking and repository_policy._require_stacking:
228
require_stacking = True
229
result._format.require_stacking()
230
if is_new_repo and not require_stacking and revision_id is not None:
231
fetch_spec = graph.PendingAncestryResult(
232
[revision_id], local_repo)
233
result_repo.fetch(local_repo, fetch_spec=fetch_spec)
235
result_repo.fetch(local_repo, revision_id=revision_id)
310
238
# 1 if there is a branch present
311
239
# make sure its content is available in the target repository
414
333
except errors.NoRepositoryPresent:
417
return False, ([], repository)
418
return True, (bzrdir.list_branches(), None)
420
for branches, repo in BzrDir.find_bzrdirs(transport,
336
return False, (None, repository)
338
branch = bzrdir.open_branch()
339
except errors.NotBranchError:
340
return True, (None, None)
342
return True, (branch, None)
344
for branch, repo in BzrDir.find_bzrdirs(transport, evaluate=evaluate):
422
345
if repo is not None:
423
ret.extend(repo.find_branches())
424
if branches is not None:
346
branches.extend(repo.find_branches())
347
if branch is not None:
348
branches.append(branch)
428
351
def destroy_repository(self):
429
352
"""Destroy the repository in this BzrDir"""
430
353
raise NotImplementedError(self.destroy_repository)
432
def create_branch(self, name=None):
355
def create_branch(self):
433
356
"""Create a branch in this BzrDir.
435
:param name: Name of the colocated branch to create, None for
438
358
The bzrdir's format will control what branch format is created.
439
359
For more control see BranchFormatXX.create(a_bzrdir).
441
361
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
363
def destroy_branch(self):
364
"""Destroy the branch in this BzrDir"""
449
365
raise NotImplementedError(self.destroy_branch)
621
538
: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
540
pb = ui.ui_factory.nested_progress_bar()
634
542
# FIXME: bug 300001 -- the backup fails if the backup directory
635
543
# already exists, but it should instead either remove it or make
636
544
# a new backup directory.
546
# FIXME: bug 262450 -- the backup directory should have the same
547
# permissions as the .bzr directory (probably a bug in copy_tree)
638
548
old_path = self.root_transport.abspath('.bzr')
639
new_path = self.root_transport.abspath(backup_dir)
640
ui.ui_factory.note('making backup of %s\n to %s' % (old_path, new_path,))
641
self.root_transport.copy_tree('.bzr', backup_dir)
549
new_path = self.root_transport.abspath('backup.bzr')
550
pb.note('making backup of %s' % (old_path,))
551
pb.note(' to %s' % (new_path,))
552
self.root_transport.copy_tree('.bzr', 'backup.bzr')
642
553
return (old_path, new_path)
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
1367
1200
class BzrDirHooks(hooks.Hooks):
1368
1201
"""Hooks for BzrDir operations."""
1373
1206
self.create_hook(hooks.HookPoint('pre_open',
1374
1207
"Invoked before attempting to open a BzrDir with the transport "
1375
1208
"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
1210
# install the default hooks
1383
1211
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
1214
class BzrDirPreSplitOut(BzrDir):
1423
1215
"""A common class for the all-in-one formats."""
2012
1758
self._supply_sub_formats_to(remote_format)
2013
1759
return remote_format.initialize_on_transport(transport)
2015
def initialize_on_transport_ex(self, transport, use_existing_dir=False,
2016
create_prefix=False, force_new_repo=False, stacked_on=None,
2017
stack_on_pwd=None, repo_format_name=None, make_working_trees=None,
2018
shared_repo=False, vfs_only=False):
2019
"""Create this format on transport.
2021
The directory to initialize will be created.
2023
:param force_new_repo: Do not use a shared repository for the target,
2024
even if one is available.
2025
:param create_prefix: Create any missing directories leading up to
2027
:param use_existing_dir: Use an existing directory if one exists.
2028
:param stacked_on: A url to stack any created branch on, None to follow
2029
any target stacking policy.
2030
:param stack_on_pwd: If stack_on is relative, the location it is
2032
:param repo_format_name: If non-None, a repository will be
2033
made-or-found. Should none be found, or if force_new_repo is True
2034
the repo_format_name is used to select the format of repository to
2036
:param make_working_trees: Control the setting of make_working_trees
2037
for a new shared repository when one is made. None to use whatever
2038
default the format has.
2039
:param shared_repo: Control whether made repositories are shared or
2041
:param vfs_only: If True do not attempt to use a smart server
2042
:return: repo, bzrdir, require_stacking, repository_policy. repo is
2043
None if none was created or found, bzrdir is always valid.
2044
require_stacking is the result of examining the stacked_on
2045
parameter and any stacking policy found for the target.
2048
# Try to hand off to a smart server
2050
client_medium = transport.get_smart_medium()
2051
except errors.NoSmartMedium:
2054
# TODO: lookup the local format from a server hint.
2055
remote_dir_format = RemoteBzrDirFormat()
2056
remote_dir_format._network_name = self.network_name()
2057
self._supply_sub_formats_to(remote_dir_format)
2058
return remote_dir_format.initialize_on_transport_ex(transport,
2059
use_existing_dir=use_existing_dir, create_prefix=create_prefix,
2060
force_new_repo=force_new_repo, stacked_on=stacked_on,
2061
stack_on_pwd=stack_on_pwd, repo_format_name=repo_format_name,
2062
make_working_trees=make_working_trees, shared_repo=shared_repo)
2063
# XXX: Refactor the create_prefix/no_create_prefix code into a
2064
# common helper function
2065
# The destination may not exist - if so make it according to policy.
2066
def make_directory(transport):
2067
transport.mkdir('.')
2069
def redirected(transport, e, redirection_notice):
2070
note(redirection_notice)
2071
return transport._redirected_to(e.source, e.target)
2073
transport = do_catching_redirections(make_directory, transport,
2075
except errors.FileExists:
2076
if not use_existing_dir:
2078
except errors.NoSuchFile:
2079
if not create_prefix:
2081
transport.create_prefix()
2083
require_stacking = (stacked_on is not None)
2084
# Now the target directory exists, but doesn't have a .bzr
2085
# directory. So we need to create it, along with any work to create
2086
# all of the dependent branches, etc.
2088
result = self.initialize_on_transport(transport)
2089
if repo_format_name:
2091
# use a custom format
2092
result._format.repository_format = \
2093
repository.network_format_registry.get(repo_format_name)
2094
except AttributeError:
2095
# The format didn't permit it to be set.
2097
# A repository is desired, either in-place or shared.
2098
repository_policy = result.determine_repository_policy(
2099
force_new_repo, stacked_on, stack_on_pwd,
2100
require_stacking=require_stacking)
2101
result_repo, is_new_repo = repository_policy.acquire_repository(
2102
make_working_trees, shared_repo)
2103
if not require_stacking and repository_policy._require_stacking:
2104
require_stacking = True
2105
result._format.require_stacking()
2106
result_repo.lock_write()
2109
repository_policy = None
2110
return result_repo, result, require_stacking, repository_policy
2112
1761
def _initialize_on_transport_vfs(self, transport):
2113
1762
"""Initialize a new bzrdir using VFS calls.
2326
1975
repository_format = property(__return_repository_format)
2329
class BzrDirFormatAllInOne(BzrDirFormat):
2330
"""Common class for formats before meta-dirs."""
2332
def initialize_on_transport_ex(self, transport, use_existing_dir=False,
2333
create_prefix=False, force_new_repo=False, stacked_on=None,
2334
stack_on_pwd=None, repo_format_name=None, make_working_trees=None,
2336
"""See BzrDirFormat.initialize_on_transport_ex."""
2337
require_stacking = (stacked_on is not None)
2338
# Format 5 cannot stack, but we've been asked to - actually init
2340
if require_stacking:
2341
format = BzrDirMetaFormat1()
2342
return format.initialize_on_transport_ex(transport,
2343
use_existing_dir=use_existing_dir, create_prefix=create_prefix,
2344
force_new_repo=force_new_repo, stacked_on=stacked_on,
2345
stack_on_pwd=stack_on_pwd, repo_format_name=repo_format_name,
2346
make_working_trees=make_working_trees, shared_repo=shared_repo)
2347
return BzrDirFormat.initialize_on_transport_ex(self, transport,
2348
use_existing_dir=use_existing_dir, create_prefix=create_prefix,
2349
force_new_repo=force_new_repo, stacked_on=stacked_on,
2350
stack_on_pwd=stack_on_pwd, repo_format_name=repo_format_name,
2351
make_working_trees=make_working_trees, shared_repo=shared_repo)
2354
class BzrDirFormat5(BzrDirFormatAllInOne):
1978
class BzrDirFormat5(BzrDirFormat):
2355
1979
"""Bzr control format 5.
2357
1981
This format is a combined format for working tree, branch and repository.
2511
2135
def set_branch_format(self, format):
2512
2136
self._branch_format = format
2514
def require_stacking(self, stack_on=None, possible_transports=None,
2516
"""We have a request to stack, try to ensure the formats support it.
2518
:param stack_on: If supplied, it is the URL to a branch that we want to
2519
stack on. Check to see if that format supports stacking before
2522
# Stacking is desired. requested by the target, but does the place it
2523
# points at support stacking? If it doesn't then we should
2524
# not implicitly upgrade. We check this here.
2525
new_repo_format = None
2526
new_branch_format = None
2528
# a bit of state for get_target_branch so that we don't try to open it
2529
# 2 times, for both repo *and* branch
2530
target = [None, False, None] # target_branch, checked, upgrade anyway
2531
def get_target_branch():
2533
# We've checked, don't check again
2535
if stack_on is None:
2536
# No target format, that means we want to force upgrading
2537
target[:] = [None, True, True]
2540
target_dir = BzrDir.open(stack_on,
2541
possible_transports=possible_transports)
2542
except errors.NotBranchError:
2543
# Nothing there, don't change formats
2544
target[:] = [None, True, False]
2546
except errors.JailBreak:
2547
# JailBreak, JFDI and upgrade anyway
2548
target[:] = [None, True, True]
2551
target_branch = target_dir.open_branch()
2552
except errors.NotBranchError:
2553
# No branch, don't upgrade formats
2554
target[:] = [None, True, False]
2556
target[:] = [target_branch, True, False]
2559
if (not _skip_repo and
2560
not self.repository_format.supports_external_lookups):
2561
# We need to upgrade the Repository.
2562
target_branch, _, do_upgrade = get_target_branch()
2563
if target_branch is None:
2564
# We don't have a target branch, should we upgrade anyway?
2566
# stack_on is inaccessible, JFDI.
2567
# TODO: bad monkey, hard-coded formats...
2568
if self.repository_format.rich_root_data:
2569
new_repo_format = pack_repo.RepositoryFormatKnitPack5RichRoot()
2571
new_repo_format = pack_repo.RepositoryFormatKnitPack5()
2573
# If the target already supports stacking, then we know the
2574
# project is already able to use stacking, so auto-upgrade
2576
new_repo_format = target_branch.repository._format
2577
if not new_repo_format.supports_external_lookups:
2578
# target doesn't, source doesn't, so don't auto upgrade
2580
new_repo_format = None
2581
if new_repo_format is not None:
2582
self.repository_format = new_repo_format
2583
note('Source repository format does not support stacking,'
2584
' using format:\n %s',
2585
new_repo_format.get_format_description())
2138
def require_stacking(self):
2587
2139
if not self.get_branch_format().supports_stacking():
2588
# We just checked the repo, now lets check if we need to
2589
# upgrade the branch format
2590
target_branch, _, do_upgrade = get_target_branch()
2591
if target_branch is None:
2593
# TODO: bad monkey, hard-coded formats...
2594
new_branch_format = branch.BzrBranchFormat7()
2140
# We need to make a stacked branch, but the default format for the
2141
# target doesn't support stacking. So force a branch that *can*
2143
from bzrlib.branch import BzrBranchFormat7
2144
branch_format = BzrBranchFormat7()
2145
self.set_branch_format(branch_format)
2146
mutter("using %r for stacking" % (branch_format,))
2147
from bzrlib.repofmt import pack_repo
2148
if self.repository_format.rich_root_data:
2149
bzrdir_format_name = '1.6.1-rich-root'
2150
repo_format = pack_repo.RepositoryFormatKnitPack5RichRoot()
2596
new_branch_format = target_branch._format
2597
if not new_branch_format.supports_stacking():
2598
new_branch_format = None
2599
if new_branch_format is not None:
2600
# Does support stacking, use its format.
2601
self.set_branch_format(new_branch_format)
2602
note('Source branch format does not support stacking,'
2603
' using format:\n %s',
2604
new_branch_format.get_format_description())
2152
bzrdir_format_name = '1.6'
2153
repo_format = pack_repo.RepositoryFormatKnitPack5()
2154
note('Source format does not support stacking, using format:'
2156
bzrdir_format_name, repo_format.get_format_description())
2157
self.repository_format = repo_format
2606
2159
def get_converter(self, format=None):
2607
2160
"""See BzrDirFormat.get_converter()."""
3291
2811
return local_dir_format.initialize_on_transport(transport)
3292
2812
client = _SmartClient(client_medium)
3293
2813
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)
2814
response = client.call('BzrDirFormat.initialize', path)
3298
2815
if response[0] != 'ok':
3299
2816
raise errors.SmartProtocolError('unexpected response code %s' % (response,))
3300
2817
format = RemoteBzrDirFormat()
3301
2818
self._supply_sub_formats_to(format)
3302
2819
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
2821
def _open(self, transport):
3451
2822
return remote.RemoteBzrDir(transport, self)
3788
3149
stack_on = self._get_full_stack_on()
3151
# Stacking is desired. requested by the target, but does the place it
3152
# points at support stacking? If it doesn't then we should
3153
# not implicitly upgrade. We check this here.
3790
3154
format = self._bzrdir._format
3791
format.require_stacking(stack_on=stack_on,
3792
possible_transports=[self._bzrdir.root_transport])
3155
if not (format.repository_format.supports_external_lookups
3156
and format.get_branch_format().supports_stacking()):
3157
# May need to upgrade - but only do if the target also
3158
# supports stacking. Note that this currently wastes
3159
# network round trips to check - but we only do this
3160
# when the source can't stack so it will fade away
3161
# as people do upgrade.
3163
target_dir = BzrDir.open(stack_on,
3164
possible_transports=[self._bzrdir.root_transport])
3165
except errors.NotBranchError:
3166
# Nothing there, don't change formats
3170
target_branch = target_dir.open_branch()
3171
except errors.NotBranchError:
3172
# No branch, don't change formats
3175
branch_format = target_branch._format
3176
repo_format = target_branch.repository._format
3177
if not (branch_format.supports_stacking()
3178
and repo_format.supports_external_lookups):
3179
# Doesn't stack itself, don't force an upgrade
3182
# Does support stacking, use its format.
3183
format.repository_format = repo_format
3184
format.set_branch_format(branch_format)
3185
note('Source format does not support stacking, '
3186
'using format: \'%s\'\n %s\n',
3187
branch_format.get_format_description(),
3188
repo_format.get_format_description())
3793
3189
if not self._require_stacking:
3794
3190
# We have picked up automatic stacking somewhere.
3795
3191
note('Using default stacking branch %s at %s', self._stack_on,
3951
3341
'(needed for bzr-svn and bzr-git).',
3952
3342
branch_format='bzrlib.branch.BzrBranchFormat7',
3953
3343
tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3956
format_registry.register_metadir('1.14',
3345
format_registry.register_metadir('development-wt5',
3957
3346
'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack6',
3958
help='A working-tree format that supports content filtering.',
3347
help='A working-tree format that supports views and content filtering.',
3959
3348
branch_format='bzrlib.branch.BzrBranchFormat7',
3960
3349
tree_format='bzrlib.workingtree.WorkingTreeFormat5',
3962
format_registry.register_metadir('1.14-rich-root',
3352
format_registry.register_metadir('development-wt5-rich-root',
3963
3353
'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack6RichRoot',
3964
help='A variant of 1.14 that supports rich-root data '
3354
help='A variant of development-wt5 that supports rich-root data '
3965
3355
'(needed for bzr-svn and bzr-git).',
3966
3356
branch_format='bzrlib.branch.BzrBranchFormat7',
3967
3357
tree_format='bzrlib.workingtree.WorkingTreeFormat5',
3969
# The following un-numbered 'development' formats should always just be aliases.
3970
format_registry.register_metadir('development-rich-root',
3971
'bzrlib.repofmt.groupcompress_repo.RepositoryFormatCHK1',
3972
help='Current development format. Supports rich roots. Can convert data '
3973
'to and from rich-root-pack (and anything compatible with '
3974
'rich-root-pack) format repositories. Repositories and branches in '
3975
'this format can only be read by bzr.dev. Please read '
3976
'http://doc.bazaar.canonical.com/latest/developers/development-repo.html '
3360
# The following two formats should always just be aliases.
3361
format_registry.register_metadir('development',
3362
'bzrlib.repofmt.pack_repo.RepositoryFormatPackDevelopment2',
3363
help='Current development format. Can convert data to and from pack-0.92 '
3364
'(and anything compatible with pack-0.92) format repositories. '
3365
'Repositories and branches in this format can only be read by bzr.dev. '
3367
'http://doc.bazaar-vcs.org/latest/developers/development-repo.html '
3978
3369
branch_format='bzrlib.branch.BzrBranchFormat7',
3979
tree_format='bzrlib.workingtree.WorkingTreeFormat6',
3370
tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3980
3371
experimental=True,
3984
3374
format_registry.register_metadir('development-subtree',
3985
3375
'bzrlib.repofmt.pack_repo.RepositoryFormatPackDevelopment2Subtree',
3987
3377
'from pack-0.92-subtree (and anything compatible with '
3988
3378
'pack-0.92-subtree) format repositories. Repositories and branches in '
3989
3379
'this format can only be read by bzr.dev. Please read '
3990
'http://doc.bazaar.canonical.com/latest/developers/development-repo.html '
3380
'http://doc.bazaar-vcs.org/latest/developers/development-repo.html '
3992
3382
branch_format='bzrlib.branch.BzrBranchFormat7',
3993
tree_format='bzrlib.workingtree.WorkingTreeFormat6',
3383
tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3994
3384
experimental=True,
3996
alias=False, # Restore to being an alias when an actual development subtree format is added
3997
# This current non-alias status is simply because we did not introduce a
3998
# chk based subtree format.
4001
3387
# And the development formats above will have aliased one of the following:
4002
format_registry.register_metadir('development6-rich-root',
4003
'bzrlib.repofmt.groupcompress_repo.RepositoryFormatCHK1',
4004
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 '
4008
branch_format='bzrlib.branch.BzrBranchFormat7',
4009
tree_format='bzrlib.workingtree.WorkingTreeFormat6',
4014
format_registry.register_metadir('development7-rich-root',
4015
'bzrlib.repofmt.groupcompress_repo.RepositoryFormatCHK2',
4016
help='pack-1.9 with 255-way hashed CHK inv, bencode revision, group compress, '
4017
'rich roots. Please read '
4018
'http://doc.bazaar.canonical.com/latest/developers/development-repo.html '
4020
branch_format='bzrlib.branch.BzrBranchFormat7',
4021
tree_format='bzrlib.workingtree.WorkingTreeFormat6',
4026
format_registry.register_metadir('2a',
4027
'bzrlib.repofmt.groupcompress_repo.RepositoryFormat2a',
4028
help='First format for bzr 2.0 series.\n'
4029
'Uses group-compress storage.\n'
4030
'Provides rich roots which are a one-way transition.\n',
4031
# 'storage in packs, 255-way hashed CHK inventory, bencode revision, group compress, '
4032
# 'rich roots. Supported by bzr 1.16 and later.',
4033
branch_format='bzrlib.branch.BzrBranchFormat7',
4034
tree_format='bzrlib.workingtree.WorkingTreeFormat6',
3388
format_registry.register_metadir('development2',
3389
'bzrlib.repofmt.pack_repo.RepositoryFormatPackDevelopment2',
3390
help='1.6.1 with B+Tree based index. '
3392
'http://doc.bazaar-vcs.org/latest/developers/development-repo.html '
3394
branch_format='bzrlib.branch.BzrBranchFormat7',
3395
tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3399
format_registry.register_metadir('development2-subtree',
3400
'bzrlib.repofmt.pack_repo.RepositoryFormatPackDevelopment2Subtree',
3401
help='1.6.1-subtree with B+Tree based index. '
3403
'http://doc.bazaar-vcs.org/latest/developers/development-repo.html '
3405
branch_format='bzrlib.branch.BzrBranchFormat7',
3406
tree_format='bzrlib.workingtree.WorkingTreeFormat4',
4038
3410
# The following format should be an alias for the rich root equivalent
4039
3411
# of the default format
4040
3412
format_registry.register_metadir('default-rich-root',
4041
'bzrlib.repofmt.groupcompress_repo.RepositoryFormat2a',
4042
branch_format='bzrlib.branch.BzrBranchFormat7',
4043
tree_format='bzrlib.workingtree.WorkingTreeFormat6',
3413
'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack4',
3414
help='Default format, rich root variant. (needed for bzr-svn and bzr-git).',
3415
branch_format='bzrlib.branch.BzrBranchFormat6',
3416
tree_format='bzrlib.workingtree.WorkingTreeFormat4',
4048
3419
# The current format that is made on 'bzr init'.
4049
format_registry.set_default('2a')
3420
format_registry.set_default('pack-0.92')