1
# Copyright (C) 2005, 2006, 2007, 2008, 2009 Canonical Ltd
1
# Copyright (C) 2006-2010 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):
90
125
"""A .bzr control diretory.
92
127
BzrDir instances let you create or open any of the things that can be
130
165
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.
131
169
target_repo_format = target_format.repository_format
132
source_repo_format = self._format.repository_format
133
source_repo_format.check_conversion_target(target_repo_format)
171
self.open_repository()._format.check_conversion_target(
173
except errors.NoRepositoryPresent:
174
# No repo, no problem.
136
178
def _check_supported(format, allow_unsupported,
252
294
# copied, and finally if we are copying up to a specific
253
295
# revision_id then we can use the pending-ancestry-result which
254
296
# does not require traversing all of history to describe it.
255
if (result_repo.bzrdir.root_transport.base ==
256
result.root_transport.base and not require_stacking and
297
if (result_repo.user_url == result.user_url
298
and not require_stacking and
257
299
revision_id is not None):
258
300
fetch_spec = graph.PendingAncestryResult(
259
301
[revision_id], local_repo)
346
388
for subdir in sorted(subdirs, reverse=True):
347
389
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:
350
401
def find_branches(transport):
351
402
"""Find all branches under a transport.
363
414
except errors.NoRepositoryPresent:
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):
417
return False, ([], repository)
418
return True, (bzrdir.list_branches(), None)
420
for branches, repo in BzrDir.find_bzrdirs(transport,
375
422
if repo is not None:
376
branches.extend(repo.find_branches())
377
if branch is not None:
378
branches.append(branch)
423
ret.extend(repo.find_branches())
424
if branches is not None:
381
428
def destroy_repository(self):
382
429
"""Destroy the repository in this BzrDir"""
383
430
raise NotImplementedError(self.destroy_repository)
385
def create_branch(self):
432
def create_branch(self, name=None):
386
433
"""Create a branch in this BzrDir.
435
:param name: Name of the colocated branch to create, None for
388
438
The bzrdir's format will control what branch format is created.
389
439
For more control see BranchFormatXX.create(a_bzrdir).
391
441
raise NotImplementedError(self.create_branch)
393
def destroy_branch(self):
394
"""Destroy the branch in this BzrDir"""
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
395
449
raise NotImplementedError(self.destroy_branch)
445
499
except errors.NoRepositoryPresent:
446
500
repository = None
448
if ((found_bzrdir.root_transport.base !=
449
self.root_transport.base) and not repository.is_shared()):
502
if (found_bzrdir.user_url != self.user_url
503
and not repository.is_shared()):
450
504
# Don't look higher, can't use a higher shared repo.
451
505
repository = None
567
621
: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()
569
632
pb = ui.ui_factory.nested_progress_bar()
571
634
# FIXME: bug 300001 -- the backup fails if the backup directory
572
635
# already exists, but it should instead either remove it or make
573
636
# 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)
577
638
old_path = self.root_transport.abspath('.bzr')
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')
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)
582
642
return (old_path, new_path)
644
704
next_transport = found_bzrdir.root_transport.clone('..')
645
if (found_bzrdir.root_transport.base == next_transport.base):
705
if (found_bzrdir.user_url == next_transport.base):
646
706
# top of the file system
648
708
# find the next containing bzrdir
665
725
repository = found_bzrdir.open_repository()
666
726
except errors.NoRepositoryPresent:
667
727
return None, False
668
if found_bzrdir.root_transport.base == self.root_transport.base:
728
if found_bzrdir.user_url == self.user_url:
669
729
return repository, True
670
730
elif repository.is_shared():
671
731
return repository, True
689
def get_branch_transport(self, branch_format):
749
def get_branch_transport(self, branch_format, name=None):
690
750
"""Get the transport for use by branch format in this BzrDir.
692
752
Note that bzr dirs that do not support format strings will raise
787
847
:param _transport: the transport this dir is based at.
789
849
self._format = _format
850
# these are also under the more standard names of
851
# control_transport and user_transport
790
852
self.transport = _transport.clone('.bzr')
791
853
self.root_transport = _transport
792
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
794
864
def is_control_filename(self, filename):
795
865
"""True if filename is the name of a path which is reserved for bzrdir's.
870
940
BzrDir._check_supported(format, _unsupported)
871
941
return format.open(transport, _found=True)
873
def open_branch(self, unsupported=False, ignore_fallbacks=False):
943
def open_branch(self, name=None, unsupported=False,
944
ignore_fallbacks=False):
874
945
"""Open the branch object at this BzrDir if one is present.
876
947
If unsupported is True, then no longer supported branch formats can
1015
1086
raise NotImplementedError(self.open_workingtree)
1017
def has_branch(self):
1088
def has_branch(self, name=None):
1018
1089
"""Tell if this bzrdir contains a branch.
1020
1091
Note: if you're going to open the branch, you should just go ahead
1302
1373
self.create_hook(hooks.HookPoint('pre_open',
1303
1374
"Invoked before attempting to open a BzrDir with the transport "
1304
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.",
1306
1382
# install the default hooks
1307
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__,
1310
1422
class BzrDirPreSplitOut(BzrDir):
1311
1423
"""A common class for the all-in-one formats."""
1351
1463
tree.clone(result)
1354
def create_branch(self):
1466
def create_branch(self, name=None):
1355
1467
"""See BzrDir.create_branch."""
1356
return self._format.get_branch_format().initialize(self)
1468
return self._format.get_branch_format().initialize(self, name=name)
1358
def destroy_branch(self):
1470
def destroy_branch(self, name=None):
1359
1471
"""See BzrDir.destroy_branch."""
1360
1472
raise errors.UnsupportedOperation(self.destroy_branch, self)
1384
1496
# that can do wonky stuff here, and that only
1385
1497
# happens for creating checkouts, which cannot be
1386
1498
# done on this format anyway. So - acceptable wart.
1500
warning("can't support hardlinked working trees in %r"
1388
1503
result = self.open_workingtree(recommend_upgrade=False)
1389
1504
except errors.NoSuchFile:
1414
1529
raise errors.UnsupportedOperation(self.destroy_workingtree_metadata,
1417
def get_branch_transport(self, branch_format):
1532
def get_branch_transport(self, branch_format, name=None):
1418
1533
"""See BzrDir.get_branch_transport()."""
1534
if name is not None:
1535
raise errors.NoColocatedBranchSupport(self)
1419
1536
if branch_format is None:
1420
1537
return self.transport
1454
1571
format = BzrDirFormat.get_default_format()
1455
1572
return not isinstance(self._format, format.__class__)
1457
def open_branch(self, unsupported=False, ignore_fallbacks=False):
1574
def open_branch(self, name=None, unsupported=False,
1575
ignore_fallbacks=False):
1458
1576
"""See BzrDir.open_branch."""
1459
1577
from bzrlib.branch import BzrBranchFormat4
1460
1578
format = BzrBranchFormat4()
1461
1579
self._check_supported(format, unsupported)
1462
return format.open(self, _found=True)
1580
return format.open(self, name, _found=True)
1464
1582
def sprout(self, url, revision_id=None, force_new_repo=False,
1465
1583
possible_transports=None, accelerator_tree=None,
1526
1644
This is a deprecated format and may be removed after sept 2006.
1647
def has_workingtree(self):
1648
"""See BzrDir.has_workingtree."""
1529
1651
def open_repository(self):
1530
1652
"""See BzrDir.open_repository."""
1531
1653
from bzrlib.repofmt.weaverepo import RepositoryFormat5
1547
1669
This is a deprecated format and may be removed after sept 2006.
1672
def has_workingtree(self):
1673
"""See BzrDir.has_workingtree."""
1550
1676
def open_repository(self):
1551
1677
"""See BzrDir.open_repository."""
1552
1678
from bzrlib.repofmt.weaverepo import RepositoryFormat6
1574
1700
"""See BzrDir.can_convert_format()."""
1577
def create_branch(self):
1703
def create_branch(self, name=None):
1578
1704
"""See BzrDir.create_branch."""
1579
return self._format.get_branch_format().initialize(self)
1705
return self._format.get_branch_format().initialize(self, name=name)
1581
def destroy_branch(self):
1707
def destroy_branch(self, name=None):
1582
1708
"""See BzrDir.create_branch."""
1709
if name is not None:
1710
raise errors.NoColocatedBranchSupport(self)
1583
1711
self.transport.delete_tree('branch')
1585
1713
def create_repository(self, shared=False):
1628
1756
format = BranchFormat.find_format(self)
1629
1757
return format.get_reference(self)
1631
def get_branch_transport(self, branch_format):
1759
def get_branch_transport(self, branch_format, name=None):
1632
1760
"""See BzrDir.get_branch_transport()."""
1761
if name is not None:
1762
raise errors.NoColocatedBranchSupport(self)
1763
# XXX: this shouldn't implicitly create the directory if it's just
1764
# promising to get a transport -- mbp 20090727
1633
1765
if branch_format is None:
1634
1766
return self.transport.clone('branch')
1671
1803
return self.transport.clone('checkout')
1805
def has_workingtree(self):
1806
"""Tell if this bzrdir contains a working tree.
1808
This will still raise an exception if the bzrdir has a workingtree that
1809
is remote & inaccessible.
1811
Note: if you're going to open the working tree, you should just go
1812
ahead and try, and not ask permission first.
1814
from bzrlib.workingtree import WorkingTreeFormat
1816
WorkingTreeFormat.find_format(self)
1817
except errors.NoWorkingTree:
1673
1821
def needs_format_conversion(self, format=None):
1674
1822
"""See BzrDir.needs_format_conversion()."""
1675
1823
if format is None:
1689
1837
except errors.NoRepositoryPresent:
1692
if not isinstance(self.open_branch()._format,
1839
for branch in self.list_branches():
1840
if not isinstance(branch._format,
1693
1841
format.get_branch_format().__class__):
1694
1842
# the branch needs an upgrade.
1696
except errors.NotBranchError:
1699
1845
my_wt = self.open_workingtree(recommend_upgrade=False)
1700
1846
if not isinstance(my_wt._format,
1708
def open_branch(self, unsupported=False, ignore_fallbacks=False):
1854
def open_branch(self, name=None, unsupported=False,
1855
ignore_fallbacks=False):
1709
1856
"""See BzrDir.open_branch."""
1710
1857
format = self.find_branch_format()
1711
1858
self._check_supported(format, unsupported)
1712
return format.open(self, _found=True, ignore_fallbacks=ignore_fallbacks)
1859
return format.open(self, name=name,
1860
_found=True, ignore_fallbacks=ignore_fallbacks)
1714
1862
def open_repository(self, unsupported=False):
1715
1863
"""See BzrDir.open_repository."""
1747
1895
Once a format is deprecated, just deprecate the initialize and open
1748
1896
methods on the format class. Do not deprecate the object, as the
1749
1897
object will be created every system load.
1899
:cvar colocated_branches: Whether this formats supports colocated branches.
1752
1902
_default_format = None
1770
1920
_lock_file_name = 'branch-lock'
1922
colocated_branches = False
1923
"""Whether co-located branches are supported for this control dir format.
1772
1926
# _lock_class must be set in subclasses to the lock type, typ.
1773
1927
# TransportLock or LockDir
1791
1945
def probe_transport(klass, transport):
1792
1946
"""Return the .bzrdir style format present in a directory."""
1794
format_string = transport.get(".bzr/branch-format").read()
1948
format_string = transport.get_bytes(".bzr/branch-format")
1795
1949
except errors.NoSuchFile:
1796
1950
raise errors.NotBranchError(path=transport.base)
2573
2727
def convert(self, to_convert, pb):
2574
2728
"""See Converter.convert()."""
2575
2729
self.bzrdir = to_convert
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)
2731
warnings.warn("pb parameter to convert() is deprecated")
2732
self.pb = ui.ui_factory.nested_progress_bar()
2734
ui.ui_factory.note('starting upgrade from format 4 to 5')
2735
if isinstance(self.bzrdir.transport, local.LocalTransport):
2736
self.bzrdir.get_workingtree_transport(None).delete('stat-cache')
2737
self._convert_to_weaves()
2738
return BzrDir.open(self.bzrdir.user_url)
2583
2742
def _convert_to_weaves(self):
2584
self.pb.note('note: upgrade may be faster if all store files are ungzipped first')
2743
ui.ui_factory.note('note: upgrade may be faster if all store files are ungzipped first')
2586
2745
# TODO permissions
2587
2746
stat = self.bzrdir.transport.stat('weaves')
2615
2774
self.pb.clear()
2616
2775
self._write_all_weaves()
2617
2776
self._write_all_revs()
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)
2777
ui.ui_factory.note('upgraded to weaves:')
2778
ui.ui_factory.note(' %6d revisions and inventories' % len(self.revisions))
2779
ui.ui_factory.note(' %6d revisions not present' % len(self.absent_revisions))
2780
ui.ui_factory.note(' %6d texts' % self.text_count)
2622
2781
self._cleanup_spare_files_after_format4()
2623
2782
self.branch._transport.put_bytes(
2624
2783
'branch-format',
2692
2851
len(self.known_revisions))
2693
2852
if not self.branch.repository.has_revision(rev_id):
2694
2853
self.pb.clear()
2695
self.pb.note('revision {%s} not present in branch; '
2696
'will be converted as a ghost',
2854
ui.ui_factory.note('revision {%s} not present in branch; '
2855
'will be converted as a ghost' %
2698
2857
self.absent_revisions.add(rev_id)
2825
2984
def convert(self, to_convert, pb):
2826
2985
"""See Converter.convert()."""
2827
2986
self.bzrdir = to_convert
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)
2987
pb = ui.ui_factory.nested_progress_bar()
2989
ui.ui_factory.note('starting upgrade from format 5 to 6')
2990
self._convert_to_prefixed()
2991
return BzrDir.open(self.bzrdir.user_url)
2833
2995
def _convert_to_prefixed(self):
2834
2996
from bzrlib.store import TransportStore
2835
2997
self.bzrdir.transport.delete('branch-format')
2836
2998
for store_name in ["weaves", "revision-store"]:
2837
self.pb.note("adding prefixes to %s" % store_name)
2999
ui.ui_factory.note("adding prefixes to %s" % store_name)
2838
3000
store_transport = self.bzrdir.transport.clone(store_name)
2839
3001
store = TransportStore(store_transport, prefixed=True)
2840
3002
for urlfilename in store_transport.list_dir('.'):
2867
3029
from bzrlib.repofmt.weaverepo import RepositoryFormat7
2868
3030
from bzrlib.branch import BzrBranchFormat5
2869
3031
self.bzrdir = to_convert
3032
self.pb = ui.ui_factory.nested_progress_bar()
2872
3034
self.total = 20 # the steps we know about
2873
3035
self.garbage_inventories = []
2874
3036
self.dir_mode = self.bzrdir._get_dir_mode()
2875
3037
self.file_mode = self.bzrdir._get_file_mode()
2877
self.pb.note('starting upgrade from format 6 to metadir')
3039
ui.ui_factory.note('starting upgrade from format 6 to metadir')
2878
3040
self.bzrdir.transport.put_bytes(
2879
3041
'branch-format',
2880
3042
"Converting to format 6",
2931
3093
has_checkout = True
2932
3094
if not has_checkout:
2933
self.pb.note('No working tree.')
3095
ui.ui_factory.note('No working tree.')
2934
3096
# If some checkout files are there, we may as well get rid of them.
2935
3097
for name, mandatory in checkout_files:
2936
3098
if name in bzrcontents:
2953
3115
'branch-format',
2954
3116
BzrDirMetaFormat1().get_format_string(),
2955
3117
mode=self.file_mode)
2956
return BzrDir.open(self.bzrdir.root_transport.base)
3119
return BzrDir.open(self.bzrdir.user_url)
2958
3121
def make_lock(self, name):
2959
3122
"""Make a lock for the new control dir name."""
2994
3157
def convert(self, to_convert, pb):
2995
3158
"""See Converter.convert()."""
2996
3159
self.bzrdir = to_convert
3160
self.pb = ui.ui_factory.nested_progress_bar()
3000
3163
self.step('checking repository format')
3006
3169
if not isinstance(repo._format, self.target_format.repository_format.__class__):
3007
3170
from bzrlib.repository import CopyConverter
3008
self.pb.note('starting repository conversion')
3171
ui.ui_factory.note('starting repository conversion')
3009
3172
converter = CopyConverter(self.target_format.repository_format)
3010
3173
converter.convert(repo, pb)
3012
branch = self.bzrdir.open_branch()
3013
except errors.NotBranchError:
3174
for branch in self.bzrdir.list_branches():
3016
3175
# TODO: conversions of Branch and Tree should be done by
3017
3176
# InterXFormat lookups/some sort of registry.
3018
3177
# Avoid circular imports
3033
3192
new is _mod_branch.BzrBranchFormat8):
3034
3193
branch_converter = _mod_branch.Converter7to8()
3036
raise errors.BadConversionTarget("No converter", new)
3195
raise errors.BadConversionTarget("No converter", new,
3037
3197
branch_converter.convert(branch)
3038
3198
branch = self.bzrdir.open_branch()
3039
3199
old = branch._format.__class__
3072
3233
def __init__(self):
3073
3234
BzrDirMetaFormat1.__init__(self)
3235
# XXX: It's a bit ugly that the network name is here, because we'd
3236
# like to believe that format objects are stateless or at least
3237
# immutable, However, we do at least avoid mutating the name after
3238
# it's returned. See <https://bugs.edge.launchpad.net/bzr/+bug/504102>
3074
3239
self._network_name = None
3242
return "%s(_network_name=%r)" % (self.__class__.__name__,
3076
3245
def get_format_description(self):
3246
if self._network_name:
3247
real_format = network_format_registry.get(self._network_name)
3248
return 'Remote: ' + real_format.get_format_description()
3077
3249
return 'bzr remote bzrdir'
3079
3251
def get_format_string(self):
3212
3384
args.append(self._serialize_NoneString(repo_format_name))
3213
3385
args.append(self._serialize_NoneTrueFalse(make_working_trees))
3214
3386
args.append(self._serialize_NoneTrueFalse(shared_repo))
3215
if self._network_name is None:
3216
self._network_name = \
3387
request_network_name = self._network_name or \
3217
3388
BzrDirFormat.get_default_format().network_name()
3219
3390
response = client.call('BzrDirFormat.initialize_ex_1.16',
3220
self.network_name(), path, *args)
3391
request_network_name, path, *args)
3221
3392
except errors.UnknownSmartMethod:
3222
3393
client._medium._remember_remote_is_before((1,16))
3223
3394
local_dir_format = BzrDirMetaFormat1()
3473
3644
experimental_pairs.append((key, help))
3475
3646
output += wrapped(key, help, info)
3476
output += "\nSee ``bzr help formats`` for more about storage formats."
3647
output += "\nSee :doc:`formats-help` for more about storage formats."
3477
3648
other_output = ""
3478
3649
if len(experimental_pairs) > 0:
3479
3650
other_output += "Experimental formats are shown below.\n\n"
3533
3704
stack_on = urlutils.rebase_url(self._stack_on,
3534
3705
self._stack_on_pwd,
3535
branch.bzrdir.root_transport.base)
3536
3707
except errors.InvalidRebaseURLs:
3537
3708
stack_on = self._get_full_stack_on()
3542
3713
if self._require_stacking:
3716
def requires_stacking(self):
3717
"""Return True if this policy requires stacking."""
3718
return self._stack_on is not None and self._require_stacking
3545
3720
def _get_full_stack_on(self):
3546
3721
"""Get a fully-qualified URL for the stack_on location."""
3547
3722
if self._stack_on is None:
3663
3838
format_registry.register('weave', BzrDirFormat6,
3664
3839
'Pre-0.8 format. Slower than knit and does not'
3665
3840
' support checkouts or shared repositories.',
3666
3842
deprecated=True)
3667
3843
format_registry.register_metadir('metaweave',
3668
3844
'bzrlib.repofmt.weaverepo.RepositoryFormat7',
3669
3845
'Transitional format in 0.8. Slower than knit.',
3670
3846
branch_format='bzrlib.branch.BzrBranchFormat5',
3671
3847
tree_format='bzrlib.workingtree.WorkingTreeFormat3',
3672
3849
deprecated=True)
3673
3850
format_registry.register_metadir('knit',
3674
3851
'bzrlib.repofmt.knitrepo.RepositoryFormatKnit1',
3675
3852
'Format using knits. Recommended for interoperation with bzr <= 0.14.',
3676
3853
branch_format='bzrlib.branch.BzrBranchFormat5',
3677
3854
tree_format='bzrlib.workingtree.WorkingTreeFormat3',
3678
3856
deprecated=True)
3679
3857
format_registry.register_metadir('dirstate',
3680
3858
'bzrlib.repofmt.knitrepo.RepositoryFormatKnit1',
3684
3862
# this uses bzrlib.workingtree.WorkingTreeFormat4 because importing
3685
3863
# directly from workingtree_4 triggers a circular import.
3686
3864
tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3687
3866
deprecated=True)
3688
3867
format_registry.register_metadir('dirstate-tags',
3689
3868
'bzrlib.repofmt.knitrepo.RepositoryFormatKnit1',
3692
3871
' Incompatible with bzr < 0.15.',
3693
3872
branch_format='bzrlib.branch.BzrBranchFormat6',
3694
3873
tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3695
3875
deprecated=True)
3696
3876
format_registry.register_metadir('rich-root',
3697
3877
'bzrlib.repofmt.knitrepo.RepositoryFormatKnit4',
3700
3880
branch_format='bzrlib.branch.BzrBranchFormat6',
3701
3881
tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3702
3883
deprecated=True)
3703
3884
format_registry.register_metadir('dirstate-with-subtree',
3704
3885
'bzrlib.repofmt.knitrepo.RepositoryFormatKnit3',
3715
3896
help='New in 0.92: Pack-based format with data compatible with '
3716
3897
'dirstate-tags format repositories. Interoperates with '
3717
3898
'bzr repositories before 0.92 but cannot be read by bzr < 0.92. '
3718
'Previously called knitpack-experimental. '
3719
'For more information, see '
3720
'http://doc.bazaar-vcs.org/latest/developers/packrepo.html.',
3721
3900
branch_format='bzrlib.branch.BzrBranchFormat6',
3722
3901
tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3726
3905
help='New in 0.92: Pack-based format with data compatible with '
3727
3906
'dirstate-with-subtree format repositories. Interoperates with '
3728
3907
'bzr repositories before 0.92 but cannot be read by bzr < 0.92. '
3729
'Previously called knitpack-experimental. '
3730
'For more information, see '
3731
'http://doc.bazaar-vcs.org/latest/developers/packrepo.html.',
3732
3909
branch_format='bzrlib.branch.BzrBranchFormat6',
3733
3910
tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3740
3917
'(needed for bzr-svn and bzr-git).',
3741
3918
branch_format='bzrlib.branch.BzrBranchFormat6',
3742
3919
tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3744
3922
format_registry.register_metadir('1.6',
3745
3923
'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack5',
3748
3926
'not present locally.',
3749
3927
branch_format='bzrlib.branch.BzrBranchFormat7',
3750
3928
tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3752
3931
format_registry.register_metadir('1.6.1-rich-root',
3753
3932
'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack5RichRoot',
3755
3934
'(needed for bzr-svn and bzr-git).',
3756
3935
branch_format='bzrlib.branch.BzrBranchFormat7',
3757
3936
tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3759
3939
format_registry.register_metadir('1.9',
3760
3940
'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack6',
3763
3943
'performance for most operations.',
3764
3944
branch_format='bzrlib.branch.BzrBranchFormat7',
3765
3945
tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3767
3948
format_registry.register_metadir('1.9-rich-root',
3768
3949
'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack6RichRoot',
3770
3951
'(needed for bzr-svn and bzr-git).',
3771
3952
branch_format='bzrlib.branch.BzrBranchFormat7',
3772
3953
tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3774
3956
format_registry.register_metadir('1.14',
3775
3957
'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack6',
3791
3973
'to and from rich-root-pack (and anything compatible with '
3792
3974
'rich-root-pack) format repositories. Repositories and branches in '
3793
3975
'this format can only be read by bzr.dev. Please read '
3794
'http://doc.bazaar-vcs.org/latest/developers/development-repo.html '
3976
'http://doc.bazaar.canonical.com/latest/developers/development-repo.html '
3796
3978
branch_format='bzrlib.branch.BzrBranchFormat7',
3797
3979
tree_format='bzrlib.workingtree.WorkingTreeFormat6',
3798
3980
experimental=True,
3801
3984
format_registry.register_metadir('development-subtree',
3802
3985
'bzrlib.repofmt.pack_repo.RepositoryFormatPackDevelopment2Subtree',
3804
3987
'from pack-0.92-subtree (and anything compatible with '
3805
3988
'pack-0.92-subtree) format repositories. Repositories and branches in '
3806
3989
'this format can only be read by bzr.dev. Please read '
3807
'http://doc.bazaar-vcs.org/latest/developers/development-repo.html '
3990
'http://doc.bazaar.canonical.com/latest/developers/development-repo.html '
3809
3992
branch_format='bzrlib.branch.BzrBranchFormat7',
3810
3993
tree_format='bzrlib.workingtree.WorkingTreeFormat6',
3811
3994
experimental=True,
3812
3996
alias=False, # Restore to being an alias when an actual development subtree format is added
3813
3997
# This current non-alias status is simply because we did not introduce a
3814
3998
# chk based subtree format.
3819
4003
'bzrlib.repofmt.groupcompress_repo.RepositoryFormatCHK1',
3820
4004
help='pack-1.9 with 255-way hashed CHK inv, group compress, rich roots '
3822
'http://doc.bazaar-vcs.org/latest/developers/development-repo.html '
4006
'http://doc.bazaar.canonical.com/latest/developers/development-repo.html '
3824
4008
branch_format='bzrlib.branch.BzrBranchFormat7',
3825
4009
tree_format='bzrlib.workingtree.WorkingTreeFormat6',
3831
4015
'bzrlib.repofmt.groupcompress_repo.RepositoryFormatCHK2',
3832
4016
help='pack-1.9 with 255-way hashed CHK inv, bencode revision, group compress, '
3833
4017
'rich roots. Please read '
3834
'http://doc.bazaar-vcs.org/latest/developers/development-repo.html '
4018
'http://doc.bazaar.canonical.com/latest/developers/development-repo.html '
3836
4020
branch_format='bzrlib.branch.BzrBranchFormat7',
3837
4021
tree_format='bzrlib.workingtree.WorkingTreeFormat6',
3854
4038
# The following format should be an alias for the rich root equivalent
3855
4039
# of the default format
3856
4040
format_registry.register_metadir('default-rich-root',
3857
'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack4',
3858
help='Default format, rich root variant. (needed for bzr-svn and bzr-git).',
3859
branch_format='bzrlib.branch.BzrBranchFormat6',
3860
tree_format='bzrlib.workingtree.WorkingTreeFormat4',
4041
'bzrlib.repofmt.groupcompress_repo.RepositoryFormat2a',
4042
branch_format='bzrlib.branch.BzrBranchFormat7',
4043
tree_format='bzrlib.workingtree.WorkingTreeFormat6',
3863
4048
# The current format that is made on 'bzr init'.
3864
format_registry.set_default('pack-0.92')
4049
format_registry.set_default('2a')