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
91
"""A .bzr control diretory.
127
93
BzrDir instances let you create or open any of the things that can be
165
131
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
132
target_repo_format = target_format.repository_format
171
self.open_repository()._format.check_conversion_target(
173
except errors.NoRepositoryPresent:
174
# No repo, no problem.
133
source_repo_format = self._format.repository_format
134
source_repo_format.check_conversion_target(target_repo_format)
178
137
def _check_supported(format, allow_unsupported,
294
253
# copied, and finally if we are copying up to a specific
295
254
# revision_id then we can use the pending-ancestry-result which
296
255
# 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
256
if (result_repo.bzrdir.root_transport.base ==
257
result.root_transport.base and not require_stacking and
299
258
revision_id is not None):
300
259
fetch_spec = graph.PendingAncestryResult(
301
260
[revision_id], local_repo)
377
336
bzrdir = BzrDir.open_from_transport(current_transport)
378
except (errors.NotBranchError, errors.PermissionDenied):
337
except errors.NotBranchError:
381
340
recurse, value = evaluate(bzrdir)
384
343
subdirs = list_current(current_transport)
385
except (errors.NoSuchFile, errors.PermissionDenied):
344
except errors.NoSuchFile:
388
347
for subdir in sorted(subdirs, reverse=True):
389
348
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, errors.NoRepositoryPresent):
401
351
def find_branches(transport):
402
352
"""Find all branches under a transport.
414
364
except errors.NoRepositoryPresent:
417
return False, ([], repository)
418
return True, (bzrdir.list_branches(), None)
420
for branches, repo in BzrDir.find_bzrdirs(transport,
367
return False, (None, repository)
369
branch = bzrdir.open_branch()
370
except errors.NotBranchError:
371
return True, (None, None)
373
return True, (branch, None)
375
for branch, repo in BzrDir.find_bzrdirs(transport, evaluate=evaluate):
422
376
if repo is not None:
423
ret.extend(repo.find_branches())
424
if branches is not None:
377
branches.extend(repo.find_branches())
378
if branch is not None:
379
branches.append(branch)
428
382
def destroy_repository(self):
429
383
"""Destroy the repository in this BzrDir"""
430
384
raise NotImplementedError(self.destroy_repository)
432
def create_branch(self, name=None):
386
def create_branch(self):
433
387
"""Create a branch in this BzrDir.
435
:param name: Name of the colocated branch to create, None for
438
389
The bzrdir's format will control what branch format is created.
439
390
For more control see BranchFormatXX.create(a_bzrdir).
441
392
raise NotImplementedError(self.create_branch)
443
def destroy_branch(self, name=None):
444
"""Destroy a branch in this BzrDir.
446
:param name: Name of the branch to destroy, None for the default
394
def destroy_branch(self):
395
"""Destroy the branch in this BzrDir"""
449
396
raise NotImplementedError(self.destroy_branch)
499
446
except errors.NoRepositoryPresent:
500
447
repository = None
502
if (found_bzrdir.user_url != self.user_url
503
and not repository.is_shared()):
449
if ((found_bzrdir.root_transport.base !=
450
self.root_transport.base) and not repository.is_shared()):
504
451
# Don't look higher, can't use a higher shared repo.
505
452
repository = None
621
568
:return: Tuple with old path name and new path name
623
def name_gen(base='backup.bzr'):
625
name = "%s.~%d~" % (base, counter)
626
while self.root_transport.has(name):
628
name = "%s.~%d~" % (base, counter)
631
backup_dir=name_gen()
632
570
pb = ui.ui_factory.nested_progress_bar()
634
572
# FIXME: bug 300001 -- the backup fails if the backup directory
635
573
# already exists, but it should instead either remove it or make
636
574
# a new backup directory.
576
# FIXME: bug 262450 -- the backup directory should have the same
577
# permissions as the .bzr directory (probably a bug in copy_tree)
638
578
old_path = self.root_transport.abspath('.bzr')
639
new_path = self.root_transport.abspath(backup_dir)
640
ui.ui_factory.note('making backup of %s\n to %s' % (old_path, new_path,))
641
self.root_transport.copy_tree('.bzr', backup_dir)
579
new_path = self.root_transport.abspath('backup.bzr')
580
pb.note('making backup of %s' % (old_path,))
581
pb.note(' to %s' % (new_path,))
582
self.root_transport.copy_tree('.bzr', 'backup.bzr')
642
583
return (old_path, new_path)
704
645
next_transport = found_bzrdir.root_transport.clone('..')
705
if (found_bzrdir.user_url == next_transport.base):
646
if (found_bzrdir.root_transport.base == next_transport.base):
706
647
# top of the file system
708
649
# find the next containing bzrdir
725
666
repository = found_bzrdir.open_repository()
726
667
except errors.NoRepositoryPresent:
727
668
return None, False
728
if found_bzrdir.user_url == self.user_url:
669
if found_bzrdir.root_transport.base == self.root_transport.base:
729
670
return repository, True
730
671
elif repository.is_shared():
731
672
return repository, True
737
678
raise errors.NoRepositoryPresent(self)
738
679
return found_repo
740
def get_branch_reference(self, name=None):
681
def get_branch_reference(self):
741
682
"""Return the referenced URL for the branch in this bzrdir.
743
:param name: Optional colocated branch name
744
684
:raises NotBranchError: If there is no Branch.
745
:raises NoColocatedBranchSupport: If a branch name was specified
746
but colocated branches are not supported.
747
685
:return: The URL the branch in this bzrdir references if it is a
748
686
reference branch, or None for regular branches.
751
raise errors.NoColocatedBranchSupport(self)
754
def get_branch_transport(self, branch_format, name=None):
690
def get_branch_transport(self, branch_format):
755
691
"""Get the transport for use by branch format in this BzrDir.
757
693
Note that bzr dirs that do not support format strings will raise
852
788
:param _transport: the transport this dir is based at.
854
790
self._format = _format
855
# these are also under the more standard names of
856
# control_transport and user_transport
857
791
self.transport = _transport.clone('.bzr')
858
792
self.root_transport = _transport
859
793
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
795
def is_control_filename(self, filename):
870
796
"""True if filename is the name of a path which is reserved for bzrdir's.
945
871
BzrDir._check_supported(format, _unsupported)
946
872
return format.open(transport, _found=True)
948
def open_branch(self, name=None, unsupported=False,
949
ignore_fallbacks=False):
874
def open_branch(self, unsupported=False, ignore_fallbacks=False):
950
875
"""Open the branch object at this BzrDir if one is present.
952
877
If unsupported is True, then no longer supported branch formats can
999
924
raise errors.NotBranchError(path=url)
1000
925
a_transport = new_t
1002
def _get_tree_branch(self, name=None):
927
def _get_tree_branch(self):
1003
928
"""Return the branch and tree, if any, for this bzrdir.
1005
:param name: Name of colocated branch to open.
1007
930
Return None for tree if not present or inaccessible.
1008
931
Raise NotBranchError if no branch is present.
1009
932
:return: (tree, branch)
1012
935
tree = self.open_workingtree()
1013
936
except (errors.NoWorkingTree, errors.NotLocalUrl):
1015
branch = self.open_branch(name=name)
938
branch = self.open_branch()
1017
if name is not None:
1018
branch = self.open_branch(name=name)
1020
branch = tree.branch
1021
941
return tree, branch
1096
1016
raise NotImplementedError(self.open_workingtree)
1098
def has_branch(self, name=None):
1018
def has_branch(self):
1099
1019
"""Tell if this bzrdir contains a branch.
1101
1021
Note: if you're going to open the branch, you should just go ahead
1244
1164
repository_policy = result.determine_repository_policy(
1245
1165
force_new_repo, stacked_branch_url, require_stacking=stacked)
1246
1166
result_repo, is_new_repo = repository_policy.acquire_repository()
1247
is_stacked = stacked or (len(result_repo._fallback_repositories) != 0)
1248
if is_new_repo and revision_id is not None and not is_stacked:
1167
if is_new_repo and revision_id is not None and not stacked:
1249
1168
fetch_spec = graph.PendingAncestryResult(
1250
1169
[revision_id], source_repository)
1384
1303
self.create_hook(hooks.HookPoint('pre_open',
1385
1304
"Invoked before attempting to open a BzrDir with the transport "
1386
1305
"that the open will use.", (1, 14), None))
1387
self.create_hook(hooks.HookPoint('post_repo_init',
1388
"Invoked after a repository has been initialized. "
1389
"post_repo_init is called with a "
1390
"bzrlib.bzrdir.RepoInitHookParams.",
1393
1307
# install the default hooks
1394
1308
BzrDir.hooks = BzrDirHooks()
1397
class RepoInitHookParams(object):
1398
"""Object holding parameters passed to *_repo_init hooks.
1400
There are 4 fields that hooks may wish to access:
1402
:ivar repository: Repository created
1403
:ivar format: Repository format
1404
:ivar bzrdir: The bzrdir for the repository
1405
:ivar shared: The repository is shared
1408
def __init__(self, repository, format, a_bzrdir, shared):
1409
"""Create a group of RepoInitHook parameters.
1411
:param repository: Repository created
1412
:param format: Repository format
1413
:param bzrdir: The bzrdir for the repository
1414
:param shared: The repository is shared
1416
self.repository = repository
1417
self.format = format
1418
self.bzrdir = a_bzrdir
1419
self.shared = shared
1421
def __eq__(self, other):
1422
return self.__dict__ == other.__dict__
1426
return "<%s for %s>" % (self.__class__.__name__,
1429
return "<%s for %s>" % (self.__class__.__name__,
1433
1311
class BzrDirPreSplitOut(BzrDir):
1434
1312
"""A common class for the all-in-one formats."""
1474
1352
tree.clone(result)
1477
def create_branch(self, name=None):
1355
def create_branch(self):
1478
1356
"""See BzrDir.create_branch."""
1479
return self._format.get_branch_format().initialize(self, name=name)
1357
return self._format.get_branch_format().initialize(self)
1481
def destroy_branch(self, name=None):
1359
def destroy_branch(self):
1482
1360
"""See BzrDir.destroy_branch."""
1483
1361
raise errors.UnsupportedOperation(self.destroy_branch, self)
1540
1418
raise errors.UnsupportedOperation(self.destroy_workingtree_metadata,
1543
def get_branch_transport(self, branch_format, name=None):
1421
def get_branch_transport(self, branch_format):
1544
1422
"""See BzrDir.get_branch_transport()."""
1545
if name is not None:
1546
raise errors.NoColocatedBranchSupport(self)
1547
1423
if branch_format is None:
1548
1424
return self.transport
1582
1458
format = BzrDirFormat.get_default_format()
1583
1459
return not isinstance(self._format, format.__class__)
1585
def open_branch(self, name=None, unsupported=False,
1586
ignore_fallbacks=False):
1461
def open_branch(self, unsupported=False, ignore_fallbacks=False):
1587
1462
"""See BzrDir.open_branch."""
1588
1463
from bzrlib.branch import BzrBranchFormat4
1589
1464
format = BzrBranchFormat4()
1590
1465
self._check_supported(format, unsupported)
1591
return format.open(self, name, _found=True)
1466
return format.open(self, _found=True)
1593
1468
def sprout(self, url, revision_id=None, force_new_repo=False,
1594
1469
possible_transports=None, accelerator_tree=None,
1655
1530
This is a deprecated format and may be removed after sept 2006.
1658
def has_workingtree(self):
1659
"""See BzrDir.has_workingtree."""
1662
1533
def open_repository(self):
1663
1534
"""See BzrDir.open_repository."""
1664
1535
from bzrlib.repofmt.weaverepo import RepositoryFormat5
1680
1551
This is a deprecated format and may be removed after sept 2006.
1683
def has_workingtree(self):
1684
"""See BzrDir.has_workingtree."""
1687
1554
def open_repository(self):
1688
1555
"""See BzrDir.open_repository."""
1689
1556
from bzrlib.repofmt.weaverepo import RepositoryFormat6
1711
1578
"""See BzrDir.can_convert_format()."""
1714
def create_branch(self, name=None):
1581
def create_branch(self):
1715
1582
"""See BzrDir.create_branch."""
1716
return self._format.get_branch_format().initialize(self, name=name)
1583
return self._format.get_branch_format().initialize(self)
1718
def destroy_branch(self, name=None):
1585
def destroy_branch(self):
1719
1586
"""See BzrDir.create_branch."""
1720
if name is not None:
1721
raise errors.NoColocatedBranchSupport(self)
1722
1587
self.transport.delete_tree('branch')
1724
1589
def create_repository(self, shared=False):
1747
1612
def destroy_workingtree_metadata(self):
1748
1613
self.transport.delete_tree('checkout')
1750
def find_branch_format(self, name=None):
1615
def find_branch_format(self):
1751
1616
"""Find the branch 'format' for this bzrdir.
1753
1618
This might be a synthetic object for e.g. RemoteBranch and SVN.
1755
1620
from bzrlib.branch import BranchFormat
1756
return BranchFormat.find_format(self, name=name)
1621
return BranchFormat.find_format(self)
1758
1623
def _get_mkdir_mode(self):
1759
1624
"""Figure out the mode to use when creating a bzrdir subdir."""
1761
1626
lockable_files.TransportLock)
1762
1627
return temp_control._dir_mode
1764
def get_branch_reference(self, name=None):
1629
def get_branch_reference(self):
1765
1630
"""See BzrDir.get_branch_reference()."""
1766
1631
from bzrlib.branch import BranchFormat
1767
format = BranchFormat.find_format(self, name=name)
1768
return format.get_reference(self, name=name)
1632
format = BranchFormat.find_format(self)
1633
return format.get_reference(self)
1770
def get_branch_transport(self, branch_format, name=None):
1635
def get_branch_transport(self, branch_format):
1771
1636
"""See BzrDir.get_branch_transport()."""
1772
if name is not None:
1773
raise errors.NoColocatedBranchSupport(self)
1774
1637
# XXX: this shouldn't implicitly create the directory if it's just
1775
1638
# promising to get a transport -- mbp 20090727
1776
1639
if branch_format is None:
1814
1677
return self.transport.clone('checkout')
1816
def has_workingtree(self):
1817
"""Tell if this bzrdir contains a working tree.
1819
This will still raise an exception if the bzrdir has a workingtree that
1820
is remote & inaccessible.
1822
Note: if you're going to open the working tree, you should just go
1823
ahead and try, and not ask permission first.
1825
from bzrlib.workingtree import WorkingTreeFormat
1827
WorkingTreeFormat.find_format(self)
1828
except errors.NoWorkingTree:
1832
1679
def needs_format_conversion(self, format=None):
1833
1680
"""See BzrDir.needs_format_conversion()."""
1834
1681
if format is None:
1848
1695
except errors.NoRepositoryPresent:
1850
for branch in self.list_branches():
1851
if not isinstance(branch._format,
1698
if not isinstance(self.open_branch()._format,
1852
1699
format.get_branch_format().__class__):
1853
1700
# the branch needs an upgrade.
1702
except errors.NotBranchError:
1856
1705
my_wt = self.open_workingtree(recommend_upgrade=False)
1857
1706
if not isinstance(my_wt._format,
1865
def open_branch(self, name=None, unsupported=False,
1866
ignore_fallbacks=False):
1714
def open_branch(self, unsupported=False, ignore_fallbacks=False):
1867
1715
"""See BzrDir.open_branch."""
1868
format = self.find_branch_format(name=name)
1716
format = self.find_branch_format()
1869
1717
self._check_supported(format, unsupported)
1870
return format.open(self, name=name,
1871
_found=True, ignore_fallbacks=ignore_fallbacks)
1718
return format.open(self, _found=True, ignore_fallbacks=ignore_fallbacks)
1873
1720
def open_repository(self, unsupported=False):
1874
1721
"""See BzrDir.open_repository."""
1906
1753
Once a format is deprecated, just deprecate the initialize and open
1907
1754
methods on the format class. Do not deprecate the object, as the
1908
1755
object will be created every system load.
1910
:cvar colocated_branches: Whether this formats supports colocated branches.
1913
1758
_default_format = None
1931
1776
_lock_file_name = 'branch-lock'
1933
colocated_branches = False
1934
"""Whether co-located branches are supported for this control dir format.
1937
1778
# _lock_class must be set in subclasses to the lock type, typ.
1938
1779
# TransportLock or LockDir
1956
1797
def probe_transport(klass, transport):
1957
1798
"""Return the .bzrdir style format present in a directory."""
1959
format_string = transport.get_bytes(".bzr/branch-format")
1800
format_string = transport.get(".bzr/branch-format").read()
1960
1801
except errors.NoSuchFile:
1961
1802
raise errors.NotBranchError(path=transport.base)
1963
1805
return klass._formats[format_string]
1964
1806
except KeyError:
2737
2579
def convert(self, to_convert, pb):
2738
2580
"""See Converter.convert()."""
2739
2581
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)
2583
self.pb.note('starting upgrade from format 4 to 5')
2584
if isinstance(self.bzrdir.transport, local.LocalTransport):
2585
self.bzrdir.get_workingtree_transport(None).delete('stat-cache')
2586
self._convert_to_weaves()
2587
return BzrDir.open(self.bzrdir.root_transport.base)
2752
2589
def _convert_to_weaves(self):
2753
ui.ui_factory.note('note: upgrade may be faster if all store files are ungzipped first')
2590
self.pb.note('note: upgrade may be faster if all store files are ungzipped first')
2755
2592
# TODO permissions
2756
2593
stat = self.bzrdir.transport.stat('weaves')
2784
2621
self.pb.clear()
2785
2622
self._write_all_weaves()
2786
2623
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)
2624
self.pb.note('upgraded to weaves:')
2625
self.pb.note(' %6d revisions and inventories', len(self.revisions))
2626
self.pb.note(' %6d revisions not present', len(self.absent_revisions))
2627
self.pb.note(' %6d texts', self.text_count)
2791
2628
self._cleanup_spare_files_after_format4()
2792
2629
self.branch._transport.put_bytes(
2793
2630
'branch-format',
2861
2698
len(self.known_revisions))
2862
2699
if not self.branch.repository.has_revision(rev_id):
2863
2700
self.pb.clear()
2864
ui.ui_factory.note('revision {%s} not present in branch; '
2865
'will be converted as a ghost' %
2701
self.pb.note('revision {%s} not present in branch; '
2702
'will be converted as a ghost',
2867
2704
self.absent_revisions.add(rev_id)
2873
2710
self.revisions[rev_id] = rev
2875
2712
def _load_old_inventory(self, rev_id):
2876
f = self.branch.repository.inventory_store.get(rev_id)
2878
old_inv_xml = f.read()
2713
old_inv_xml = self.branch.repository.inventory_store.get(rev_id).read()
2881
2714
inv = xml4.serializer_v4.read_inventory_from_string(old_inv_xml)
2882
2715
inv.revision_id = rev_id
2883
2716
rev = self.revisions[rev_id]
2961
2794
ie.revision = previous_ie.revision
2963
2796
if ie.has_text():
2964
f = self.branch.repository._text_store.get(ie.text_id)
2966
file_lines = f.readlines()
2797
text = self.branch.repository._text_store.get(ie.text_id)
2798
file_lines = text.readlines()
2969
2799
w.add_lines(rev_id, previous_revisions, file_lines)
2970
2800
self.text_count += 1
3001
2831
def convert(self, to_convert, pb):
3002
2832
"""See Converter.convert()."""
3003
2833
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)
2835
self.pb.note('starting upgrade from format 5 to 6')
2836
self._convert_to_prefixed()
2837
return BzrDir.open(self.bzrdir.root_transport.base)
3012
2839
def _convert_to_prefixed(self):
3013
2840
from bzrlib.store import TransportStore
3014
2841
self.bzrdir.transport.delete('branch-format')
3015
2842
for store_name in ["weaves", "revision-store"]:
3016
ui.ui_factory.note("adding prefixes to %s" % store_name)
2843
self.pb.note("adding prefixes to %s" % store_name)
3017
2844
store_transport = self.bzrdir.transport.clone(store_name)
3018
2845
store = TransportStore(store_transport, prefixed=True)
3019
2846
for urlfilename in store_transport.list_dir('.'):
3046
2873
from bzrlib.repofmt.weaverepo import RepositoryFormat7
3047
2874
from bzrlib.branch import BzrBranchFormat5
3048
2875
self.bzrdir = to_convert
3049
self.pb = ui.ui_factory.nested_progress_bar()
3051
2878
self.total = 20 # the steps we know about
3052
2879
self.garbage_inventories = []
3053
2880
self.dir_mode = self.bzrdir._get_dir_mode()
3054
2881
self.file_mode = self.bzrdir._get_file_mode()
3056
ui.ui_factory.note('starting upgrade from format 6 to metadir')
2883
self.pb.note('starting upgrade from format 6 to metadir')
3057
2884
self.bzrdir.transport.put_bytes(
3058
2885
'branch-format',
3059
2886
"Converting to format 6",
3110
2937
has_checkout = True
3111
2938
if not has_checkout:
3112
ui.ui_factory.note('No working tree.')
2939
self.pb.note('No working tree.')
3113
2940
# If some checkout files are there, we may as well get rid of them.
3114
2941
for name, mandatory in checkout_files:
3115
2942
if name in bzrcontents:
3132
2959
'branch-format',
3133
2960
BzrDirMetaFormat1().get_format_string(),
3134
2961
mode=self.file_mode)
3136
return BzrDir.open(self.bzrdir.user_url)
2962
return BzrDir.open(self.bzrdir.root_transport.base)
3138
2964
def make_lock(self, name):
3139
2965
"""Make a lock for the new control dir name."""
3174
3000
def convert(self, to_convert, pb):
3175
3001
"""See Converter.convert()."""
3176
3002
self.bzrdir = to_convert
3177
self.pb = ui.ui_factory.nested_progress_bar()
3180
3006
self.step('checking repository format')
3186
3012
if not isinstance(repo._format, self.target_format.repository_format.__class__):
3187
3013
from bzrlib.repository import CopyConverter
3188
ui.ui_factory.note('starting repository conversion')
3014
self.pb.note('starting repository conversion')
3189
3015
converter = CopyConverter(self.target_format.repository_format)
3190
3016
converter.convert(repo, pb)
3191
for branch in self.bzrdir.list_branches():
3018
branch = self.bzrdir.open_branch()
3019
except errors.NotBranchError:
3192
3022
# TODO: conversions of Branch and Tree should be done by
3193
3023
# InterXFormat lookups/some sort of registry.
3194
3024
# Avoid circular imports
3209
3039
new is _mod_branch.BzrBranchFormat8):
3210
3040
branch_converter = _mod_branch.Converter7to8()
3212
raise errors.BadConversionTarget("No converter", new,
3042
raise errors.BadConversionTarget("No converter", new)
3214
3043
branch_converter.convert(branch)
3215
3044
branch = self.bzrdir.open_branch()
3216
3045
old = branch._format.__class__
3250
3078
def __init__(self):
3251
3079
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
3080
self._network_name = None
3259
return "%s(_network_name=%r)" % (self.__class__.__name__,
3262
3082
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
3083
return 'bzr remote bzrdir'
3268
3085
def get_format_string(self):
3401
3218
args.append(self._serialize_NoneString(repo_format_name))
3402
3219
args.append(self._serialize_NoneTrueFalse(make_working_trees))
3403
3220
args.append(self._serialize_NoneTrueFalse(shared_repo))
3404
request_network_name = self._network_name or \
3221
if self._network_name is None:
3222
self._network_name = \
3405
3223
BzrDirFormat.get_default_format().network_name()
3407
3225
response = client.call('BzrDirFormat.initialize_ex_1.16',
3408
request_network_name, path, *args)
3226
self.network_name(), path, *args)
3409
3227
except errors.UnknownSmartMethod:
3410
3228
client._medium._remember_remote_is_before((1,16))
3411
3229
local_dir_format = BzrDirMetaFormat1()
3661
3479
experimental_pairs.append((key, help))
3663
3481
output += wrapped(key, help, info)
3664
output += "\nSee :doc:`formats-help` for more about storage formats."
3482
output += "\nSee ``bzr help formats`` for more about storage formats."
3665
3483
other_output = ""
3666
3484
if len(experimental_pairs) > 0:
3667
3485
other_output += "Experimental formats are shown below.\n\n"
3721
3539
stack_on = urlutils.rebase_url(self._stack_on,
3722
3540
self._stack_on_pwd,
3541
branch.bzrdir.root_transport.base)
3724
3542
except errors.InvalidRebaseURLs:
3725
3543
stack_on = self._get_full_stack_on()
3730
3548
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
3551
def _get_full_stack_on(self):
3738
3552
"""Get a fully-qualified URL for the stack_on location."""
3739
3553
if self._stack_on is None:
3855
3669
format_registry.register('weave', BzrDirFormat6,
3856
3670
'Pre-0.8 format. Slower than knit and does not'
3857
3671
' support checkouts or shared repositories.',
3859
3672
deprecated=True)
3860
3673
format_registry.register_metadir('metaweave',
3861
3674
'bzrlib.repofmt.weaverepo.RepositoryFormat7',
3862
3675
'Transitional format in 0.8. Slower than knit.',
3863
3676
branch_format='bzrlib.branch.BzrBranchFormat5',
3864
3677
tree_format='bzrlib.workingtree.WorkingTreeFormat3',
3866
3678
deprecated=True)
3867
3679
format_registry.register_metadir('knit',
3868
3680
'bzrlib.repofmt.knitrepo.RepositoryFormatKnit1',
3869
3681
'Format using knits. Recommended for interoperation with bzr <= 0.14.',
3870
3682
branch_format='bzrlib.branch.BzrBranchFormat5',
3871
3683
tree_format='bzrlib.workingtree.WorkingTreeFormat3',
3873
3684
deprecated=True)
3874
3685
format_registry.register_metadir('dirstate',
3875
3686
'bzrlib.repofmt.knitrepo.RepositoryFormatKnit1',
3879
3690
# this uses bzrlib.workingtree.WorkingTreeFormat4 because importing
3880
3691
# directly from workingtree_4 triggers a circular import.
3881
3692
tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3883
3693
deprecated=True)
3884
3694
format_registry.register_metadir('dirstate-tags',
3885
3695
'bzrlib.repofmt.knitrepo.RepositoryFormatKnit1',
3888
3698
' Incompatible with bzr < 0.15.',
3889
3699
branch_format='bzrlib.branch.BzrBranchFormat6',
3890
3700
tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3892
3701
deprecated=True)
3893
3702
format_registry.register_metadir('rich-root',
3894
3703
'bzrlib.repofmt.knitrepo.RepositoryFormatKnit4',
3897
3706
branch_format='bzrlib.branch.BzrBranchFormat6',
3898
3707
tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3900
3708
deprecated=True)
3901
3709
format_registry.register_metadir('dirstate-with-subtree',
3902
3710
'bzrlib.repofmt.knitrepo.RepositoryFormatKnit3',
3913
3721
help='New in 0.92: Pack-based format with data compatible with '
3914
3722
'dirstate-tags format repositories. Interoperates with '
3915
3723
'bzr repositories before 0.92 but cannot be read by bzr < 0.92. '
3724
'Previously called knitpack-experimental. '
3725
'For more information, see '
3726
'http://doc.bazaar-vcs.org/latest/developers/packrepo.html.',
3917
3727
branch_format='bzrlib.branch.BzrBranchFormat6',
3918
3728
tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3922
3732
help='New in 0.92: Pack-based format with data compatible with '
3923
3733
'dirstate-with-subtree format repositories. Interoperates with '
3924
3734
'bzr repositories before 0.92 but cannot be read by bzr < 0.92. '
3735
'Previously called knitpack-experimental. '
3736
'For more information, see '
3737
'http://doc.bazaar-vcs.org/latest/developers/packrepo.html.',
3926
3738
branch_format='bzrlib.branch.BzrBranchFormat6',
3927
3739
tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3934
3746
'(needed for bzr-svn and bzr-git).',
3935
3747
branch_format='bzrlib.branch.BzrBranchFormat6',
3936
3748
tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3939
3750
format_registry.register_metadir('1.6',
3940
3751
'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack5',
3943
3754
'not present locally.',
3944
3755
branch_format='bzrlib.branch.BzrBranchFormat7',
3945
3756
tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3948
3758
format_registry.register_metadir('1.6.1-rich-root',
3949
3759
'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack5RichRoot',
3951
3761
'(needed for bzr-svn and bzr-git).',
3952
3762
branch_format='bzrlib.branch.BzrBranchFormat7',
3953
3763
tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3956
3765
format_registry.register_metadir('1.9',
3957
3766
'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack6',
3960
3769
'performance for most operations.',
3961
3770
branch_format='bzrlib.branch.BzrBranchFormat7',
3962
3771
tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3965
3773
format_registry.register_metadir('1.9-rich-root',
3966
3774
'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack6RichRoot',
3968
3776
'(needed for bzr-svn and bzr-git).',
3969
3777
branch_format='bzrlib.branch.BzrBranchFormat7',
3970
3778
tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3973
3780
format_registry.register_metadir('1.14',
3974
3781
'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack6',
3990
3797
'to and from rich-root-pack (and anything compatible with '
3991
3798
'rich-root-pack) format repositories. Repositories and branches in '
3992
3799
'this format can only be read by bzr.dev. Please read '
3993
'http://doc.bazaar.canonical.com/latest/developers/development-repo.html '
3800
'http://doc.bazaar-vcs.org/latest/developers/development-repo.html '
3995
3802
branch_format='bzrlib.branch.BzrBranchFormat7',
3996
3803
tree_format='bzrlib.workingtree.WorkingTreeFormat6',
3997
3804
experimental=True,
4001
3807
format_registry.register_metadir('development-subtree',
4002
3808
'bzrlib.repofmt.pack_repo.RepositoryFormatPackDevelopment2Subtree',
4004
3810
'from pack-0.92-subtree (and anything compatible with '
4005
3811
'pack-0.92-subtree) format repositories. Repositories and branches in '
4006
3812
'this format can only be read by bzr.dev. Please read '
4007
'http://doc.bazaar.canonical.com/latest/developers/development-repo.html '
3813
'http://doc.bazaar-vcs.org/latest/developers/development-repo.html '
4009
3815
branch_format='bzrlib.branch.BzrBranchFormat7',
4010
3816
tree_format='bzrlib.workingtree.WorkingTreeFormat6',
4011
3817
experimental=True,
4013
3818
alias=False, # Restore to being an alias when an actual development subtree format is added
4014
3819
# This current non-alias status is simply because we did not introduce a
4015
3820
# chk based subtree format.
4020
3825
'bzrlib.repofmt.groupcompress_repo.RepositoryFormatCHK1',
4021
3826
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 '
3828
'http://doc.bazaar-vcs.org/latest/developers/development-repo.html '
4025
3830
branch_format='bzrlib.branch.BzrBranchFormat7',
4026
3831
tree_format='bzrlib.workingtree.WorkingTreeFormat6',
4032
3837
'bzrlib.repofmt.groupcompress_repo.RepositoryFormatCHK2',
4033
3838
help='pack-1.9 with 255-way hashed CHK inv, bencode revision, group compress, '
4034
3839
'rich roots. Please read '
4035
'http://doc.bazaar.canonical.com/latest/developers/development-repo.html '
3840
'http://doc.bazaar-vcs.org/latest/developers/development-repo.html '
4037
3842
branch_format='bzrlib.branch.BzrBranchFormat7',
4038
3843
tree_format='bzrlib.workingtree.WorkingTreeFormat6',
4055
3860
# The following format should be an alias for the rich root equivalent
4056
3861
# of the default format
4057
3862
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',
3863
'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack4',
3864
help='Default format, rich root variant. (needed for bzr-svn and bzr-git).',
3865
branch_format='bzrlib.branch.BzrBranchFormat6',
3866
tree_format='bzrlib.workingtree.WorkingTreeFormat4',
4065
3869
# The current format that is made on 'bzr init'.
4066
format_registry.set_default('2a')
3870
format_registry.set_default('pack-0.92')