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):
92
125
"""A .bzr control diretory.
94
127
BzrDir instances let you create or open any of the things that can be
261
294
# copied, and finally if we are copying up to a specific
262
295
# revision_id then we can use the pending-ancestry-result which
263
296
# does not require traversing all of history to describe it.
264
if (result_repo.bzrdir.root_transport.base ==
265
result.root_transport.base and not require_stacking and
297
if (result_repo.user_url == result.user_url
298
and not require_stacking and
266
299
revision_id is not None):
267
300
fetch_spec = graph.PendingAncestryResult(
268
301
[revision_id], local_repo)
466
499
except errors.NoRepositoryPresent:
467
500
repository = None
469
if ((found_bzrdir.root_transport.base !=
470
self.root_transport.base) and not repository.is_shared()):
502
if (found_bzrdir.user_url != self.user_url
503
and not repository.is_shared()):
471
504
# Don't look higher, can't use a higher shared repo.
472
505
repository = None
602
635
# already exists, but it should instead either remove it or make
603
636
# a new backup directory.
605
# FIXME: bug 262450 -- the backup directory should have the same
606
# permissions as the .bzr directory (probably a bug in copy_tree)
607
638
old_path = self.root_transport.abspath('.bzr')
608
639
new_path = self.root_transport.abspath(backup_dir)
609
640
ui.ui_factory.note('making backup of %s\n to %s' % (old_path, new_path,))
673
704
next_transport = found_bzrdir.root_transport.clone('..')
674
if (found_bzrdir.root_transport.base == next_transport.base):
705
if (found_bzrdir.user_url == next_transport.base):
675
706
# top of the file system
677
708
# find the next containing bzrdir
694
725
repository = found_bzrdir.open_repository()
695
726
except errors.NoRepositoryPresent:
696
727
return None, False
697
if found_bzrdir.root_transport.base == self.root_transport.base:
728
if found_bzrdir.user_url == self.user_url:
698
729
return repository, True
699
730
elif repository.is_shared():
700
731
return repository, True
718
def get_branch_transport(self, branch_format):
749
def get_branch_transport(self, branch_format, name=None):
719
750
"""Get the transport for use by branch format in this BzrDir.
721
752
Note that bzr dirs that do not support format strings will raise
816
847
:param _transport: the transport this dir is based at.
818
849
self._format = _format
850
# these are also under the more standard names of
851
# control_transport and user_transport
819
852
self.transport = _transport.clone('.bzr')
820
853
self.root_transport = _transport
821
854
self._mode_check_done = False
857
def user_transport(self):
858
return self.root_transport
861
def control_transport(self):
862
return self.transport
823
864
def is_control_filename(self, filename):
824
865
"""True if filename is the name of a path which is reserved for bzrdir's.
1332
1373
self.create_hook(hooks.HookPoint('pre_open',
1333
1374
"Invoked before attempting to open a BzrDir with the transport "
1334
1375
"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.",
1336
1382
# install the default hooks
1337
1383
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__,
1340
1422
class BzrDirPreSplitOut(BzrDir):
1341
1423
"""A common class for the all-in-one formats."""
1384
1466
def create_branch(self, name=None):
1385
1467
"""See BzrDir.create_branch."""
1386
if name is not None:
1387
raise errors.NoColocatedBranchSupport(self)
1388
return self._format.get_branch_format().initialize(self)
1468
return self._format.get_branch_format().initialize(self, name=name)
1390
1470
def destroy_branch(self, name=None):
1391
1471
"""See BzrDir.destroy_branch."""
1449
1529
raise errors.UnsupportedOperation(self.destroy_workingtree_metadata,
1452
def get_branch_transport(self, branch_format):
1532
def get_branch_transport(self, branch_format, name=None):
1453
1533
"""See BzrDir.get_branch_transport()."""
1534
if name is not None:
1535
raise errors.NoColocatedBranchSupport(self)
1454
1536
if branch_format is None:
1455
1537
return self.transport
1492
1574
def open_branch(self, name=None, unsupported=False,
1493
1575
ignore_fallbacks=False):
1494
1576
"""See BzrDir.open_branch."""
1495
if name is not None:
1496
raise errors.NoColocatedBranchSupport(self)
1497
1577
from bzrlib.branch import BzrBranchFormat4
1498
1578
format = BzrBranchFormat4()
1499
1579
self._check_supported(format, unsupported)
1500
return format.open(self, _found=True)
1580
return format.open(self, name, _found=True)
1502
1582
def sprout(self, url, revision_id=None, force_new_repo=False,
1503
1583
possible_transports=None, accelerator_tree=None,
1623
1703
def create_branch(self, name=None):
1624
1704
"""See BzrDir.create_branch."""
1625
if name is not None:
1626
raise errors.NoColocatedBranchSupport(self)
1627
return self._format.get_branch_format().initialize(self)
1705
return self._format.get_branch_format().initialize(self, name=name)
1629
1707
def destroy_branch(self, name=None):
1630
1708
"""See BzrDir.create_branch."""
1678
1756
format = BranchFormat.find_format(self)
1679
1757
return format.get_reference(self)
1681
def get_branch_transport(self, branch_format):
1759
def get_branch_transport(self, branch_format, name=None):
1682
1760
"""See BzrDir.get_branch_transport()."""
1761
if name is not None:
1762
raise errors.NoColocatedBranchSupport(self)
1683
1763
# XXX: this shouldn't implicitly create the directory if it's just
1684
1764
# promising to get a transport -- mbp 20090727
1685
1765
if branch_format is None:
1774
1854
def open_branch(self, name=None, unsupported=False,
1775
1855
ignore_fallbacks=False):
1776
1856
"""See BzrDir.open_branch."""
1777
if name is not None:
1778
raise errors.NoColocatedBranchSupport(self)
1779
1857
format = self.find_branch_format()
1780
1858
self._check_supported(format, unsupported)
1781
return format.open(self, _found=True, ignore_fallbacks=ignore_fallbacks)
1859
return format.open(self, name=name,
1860
_found=True, ignore_fallbacks=ignore_fallbacks)
1783
1862
def open_repository(self, unsupported=False):
1784
1863
"""See BzrDir.open_repository."""
2656
2735
if isinstance(self.bzrdir.transport, local.LocalTransport):
2657
2736
self.bzrdir.get_workingtree_transport(None).delete('stat-cache')
2658
2737
self._convert_to_weaves()
2659
return BzrDir.open(self.bzrdir.root_transport.base)
2738
return BzrDir.open(self.bzrdir.user_url)
2661
2740
self.pb.finished()
3037
3116
BzrDirMetaFormat1().get_format_string(),
3038
3117
mode=self.file_mode)
3039
3118
self.pb.finished()
3040
return BzrDir.open(self.bzrdir.root_transport.base)
3119
return BzrDir.open(self.bzrdir.user_url)
3042
3121
def make_lock(self, name):
3043
3122
"""Make a lock for the new control dir name."""
3625
3704
stack_on = urlutils.rebase_url(self._stack_on,
3626
3705
self._stack_on_pwd,
3627
branch.bzrdir.root_transport.base)
3628
3707
except errors.InvalidRebaseURLs:
3629
3708
stack_on = self._get_full_stack_on()