91
class ControlComponent(object):
92
"""Abstract base class for control directory components.
94
This provides interfaces that are common across bzrdirs,
95
repositories, branches, and workingtree control directories.
97
They all expose two urls and transports: the *user* URL is the
98
one that stops above the control directory (eg .bzr) and that
99
should normally be used in messages, and the *control* URL is
100
under that in eg .bzr/checkout and is used to read the control
103
This can be used as a mixin and is intended to fit with
108
def control_transport(self):
109
raise NotImplementedError
112
def control_url(self):
113
return self.control_transport.base
116
def user_transport(self):
117
raise NotImplementedError
121
return self.user_transport.base
124
class BzrDir(ControlComponent):
125
91
"""A .bzr control diretory.
127
93
BzrDir instances let you create or open any of the things that can be
414
364
except errors.NoRepositoryPresent:
417
return False, ([], repository)
418
return True, (bzrdir.list_branches(), None)
420
for branches, repo in BzrDir.find_bzrdirs(transport,
367
return False, (None, repository)
369
branch = bzrdir.open_branch()
370
except errors.NotBranchError:
371
return True, (None, None)
373
return True, (branch, None)
375
for branch, repo in BzrDir.find_bzrdirs(transport, evaluate=evaluate):
422
376
if repo is not None:
423
ret.extend(repo.find_branches())
424
if branches is not None:
377
branches.extend(repo.find_branches())
378
if branch is not None:
379
branches.append(branch)
428
382
def destroy_repository(self):
429
383
"""Destroy the repository in this BzrDir"""
430
384
raise NotImplementedError(self.destroy_repository)
432
def create_branch(self, name=None):
386
def create_branch(self):
433
387
"""Create a branch in this BzrDir.
435
:param name: Name of the colocated branch to create, None for
438
389
The bzrdir's format will control what branch format is created.
439
390
For more control see BranchFormatXX.create(a_bzrdir).
441
392
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
394
def destroy_branch(self):
395
"""Destroy the branch in this BzrDir"""
449
396
raise NotImplementedError(self.destroy_branch)
621
568
: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
570
pb = ui.ui_factory.nested_progress_bar()
634
572
# FIXME: bug 300001 -- the backup fails if the backup directory
635
573
# already exists, but it should instead either remove it or make
636
574
# a new backup directory.
576
# FIXME: bug 262450 -- the backup directory should have the same
577
# permissions as the .bzr directory (probably a bug in copy_tree)
638
578
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)
579
new_path = self.root_transport.abspath('backup.bzr')
580
pb.note('making backup of %s' % (old_path,))
581
pb.note(' to %s' % (new_path,))
582
self.root_transport.copy_tree('.bzr', 'backup.bzr')
642
583
return (old_path, new_path)
737
678
raise errors.NoRepositoryPresent(self)
738
679
return found_repo
740
def get_branch_reference(self, name=None):
681
def get_branch_reference(self):
741
682
"""Return the referenced URL for the branch in this bzrdir.
743
:param name: Optional colocated branch name
744
684
:raises NotBranchError: If there is no Branch.
745
:raises NoColocatedBranchSupport: If a branch name was specified
746
but colocated branches are not supported.
747
685
:return: The URL the branch in this bzrdir references if it is a
748
686
reference branch, or None for regular branches.
751
raise errors.NoColocatedBranchSupport(self)
754
def get_branch_transport(self, branch_format, name=None):
690
def get_branch_transport(self, branch_format):
755
691
"""Get the transport for use by branch format in this BzrDir.
757
693
Note that bzr dirs that do not support format strings will raise
1383
1303
self.create_hook(hooks.HookPoint('pre_open',
1384
1304
"Invoked before attempting to open a BzrDir with the transport "
1385
1305
"that the open will use.", (1, 14), None))
1386
self.create_hook(hooks.HookPoint('post_repo_init',
1387
"Invoked after a repository has been initialized. "
1388
"post_repo_init is called with a "
1389
"bzrlib.bzrdir.RepoInitHookParams.",
1392
1307
# install the default hooks
1393
1308
BzrDir.hooks = BzrDirHooks()
1396
class RepoInitHookParams(object):
1397
"""Object holding parameters passed to *_repo_init hooks.
1399
There are 4 fields that hooks may wish to access:
1401
:ivar repository: Repository created
1402
:ivar format: Repository format
1403
:ivar bzrdir: The bzrdir for the repository
1404
:ivar shared: The repository is shared
1407
def __init__(self, repository, format, a_bzrdir, shared):
1408
"""Create a group of RepoInitHook parameters.
1410
:param repository: Repository created
1411
:param format: Repository format
1412
:param bzrdir: The bzrdir for the repository
1413
:param shared: The repository is shared
1415
self.repository = repository
1416
self.format = format
1417
self.bzrdir = a_bzrdir
1418
self.shared = shared
1420
def __eq__(self, other):
1421
return self.__dict__ == other.__dict__
1425
return "<%s for %s>" % (self.__class__.__name__,
1428
return "<%s for %s>" % (self.__class__.__name__,
1432
1311
class BzrDirPreSplitOut(BzrDir):
1433
1312
"""A common class for the all-in-one formats."""
1581
1455
format = BzrDirFormat.get_default_format()
1582
1456
return not isinstance(self._format, format.__class__)
1584
def open_branch(self, name=None, unsupported=False,
1585
ignore_fallbacks=False):
1458
def open_branch(self, unsupported=False, ignore_fallbacks=False):
1586
1459
"""See BzrDir.open_branch."""
1587
1460
from bzrlib.branch import BzrBranchFormat4
1588
1461
format = BzrBranchFormat4()
1589
1462
self._check_supported(format, unsupported)
1590
return format.open(self, name, _found=True)
1463
return format.open(self, _found=True)
1592
1465
def sprout(self, url, revision_id=None, force_new_repo=False,
1593
1466
possible_transports=None, accelerator_tree=None,
1760
1623
lockable_files.TransportLock)
1761
1624
return temp_control._dir_mode
1763
def get_branch_reference(self, name=None):
1626
def get_branch_reference(self):
1764
1627
"""See BzrDir.get_branch_reference()."""
1765
1628
from bzrlib.branch import BranchFormat
1766
format = BranchFormat.find_format(self, name=name)
1767
return format.get_reference(self, name=name)
1629
format = BranchFormat.find_format(self)
1630
return format.get_reference(self)
1769
def get_branch_transport(self, branch_format, name=None):
1632
def get_branch_transport(self, branch_format):
1770
1633
"""See BzrDir.get_branch_transport()."""
1771
if name is not None:
1772
raise errors.NoColocatedBranchSupport(self)
1773
# XXX: this shouldn't implicitly create the directory if it's just
1774
# promising to get a transport -- mbp 20090727
1775
1634
if branch_format is None:
1776
1635
return self.transport.clone('branch')
2521
2358
def set_branch_format(self, format):
2522
2359
self._branch_format = format
2524
def require_stacking(self, stack_on=None, possible_transports=None,
2526
"""We have a request to stack, try to ensure the formats support it.
2528
:param stack_on: If supplied, it is the URL to a branch that we want to
2529
stack on. Check to see if that format supports stacking before
2532
# Stacking is desired. requested by the target, but does the place it
2533
# points at support stacking? If it doesn't then we should
2534
# not implicitly upgrade. We check this here.
2535
new_repo_format = None
2536
new_branch_format = None
2538
# a bit of state for get_target_branch so that we don't try to open it
2539
# 2 times, for both repo *and* branch
2540
target = [None, False, None] # target_branch, checked, upgrade anyway
2541
def get_target_branch():
2543
# We've checked, don't check again
2545
if stack_on is None:
2546
# No target format, that means we want to force upgrading
2547
target[:] = [None, True, True]
2550
target_dir = BzrDir.open(stack_on,
2551
possible_transports=possible_transports)
2552
except errors.NotBranchError:
2553
# Nothing there, don't change formats
2554
target[:] = [None, True, False]
2556
except errors.JailBreak:
2557
# JailBreak, JFDI and upgrade anyway
2558
target[:] = [None, True, True]
2561
target_branch = target_dir.open_branch()
2562
except errors.NotBranchError:
2563
# No branch, don't upgrade formats
2564
target[:] = [None, True, False]
2566
target[:] = [target_branch, True, False]
2569
if (not _skip_repo and
2570
not self.repository_format.supports_external_lookups):
2571
# We need to upgrade the Repository.
2572
target_branch, _, do_upgrade = get_target_branch()
2573
if target_branch is None:
2574
# We don't have a target branch, should we upgrade anyway?
2576
# stack_on is inaccessible, JFDI.
2577
# TODO: bad monkey, hard-coded formats...
2578
if self.repository_format.rich_root_data:
2579
new_repo_format = pack_repo.RepositoryFormatKnitPack5RichRoot()
2581
new_repo_format = pack_repo.RepositoryFormatKnitPack5()
2583
# If the target already supports stacking, then we know the
2584
# project is already able to use stacking, so auto-upgrade
2586
new_repo_format = target_branch.repository._format
2587
if not new_repo_format.supports_external_lookups:
2588
# target doesn't, source doesn't, so don't auto upgrade
2590
new_repo_format = None
2591
if new_repo_format is not None:
2592
self.repository_format = new_repo_format
2593
note('Source repository format does not support stacking,'
2594
' using format:\n %s',
2595
new_repo_format.get_format_description())
2361
def require_stacking(self):
2597
2362
if not self.get_branch_format().supports_stacking():
2598
# We just checked the repo, now lets check if we need to
2599
# upgrade the branch format
2600
target_branch, _, do_upgrade = get_target_branch()
2601
if target_branch is None:
2603
# TODO: bad monkey, hard-coded formats...
2604
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()
2606
new_branch_format = target_branch._format
2607
if not new_branch_format.supports_stacking():
2608
new_branch_format = None
2609
if new_branch_format is not None:
2610
# Does support stacking, use its format.
2611
self.set_branch_format(new_branch_format)
2612
note('Source branch format does not support stacking,'
2613
' using format:\n %s',
2614
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
2616
2382
def get_converter(self, format=None):
2617
2383
"""See BzrDirFormat.get_converter()."""
2737
2503
def convert(self, to_convert, pb):
2738
2504
"""See Converter.convert()."""
2739
2505
self.bzrdir = to_convert
2741
warnings.warn("pb parameter to convert() is deprecated")
2742
self.pb = ui.ui_factory.nested_progress_bar()
2744
ui.ui_factory.note('starting upgrade from format 4 to 5')
2745
if isinstance(self.bzrdir.transport, local.LocalTransport):
2746
self.bzrdir.get_workingtree_transport(None).delete('stat-cache')
2747
self._convert_to_weaves()
2748
return BzrDir.open(self.bzrdir.user_url)
2507
self.pb.note('starting upgrade from format 4 to 5')
2508
if isinstance(self.bzrdir.transport, local.LocalTransport):
2509
self.bzrdir.get_workingtree_transport(None).delete('stat-cache')
2510
self._convert_to_weaves()
2511
return BzrDir.open(self.bzrdir.root_transport.base)
2752
2513
def _convert_to_weaves(self):
2753
ui.ui_factory.note('note: upgrade may be faster if all store files are ungzipped first')
2514
self.pb.note('note: upgrade may be faster if all store files are ungzipped first')
2755
2516
# TODO permissions
2756
2517
stat = self.bzrdir.transport.stat('weaves')
3001
2755
def convert(self, to_convert, pb):
3002
2756
"""See Converter.convert()."""
3003
2757
self.bzrdir = to_convert
3004
pb = ui.ui_factory.nested_progress_bar()
3006
ui.ui_factory.note('starting upgrade from format 5 to 6')
3007
self._convert_to_prefixed()
3008
return BzrDir.open(self.bzrdir.user_url)
2759
self.pb.note('starting upgrade from format 5 to 6')
2760
self._convert_to_prefixed()
2761
return BzrDir.open(self.bzrdir.root_transport.base)
3012
2763
def _convert_to_prefixed(self):
3013
2764
from bzrlib.store import TransportStore
3014
2765
self.bzrdir.transport.delete('branch-format')
3015
2766
for store_name in ["weaves", "revision-store"]:
3016
ui.ui_factory.note("adding prefixes to %s" % store_name)
2767
self.pb.note("adding prefixes to %s" % store_name)
3017
2768
store_transport = self.bzrdir.transport.clone(store_name)
3018
2769
store = TransportStore(store_transport, prefixed=True)
3019
2770
for urlfilename in store_transport.list_dir('.'):
3377
3115
stack_on_pwd=stack_on_pwd, repo_format_name=repo_format_name,
3378
3116
make_working_trees=make_working_trees, shared_repo=shared_repo,
3380
return self._initialize_on_transport_ex_rpc(client, path, transport,
3381
use_existing_dir, create_prefix, force_new_repo, stacked_on,
3382
stack_on_pwd, repo_format_name, make_working_trees, shared_repo)
3384
def _initialize_on_transport_ex_rpc(self, client, path, transport,
3385
use_existing_dir, create_prefix, force_new_repo, stacked_on,
3386
stack_on_pwd, repo_format_name, make_working_trees, shared_repo):
3388
3119
args.append(self._serialize_NoneTrueFalse(use_existing_dir))
3389
3120
args.append(self._serialize_NoneTrueFalse(create_prefix))
3401
3132
args.append(self._serialize_NoneString(repo_format_name))
3402
3133
args.append(self._serialize_NoneTrueFalse(make_working_trees))
3403
3134
args.append(self._serialize_NoneTrueFalse(shared_repo))
3404
request_network_name = self._network_name or \
3135
if self._network_name is None:
3136
self._network_name = \
3405
3137
BzrDirFormat.get_default_format().network_name()
3407
response = client.call('BzrDirFormat.initialize_ex_1.16',
3408
request_network_name, path, *args)
3139
response = client.call('BzrDirFormat.initialize_ex',
3140
self.network_name(), path, *args)
3409
3141
except errors.UnknownSmartMethod:
3410
client._medium._remember_remote_is_before((1,16))
3411
3142
local_dir_format = BzrDirMetaFormat1()
3412
3143
self._supply_sub_formats_to(local_dir_format)
3413
3144
return local_dir_format.initialize_on_transport_ex(transport,
3805
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.
3807
3526
format = self._bzrdir._format
3808
format.require_stacking(stack_on=stack_on,
3809
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())
3810
3571
if not self._require_stacking:
3811
3572
# We have picked up automatic stacking somewhere.
3812
3573
note('Using default stacking branch %s at %s', self._stack_on,
3855
3616
format_registry.register('weave', BzrDirFormat6,
3856
3617
'Pre-0.8 format. Slower than knit and does not'
3857
3618
' support checkouts or shared repositories.',
3859
3619
deprecated=True)
3860
3620
format_registry.register_metadir('metaweave',
3861
3621
'bzrlib.repofmt.weaverepo.RepositoryFormat7',
3862
3622
'Transitional format in 0.8. Slower than knit.',
3863
3623
branch_format='bzrlib.branch.BzrBranchFormat5',
3864
3624
tree_format='bzrlib.workingtree.WorkingTreeFormat3',
3866
3625
deprecated=True)
3867
3626
format_registry.register_metadir('knit',
3868
3627
'bzrlib.repofmt.knitrepo.RepositoryFormatKnit1',
3869
3628
'Format using knits. Recommended for interoperation with bzr <= 0.14.',
3870
3629
branch_format='bzrlib.branch.BzrBranchFormat5',
3871
3630
tree_format='bzrlib.workingtree.WorkingTreeFormat3',
3873
3631
deprecated=True)
3874
3632
format_registry.register_metadir('dirstate',
3875
3633
'bzrlib.repofmt.knitrepo.RepositoryFormatKnit1',
4020
3772
'bzrlib.repofmt.groupcompress_repo.RepositoryFormatCHK1',
4021
3773
help='pack-1.9 with 255-way hashed CHK inv, group compress, rich roots '
4023
'http://doc.bazaar.canonical.com/latest/developers/development-repo.html '
4025
branch_format='bzrlib.branch.BzrBranchFormat7',
4026
tree_format='bzrlib.workingtree.WorkingTreeFormat6',
4031
format_registry.register_metadir('development7-rich-root',
4032
'bzrlib.repofmt.groupcompress_repo.RepositoryFormatCHK2',
4033
help='pack-1.9 with 255-way hashed CHK inv, bencode revision, group compress, '
4034
'rich roots. Please read '
4035
'http://doc.bazaar.canonical.com/latest/developers/development-repo.html '
4037
branch_format='bzrlib.branch.BzrBranchFormat7',
4038
tree_format='bzrlib.workingtree.WorkingTreeFormat6',
4043
format_registry.register_metadir('2a',
4044
'bzrlib.repofmt.groupcompress_repo.RepositoryFormat2a',
4045
help='First format for bzr 2.0 series.\n'
4046
'Uses group-compress storage.\n'
4047
'Provides rich roots which are a one-way transition.\n',
4048
# 'storage in packs, 255-way hashed CHK inventory, bencode revision, group compress, '
4049
# 'rich roots. Supported by bzr 1.16 and later.',
4050
branch_format='bzrlib.branch.BzrBranchFormat7',
4051
tree_format='bzrlib.workingtree.WorkingTreeFormat6',
3775
'http://doc.bazaar-vcs.org/latest/developers/development-repo.html '
3777
branch_format='bzrlib.branch.BzrBranchFormat7',
3778
tree_format='bzrlib.workingtree.WorkingTreeFormat6',
4052
3780
experimental=True,
4055
3783
# The following format should be an alias for the rich root equivalent
4056
3784
# of the default format
4057
3785
format_registry.register_metadir('default-rich-root',
4058
'bzrlib.repofmt.groupcompress_repo.RepositoryFormat2a',
4059
branch_format='bzrlib.branch.BzrBranchFormat7',
4060
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',
4065
3792
# The current format that is made on 'bzr init'.
4066
format_registry.set_default('2a')
3793
format_registry.set_default('pack-0.92')