Rev 6208: (jelmer) Support upgrading between the 2a and development-colo formats. in file:///srv/pqm.bazaar-vcs.org/archives/thelove/bzr/%2Btrunk/

Patch Queue Manager pqm at pqm.ubuntu.com
Wed Oct 12 13:06:10 UTC 2011


At file:///srv/pqm.bazaar-vcs.org/archives/thelove/bzr/%2Btrunk/

------------------------------------------------------------
revno: 6208 [merge]
revision-id: pqm at pqm.ubuntu.com-20111012130609-iqfvfq1pghcs1zz2
parent: pqm at pqm.ubuntu.com-20111010172112-zj6ufki2aonpr4ut
parent: jelmer at samba.org-20111011201809-apxml9aoaakkie53
committer: Patch Queue Manager <pqm at pqm.ubuntu.com>
branch nick: +trunk
timestamp: Wed 2011-10-12 13:06:09 +0000
message:
  (jelmer) Support upgrading between the 2a and development-colo formats.
   (Jelmer Vernooij)
modified:
  bzrlib/bzrdir.py               bzrdir.py-20060131065624-156dfea39c4387cb
  bzrlib/tests/test_bzrdir.py    test_bzrdir.py-20060131065654-deba40eef51cf220
=== modified file 'bzrlib/bzrdir.py'
--- a/bzrlib/bzrdir.py	2011-10-05 14:12:34 +0000
+++ b/bzrlib/bzrdir.py	2011-10-11 20:18:09 +0000
@@ -1269,7 +1269,8 @@
 
     def needs_format_conversion(self, format):
         """See BzrDir.needs_format_conversion()."""
-        if not isinstance(self._format, format.__class__):
+        if (not isinstance(self._format, format.__class__) or
+            self._format.get_format_string() != format.get_format_string()):
             # it is not a meta dir format, conversion is needed.
             return True
         # we might want to push this down to the repository?
@@ -1871,6 +1872,12 @@
         """See BzrDirFormat.get_converter()."""
         if format is None:
             format = BzrDirFormat.get_default_format()
+        if (type(self) is BzrDirMetaFormat1 and
+            type(format) is BzrDirMetaFormat1Colo):
+            return ConvertMetaToColo(format)
+        if (type(self) is BzrDirMetaFormat1Colo and
+            type(format) is BzrDirMetaFormat1):
+            return ConvertMetaRemoveColo(format)
         if not isinstance(self, format.__class__):
             # converting away from metadir is not implemented
             raise NotImplementedError(self.get_converter)
@@ -2056,6 +2063,49 @@
         return to_convert
 
 
+class ConvertMetaToColo(controldir.Converter):
+    """Add colocated branch support."""
+
+    def __init__(self, target_format):
+        """Create a converter.that upgrades a metadir to the colo format.
+
+        :param target_format: The final metadir format that is desired.
+        """
+        self.target_format = target_format
+
+    def convert(self, to_convert, pb):
+        """See Converter.convert()."""
+        to_convert.transport.put_bytes('branch-format',
+            self.target_format.get_format_string())
+        return BzrDir.open_from_transport(to_convert.root_transport)
+
+
+class ConvertMetaRemoveColo(controldir.Converter):
+    """Remove colocated branch support from a bzrdir."""
+
+    def __init__(self, target_format):
+        """Create a converter.that downgrades a colocated branch metadir
+        to a regular metadir.
+
+        :param target_format: The final metadir format that is desired.
+        """
+        self.target_format = target_format
+
+    def convert(self, to_convert, pb):
+        """See Converter.convert()."""
+        to_convert.control_files.lock_write()
+        try:
+            branches = to_convert.list_branches()
+            if len(branches) > 1:
+                raise errors.BzrError("remove all but a single "
+                    "colocated branch when downgrading")
+        finally:
+            to_convert.control_files.unlock()
+        to_convert.transport.put_bytes('branch-format',
+            self.target_format.get_format_string())
+        return BzrDir.open_from_transport(to_convert.root_transport)
+
+
 controldir.ControlDirFormat.register_server_prober(RemoteBzrProber)
 
 

=== modified file 'bzrlib/tests/test_bzrdir.py'
--- a/bzrlib/tests/test_bzrdir.py	2011-10-05 14:12:34 +0000
+++ b/bzrlib/tests/test_bzrdir.py	2011-10-11 20:18:09 +0000
@@ -1404,3 +1404,29 @@
     def test_supports_colo(self):
         format = bzrdir.BzrDirMetaFormat1Colo()
         self.assertTrue(format.colocated_branches)
+
+    def test_upgrade_from_2a(self):
+        tree = self.make_branch_and_tree('.', format='2a')
+        format = bzrdir.BzrDirMetaFormat1Colo()
+        self.assertTrue(tree.bzrdir.needs_format_conversion(format))
+        converter = tree.bzrdir._format.get_converter(format)
+        result = converter.convert(tree.bzrdir, None)
+        self.assertIsInstance(result._format, bzrdir.BzrDirMetaFormat1Colo)
+        self.assertFalse(result.needs_format_conversion(format))
+
+    def test_downgrade_to_2a(self):
+        tree = self.make_branch_and_tree('.', format='development-colo')
+        format = bzrdir.BzrDirMetaFormat1()
+        self.assertTrue(tree.bzrdir.needs_format_conversion(format))
+        converter = tree.bzrdir._format.get_converter(format)
+        result = converter.convert(tree.bzrdir, None)
+        self.assertIsInstance(result._format, bzrdir.BzrDirMetaFormat1)
+        self.assertFalse(result.needs_format_conversion(format))
+
+    def test_downgrade_to_2a_too_many_branches(self):
+        tree = self.make_branch_and_tree('.', format='development-colo')
+        tree.bzrdir.create_branch(name="another-colocated-branch")
+        converter = tree.bzrdir._format.get_converter(
+            bzrdir.BzrDirMetaFormat1())
+        self.assertRaises(errors.BzrError, converter.convert, tree.bzrdir,
+            None)




More information about the bazaar-commits mailing list