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
749
def get_branch_transport(self, branch_format, name=None):
689
def get_branch_transport(self, branch_format):
750
690
"""Get the transport for use by branch format in this BzrDir.
752
692
Note that bzr dirs that do not support format strings will raise
847
787
:param _transport: the transport this dir is based at.
849
789
self._format = _format
850
# these are also under the more standard names of
851
# control_transport and user_transport
852
790
self.transport = _transport.clone('.bzr')
853
791
self.root_transport = _transport
854
792
self._mode_check_done = False
857
def user_transport(self):
858
return self.root_transport
861
def control_transport(self):
862
return self.transport
864
794
def is_control_filename(self, filename):
865
795
"""True if filename is the name of a path which is reserved for bzrdir's.
940
870
BzrDir._check_supported(format, _unsupported)
941
871
return format.open(transport, _found=True)
943
def open_branch(self, name=None, unsupported=False,
944
ignore_fallbacks=False):
873
def open_branch(self, unsupported=False, ignore_fallbacks=False):
945
874
"""Open the branch object at this BzrDir if one is present.
947
876
If unsupported is True, then no longer supported branch formats can
1086
1015
raise NotImplementedError(self.open_workingtree)
1088
def has_branch(self, name=None):
1017
def has_branch(self):
1089
1018
"""Tell if this bzrdir contains a branch.
1091
1020
Note: if you're going to open the branch, you should just go ahead
1373
1302
self.create_hook(hooks.HookPoint('pre_open',
1374
1303
"Invoked before attempting to open a BzrDir with the transport "
1375
1304
"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.",
1382
1306
# install the default hooks
1383
1307
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__,
1422
1310
class BzrDirPreSplitOut(BzrDir):
1423
1311
"""A common class for the all-in-one formats."""
1463
1351
tree.clone(result)
1466
def create_branch(self, name=None):
1354
def create_branch(self):
1467
1355
"""See BzrDir.create_branch."""
1468
return self._format.get_branch_format().initialize(self, name=name)
1356
return self._format.get_branch_format().initialize(self)
1470
def destroy_branch(self, name=None):
1358
def destroy_branch(self):
1471
1359
"""See BzrDir.destroy_branch."""
1472
1360
raise errors.UnsupportedOperation(self.destroy_branch, self)
1496
1384
# that can do wonky stuff here, and that only
1497
1385
# happens for creating checkouts, which cannot be
1498
1386
# done on this format anyway. So - acceptable wart.
1500
warning("can't support hardlinked working trees in %r"
1503
1388
result = self.open_workingtree(recommend_upgrade=False)
1504
1389
except errors.NoSuchFile:
1529
1414
raise errors.UnsupportedOperation(self.destroy_workingtree_metadata,
1532
def get_branch_transport(self, branch_format, name=None):
1417
def get_branch_transport(self, branch_format):
1533
1418
"""See BzrDir.get_branch_transport()."""
1534
if name is not None:
1535
raise errors.NoColocatedBranchSupport(self)
1536
1419
if branch_format is None:
1537
1420
return self.transport
1571
1454
format = BzrDirFormat.get_default_format()
1572
1455
return not isinstance(self._format, format.__class__)
1574
def open_branch(self, name=None, unsupported=False,
1575
ignore_fallbacks=False):
1457
def open_branch(self, unsupported=False, ignore_fallbacks=False):
1576
1458
"""See BzrDir.open_branch."""
1577
1459
from bzrlib.branch import BzrBranchFormat4
1578
1460
format = BzrBranchFormat4()
1579
1461
self._check_supported(format, unsupported)
1580
return format.open(self, name, _found=True)
1462
return format.open(self, _found=True)
1582
1464
def sprout(self, url, revision_id=None, force_new_repo=False,
1583
1465
possible_transports=None, accelerator_tree=None,
1644
1526
This is a deprecated format and may be removed after sept 2006.
1647
def has_workingtree(self):
1648
"""See BzrDir.has_workingtree."""
1651
1529
def open_repository(self):
1652
1530
"""See BzrDir.open_repository."""
1653
1531
from bzrlib.repofmt.weaverepo import RepositoryFormat5
1669
1547
This is a deprecated format and may be removed after sept 2006.
1672
def has_workingtree(self):
1673
"""See BzrDir.has_workingtree."""
1676
1550
def open_repository(self):
1677
1551
"""See BzrDir.open_repository."""
1678
1552
from bzrlib.repofmt.weaverepo import RepositoryFormat6
1700
1574
"""See BzrDir.can_convert_format()."""
1703
def create_branch(self, name=None):
1577
def create_branch(self):
1704
1578
"""See BzrDir.create_branch."""
1705
return self._format.get_branch_format().initialize(self, name=name)
1579
return self._format.get_branch_format().initialize(self)
1707
def destroy_branch(self, name=None):
1581
def destroy_branch(self):
1708
1582
"""See BzrDir.create_branch."""
1709
if name is not None:
1710
raise errors.NoColocatedBranchSupport(self)
1711
1583
self.transport.delete_tree('branch')
1713
1585
def create_repository(self, shared=False):
1756
1628
format = BranchFormat.find_format(self)
1757
1629
return format.get_reference(self)
1759
def get_branch_transport(self, branch_format, name=None):
1631
def get_branch_transport(self, branch_format):
1760
1632
"""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
1765
1633
if branch_format is None:
1766
1634
return self.transport.clone('branch')
1803
1671
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:
1821
1673
def needs_format_conversion(self, format=None):
1822
1674
"""See BzrDir.needs_format_conversion()."""
1823
1675
if format is None:
1837
1689
except errors.NoRepositoryPresent:
1839
for branch in self.list_branches():
1840
if not isinstance(branch._format,
1692
if not isinstance(self.open_branch()._format,
1841
1693
format.get_branch_format().__class__):
1842
1694
# the branch needs an upgrade.
1696
except errors.NotBranchError:
1845
1699
my_wt = self.open_workingtree(recommend_upgrade=False)
1846
1700
if not isinstance(my_wt._format,
1854
def open_branch(self, name=None, unsupported=False,
1855
ignore_fallbacks=False):
1708
def open_branch(self, unsupported=False, ignore_fallbacks=False):
1856
1709
"""See BzrDir.open_branch."""
1857
1710
format = self.find_branch_format()
1858
1711
self._check_supported(format, unsupported)
1859
return format.open(self, name=name,
1860
_found=True, ignore_fallbacks=ignore_fallbacks)
1712
return format.open(self, _found=True, ignore_fallbacks=ignore_fallbacks)
1862
1714
def open_repository(self, unsupported=False):
1863
1715
"""See BzrDir.open_repository."""
1895
1747
Once a format is deprecated, just deprecate the initialize and open
1896
1748
methods on the format class. Do not deprecate the object, as the
1897
1749
object will be created every system load.
1899
:cvar colocated_branches: Whether this formats supports colocated branches.
1902
1752
_default_format = None
1920
1770
_lock_file_name = 'branch-lock'
1922
colocated_branches = False
1923
"""Whether co-located branches are supported for this control dir format.
1926
1772
# _lock_class must be set in subclasses to the lock type, typ.
1927
1773
# TransportLock or LockDir
1945
1791
def probe_transport(klass, transport):
1946
1792
"""Return the .bzrdir style format present in a directory."""
1948
format_string = transport.get_bytes(".bzr/branch-format")
1794
format_string = transport.get(".bzr/branch-format").read()
1949
1795
except errors.NoSuchFile:
1950
1796
raise errors.NotBranchError(path=transport.base)
2727
2573
def convert(self, to_convert, pb):
2728
2574
"""See Converter.convert()."""
2729
2575
self.bzrdir = to_convert
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)
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)
2742
2583
def _convert_to_weaves(self):
2743
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')
2745
2586
# TODO permissions
2746
2587
stat = self.bzrdir.transport.stat('weaves')
2774
2615
self.pb.clear()
2775
2616
self._write_all_weaves()
2776
2617
self._write_all_revs()
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)
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)
2781
2622
self._cleanup_spare_files_after_format4()
2782
2623
self.branch._transport.put_bytes(
2783
2624
'branch-format',
2851
2692
len(self.known_revisions))
2852
2693
if not self.branch.repository.has_revision(rev_id):
2853
2694
self.pb.clear()
2854
ui.ui_factory.note('revision {%s} not present in branch; '
2855
'will be converted as a ghost' %
2695
self.pb.note('revision {%s} not present in branch; '
2696
'will be converted as a ghost',
2857
2698
self.absent_revisions.add(rev_id)
2984
2825
def convert(self, to_convert, pb):
2985
2826
"""See Converter.convert()."""
2986
2827
self.bzrdir = to_convert
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)
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)
2995
2833
def _convert_to_prefixed(self):
2996
2834
from bzrlib.store import TransportStore
2997
2835
self.bzrdir.transport.delete('branch-format')
2998
2836
for store_name in ["weaves", "revision-store"]:
2999
ui.ui_factory.note("adding prefixes to %s" % store_name)
2837
self.pb.note("adding prefixes to %s" % store_name)
3000
2838
store_transport = self.bzrdir.transport.clone(store_name)
3001
2839
store = TransportStore(store_transport, prefixed=True)
3002
2840
for urlfilename in store_transport.list_dir('.'):
3029
2867
from bzrlib.repofmt.weaverepo import RepositoryFormat7
3030
2868
from bzrlib.branch import BzrBranchFormat5
3031
2869
self.bzrdir = to_convert
3032
self.pb = ui.ui_factory.nested_progress_bar()
3034
2872
self.total = 20 # the steps we know about
3035
2873
self.garbage_inventories = []
3036
2874
self.dir_mode = self.bzrdir._get_dir_mode()
3037
2875
self.file_mode = self.bzrdir._get_file_mode()
3039
ui.ui_factory.note('starting upgrade from format 6 to metadir')
2877
self.pb.note('starting upgrade from format 6 to metadir')
3040
2878
self.bzrdir.transport.put_bytes(
3041
2879
'branch-format',
3042
2880
"Converting to format 6",
3093
2931
has_checkout = True
3094
2932
if not has_checkout:
3095
ui.ui_factory.note('No working tree.')
2933
self.pb.note('No working tree.')
3096
2934
# If some checkout files are there, we may as well get rid of them.
3097
2935
for name, mandatory in checkout_files:
3098
2936
if name in bzrcontents:
3115
2953
'branch-format',
3116
2954
BzrDirMetaFormat1().get_format_string(),
3117
2955
mode=self.file_mode)
3119
return BzrDir.open(self.bzrdir.user_url)
2956
return BzrDir.open(self.bzrdir.root_transport.base)
3121
2958
def make_lock(self, name):
3122
2959
"""Make a lock for the new control dir name."""
3157
2994
def convert(self, to_convert, pb):
3158
2995
"""See Converter.convert()."""
3159
2996
self.bzrdir = to_convert
3160
self.pb = ui.ui_factory.nested_progress_bar()
3163
3000
self.step('checking repository format')
3169
3006
if not isinstance(repo._format, self.target_format.repository_format.__class__):
3170
3007
from bzrlib.repository import CopyConverter
3171
ui.ui_factory.note('starting repository conversion')
3008
self.pb.note('starting repository conversion')
3172
3009
converter = CopyConverter(self.target_format.repository_format)
3173
3010
converter.convert(repo, pb)
3174
for branch in self.bzrdir.list_branches():
3012
branch = self.bzrdir.open_branch()
3013
except errors.NotBranchError:
3175
3016
# TODO: conversions of Branch and Tree should be done by
3176
3017
# InterXFormat lookups/some sort of registry.
3177
3018
# Avoid circular imports
3192
3033
new is _mod_branch.BzrBranchFormat8):
3193
3034
branch_converter = _mod_branch.Converter7to8()
3195
raise errors.BadConversionTarget("No converter", new,
3036
raise errors.BadConversionTarget("No converter", new)
3197
3037
branch_converter.convert(branch)
3198
3038
branch = self.bzrdir.open_branch()
3199
3039
old = branch._format.__class__
3233
3072
def __init__(self):
3234
3073
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>
3239
3074
self._network_name = None
3242
return "%s(_network_name=%r)" % (self.__class__.__name__,
3245
3076
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()
3249
3077
return 'bzr remote bzrdir'
3251
3079
def get_format_string(self):
3384
3212
args.append(self._serialize_NoneString(repo_format_name))
3385
3213
args.append(self._serialize_NoneTrueFalse(make_working_trees))
3386
3214
args.append(self._serialize_NoneTrueFalse(shared_repo))
3387
request_network_name = self._network_name or \
3215
if self._network_name is None:
3216
self._network_name = \
3388
3217
BzrDirFormat.get_default_format().network_name()
3390
3219
response = client.call('BzrDirFormat.initialize_ex_1.16',
3391
request_network_name, path, *args)
3220
self.network_name(), path, *args)
3392
3221
except errors.UnknownSmartMethod:
3393
3222
client._medium._remember_remote_is_before((1,16))
3394
3223
local_dir_format = BzrDirMetaFormat1()
3644
3473
experimental_pairs.append((key, help))
3646
3475
output += wrapped(key, help, info)
3647
output += "\nSee :doc:`formats-help` for more about storage formats."
3476
output += "\nSee ``bzr help formats`` for more about storage formats."
3648
3477
other_output = ""
3649
3478
if len(experimental_pairs) > 0:
3650
3479
other_output += "Experimental formats are shown below.\n\n"
3704
3533
stack_on = urlutils.rebase_url(self._stack_on,
3705
3534
self._stack_on_pwd,
3535
branch.bzrdir.root_transport.base)
3707
3536
except errors.InvalidRebaseURLs:
3708
3537
stack_on = self._get_full_stack_on()
3713
3542
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
3720
3545
def _get_full_stack_on(self):
3721
3546
"""Get a fully-qualified URL for the stack_on location."""
3722
3547
if self._stack_on is None:
3838
3663
format_registry.register('weave', BzrDirFormat6,
3839
3664
'Pre-0.8 format. Slower than knit and does not'
3840
3665
' support checkouts or shared repositories.',
3842
3666
deprecated=True)
3843
3667
format_registry.register_metadir('metaweave',
3844
3668
'bzrlib.repofmt.weaverepo.RepositoryFormat7',
3845
3669
'Transitional format in 0.8. Slower than knit.',
3846
3670
branch_format='bzrlib.branch.BzrBranchFormat5',
3847
3671
tree_format='bzrlib.workingtree.WorkingTreeFormat3',
3849
3672
deprecated=True)
3850
3673
format_registry.register_metadir('knit',
3851
3674
'bzrlib.repofmt.knitrepo.RepositoryFormatKnit1',
3852
3675
'Format using knits. Recommended for interoperation with bzr <= 0.14.',
3853
3676
branch_format='bzrlib.branch.BzrBranchFormat5',
3854
3677
tree_format='bzrlib.workingtree.WorkingTreeFormat3',
3856
3678
deprecated=True)
3857
3679
format_registry.register_metadir('dirstate',
3858
3680
'bzrlib.repofmt.knitrepo.RepositoryFormatKnit1',
3862
3684
# this uses bzrlib.workingtree.WorkingTreeFormat4 because importing
3863
3685
# directly from workingtree_4 triggers a circular import.
3864
3686
tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3866
3687
deprecated=True)
3867
3688
format_registry.register_metadir('dirstate-tags',
3868
3689
'bzrlib.repofmt.knitrepo.RepositoryFormatKnit1',
3871
3692
' Incompatible with bzr < 0.15.',
3872
3693
branch_format='bzrlib.branch.BzrBranchFormat6',
3873
3694
tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3875
3695
deprecated=True)
3876
3696
format_registry.register_metadir('rich-root',
3877
3697
'bzrlib.repofmt.knitrepo.RepositoryFormatKnit4',
3880
3700
branch_format='bzrlib.branch.BzrBranchFormat6',
3881
3701
tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3883
3702
deprecated=True)
3884
3703
format_registry.register_metadir('dirstate-with-subtree',
3885
3704
'bzrlib.repofmt.knitrepo.RepositoryFormatKnit3',
3896
3715
help='New in 0.92: Pack-based format with data compatible with '
3897
3716
'dirstate-tags format repositories. Interoperates with '
3898
3717
'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.',
3900
3721
branch_format='bzrlib.branch.BzrBranchFormat6',
3901
3722
tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3905
3726
help='New in 0.92: Pack-based format with data compatible with '
3906
3727
'dirstate-with-subtree format repositories. Interoperates with '
3907
3728
'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.',
3909
3732
branch_format='bzrlib.branch.BzrBranchFormat6',
3910
3733
tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3917
3740
'(needed for bzr-svn and bzr-git).',
3918
3741
branch_format='bzrlib.branch.BzrBranchFormat6',
3919
3742
tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3922
3744
format_registry.register_metadir('1.6',
3923
3745
'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack5',
3926
3748
'not present locally.',
3927
3749
branch_format='bzrlib.branch.BzrBranchFormat7',
3928
3750
tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3931
3752
format_registry.register_metadir('1.6.1-rich-root',
3932
3753
'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack5RichRoot',
3934
3755
'(needed for bzr-svn and bzr-git).',
3935
3756
branch_format='bzrlib.branch.BzrBranchFormat7',
3936
3757
tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3939
3759
format_registry.register_metadir('1.9',
3940
3760
'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack6',
3943
3763
'performance for most operations.',
3944
3764
branch_format='bzrlib.branch.BzrBranchFormat7',
3945
3765
tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3948
3767
format_registry.register_metadir('1.9-rich-root',
3949
3768
'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack6RichRoot',
3951
3770
'(needed for bzr-svn and bzr-git).',
3952
3771
branch_format='bzrlib.branch.BzrBranchFormat7',
3953
3772
tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3956
3774
format_registry.register_metadir('1.14',
3957
3775
'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack6',
3973
3791
'to and from rich-root-pack (and anything compatible with '
3974
3792
'rich-root-pack) format repositories. Repositories and branches in '
3975
3793
'this format can only be read by bzr.dev. Please read '
3976
'http://doc.bazaar.canonical.com/latest/developers/development-repo.html '
3794
'http://doc.bazaar-vcs.org/latest/developers/development-repo.html '
3978
3796
branch_format='bzrlib.branch.BzrBranchFormat7',
3979
3797
tree_format='bzrlib.workingtree.WorkingTreeFormat6',
3980
3798
experimental=True,
3984
3801
format_registry.register_metadir('development-subtree',
3985
3802
'bzrlib.repofmt.pack_repo.RepositoryFormatPackDevelopment2Subtree',
3987
3804
'from pack-0.92-subtree (and anything compatible with '
3988
3805
'pack-0.92-subtree) format repositories. Repositories and branches in '
3989
3806
'this format can only be read by bzr.dev. Please read '
3990
'http://doc.bazaar.canonical.com/latest/developers/development-repo.html '
3807
'http://doc.bazaar-vcs.org/latest/developers/development-repo.html '
3992
3809
branch_format='bzrlib.branch.BzrBranchFormat7',
3993
3810
tree_format='bzrlib.workingtree.WorkingTreeFormat6',
3994
3811
experimental=True,
3996
3812
alias=False, # Restore to being an alias when an actual development subtree format is added
3997
3813
# This current non-alias status is simply because we did not introduce a
3998
3814
# chk based subtree format.
4003
3819
'bzrlib.repofmt.groupcompress_repo.RepositoryFormatCHK1',
4004
3820
help='pack-1.9 with 255-way hashed CHK inv, group compress, rich roots '
4006
'http://doc.bazaar.canonical.com/latest/developers/development-repo.html '
3822
'http://doc.bazaar-vcs.org/latest/developers/development-repo.html '
4008
3824
branch_format='bzrlib.branch.BzrBranchFormat7',
4009
3825
tree_format='bzrlib.workingtree.WorkingTreeFormat6',
4015
3831
'bzrlib.repofmt.groupcompress_repo.RepositoryFormatCHK2',
4016
3832
help='pack-1.9 with 255-way hashed CHK inv, bencode revision, group compress, '
4017
3833
'rich roots. Please read '
4018
'http://doc.bazaar.canonical.com/latest/developers/development-repo.html '
3834
'http://doc.bazaar-vcs.org/latest/developers/development-repo.html '
4020
3836
branch_format='bzrlib.branch.BzrBranchFormat7',
4021
3837
tree_format='bzrlib.workingtree.WorkingTreeFormat6',
4038
3854
# The following format should be an alias for the rich root equivalent
4039
3855
# of the default format
4040
3856
format_registry.register_metadir('default-rich-root',
4041
'bzrlib.repofmt.groupcompress_repo.RepositoryFormat2a',
4042
branch_format='bzrlib.branch.BzrBranchFormat7',
4043
tree_format='bzrlib.workingtree.WorkingTreeFormat6',
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',
4048
3863
# The current format that is made on 'bzr init'.
4049
format_registry.set_default('2a')
3864
format_registry.set_default('pack-0.92')