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