1
# Copyright (C) 2006-2010 Canonical Ltd
1
# Copyright (C) 2005, 2006, 2007, 2008, 2009 Canonical Ltd
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
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
90
"""A .bzr control diretory.
127
92
BzrDir instances let you create or open any of the things that can be
165
130
def check_conversion_target(self, target_format):
166
"""Check that a bzrdir as a whole can be converted to a new format."""
167
# The only current restriction is that the repository content can be
168
# fetched compatibly with the target.
169
131
target_repo_format = target_format.repository_format
171
self.open_repository()._format.check_conversion_target(
173
except errors.NoRepositoryPresent:
174
# No repo, no problem.
132
source_repo_format = self._format.repository_format
133
source_repo_format.check_conversion_target(target_repo_format)
178
136
def _check_supported(format, allow_unsupported,
294
252
# copied, and finally if we are copying up to a specific
295
253
# revision_id then we can use the pending-ancestry-result which
296
254
# 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
255
if (result_repo.bzrdir.root_transport.base ==
256
result.root_transport.base and not require_stacking and
299
257
revision_id is not None):
300
258
fetch_spec = graph.PendingAncestryResult(
301
259
[revision_id], local_repo)
388
346
for subdir in sorted(subdirs, reverse=True):
389
347
pending.append(current_transport.clone(subdir))
391
def list_branches(self):
392
"""Return a sequence of all branches local to this control directory.
396
return [self.open_branch()]
397
except errors.NotBranchError:
401
350
def find_branches(transport):
402
351
"""Find all branches under a transport.
414
363
except errors.NoRepositoryPresent:
417
return False, ([], repository)
418
return True, (bzrdir.list_branches(), None)
420
for branches, repo in BzrDir.find_bzrdirs(transport,
366
return False, (None, repository)
368
branch = bzrdir.open_branch()
369
except errors.NotBranchError:
370
return True, (None, None)
372
return True, (branch, None)
374
for branch, repo in BzrDir.find_bzrdirs(transport, evaluate=evaluate):
422
375
if repo is not None:
423
ret.extend(repo.find_branches())
424
if branches is not None:
376
branches.extend(repo.find_branches())
377
if branch is not None:
378
branches.append(branch)
428
381
def destroy_repository(self):
429
382
"""Destroy the repository in this BzrDir"""
430
383
raise NotImplementedError(self.destroy_repository)
432
def create_branch(self, name=None):
385
def create_branch(self):
433
386
"""Create a branch in this BzrDir.
435
:param name: Name of the colocated branch to create, None for
438
388
The bzrdir's format will control what branch format is created.
439
389
For more control see BranchFormatXX.create(a_bzrdir).
441
391
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
393
def destroy_branch(self):
394
"""Destroy the branch in this BzrDir"""
449
395
raise NotImplementedError(self.destroy_branch)
499
445
except errors.NoRepositoryPresent:
500
446
repository = None
502
if (found_bzrdir.user_url != self.user_url
503
and not repository.is_shared()):
448
if ((found_bzrdir.root_transport.base !=
449
self.root_transport.base) and not repository.is_shared()):
504
450
# Don't look higher, can't use a higher shared repo.
505
451
repository = None
621
567
: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
569
pb = ui.ui_factory.nested_progress_bar()
634
571
# FIXME: bug 300001 -- the backup fails if the backup directory
635
572
# already exists, but it should instead either remove it or make
636
573
# a new backup directory.
575
# FIXME: bug 262450 -- the backup directory should have the same
576
# permissions as the .bzr directory (probably a bug in copy_tree)
638
577
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)
578
new_path = self.root_transport.abspath('backup.bzr')
579
pb.note('making backup of %s' % (old_path,))
580
pb.note(' to %s' % (new_path,))
581
self.root_transport.copy_tree('.bzr', 'backup.bzr')
642
582
return (old_path, new_path)
704
644
next_transport = found_bzrdir.root_transport.clone('..')
705
if (found_bzrdir.user_url == next_transport.base):
645
if (found_bzrdir.root_transport.base == next_transport.base):
706
646
# top of the file system
708
648
# find the next containing bzrdir
725
665
repository = found_bzrdir.open_repository()
726
666
except errors.NoRepositoryPresent:
727
667
return None, False
728
if found_bzrdir.user_url == self.user_url:
668
if found_bzrdir.root_transport.base == self.root_transport.base:
729
669
return repository, True
730
670
elif repository.is_shared():
731
671
return repository, True
737
677
raise errors.NoRepositoryPresent(self)
738
678
return found_repo
740
def get_branch_reference(self, name=None):
680
def get_branch_reference(self):
741
681
"""Return the referenced URL for the branch in this bzrdir.
743
:param name: Optional colocated branch name
744
683
:raises NotBranchError: If there is no Branch.
745
:raises NoColocatedBranchSupport: If a branch name was specified
746
but colocated branches are not supported.
747
684
:return: The URL the branch in this bzrdir references if it is a
748
685
reference branch, or None for regular branches.
751
raise errors.NoColocatedBranchSupport(self)
754
def get_branch_transport(self, branch_format, name=None):
689
def get_branch_transport(self, branch_format):
755
690
"""Get the transport for use by branch format in this BzrDir.
757
692
Note that bzr dirs that do not support format strings will raise
852
787
:param _transport: the transport this dir is based at.
854
789
self._format = _format
855
# these are also under the more standard names of
856
# control_transport and user_transport
857
790
self.transport = _transport.clone('.bzr')
858
791
self.root_transport = _transport
859
792
self._mode_check_done = False
862
def user_transport(self):
863
return self.root_transport
866
def control_transport(self):
867
return self.transport
869
794
def is_control_filename(self, filename):
870
795
"""True if filename is the name of a path which is reserved for bzrdir's.
945
870
BzrDir._check_supported(format, _unsupported)
946
871
return format.open(transport, _found=True)
948
def open_branch(self, name=None, unsupported=False,
949
ignore_fallbacks=False):
873
def open_branch(self, unsupported=False, ignore_fallbacks=False):
950
874
"""Open the branch object at this BzrDir if one is present.
952
876
If unsupported is True, then no longer supported branch formats can
999
923
raise errors.NotBranchError(path=url)
1000
924
a_transport = new_t
1002
def _get_tree_branch(self, name=None):
926
def _get_tree_branch(self):
1003
927
"""Return the branch and tree, if any, for this bzrdir.
1005
:param name: Name of colocated branch to open.
1007
929
Return None for tree if not present or inaccessible.
1008
930
Raise NotBranchError if no branch is present.
1009
931
:return: (tree, branch)
1012
934
tree = self.open_workingtree()
1013
935
except (errors.NoWorkingTree, errors.NotLocalUrl):
1015
branch = self.open_branch(name=name)
937
branch = self.open_branch()
1017
if name is not None:
1018
branch = self.open_branch(name=name)
1020
branch = tree.branch
1021
940
return tree, branch
1096
1015
raise NotImplementedError(self.open_workingtree)
1098
def has_branch(self, name=None):
1017
def has_branch(self):
1099
1018
"""Tell if this bzrdir contains a branch.
1101
1020
Note: if you're going to open the branch, you should just go ahead
1316
1235
def push_branch(self, source, revision_id=None, overwrite=False,
1317
remember=False, create_prefix=False):
1318
1237
"""Push the source branch into this BzrDir."""
1320
1239
# If we can open a branch, use its direct repository, otherwise see
1383
1302
self.create_hook(hooks.HookPoint('pre_open',
1384
1303
"Invoked before attempting to open a BzrDir with the transport "
1385
1304
"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
1306
# install the default hooks
1393
1307
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
1310
class BzrDirPreSplitOut(BzrDir):
1433
1311
"""A common class for the all-in-one formats."""
1473
1351
tree.clone(result)
1476
def create_branch(self, name=None):
1354
def create_branch(self):
1477
1355
"""See BzrDir.create_branch."""
1478
return self._format.get_branch_format().initialize(self, name=name)
1356
return self._format.get_branch_format().initialize(self)
1480
def destroy_branch(self, name=None):
1358
def destroy_branch(self):
1481
1359
"""See BzrDir.destroy_branch."""
1482
1360
raise errors.UnsupportedOperation(self.destroy_branch, self)
1506
1384
# that can do wonky stuff here, and that only
1507
1385
# happens for creating checkouts, which cannot be
1508
1386
# done on this format anyway. So - acceptable wart.
1510
warning("can't support hardlinked working trees in %r"
1513
1388
result = self.open_workingtree(recommend_upgrade=False)
1514
1389
except errors.NoSuchFile:
1539
1414
raise errors.UnsupportedOperation(self.destroy_workingtree_metadata,
1542
def get_branch_transport(self, branch_format, name=None):
1417
def get_branch_transport(self, branch_format):
1543
1418
"""See BzrDir.get_branch_transport()."""
1544
if name is not None:
1545
raise errors.NoColocatedBranchSupport(self)
1546
1419
if branch_format is None:
1547
1420
return self.transport
1581
1454
format = BzrDirFormat.get_default_format()
1582
1455
return not isinstance(self._format, format.__class__)
1584
def open_branch(self, name=None, unsupported=False,
1585
ignore_fallbacks=False):
1457
def open_branch(self, unsupported=False, ignore_fallbacks=False):
1586
1458
"""See BzrDir.open_branch."""
1587
1459
from bzrlib.branch import BzrBranchFormat4
1588
1460
format = BzrBranchFormat4()
1589
1461
self._check_supported(format, unsupported)
1590
return format.open(self, name, _found=True)
1462
return format.open(self, _found=True)
1592
1464
def sprout(self, url, revision_id=None, force_new_repo=False,
1593
1465
possible_transports=None, accelerator_tree=None,
1654
1526
This is a deprecated format and may be removed after sept 2006.
1657
def has_workingtree(self):
1658
"""See BzrDir.has_workingtree."""
1661
1529
def open_repository(self):
1662
1530
"""See BzrDir.open_repository."""
1663
1531
from bzrlib.repofmt.weaverepo import RepositoryFormat5
1679
1547
This is a deprecated format and may be removed after sept 2006.
1682
def has_workingtree(self):
1683
"""See BzrDir.has_workingtree."""
1686
1550
def open_repository(self):
1687
1551
"""See BzrDir.open_repository."""
1688
1552
from bzrlib.repofmt.weaverepo import RepositoryFormat6
1710
1574
"""See BzrDir.can_convert_format()."""
1713
def create_branch(self, name=None):
1577
def create_branch(self):
1714
1578
"""See BzrDir.create_branch."""
1715
return self._format.get_branch_format().initialize(self, name=name)
1579
return self._format.get_branch_format().initialize(self)
1717
def destroy_branch(self, name=None):
1581
def destroy_branch(self):
1718
1582
"""See BzrDir.create_branch."""
1719
if name is not None:
1720
raise errors.NoColocatedBranchSupport(self)
1721
1583
self.transport.delete_tree('branch')
1723
1585
def create_repository(self, shared=False):
1746
1608
def destroy_workingtree_metadata(self):
1747
1609
self.transport.delete_tree('checkout')
1749
def find_branch_format(self, name=None):
1611
def find_branch_format(self):
1750
1612
"""Find the branch 'format' for this bzrdir.
1752
1614
This might be a synthetic object for e.g. RemoteBranch and SVN.
1754
1616
from bzrlib.branch import BranchFormat
1755
return BranchFormat.find_format(self, name=name)
1617
return BranchFormat.find_format(self)
1757
1619
def _get_mkdir_mode(self):
1758
1620
"""Figure out the mode to use when creating a bzrdir subdir."""
1760
1622
lockable_files.TransportLock)
1761
1623
return temp_control._dir_mode
1763
def get_branch_reference(self, name=None):
1625
def get_branch_reference(self):
1764
1626
"""See BzrDir.get_branch_reference()."""
1765
1627
from bzrlib.branch import BranchFormat
1766
format = BranchFormat.find_format(self, name=name)
1767
return format.get_reference(self, name=name)
1628
format = BranchFormat.find_format(self)
1629
return format.get_reference(self)
1769
def get_branch_transport(self, branch_format, name=None):
1631
def get_branch_transport(self, branch_format):
1770
1632
"""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
1633
if branch_format is None:
1776
1634
return self.transport.clone('branch')
1813
1671
return self.transport.clone('checkout')
1815
def has_workingtree(self):
1816
"""Tell if this bzrdir contains a working tree.
1818
This will still raise an exception if the bzrdir has a workingtree that
1819
is remote & inaccessible.
1821
Note: if you're going to open the working tree, you should just go
1822
ahead and try, and not ask permission first.
1824
from bzrlib.workingtree import WorkingTreeFormat
1826
WorkingTreeFormat.find_format(self)
1827
except errors.NoWorkingTree:
1831
1673
def needs_format_conversion(self, format=None):
1832
1674
"""See BzrDir.needs_format_conversion()."""
1833
1675
if format is None:
1847
1689
except errors.NoRepositoryPresent:
1849
for branch in self.list_branches():
1850
if not isinstance(branch._format,
1692
if not isinstance(self.open_branch()._format,
1851
1693
format.get_branch_format().__class__):
1852
1694
# the branch needs an upgrade.
1696
except errors.NotBranchError:
1855
1699
my_wt = self.open_workingtree(recommend_upgrade=False)
1856
1700
if not isinstance(my_wt._format,
1864
def open_branch(self, name=None, unsupported=False,
1865
ignore_fallbacks=False):
1708
def open_branch(self, unsupported=False, ignore_fallbacks=False):
1866
1709
"""See BzrDir.open_branch."""
1867
format = self.find_branch_format(name=name)
1710
format = self.find_branch_format()
1868
1711
self._check_supported(format, unsupported)
1869
return format.open(self, name=name,
1870
_found=True, ignore_fallbacks=ignore_fallbacks)
1712
return format.open(self, _found=True, ignore_fallbacks=ignore_fallbacks)
1872
1714
def open_repository(self, unsupported=False):
1873
1715
"""See BzrDir.open_repository."""
1905
1747
Once a format is deprecated, just deprecate the initialize and open
1906
1748
methods on the format class. Do not deprecate the object, as the
1907
1749
object will be created every system load.
1909
:cvar colocated_branches: Whether this formats supports colocated branches.
1912
1752
_default_format = None
1930
1770
_lock_file_name = 'branch-lock'
1932
colocated_branches = False
1933
"""Whether co-located branches are supported for this control dir format.
1936
1772
# _lock_class must be set in subclasses to the lock type, typ.
1937
1773
# TransportLock or LockDir
1955
1791
def probe_transport(klass, transport):
1956
1792
"""Return the .bzrdir style format present in a directory."""
1958
format_string = transport.get_bytes(".bzr/branch-format")
1794
format_string = transport.get(".bzr/branch-format").read()
1959
1795
except errors.NoSuchFile:
1960
1796
raise errors.NotBranchError(path=transport.base)
2737
2573
def convert(self, to_convert, pb):
2738
2574
"""See Converter.convert()."""
2739
2575
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)
2577
self.pb.note('starting upgrade from format 4 to 5')
2578
if isinstance(self.bzrdir.transport, local.LocalTransport):
2579
self.bzrdir.get_workingtree_transport(None).delete('stat-cache')
2580
self._convert_to_weaves()
2581
return BzrDir.open(self.bzrdir.root_transport.base)
2752
2583
def _convert_to_weaves(self):
2753
ui.ui_factory.note('note: upgrade may be faster if all store files are ungzipped first')
2584
self.pb.note('note: upgrade may be faster if all store files are ungzipped first')
2755
2586
# TODO permissions
2756
2587
stat = self.bzrdir.transport.stat('weaves')
2784
2615
self.pb.clear()
2785
2616
self._write_all_weaves()
2786
2617
self._write_all_revs()
2787
ui.ui_factory.note('upgraded to weaves:')
2788
ui.ui_factory.note(' %6d revisions and inventories' % len(self.revisions))
2789
ui.ui_factory.note(' %6d revisions not present' % len(self.absent_revisions))
2790
ui.ui_factory.note(' %6d texts' % self.text_count)
2618
self.pb.note('upgraded to weaves:')
2619
self.pb.note(' %6d revisions and inventories', len(self.revisions))
2620
self.pb.note(' %6d revisions not present', len(self.absent_revisions))
2621
self.pb.note(' %6d texts', self.text_count)
2791
2622
self._cleanup_spare_files_after_format4()
2792
2623
self.branch._transport.put_bytes(
2793
2624
'branch-format',
2861
2692
len(self.known_revisions))
2862
2693
if not self.branch.repository.has_revision(rev_id):
2863
2694
self.pb.clear()
2864
ui.ui_factory.note('revision {%s} not present in branch; '
2865
'will be converted as a ghost' %
2695
self.pb.note('revision {%s} not present in branch; '
2696
'will be converted as a ghost',
2867
2698
self.absent_revisions.add(rev_id)
2873
2704
self.revisions[rev_id] = rev
2875
2706
def _load_old_inventory(self, rev_id):
2876
f = self.branch.repository.inventory_store.get(rev_id)
2878
old_inv_xml = f.read()
2707
old_inv_xml = self.branch.repository.inventory_store.get(rev_id).read()
2881
2708
inv = xml4.serializer_v4.read_inventory_from_string(old_inv_xml)
2882
2709
inv.revision_id = rev_id
2883
2710
rev = self.revisions[rev_id]
2961
2788
ie.revision = previous_ie.revision
2963
2790
if ie.has_text():
2964
f = self.branch.repository._text_store.get(ie.text_id)
2966
file_lines = f.readlines()
2791
text = self.branch.repository._text_store.get(ie.text_id)
2792
file_lines = text.readlines()
2969
2793
w.add_lines(rev_id, previous_revisions, file_lines)
2970
2794
self.text_count += 1
3001
2825
def convert(self, to_convert, pb):
3002
2826
"""See Converter.convert()."""
3003
2827
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)
2829
self.pb.note('starting upgrade from format 5 to 6')
2830
self._convert_to_prefixed()
2831
return BzrDir.open(self.bzrdir.root_transport.base)
3012
2833
def _convert_to_prefixed(self):
3013
2834
from bzrlib.store import TransportStore
3014
2835
self.bzrdir.transport.delete('branch-format')
3015
2836
for store_name in ["weaves", "revision-store"]:
3016
ui.ui_factory.note("adding prefixes to %s" % store_name)
2837
self.pb.note("adding prefixes to %s" % store_name)
3017
2838
store_transport = self.bzrdir.transport.clone(store_name)
3018
2839
store = TransportStore(store_transport, prefixed=True)
3019
2840
for urlfilename in store_transport.list_dir('.'):
3046
2867
from bzrlib.repofmt.weaverepo import RepositoryFormat7
3047
2868
from bzrlib.branch import BzrBranchFormat5
3048
2869
self.bzrdir = to_convert
3049
self.pb = ui.ui_factory.nested_progress_bar()
3051
2872
self.total = 20 # the steps we know about
3052
2873
self.garbage_inventories = []
3053
2874
self.dir_mode = self.bzrdir._get_dir_mode()
3054
2875
self.file_mode = self.bzrdir._get_file_mode()
3056
ui.ui_factory.note('starting upgrade from format 6 to metadir')
2877
self.pb.note('starting upgrade from format 6 to metadir')
3057
2878
self.bzrdir.transport.put_bytes(
3058
2879
'branch-format',
3059
2880
"Converting to format 6",
3110
2931
has_checkout = True
3111
2932
if not has_checkout:
3112
ui.ui_factory.note('No working tree.')
2933
self.pb.note('No working tree.')
3113
2934
# If some checkout files are there, we may as well get rid of them.
3114
2935
for name, mandatory in checkout_files:
3115
2936
if name in bzrcontents:
3132
2953
'branch-format',
3133
2954
BzrDirMetaFormat1().get_format_string(),
3134
2955
mode=self.file_mode)
3136
return BzrDir.open(self.bzrdir.user_url)
2956
return BzrDir.open(self.bzrdir.root_transport.base)
3138
2958
def make_lock(self, name):
3139
2959
"""Make a lock for the new control dir name."""
3174
2994
def convert(self, to_convert, pb):
3175
2995
"""See Converter.convert()."""
3176
2996
self.bzrdir = to_convert
3177
self.pb = ui.ui_factory.nested_progress_bar()
3180
3000
self.step('checking repository format')
3186
3006
if not isinstance(repo._format, self.target_format.repository_format.__class__):
3187
3007
from bzrlib.repository import CopyConverter
3188
ui.ui_factory.note('starting repository conversion')
3008
self.pb.note('starting repository conversion')
3189
3009
converter = CopyConverter(self.target_format.repository_format)
3190
3010
converter.convert(repo, pb)
3191
for branch in self.bzrdir.list_branches():
3012
branch = self.bzrdir.open_branch()
3013
except errors.NotBranchError:
3192
3016
# TODO: conversions of Branch and Tree should be done by
3193
3017
# InterXFormat lookups/some sort of registry.
3194
3018
# Avoid circular imports
3209
3033
new is _mod_branch.BzrBranchFormat8):
3210
3034
branch_converter = _mod_branch.Converter7to8()
3212
raise errors.BadConversionTarget("No converter", new,
3036
raise errors.BadConversionTarget("No converter", new)
3214
3037
branch_converter.convert(branch)
3215
3038
branch = self.bzrdir.open_branch()
3216
3039
old = branch._format.__class__
3250
3072
def __init__(self):
3251
3073
BzrDirMetaFormat1.__init__(self)
3252
# XXX: It's a bit ugly that the network name is here, because we'd
3253
# like to believe that format objects are stateless or at least
3254
# immutable, However, we do at least avoid mutating the name after
3255
# it's returned. See <https://bugs.launchpad.net/bzr/+bug/504102>
3256
3074
self._network_name = None
3259
return "%s(_network_name=%r)" % (self.__class__.__name__,
3262
3076
def get_format_description(self):
3263
if self._network_name:
3264
real_format = network_format_registry.get(self._network_name)
3265
return 'Remote: ' + real_format.get_format_description()
3266
3077
return 'bzr remote bzrdir'
3268
3079
def get_format_string(self):
3401
3212
args.append(self._serialize_NoneString(repo_format_name))
3402
3213
args.append(self._serialize_NoneTrueFalse(make_working_trees))
3403
3214
args.append(self._serialize_NoneTrueFalse(shared_repo))
3404
request_network_name = self._network_name or \
3215
if self._network_name is None:
3216
self._network_name = \
3405
3217
BzrDirFormat.get_default_format().network_name()
3407
3219
response = client.call('BzrDirFormat.initialize_ex_1.16',
3408
request_network_name, path, *args)
3220
self.network_name(), path, *args)
3409
3221
except errors.UnknownSmartMethod:
3410
3222
client._medium._remember_remote_is_before((1,16))
3411
3223
local_dir_format = BzrDirMetaFormat1()
3661
3472
experimental_pairs.append((key, help))
3663
3474
output += wrapped(key, help, info)
3664
output += "\nSee :doc:`formats-help` for more about storage formats."
3475
output += "\nSee ``bzr help formats`` for more about storage formats."
3665
3476
other_output = ""
3666
3477
if len(experimental_pairs) > 0:
3667
3478
other_output += "Experimental formats are shown below.\n\n"
3721
3532
stack_on = urlutils.rebase_url(self._stack_on,
3722
3533
self._stack_on_pwd,
3534
branch.bzrdir.root_transport.base)
3724
3535
except errors.InvalidRebaseURLs:
3725
3536
stack_on = self._get_full_stack_on()
3730
3541
if self._require_stacking:
3733
def requires_stacking(self):
3734
"""Return True if this policy requires stacking."""
3735
return self._stack_on is not None and self._require_stacking
3737
3544
def _get_full_stack_on(self):
3738
3545
"""Get a fully-qualified URL for the stack_on location."""
3739
3546
if self._stack_on is None:
3855
3662
format_registry.register('weave', BzrDirFormat6,
3856
3663
'Pre-0.8 format. Slower than knit and does not'
3857
3664
' support checkouts or shared repositories.',
3859
3665
deprecated=True)
3860
3666
format_registry.register_metadir('metaweave',
3861
3667
'bzrlib.repofmt.weaverepo.RepositoryFormat7',
3862
3668
'Transitional format in 0.8. Slower than knit.',
3863
3669
branch_format='bzrlib.branch.BzrBranchFormat5',
3864
3670
tree_format='bzrlib.workingtree.WorkingTreeFormat3',
3866
3671
deprecated=True)
3867
3672
format_registry.register_metadir('knit',
3868
3673
'bzrlib.repofmt.knitrepo.RepositoryFormatKnit1',
3869
3674
'Format using knits. Recommended for interoperation with bzr <= 0.14.',
3870
3675
branch_format='bzrlib.branch.BzrBranchFormat5',
3871
3676
tree_format='bzrlib.workingtree.WorkingTreeFormat3',
3873
3677
deprecated=True)
3874
3678
format_registry.register_metadir('dirstate',
3875
3679
'bzrlib.repofmt.knitrepo.RepositoryFormatKnit1',
3879
3683
# this uses bzrlib.workingtree.WorkingTreeFormat4 because importing
3880
3684
# directly from workingtree_4 triggers a circular import.
3881
3685
tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3883
3686
deprecated=True)
3884
3687
format_registry.register_metadir('dirstate-tags',
3885
3688
'bzrlib.repofmt.knitrepo.RepositoryFormatKnit1',
3888
3691
' Incompatible with bzr < 0.15.',
3889
3692
branch_format='bzrlib.branch.BzrBranchFormat6',
3890
3693
tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3892
3694
deprecated=True)
3893
3695
format_registry.register_metadir('rich-root',
3894
3696
'bzrlib.repofmt.knitrepo.RepositoryFormatKnit4',
3897
3699
branch_format='bzrlib.branch.BzrBranchFormat6',
3898
3700
tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3900
3701
deprecated=True)
3901
3702
format_registry.register_metadir('dirstate-with-subtree',
3902
3703
'bzrlib.repofmt.knitrepo.RepositoryFormatKnit3',
3913
3714
help='New in 0.92: Pack-based format with data compatible with '
3914
3715
'dirstate-tags format repositories. Interoperates with '
3915
3716
'bzr repositories before 0.92 but cannot be read by bzr < 0.92. '
3717
'Previously called knitpack-experimental. '
3718
'For more information, see '
3719
'http://doc.bazaar-vcs.org/latest/developers/packrepo.html.',
3917
3720
branch_format='bzrlib.branch.BzrBranchFormat6',
3918
3721
tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3922
3725
help='New in 0.92: Pack-based format with data compatible with '
3923
3726
'dirstate-with-subtree format repositories. Interoperates with '
3924
3727
'bzr repositories before 0.92 but cannot be read by bzr < 0.92. '
3728
'Previously called knitpack-experimental. '
3729
'For more information, see '
3730
'http://doc.bazaar-vcs.org/latest/developers/packrepo.html.',
3926
3731
branch_format='bzrlib.branch.BzrBranchFormat6',
3927
3732
tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3934
3739
'(needed for bzr-svn and bzr-git).',
3935
3740
branch_format='bzrlib.branch.BzrBranchFormat6',
3936
3741
tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3939
3743
format_registry.register_metadir('1.6',
3940
3744
'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack5',
3943
3747
'not present locally.',
3944
3748
branch_format='bzrlib.branch.BzrBranchFormat7',
3945
3749
tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3948
3751
format_registry.register_metadir('1.6.1-rich-root',
3949
3752
'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack5RichRoot',
3951
3754
'(needed for bzr-svn and bzr-git).',
3952
3755
branch_format='bzrlib.branch.BzrBranchFormat7',
3953
3756
tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3956
3758
format_registry.register_metadir('1.9',
3957
3759
'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack6',
3960
3762
'performance for most operations.',
3961
3763
branch_format='bzrlib.branch.BzrBranchFormat7',
3962
3764
tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3965
3766
format_registry.register_metadir('1.9-rich-root',
3966
3767
'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack6RichRoot',
3968
3769
'(needed for bzr-svn and bzr-git).',
3969
3770
branch_format='bzrlib.branch.BzrBranchFormat7',
3970
3771
tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3973
3773
format_registry.register_metadir('1.14',
3974
3774
'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack6',
3990
3790
'to and from rich-root-pack (and anything compatible with '
3991
3791
'rich-root-pack) format repositories. Repositories and branches in '
3992
3792
'this format can only be read by bzr.dev. Please read '
3993
'http://doc.bazaar.canonical.com/latest/developers/development-repo.html '
3793
'http://doc.bazaar-vcs.org/latest/developers/development-repo.html '
3995
3795
branch_format='bzrlib.branch.BzrBranchFormat7',
3996
3796
tree_format='bzrlib.workingtree.WorkingTreeFormat6',
3997
3797
experimental=True,
4001
3800
format_registry.register_metadir('development-subtree',
4002
3801
'bzrlib.repofmt.pack_repo.RepositoryFormatPackDevelopment2Subtree',
4004
3803
'from pack-0.92-subtree (and anything compatible with '
4005
3804
'pack-0.92-subtree) format repositories. Repositories and branches in '
4006
3805
'this format can only be read by bzr.dev. Please read '
4007
'http://doc.bazaar.canonical.com/latest/developers/development-repo.html '
3806
'http://doc.bazaar-vcs.org/latest/developers/development-repo.html '
4009
3808
branch_format='bzrlib.branch.BzrBranchFormat7',
4010
3809
tree_format='bzrlib.workingtree.WorkingTreeFormat6',
4011
3810
experimental=True,
4013
3811
alias=False, # Restore to being an alias when an actual development subtree format is added
4014
3812
# This current non-alias status is simply because we did not introduce a
4015
3813
# chk based subtree format.
4020
3818
'bzrlib.repofmt.groupcompress_repo.RepositoryFormatCHK1',
4021
3819
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 '
3821
'http://doc.bazaar-vcs.org/latest/developers/development-repo.html '
4025
3823
branch_format='bzrlib.branch.BzrBranchFormat7',
4026
3824
tree_format='bzrlib.workingtree.WorkingTreeFormat6',
4032
3830
'bzrlib.repofmt.groupcompress_repo.RepositoryFormatCHK2',
4033
3831
help='pack-1.9 with 255-way hashed CHK inv, bencode revision, group compress, '
4034
3832
'rich roots. Please read '
4035
'http://doc.bazaar.canonical.com/latest/developers/development-repo.html '
3833
'http://doc.bazaar-vcs.org/latest/developers/development-repo.html '
4037
3835
branch_format='bzrlib.branch.BzrBranchFormat7',
4038
3836
tree_format='bzrlib.workingtree.WorkingTreeFormat6',
4055
3853
# The following format should be an alias for the rich root equivalent
4056
3854
# of the default format
4057
3855
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',
3856
'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack4',
3857
help='Default format, rich root variant. (needed for bzr-svn and bzr-git).',
3858
branch_format='bzrlib.branch.BzrBranchFormat6',
3859
tree_format='bzrlib.workingtree.WorkingTreeFormat4',
4065
3862
# The current format that is made on 'bzr init'.
4066
format_registry.set_default('2a')
3863
format_registry.set_default('pack-0.92')