Merge lp:~jelmer/brz/pending into lp:brz

Proposed by Jelmer Vernooij
Status: Needs review
Proposed branch: lp:~jelmer/brz/pending
Merge into: lp:brz
Prerequisite: lp:~jelmer/brz/python3.7
Diff against target: 736 lines (+136/-162)
16 files modified
breezy/bzr/bzrdir.py (+43/-72)
breezy/bzr/remote.py (+0/-4)
breezy/controldir.py (+24/-7)
breezy/errors.py (+0/-5)
breezy/git/dir.py (+0/-3)
breezy/plugins/cvs/__init__.py (+0/-3)
breezy/plugins/darcs/__init__.py (+0/-3)
breezy/plugins/mtn/__init__.py (+0/-3)
breezy/plugins/weave_fmt/bzrdir.py (+35/-21)
breezy/plugins/weave_fmt/test_bzrdir.py (+0/-10)
breezy/tests/blackbox/test_upgrade.py (+7/-5)
breezy/tests/per_controldir/test_controldir.py (+7/-9)
breezy/tests/test_bzrdir.py (+5/-5)
breezy/tests/test_upgrade.py (+7/-7)
breezy/upgrade.py (+7/-5)
tools/prepare_for_latex.py (+1/-0)
To merge this branch: bzr merge lp:~jelmer/brz/pending
Reviewer Review Type Date Requested Status
Martin Packman Approve
Review via email: mp+359654@code.launchpad.net

Commit message

Add registration for Converter objects.

Description of the change

Add registration for Converter objects.

To post a comment you must log in.
Revision history for this message
Martin Packman (gz) wrote :

Looks good, thanks!

review: Approve
Revision history for this message
The Breezy Bot (the-breezy-bot) wrote :
Revision history for this message
The Breezy Bot (the-breezy-bot) wrote :
Revision history for this message
The Breezy Bot (the-breezy-bot) wrote :
Revision history for this message
The Breezy Bot (the-breezy-bot) wrote :
Revision history for this message
The Breezy Bot (the-breezy-bot) wrote :
Revision history for this message
The Breezy Bot (the-breezy-bot) wrote :
Revision history for this message
The Breezy Bot (the-breezy-bot) wrote :

Unmerged revisions

7221. By Jelmer Vernooij

Merge trunk.

7220. By Jelmer Vernooij

Merge trunk.

7219. By Jelmer Vernooij

