2370
2358
def set_branch_format(self, format):
2371
2359
self._branch_format = format
2373
def require_stacking(self, stack_on=None, possible_transports=None,
2375
"""We have a request to stack, try to ensure the formats support it.
2377
:param stack_on: If supplied, it is the URL to a branch that we want to
2378
stack on. Check to see if that format supports stacking before
2381
# Stacking is desired. requested by the target, but does the place it
2382
# points at support stacking? If it doesn't then we should
2383
# not implicitly upgrade. We check this here.
2384
new_repo_format = None
2385
new_branch_format = None
2387
# a bit of state for get_target_branch so that we don't try to open it
2388
# 2 times, for both repo *and* branch
2389
target = [None, False, None] # target_branch, checked, upgrade anyway
2390
def get_target_branch():
2392
# We've checked, don't check again
2394
if stack_on is None:
2395
# No target format, that means we want to force upgrading
2396
target[:] = [None, True, True]
2399
target_dir = BzrDir.open(stack_on,
2400
possible_transports=possible_transports)
2401
except errors.NotBranchError:
2402
# Nothing there, don't change formats
2403
target[:] = [None, True, False]
2405
except errors.JailBreak:
2406
# JailBreak, JFDI and upgrade anyway
2407
target[:] = [None, True, True]
2410
target_branch = target_dir.open_branch()
2411
except errors.NotBranchError:
2412
# No branch, don't upgrade formats
2413
target[:] = [None, True, False]
2415
target[:] = [target_branch, True, False]
2418
if (not _skip_repo and
2419
not self.repository_format.supports_external_lookups):
2420
# We need to upgrade the Repository.
2421
target_branch, _, do_upgrade = get_target_branch()
2422
if target_branch is None:
2423
# We don't have a target branch, should we upgrade anyway?
2425
# stack_on is inaccessible, JFDI.
2426
# TODO: bad monkey, hard-coded formats...
2427
if self.repository_format.rich_root_data:
2428
new_repo_format = pack_repo.RepositoryFormatKnitPack5RichRoot()
2430
new_repo_format = pack_repo.RepositoryFormatKnitPack5()
2432
# If the target already supports stacking, then we know the
2433
# project is already able to use stacking, so auto-upgrade
2435
new_repo_format = target_branch.repository._format
2436
if not new_repo_format.supports_external_lookups:
2437
# target doesn't, source doesn't, so don't auto upgrade
2439
new_repo_format = None
2440
if new_repo_format is not None:
2441
self.repository_format = new_repo_format
2442
note('Source repository format does not support stacking,'
2443
' using format:\n %s',
2444
new_repo_format.get_format_description())
2361
def require_stacking(self):
2446
2362
if not self.get_branch_format().supports_stacking():
2447
# We just checked the repo, now lets check if we need to
2448
# upgrade the branch format
2449
target_branch, _, do_upgrade = get_target_branch()
2450
if target_branch is None:
2452
# TODO: bad monkey, hard-coded formats...
2453
new_branch_format = branch.BzrBranchFormat7()
2363
# We need to make a stacked branch, but the default format for the
2364
# target doesn't support stacking. So force a branch that *can*
2366
from bzrlib.branch import BzrBranchFormat7
2367
branch_format = BzrBranchFormat7()
2368
self.set_branch_format(branch_format)
2369
mutter("using %r for stacking" % (branch_format,))
2370
from bzrlib.repofmt import pack_repo
2371
if self.repository_format.rich_root_data:
2372
bzrdir_format_name = '1.6.1-rich-root'
2373
repo_format = pack_repo.RepositoryFormatKnitPack5RichRoot()
2455
new_branch_format = target_branch._format
2456
if not new_branch_format.supports_stacking():
2457
new_branch_format = None
2458
if new_branch_format is not None:
2459
# Does support stacking, use its format.
2460
self.set_branch_format(new_branch_format)
2461
note('Source branch format does not support stacking,'
2462
' using format:\n %s',
2463
new_branch_format.get_format_description())
2375
bzrdir_format_name = '1.6'
2376
repo_format = pack_repo.RepositoryFormatKnitPack5()
2377
note('Source format does not support stacking, using format:'
2379
bzrdir_format_name, repo_format.get_format_description())
2380
self.repository_format = repo_format
2465
2382
def get_converter(self, format=None):
2466
2383
"""See BzrDirFormat.get_converter()."""
3202
3115
stack_on_pwd=stack_on_pwd, repo_format_name=repo_format_name,
3203
3116
make_working_trees=make_working_trees, shared_repo=shared_repo,
3205
return self._initialize_on_transport_ex_rpc(client, path, transport,
3206
use_existing_dir, create_prefix, force_new_repo, stacked_on,
3207
stack_on_pwd, repo_format_name, make_working_trees, shared_repo)
3209
def _initialize_on_transport_ex_rpc(self, client, path, transport,
3210
use_existing_dir, create_prefix, force_new_repo, stacked_on,
3211
stack_on_pwd, repo_format_name, make_working_trees, shared_repo):
3213
3119
args.append(self._serialize_NoneTrueFalse(use_existing_dir))
3214
3120
args.append(self._serialize_NoneTrueFalse(create_prefix))
3631
3521
stack_on = self._get_full_stack_on()
3523
# Stacking is desired. requested by the target, but does the place it
3524
# points at support stacking? If it doesn't then we should
3525
# not implicitly upgrade. We check this here.
3633
3526
format = self._bzrdir._format
3634
format.require_stacking(stack_on=stack_on,
3635
possible_transports=[self._bzrdir.root_transport])
3527
if not (format.repository_format.supports_external_lookups
3528
and format.get_branch_format().supports_stacking()):
3529
# May need to upgrade - but only do if the target also
3530
# supports stacking. Note that this currently wastes
3531
# network round trips to check - but we only do this
3532
# when the source can't stack so it will fade away
3533
# as people do upgrade.
3534
branch_format = None
3537
target_dir = BzrDir.open(stack_on,
3538
possible_transports=[self._bzrdir.root_transport])
3539
except errors.NotBranchError:
3540
# Nothing there, don't change formats
3542
except errors.JailBreak:
3543
# stack_on is inaccessible, JFDI.
3544
if format.repository_format.rich_root_data:
3545
repo_format = pack_repo.RepositoryFormatKnitPack6RichRoot()
3547
repo_format = pack_repo.RepositoryFormatKnitPack6()
3548
branch_format = branch.BzrBranchFormat7()
3551
target_branch = target_dir.open_branch()
3552
except errors.NotBranchError:
3553
# No branch, don't change formats
3556
branch_format = target_branch._format
3557
repo_format = target_branch.repository._format
3558
if not (branch_format.supports_stacking()
3559
and repo_format.supports_external_lookups):
3560
# Doesn't stack itself, don't force an upgrade
3561
branch_format = None
3563
if branch_format and repo_format:
3564
# Does support stacking, use its format.
3565
format.repository_format = repo_format
3566
format.set_branch_format(branch_format)
3567
note('Source format does not support stacking, '
3568
'using format: \'%s\'\n %s\n',
3569
branch_format.get_format_description(),
3570
repo_format.get_format_description())
3636
3571
if not self._require_stacking:
3637
3572
# We have picked up automatic stacking somewhere.
3638
3573
note('Using default stacking branch %s at %s', self._stack_on,
3845
3780
experimental=True,
3848
format_registry.register_metadir('development7-rich-root',
3849
'bzrlib.repofmt.groupcompress_repo.RepositoryFormatCHK2',
3850
help='pack-1.9 with 255-way hashed CHK inv, bencode revision, group compress, '
3851
'rich roots. Please read '
3852
'http://doc.bazaar-vcs.org/latest/developers/development-repo.html '
3854
branch_format='bzrlib.branch.BzrBranchFormat7',
3855
tree_format='bzrlib.workingtree.WorkingTreeFormat6',
3860
format_registry.register_metadir('2a',
3861
'bzrlib.repofmt.groupcompress_repo.RepositoryFormat2a',
3862
help='First format for bzr 2.0 series.\n'
3863
'Uses group-compress storage.\n'
3864
'Provides rich roots which are a one-way transition.\n',
3865
# 'storage in packs, 255-way hashed CHK inventory, bencode revision, group compress, '
3866
# 'rich roots. Supported by bzr 1.16 and later.',
3867
branch_format='bzrlib.branch.BzrBranchFormat7',
3868
tree_format='bzrlib.workingtree.WorkingTreeFormat6',
3872
3783
# The following format should be an alias for the rich root equivalent
3873
3784
# of the default format
3874
3785
format_registry.register_metadir('default-rich-root',
3875
'bzrlib.repofmt.groupcompress_repo.RepositoryFormat2a',
3876
branch_format='bzrlib.branch.BzrBranchFormat7',
3877
tree_format='bzrlib.workingtree.WorkingTreeFormat6',
3786
'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack4',
3787
help='Default format, rich root variant. (needed for bzr-svn and bzr-git).',
3788
branch_format='bzrlib.branch.BzrBranchFormat6',
3789
tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3881
3792
# The current format that is made on 'bzr init'.
3882
format_registry.set_default('2a')
3793
format_registry.set_default('pack-0.92')