Add registration for Converter objects.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'breezy/bzr/bzrdir.py'
--- breezy/bzr/bzrdir.py 2018-11-18 19:48:57 +0000
+++ breezy/bzr/bzrdir.py 2019-02-04 13:47:49 +0000
@@ -869,10 +869,6 @@
869 self.control_transport, self._format._lock_file_name,869 self.control_transport, self._format._lock_file_name,
870 self._format._lock_class)870 self._format._lock_class)
871871
872 def can_convert_format(self):
873 """See BzrDir.can_convert_format()."""
874 return True
875
876 def create_branch(self, name=None, repository=None,872 def create_branch(self, name=None, repository=None,
877 append_revisions_only=None):873 append_revisions_only=None):
878 """See ControlDir.create_branch."""874 """See ControlDir.create_branch."""
@@ -1612,21 +1608,6 @@
1612 ' using format:\n %s'),1608 ' using format:\n %s'),
1613 new_branch_format.get_format_description())1609 new_branch_format.get_format_description())
16141610
1615 def get_converter(self, format=None):
1616 """See BzrDirFormat.get_converter()."""
1617 if format is None:
1618 format = BzrDirFormat.get_default_format()
1619 if (isinstance(self, BzrDirMetaFormat1)
1620 and isinstance(format, BzrDirMetaFormat1Colo)):
1621 return ConvertMetaToColo(format)
1622 if (isinstance(self, BzrDirMetaFormat1Colo)
1623 and isinstance(format, BzrDirMetaFormat1)):
1624 return ConvertMetaToColo(format)
1625 if not isinstance(self, format.__class__):
1626 # converting away from metadir is not implemented
1627 raise NotImplementedError(self.get_converter)
1628 return ConvertMetaToMeta(format)
1629
1630 @classmethod1611 @classmethod
1631 def get_format_string(cls):1612 def get_format_string(cls):
1632 """See BzrDirFormat.get_format_string()."""1613 """See BzrDirFormat.get_format_string()."""
@@ -1720,29 +1701,27 @@
1720 return BzrDirMeta1(transport, format)1701 return BzrDirMeta1(transport, format)
17211702
17221703
1723class ConvertMetaToMeta(controldir.Converter):1704class ConvertMetaContents(controldir.Converter):
1724 """Converts the components of metadirs."""1705 """Converts the components of metadirs."""
17251706
1726 def __init__(self, target_format):1707 @classmethod
1727 """Create a metadir to metadir converter.1708 def is_compatible(cls, source_format, target_format):
17281709 return (isinstance(source_format, BzrDirMetaFormat1) and
1729 :param target_format: The final metadir format that is desired.1710 isinstance(target_format, BzrDirMetaFormat1) and
1730 """1711 source_format.get_format_string() == target_format.get_format_string())
1731 self.target_format = target_format1712
17321713 def convert(self, to_convert, target_format, pb):
1733 def convert(self, to_convert, pb):
1734 """See Converter.convert()."""1714 """See Converter.convert()."""
1735 self.controldir = to_convert
1736 self.pb = ui.ui_factory.nested_progress_bar()1715 self.pb = ui.ui_factory.nested_progress_bar()
1737 self.count = 01716 self.count = 0
1738 self.total = 11717 self.total = 1
1739 self.step('checking repository format')1718 self.step('checking repository format')
1740 try:1719 try:
1741 repo = self.controldir.open_repository()1720 repo = to_convert.open_repository()
1742 except errors.NoRepositoryPresent:1721 except errors.NoRepositoryPresent:
1743 pass1722 pass
1744 else:1723 else:
1745 repo_fmt = self.target_format.repository_format1724 repo_fmt = target_format.repository_format
1746 if not isinstance(repo._format, repo_fmt.__class__):1725 if not isinstance(repo._format, repo_fmt.__class__):
1747 from ..repository import CopyConverter1726 from ..repository import CopyConverter
1748 ui.ui_factory.note(gettext('starting repository conversion'))1727 ui.ui_factory.note(gettext('starting repository conversion'))
@@ -1750,14 +1729,14 @@
1750 raise AssertionError(1729 raise AssertionError(
1751 "Repository in metadir does not support "1730 "Repository in metadir does not support "
1752 "overriding transport")1731 "overriding transport")
1753 converter = CopyConverter(self.target_format.repository_format)1732 converter = CopyConverter(target_format.repository_format)
1754 converter.convert(repo, pb)1733 converter.convert(repo, pb)
1755 for branch in self.controldir.list_branches():1734 for branch in to_convert.list_branches():
1756 # TODO: conversions of Branch and Tree should be done by1735 # TODO: conversions of Branch and Tree should be done by
1757 # InterXFormat lookups/some sort of registry.1736 # InterXFormat lookups/some sort of registry.
1758 # Avoid circular imports1737 # Avoid circular imports
1759 old = branch._format.__class__1738 old = branch._format.__class__
1760 new = self.target_format.get_branch_format().__class__1739 new = target_format.get_branch_format().__class__
1761 while old != new:1740 while old != new:
1762 if (old == fullhistorybranch.BzrBranchFormat51741 if (old == fullhistorybranch.BzrBranchFormat5
1763 and new in (_mod_bzrbranch.BzrBranchFormat6,1742 and new in (_mod_bzrbranch.BzrBranchFormat6,
@@ -1775,10 +1754,10 @@
1775 raise errors.BadConversionTarget("No converter", new,1754 raise errors.BadConversionTarget("No converter", new,
1776 branch._format)1755 branch._format)
1777 branch_converter.convert(branch)1756 branch_converter.convert(branch)
1778 branch = self.controldir.open_branch()1757 branch = to_convert.open_branch()
1779 old = branch._format.__class__1758 old = branch._format.__class__
1780 try:1759 try:
1781 tree = self.controldir.open_workingtree(recommend_upgrade=False)1760 tree = to_convert.open_workingtree(recommend_upgrade=False)
1782 except (errors.NoWorkingTree, errors.NotLocalUrl):1761 except (errors.NoWorkingTree, errors.NotLocalUrl):
1783 pass1762 pass
1784 else:1763 else:
@@ -1786,56 +1765,48 @@
1786 # InterXFormat lookups1765 # InterXFormat lookups
1787 if (isinstance(tree, workingtree_3.WorkingTree3)1766 if (isinstance(tree, workingtree_3.WorkingTree3)
1788 and not isinstance(tree, workingtree_4.DirStateWorkingTree)1767 and not isinstance(tree, workingtree_4.DirStateWorkingTree)
1789 and isinstance(self.target_format.workingtree_format,1768 and isinstance(target_format.workingtree_format,
1790 workingtree_4.DirStateWorkingTreeFormat)):1769 workingtree_4.DirStateWorkingTreeFormat)):
1791 workingtree_4.Converter3to4().convert(tree)1770 workingtree_4.Converter3to4().convert(tree)
1792 if (isinstance(tree, workingtree_4.DirStateWorkingTree)1771 if (isinstance(tree, workingtree_4.DirStateWorkingTree)
1793 and not isinstance(tree, workingtree_4.WorkingTree5)1772 and not isinstance(tree, workingtree_4.WorkingTree5)
1794 and isinstance(self.target_format.workingtree_format,1773 and isinstance(target_format.workingtree_format,
1795 workingtree_4.WorkingTreeFormat5)):1774 workingtree_4.WorkingTreeFormat5)):
1796 workingtree_4.Converter4to5().convert(tree)1775 workingtree_4.Converter4to5().convert(tree)
1797 if (isinstance(tree, workingtree_4.DirStateWorkingTree)1776 if (isinstance(tree, workingtree_4.DirStateWorkingTree)
1798 and not isinstance(tree, workingtree_4.WorkingTree6)1777 and not isinstance(tree, workingtree_4.WorkingTree6)
1799 and isinstance(self.target_format.workingtree_format,1778 and isinstance(target_format.workingtree_format,
1800 workingtree_4.WorkingTreeFormat6)):1779 workingtree_4.WorkingTreeFormat6)):
1801 workingtree_4.Converter4or5to6().convert(tree)1780 workingtree_4.Converter4or5to6().convert(tree)
1802 self.pb.finished()1781 self.pb.finished()
1803 return to_convert1782 return to_convert
18041783
18051784
1806class ConvertMetaToColo(controldir.Converter):1785controldir.Converter.register_converter(ConvertMetaContents)
1807 """Add colocated branch support."""1786
18081787
1809 def __init__(self, target_format):1788class ConvertMetaToColo(controldir.Converter):
1810 """Create a converter.that upgrades a metadir to the colo format.1789 """Convert a 'development-colo' bzrdir to a '2a' bzrdir and vice versa.
18111790 """
1812 :param target_format: The final metadir format that is desired.1791
1813 """1792 @classmethod
1814 self.target_format = target_format1793 def is_compatible(self, source_format, target_format):
18151794 if (isinstance(source_format, BzrDirMetaFormat1)
1816 def convert(self, to_convert, pb):1795 and isinstance(target_format, BzrDirMetaFormat1Colo)):
1817 """See Converter.convert()."""1796 return True
1818 to_convert.transport.put_bytes('branch-format',1797 if (isinstance(source_format, BzrDirMetaFormat1Colo)
1819 self.target_format.as_string())1798 and isinstance(target_format, BzrDirMetaFormat1)):
1820 return BzrDir.open_from_transport(to_convert.root_transport)1799 return True
18211800 return False
18221801
1823class ConvertMetaToColo(controldir.Converter):1802 def convert(self, to_convert, target_format, pb):
1824 """Convert a 'development-colo' bzrdir to a '2a' bzrdir."""1803 """See Converter.convert()."""
18251804 to_convert.transport.put_bytes('branch-format',
1826 def __init__(self, target_format):1805 target_format.as_string())
1827 """Create a converter that converts a 'development-colo' metadir1806 return BzrDir.open_from_transport(to_convert.root_transport)
1828 to a '2a' metadir.1807
18291808
1830 :param target_format: The final metadir format that is desired.1809controldir.Converter.register_converter(ConvertMetaToColo)
1831 """
1832 self.target_format = target_format
1833
1834 def convert(self, to_convert, pb):
1835 """See Converter.convert()."""
1836 to_convert.transport.put_bytes('branch-format',
1837 self.target_format.as_string())
1838 return BzrDir.open_from_transport(to_convert.root_transport)
18391810
18401811
1841class CreateRepository(controldir.RepositoryAcquisitionPolicy):1812class CreateRepository(controldir.RepositoryAcquisitionPolicy):
18421813
=== modified file 'breezy/bzr/remote.py'
--- breezy/bzr/remote.py 2019-01-01 23:40:59 +0000
+++ breezy/bzr/remote.py 2019-02-04 13:47:49 +0000
@@ -932,10 +932,6 @@
932 self._ensure_real()932 self._ensure_real()
933 return self._real_bzrdir.get_workingtree_transport(workingtree_format)933 return self._real_bzrdir.get_workingtree_transport(workingtree_format)
934934
935 def can_convert_format(self):
936 """Upgrading of remote bzrdirs is not supported yet."""
937 return False
938
939 def needs_format_conversion(self, format):935 def needs_format_conversion(self, format):
940 """Upgrading of remote bzrdirs is not supported yet."""936 """Upgrading of remote bzrdirs is not supported yet."""
941 return False937 return False
942938
=== modified file 'breezy/controldir.py'
--- breezy/controldir.py 2018-11-12 01:41:38 +0000
+++ breezy/controldir.py 2019-02-04 13:47:49 +0000
@@ -118,11 +118,6 @@
118 API users to check for magic attributes to see what features are supported.118 API users to check for magic attributes to see what features are supported.
119 """119 """
120120
121 def can_convert_format(self):
122 """Return true if this controldir is one whose format we can convert
123 from."""
124 return True
125
126 def list_branches(self):121 def list_branches(self):
127 """Return a sequence of all branches local to this control directory.122 """Return a sequence of all branches local to this control directory.
128123
@@ -990,18 +985,38 @@
990class Converter(object):985class Converter(object):
991 """Converts a disk format object from one format to another."""986 """Converts a disk format object from one format to another."""
992987
993 def convert(self, to_convert, pb):988 _converters = []
989
990 def convert(self, to_convert, target_format, pb):
994 """Perform the conversion of to_convert, giving feedback via pb.991 """Perform the conversion of to_convert, giving feedback via pb.
995992
996 :param to_convert: The disk object to convert.993 :param to_convert: The disk object to convert.
994 :param target_format: The target format
997 :param pb: a progress bar to use for progress information.995 :param pb: a progress bar to use for progress information.
998 """996 """
997 raise NotImplementedError(self.convert)
999998
1000 def step(self, message):999 def step(self, message):
1001 """Update the pb by a step."""1000 """Update the pb by a step."""
1002 self.count += 11001 self.count += 1
1003 self.pb.update(message, self.count, self.total)1002 self.pb.update(message, self.count, self.total)
10041003
1004 @classmethod
1005 def is_compatible(cls, source_format, target_format):
1006 raise NotImplementedError(cls.is_compatible)
1007
1008 @classmethod
1009 def register_converter(cls, converter):
1010 cls._converters.append(converter)
1011
1012 @classmethod
1013 def get_converter(cls, source_format, target_format):
1014 for converter in cls._converters:
1015 if converter.is_compatible(source_format, target_format):
1016 return converter()
1017 raise errors.BadConversionTarget(
1018 "no converter available", target_format, source_format)
1019
10051020
1006class ControlDirFormat(object):1021class ControlDirFormat(object):
1007 """An encapsulation of the initialization and open routines for a format.1022 """An encapsulation of the initialization and open routines for a format.
@@ -1070,7 +1085,9 @@
1070 :param format: Optional format to override the default format of the1085 :param format: Optional format to override the default format of the
1071 library.1086 library.
1072 """1087 """
1073 raise NotImplementedError(self.get_converter)1088 if format is None:
1089 format = ControlDirFormat.get_default_format()
1090 return Converter.get_converter(self, format)
10741091
1075 def is_supported(self):1092 def is_supported(self):
1076 """Is this format supported?1093 """Is this format supported?
10771094
=== modified file 'breezy/errors.py'
--- breezy/errors.py 2018-11-11 04:08:32 +0000
+++ breezy/errors.py 2019-02-04 13:47:49 +0000
@@ -922,11 +922,6 @@
922 self.lock_token = lock_token922 self.lock_token = lock_token
923923
924924
925class UpgradeReadonly(BzrError):
926
927 _fmt = "Upgrade URL cannot work with readonly URLs."
928
929
930class UpToDateFormat(BzrError):925class UpToDateFormat(BzrError):
931926
932 _fmt = "The branch format %(format)s is already at the most recent format."927 _fmt = "The branch format %(format)s is already at the most recent format."
933928
=== modified file 'breezy/git/dir.py'
--- breezy/git/dir.py 2018-11-16 11:37:47 +0000
+++ breezy/git/dir.py 2019-02-04 13:47:49 +0000
@@ -107,9 +107,6 @@
107 def is_supported(self):107 def is_supported(self):
108 return True108 return True
109109
110 def can_convert_format(self):
111 return False
112
113 def break_lock(self):110 def break_lock(self):
114 # There are no global locks, so nothing to break.111 # There are no global locks, so nothing to break.
115 raise NotImplementedError(self.break_lock)112 raise NotImplementedError(self.break_lock)
116113
=== modified file 'breezy/plugins/cvs/__init__.py'
--- breezy/plugins/cvs/__init__.py 2018-11-11 04:08:32 +0000
+++ breezy/plugins/cvs/__init__.py 2019-02-04 13:47:49 +0000
@@ -39,9 +39,6 @@
39class CVSDirFormat(controldir.ControlDirFormat):39class CVSDirFormat(controldir.ControlDirFormat):
40 """The CVS directory control format."""40 """The CVS directory control format."""
4141
42 def get_converter(self):
43 raise NotImplementedError(self.get_converter)
44
45 def get_format_description(self):42 def get_format_description(self):
46 return "CVS control directory."43 return "CVS control directory."
4744
4845
=== modified file 'breezy/plugins/darcs/__init__.py'
--- breezy/plugins/darcs/__init__.py 2018-11-11 04:08:32 +0000
+++ breezy/plugins/darcs/__init__.py 2019-02-04 13:47:49 +0000
@@ -37,9 +37,6 @@
37class DarcsDirFormat(controldir.ControlDirFormat):37class DarcsDirFormat(controldir.ControlDirFormat):
38 """Darcs directory format."""38 """Darcs directory format."""
3939
40 def get_converter(self):
41 raise NotImplementedError(self.get_converter)
42
43 def get_format_description(self):40 def get_format_description(self):
44 return "darcs control directory"41 return "darcs control directory"
4542
4643
=== modified file 'breezy/plugins/mtn/__init__.py'
--- breezy/plugins/mtn/__init__.py 2018-11-11 04:08:32 +0000
+++ breezy/plugins/mtn/__init__.py 2019-02-04 13:47:49 +0000
@@ -39,9 +39,6 @@
39class MonotoneDirFormat(controldir.ControlDirFormat):39class MonotoneDirFormat(controldir.ControlDirFormat):
40 """Monotone directory format."""40 """Monotone directory format."""
4141
42 def get_converter(self):
43 raise NotImplementedError(self.get_converter)
44
45 def get_format_description(self):42 def get_format_description(self):
46 return "Monotone control directory"43 return "Monotone control directory"
4744
4845
=== modified file 'breezy/plugins/weave_fmt/bzrdir.py'
--- breezy/plugins/weave_fmt/bzrdir.py 2018-11-11 04:08:32 +0000
+++ breezy/plugins/weave_fmt/bzrdir.py 2019-02-04 13:47:49 +0000
@@ -126,11 +126,6 @@
126 """See ControlDirFormat.get_format_description()."""126 """See ControlDirFormat.get_format_description()."""
127 return "All-in-one format 5"127 return "All-in-one format 5"
128128
129 def get_converter(self, format=None):
130 """See ControlDirFormat.get_converter()."""
131 # there is one and only one upgrade path here.
132 return ConvertBzrDir5To6()
133
134 def _initialize_for_clone(self, url):129 def _initialize_for_clone(self, url):
135 return self.initialize_on_transport(get_transport(url), _cloning=True)130 return self.initialize_on_transport(get_transport(url), _cloning=True)
136131
@@ -190,11 +185,6 @@
190 from .branch import BzrBranchFormat4185 from .branch import BzrBranchFormat4
191 return BzrBranchFormat4()186 return BzrBranchFormat4()
192187
193 def get_converter(self, format=None):
194 """See ControlDirFormat.get_converter()."""
195 # there is one and only one upgrade path here.
196 return ConvertBzrDir6ToMeta()
197
198 def _initialize_for_clone(self, url):188 def _initialize_for_clone(self, url):
199 return self.initialize_on_transport(get_transport(url), _cloning=True)189 return self.initialize_on_transport(get_transport(url), _cloning=True)
200190
@@ -236,7 +226,15 @@
236 self.text_count = 0226 self.text_count = 0
237 self.revisions = {}227 self.revisions = {}
238228
239 def convert(self, to_convert, pb):229 @classmethod
230 def is_compatible(cls, source_format, target_format):
231 if not isinstance(target_format, BzrDirFormat5):
232 return False
233 if not isinstance(source_format, BzrDirFormat4):
234 return False
235 return True
236
237 def convert(self, to_convert, target_format, pb):
240 """See Converter.convert()."""238 """See Converter.convert()."""
241 self.controldir = to_convert239 self.controldir = to_convert
242 if pb is not None:240 if pb is not None:
@@ -294,7 +292,7 @@
294 self._cleanup_spare_files_after_format4()292 self._cleanup_spare_files_after_format4()
295 self.branch._transport.put_bytes(293 self.branch._transport.put_bytes(
296 'branch-format',294 'branch-format',
297 BzrDirFormat5().get_format_string(),295 target_format.get_format_string(),
298 mode=self.controldir._get_file_mode())296 mode=self.controldir._get_file_mode())
299297
300 def _cleanup_spare_files_after_format4(self):298 def _cleanup_spare_files_after_format4(self):
@@ -504,7 +502,15 @@
504class ConvertBzrDir5To6(Converter):502class ConvertBzrDir5To6(Converter):
505 """Converts format 5 bzr dirs to format 6."""503 """Converts format 5 bzr dirs to format 6."""
506504
507 def convert(self, to_convert, pb):505 @classmethod
506 def is_compatible(cls, source_format, target_format):
507 if not isinstance(source_format, BzrDirFormat5):
508 return False
509 if not isinstance(source_format, BzrDirFormat6):
510 return False
511 return True
512
513 def convert(self, to_convert, target_format, pb):
508 """See Converter.convert()."""514 """See Converter.convert()."""
509 self.controldir = to_convert515 self.controldir = to_convert
510 with ui.ui_factory.nested_progress_bar() as pb:516 with ui.ui_factory.nested_progress_bar() as pb:
@@ -538,14 +544,22 @@
538 store_transport.move(filename, new_name)544 store_transport.move(filename, new_name)
539 self.controldir.transport.put_bytes(545 self.controldir.transport.put_bytes(
540 'branch-format',546 'branch-format',
541 BzrDirFormat6().get_format_string(),547 target_format.get_format_string(),
542 mode=self.controldir._get_file_mode())548 mode=self.controldir._get_file_mode())
543549
544550
545class ConvertBzrDir6ToMeta(Converter):551class ConvertBzrDir6ToMeta(Converter):
546 """Converts format 6 bzr dirs to metadirs."""552 """Converts format 6 bzr dirs to metadirs."""
547553
548 def convert(self, to_convert, pb):554 @classmethod
555 def is_compatible(cls, source_format, target_format):
556 if not isinstance(source_format, BzrDirFormat6):
557 return False
558 if not isinstance(target_format, BzrDirMetaFormat1):
559 return False
560 return True
561
562 def convert(self, to_convert, target_format, pb):
549 """See Converter.convert()."""563 """See Converter.convert()."""
550 from .repository import RepositoryFormat7564 from .repository import RepositoryFormat7
551 from ...bzr.fullhistory import BzrBranchFormat5565 from ...bzr.fullhistory import BzrBranchFormat5
@@ -634,7 +648,7 @@
634 'checkout/last-revision', last_revision)648 'checkout/last-revision', last_revision)
635 self.controldir.transport.put_bytes(649 self.controldir.transport.put_bytes(
636 'branch-format',650 'branch-format',
637 BzrDirMetaFormat1().get_format_string(),651 target_format.get_format_string(),
638 mode=self.file_mode)652 mode=self.file_mode)
639 self.pb.finished()653 self.pb.finished()
640 return ControlDir.open(self.controldir.user_url)654 return ControlDir.open(self.controldir.user_url)
@@ -692,11 +706,6 @@
692 """See ControlDirFormat.get_format_description()."""706 """See ControlDirFormat.get_format_description()."""
693 return "All-in-one format 4"707 return "All-in-one format 4"
694708
695 def get_converter(self, format=None):
696 """See ControlDirFormat.get_converter()."""
697 # there is one and only one upgrade path here.
698 return ConvertBzrDir4To5()
699
700 def initialize_on_transport(self, transport):709 def initialize_on_transport(self, transport):
701 """Format 4 branches cannot be created."""710 """Format 4 branches cannot be created."""
702 raise errors.UninitializableFormat(self)711 raise errors.UninitializableFormat(self)
@@ -1000,3 +1009,8 @@
1000 # bzrdir as a whole1009 # bzrdir as a whole
1001 from .workingtree import WorkingTreeFormat21010 from .workingtree import WorkingTreeFormat2
1002 return WorkingTreeFormat2().open(self, _found=True)1011 return WorkingTreeFormat2().open(self, _found=True)
1012
1013
1014Converter.register_converter(ConvertBzrDir4To5)
1015Converter.register_converter(ConvertBzrDir5To6)
1016Converter.register_converter(ConvertBzrDir6ToMeta)
10031017
=== modified file 'breezy/plugins/weave_fmt/test_bzrdir.py'
--- breezy/plugins/weave_fmt/test_bzrdir.py 2018-11-16 18:33:17 +0000
+++ breezy/plugins/weave_fmt/test_bzrdir.py 2019-02-04 13:47:49 +0000
@@ -73,11 +73,6 @@
73 dir = controldir.ControlDir.open(self.get_url())73 dir = controldir.ControlDir.open(self.get_url())
74 check_dir_components_use_same_lock(dir)74 check_dir_components_use_same_lock(dir)
7575
76 def test_can_convert(self):
77 # format 5 dirs are convertable
78 dir = BzrDirFormat5().initialize(self.get_url())
79 self.assertTrue(dir.can_convert_format())
80
81 def test_needs_conversion(self):76 def test_needs_conversion(self):
82 # format 5 dirs need a conversion if they are not the default,77 # format 5 dirs need a conversion if they are not the default,
83 # and they aren't78 # and they aren't
@@ -108,11 +103,6 @@
108 dir = controldir.ControlDir.open(self.get_url())103 dir = controldir.ControlDir.open(self.get_url())
109 check_dir_components_use_same_lock(dir)104 check_dir_components_use_same_lock(dir)
110105
111 def test_can_convert(self):
112 # format 6 dirs are convertable
113 dir = BzrDirFormat6().initialize(self.get_url())
114 self.assertTrue(dir.can_convert_format())
115
116 def test_needs_conversion(self):106 def test_needs_conversion(self):
117 # format 6 dirs need an conversion if they are not the default.107 # format 6 dirs need an conversion if they are not the default.
118 dir = BzrDirFormat6().initialize(self.get_url())108 dir = BzrDirFormat6().initialize(self.get_url())
119109
=== modified file 'breezy/tests/blackbox/test_upgrade.py'
--- breezy/tests/blackbox/test_upgrade.py 2018-11-11 04:08:32 +0000
+++ breezy/tests/blackbox/test_upgrade.py 2019-02-04 13:47:49 +0000
@@ -46,11 +46,15 @@
46class ConvertOldTestToMeta(controldir.Converter):46class ConvertOldTestToMeta(controldir.Converter):
47 """A trivial converter, used for testing."""47 """A trivial converter, used for testing."""
4848
49 def convert(self, to_convert, pb):49 @classmethod
50 def is_compatible(cls, source_format, target_format):
51 return True
52
53 def convert(self, to_convert, target_format, pb):
50 ui.ui_factory.note('starting upgrade from old test format to 2a')54 ui.ui_factory.note('starting upgrade from old test format to 2a')
51 to_convert.control_transport.put_bytes(55 to_convert.control_transport.put_bytes(
52 'branch-format',56 'branch-format',
53 bzrdir.BzrDirMetaFormat1().get_format_string(),57 target_format.get_format_string(),
54 mode=to_convert._get_file_mode())58 mode=to_convert._get_file_mode())
55 return controldir.ControlDir.open(to_convert.user_url)59 return controldir.ControlDir.open(to_convert.user_url)
5660
@@ -59,9 +63,6 @@
5963
60 _lock_class = lockable_files.TransportLock64 _lock_class = lockable_files.TransportLock
6165
62 def get_converter(self, format=None):
63 return ConvertOldTestToMeta()
64
65 @classmethod66 @classmethod
66 def get_format_string(cls):67 def get_format_string(cls):
67 return b"Ancient Test Format"68 return b"Ancient Test Format"
@@ -131,6 +132,7 @@
131132
132 def test_upgrade_control_dir(self):133 def test_upgrade_control_dir(self):
133 old_format = OldBzrDirFormat()134 old_format = OldBzrDirFormat()
135 self.overrideAttr(controldir.Converter, '_converters', [ConvertOldTestToMeta])
134 self.addCleanup(bzr.BzrProber.formats.remove,136 self.addCleanup(bzr.BzrProber.formats.remove,
135 old_format.get_format_string())137 old_format.get_format_string())
136 bzr.BzrProber.formats.register(old_format.get_format_string(),138 bzr.BzrProber.formats.register(old_format.get_format_string(),
137139
=== modified file 'breezy/tests/per_controldir/test_controldir.py'
--- breezy/tests/per_controldir/test_controldir.py 2018-11-11 04:08:32 +0000
+++ breezy/tests/per_controldir/test_controldir.py 2019-02-04 13:47:49 +0000
@@ -1580,12 +1580,11 @@
1580 def test_can_and_needs_format_conversion(self):1580 def test_can_and_needs_format_conversion(self):
1581 # check that we can ask an instance if its upgradable1581 # check that we can ask an instance if its upgradable
1582 dir = self.make_controldir('.')1582 dir = self.make_controldir('.')
1583 if dir.can_convert_format():1583 try:
1584 # if its default updatable there must be an updater
1585 # (we force the latest known format as downgrades may not be
1586 # available
1587 self.assertTrue(isinstance(dir._format.get_converter(1584 self.assertTrue(isinstance(dir._format.get_converter(
1588 format=dir._format), controldir.Converter))1585 format=dir._format), controldir.Converter))
1586 except errors.BadConversionTarget:
1587 pass # No converter available
1589 dir.needs_format_conversion(1588 dir.needs_format_conversion(
1590 controldir.ControlDirFormat.get_default_format())1589 controldir.ControlDirFormat.get_default_format())
15911590
@@ -1618,14 +1617,13 @@
1618 dir.create_repository()1617 dir.create_repository()
1619 dir.create_branch()1618 dir.create_branch()
1620 self.createWorkingTreeOrSkip(dir)1619 self.createWorkingTreeOrSkip(dir)
1621 if dir.can_convert_format():1620 try:
1622 # if its default updatable there must be an updater
1623 # (we force the latest known format as downgrades may not be
1624 # available
1625 with ui.ui_factory.nested_progress_bar() as pb:1621 with ui.ui_factory.nested_progress_bar() as pb:
1626 dir._format.get_converter(format=dir._format).convert(dir, pb)1622 dir._format.get_converter(format=dir._format).convert(dir, dir._format, pb)
1627 # and it should pass 'check' now.1623 # and it should pass 'check' now.
1628 check.check_dwim(self.get_url('.'), False, True, True)1624 check.check_dwim(self.get_url('.'), False, True, True)
1625 except errors.BadConversionTarget:
1626 pass # no converter available
16291627
1630 def test_format_description(self):1628 def test_format_description(self):
1631 dir = self.make_controldir('.')1629 dir = self.make_controldir('.')
16321630
=== modified file 'breezy/tests/test_bzrdir.py'
--- breezy/tests/test_bzrdir.py 2019-01-04 21:30:02 +0000
+++ breezy/tests/test_bzrdir.py 2019-02-04 13:47:49 +0000
@@ -1440,7 +1440,7 @@
1440 format = bzrdir.BzrDirMetaFormat1Colo()1440 format = bzrdir.BzrDirMetaFormat1Colo()
1441 self.assertTrue(tree.controldir.needs_format_conversion(format))1441 self.assertTrue(tree.controldir.needs_format_conversion(format))
1442 converter = tree.controldir._format.get_converter(format)1442 converter = tree.controldir._format.get_converter(format)
1443 result = converter.convert(tree.controldir, None)1443 result = converter.convert(tree.controldir, format, None)
1444 self.assertIsInstance(result._format, bzrdir.BzrDirMetaFormat1Colo)1444 self.assertIsInstance(result._format, bzrdir.BzrDirMetaFormat1Colo)
1445 self.assertFalse(result.needs_format_conversion(format))1445 self.assertFalse(result.needs_format_conversion(format))
14461446
@@ -1449,16 +1449,16 @@
1449 format = bzrdir.BzrDirMetaFormat1()1449 format = bzrdir.BzrDirMetaFormat1()
1450 self.assertTrue(tree.controldir.needs_format_conversion(format))1450 self.assertTrue(tree.controldir.needs_format_conversion(format))
1451 converter = tree.controldir._format.get_converter(format)1451 converter = tree.controldir._format.get_converter(format)
1452 result = converter.convert(tree.controldir, None)1452 result = converter.convert(tree.controldir, format, None)
1453 self.assertIsInstance(result._format, bzrdir.BzrDirMetaFormat1)1453 self.assertIsInstance(result._format, bzrdir.BzrDirMetaFormat1)
1454 self.assertFalse(result.needs_format_conversion(format))1454 self.assertFalse(result.needs_format_conversion(format))
14551455
1456 def test_downgrade_to_2a_too_many_branches(self):1456 def test_downgrade_to_2a_too_many_branches(self):
1457 tree = self.make_branch_and_tree('.', format='development-colo')1457 tree = self.make_branch_and_tree('.', format='development-colo')
1458 tree.controldir.create_branch(name="another-colocated-branch")1458 tree.controldir.create_branch(name="another-colocated-branch")
1459 converter = tree.controldir._format.get_converter(1459 target_format = bzrdir.BzrDirMetaFormat1()
1460 bzrdir.BzrDirMetaFormat1())1460 converter = tree.controldir._format.get_converter(target_format)
1461 result = converter.convert(tree.controldir, bzrdir.BzrDirMetaFormat1())1461 result = converter.convert(tree.controldir, target_format, None)
1462 self.assertIsInstance(result._format, bzrdir.BzrDirMetaFormat1)1462 self.assertIsInstance(result._format, bzrdir.BzrDirMetaFormat1)
14631463
1464 def test_nested(self):1464 def test_nested(self):
14651465
=== modified file 'breezy/tests/test_upgrade.py'
--- breezy/tests/test_upgrade.py 2018-11-12 01:41:38 +0000
+++ breezy/tests/test_upgrade.py 2019-02-04 13:47:49 +0000
@@ -51,7 +51,7 @@
51 target = controldir.format_registry.make_controldir(51 target = controldir.format_registry.make_controldir(
52 'dirstate-with-subtree')52 'dirstate-with-subtree')
53 converter = b.controldir._format.get_converter(target)53 converter = b.controldir._format.get_converter(target)
54 converter.convert(b.controldir, None)54 converter.convert(b.controldir, target, None)
55 new_branch = branch.Branch.open(self.get_url('branch'))55 new_branch = branch.Branch.open(self.get_url('branch'))
56 self.assertIs(new_branch.__class__, bzrbranch.BzrBranch6)56 self.assertIs(new_branch.__class__, bzrbranch.BzrBranch6)
57 self.assertEqual(b'CD', new_branch.last_revision())57 self.assertEqual(b'CD', new_branch.last_revision())
@@ -62,7 +62,7 @@
6262
63 b2 = self.make_branch('branch2', format='knit')63 b2 = self.make_branch('branch2', format='knit')
64 converter = b2.controldir._format.get_converter(target)64 converter = b2.controldir._format.get_converter(target)
65 converter.convert(b2.controldir, None)65 converter.convert(b2.controldir, target, None)
66 b2 = branch.Branch.open(self.get_url('branch'))66 b2 = branch.Branch.open(self.get_url('branch'))
67 self.assertIs(b2.__class__, bzrbranch.BzrBranch6)67 self.assertIs(b2.__class__, bzrbranch.BzrBranch6)
6868
@@ -71,7 +71,7 @@
71 target = controldir.format_registry.make_controldir('1.9')71 target = controldir.format_registry.make_controldir('1.9')
72 target.set_branch_format(bzrbranch.BzrBranchFormat8())72 target.set_branch_format(bzrbranch.BzrBranchFormat8())
73 converter = b.controldir._format.get_converter(target)73 converter = b.controldir._format.get_converter(target)
74 converter.convert(b.controldir, None)74 converter.convert(b.controldir, target, None)
75 b = branch.Branch.open(self.get_url('branch'))75 b = branch.Branch.open(self.get_url('branch'))
76 self.assertIs(b.__class__, bzrbranch.BzrBranch8)76 self.assertIs(b.__class__, bzrbranch.BzrBranch8)
77 self.assertEqual({}, b._get_all_reference_info())77 self.assertEqual({}, b._get_all_reference_info())
@@ -81,7 +81,7 @@
81 tree = self.make_branch_and_tree('tree', format='knit')81 tree = self.make_branch_and_tree('tree', format='knit')
82 target = controldir.format_registry.make_controldir('dirstate')82 target = controldir.format_registry.make_controldir('dirstate')
83 converter = tree.controldir._format.get_converter(target)83 converter = tree.controldir._format.get_converter(target)
84 converter.convert(tree.controldir, None)84 converter.convert(tree.controldir, target, None)
85 new_tree = workingtree.WorkingTree.open('tree')85 new_tree = workingtree.WorkingTree.open('tree')
86 self.assertIs(new_tree.__class__, workingtree_4.WorkingTree4)86 self.assertIs(new_tree.__class__, workingtree_4.WorkingTree4)
87 self.assertEqual(b'null:', new_tree.last_revision())87 self.assertEqual(b'null:', new_tree.last_revision())
@@ -94,7 +94,7 @@
94 tree.add(['file'], [b'file-id'])94 tree.add(['file'], [b'file-id'])
95 target = controldir.format_registry.make_controldir('dirstate')95 target = controldir.format_registry.make_controldir('dirstate')
96 converter = tree.controldir._format.get_converter(target)96 converter = tree.controldir._format.get_converter(target)
97 converter.convert(tree.controldir, None)97 converter.convert(tree.controldir, target, None)
98 new_tree = workingtree.WorkingTree.open('tree')98 new_tree = workingtree.WorkingTree.open('tree')
99 self.assertIs(new_tree.__class__, workingtree_4.WorkingTree4)99 self.assertIs(new_tree.__class__, workingtree_4.WorkingTree4)
100 self.assertEqual(b'null:', new_tree.last_revision())100 self.assertEqual(b'null:', new_tree.last_revision())
@@ -105,7 +105,7 @@
105 rev_id = tree.commit('first post')105 rev_id = tree.commit('first post')
106 target = controldir.format_registry.make_controldir('dirstate')106 target = controldir.format_registry.make_controldir('dirstate')
107 converter = tree.controldir._format.get_converter(target)107 converter = tree.controldir._format.get_converter(target)
108 converter.convert(tree.controldir, None)108 converter.convert(tree.controldir, target, None)
109 new_tree = workingtree.WorkingTree.open('tree')109 new_tree = workingtree.WorkingTree.open('tree')
110 self.assertIs(new_tree.__class__, workingtree_4.WorkingTree4)110 self.assertIs(new_tree.__class__, workingtree_4.WorkingTree4)
111 self.assertEqual(rev_id, new_tree.last_revision())111 self.assertEqual(rev_id, new_tree.last_revision())
@@ -122,7 +122,7 @@
122 tree.merge_from_branch(merge_tree.branch)122 tree.merge_from_branch(merge_tree.branch)
123 target = controldir.format_registry.make_controldir('dirstate')123 target = controldir.format_registry.make_controldir('dirstate')
124 converter = tree.controldir._format.get_converter(target)124 converter = tree.controldir._format.get_converter(target)
125 converter.convert(tree.controldir, None)125 converter.convert(tree.controldir, target, None)
126 new_tree = workingtree.WorkingTree.open('tree')126 new_tree = workingtree.WorkingTree.open('tree')
127 self.assertIs(new_tree.__class__, workingtree_4.WorkingTree4)127 self.assertIs(new_tree.__class__, workingtree_4.WorkingTree4)
128 self.assertEqual(rev_id2, new_tree.last_revision())128 self.assertEqual(rev_id2, new_tree.last_revision())
129129
=== modified file 'breezy/upgrade.py'
--- breezy/upgrade.py 2018-11-11 04:08:32 +0000
+++ breezy/upgrade.py 2019-02-04 13:47:49 +0000
@@ -32,6 +32,11 @@
32from .bzr.remote import RemoteBzrDir32from .bzr.remote import RemoteBzrDir
3333
3434
35class UpgradeReadonly(errors.BzrError):
36
37 _fmt = "Upgrade URL cannot work with readonly URLs."
38
39
35class Convert(object):40class Convert(object):
3641
37 def __init__(self, url=None, format=None, control_dir=None):42 def __init__(self, url=None, format=None, control_dir=None):
@@ -60,7 +65,7 @@
60 self.controldir._ensure_real()65 self.controldir._ensure_real()
61 self.controldir = self.controldir._real_bzrdir66 self.controldir = self.controldir._real_bzrdir
62 if self.controldir.root_transport.is_readonly():67 if self.controldir.root_transport.is_readonly():
63 raise errors.UpgradeReadonly68 raise UpgradeReadonly
64 self.transport = self.controldir.root_transport69 self.transport = self.controldir.root_transport
65 ui.ui_factory.suppressed_warnings.add(warning_id)70 ui.ui_factory.suppressed_warnings.add(warning_id)
66 try:71 try:
@@ -96,9 +101,6 @@
96 format = self.format101 format = self.format
97 if not self.controldir.needs_format_conversion(format):102 if not self.controldir.needs_format_conversion(format):
98 raise errors.UpToDateFormat(self.controldir._format)103 raise errors.UpToDateFormat(self.controldir._format)
99 if not self.controldir.can_convert_format():
100 raise errors.BzrError(gettext("cannot upgrade from bzrdir format %s") %
101 self.controldir._format)
102 self.controldir.check_conversion_target(format)104 self.controldir.check_conversion_target(format)
103 ui.ui_factory.note(gettext('starting upgrade of %s') %105 ui.ui_factory.note(gettext('starting upgrade of %s') %
104 urlutils.unescape_for_display(self.transport.base, 'utf-8'))106 urlutils.unescape_for_display(self.transport.base, 'utf-8'))
@@ -106,7 +108,7 @@
106 self.backup_oldpath, self.backup_newpath = self.controldir.backup_bzrdir()108 self.backup_oldpath, self.backup_newpath = self.controldir.backup_bzrdir()
107 while self.controldir.needs_format_conversion(format):109 while self.controldir.needs_format_conversion(format):
108 converter = self.controldir._format.get_converter(format)110 converter = self.controldir._format.get_converter(format)
109 self.controldir = converter.convert(self.controldir, None)111 self.controldir = converter.convert(self.controldir, format, None)
110 ui.ui_factory.note(gettext('finished'))112 ui.ui_factory.note(gettext('finished'))
111113
112 def clean_up(self):114 def clean_up(self):
113115
=== modified file 'tools/prepare_for_latex.py'
--- tools/prepare_for_latex.py 2018-11-17 16:19:11 +0000
+++ tools/prepare_for_latex.py 2019-02-04 13:47:49 +0000
@@ -41,6 +41,7 @@
41DIRECTIVE_ELEMENT_PATTERN = re.compile(u'^\\s+:[^:]+:\\s+')41DIRECTIVE_ELEMENT_PATTERN = re.compile(u'^\\s+:[^:]+:\\s+')
4242
43class Converter(object):43class Converter(object):
44
44 def __init__(self, srcdir, destdir):45 def __init__(self, srcdir, destdir):
45 self.srcdir = srcdir46 self.srcdir = srcdir
46 self.destdir = destdir47 self.destdir = destdir

Subscribers

People subscribed via source and target branches