Rev 5682: (jelmer) Add WorkingTreeFormatRegistry. (Jelmer Vernooij) in file:///home/pqm/archives/thelove/bzr/%2Btrunk/

Canonical.com Patch Queue Manager pqm at pqm.ubuntu.com
Wed Feb 23 16:36:05 UTC 2011


At file:///home/pqm/archives/thelove/bzr/%2Btrunk/

------------------------------------------------------------
revno: 5682 [merge]
revision-id: pqm at pqm.ubuntu.com-20110223163601-v9ii6owx2k3vx213
parent: pqm at pqm.ubuntu.com-20110223154326-clehiyp17ffzo5o9
parent: jelmer at samba.org-20110223135441-2unt0pw56lb0k7h9
committer: Canonical.com Patch Queue Manager <pqm at pqm.ubuntu.com>
branch nick: +trunk
timestamp: Wed 2011-02-23 16:36:01 +0000
message:
  (jelmer) Add WorkingTreeFormatRegistry. (Jelmer Vernooij)
modified:
  bzrlib/bzrdir.py               bzrdir.py-20060131065624-156dfea39c4387cb
  bzrlib/tests/per_tree/__init__.py __init__.py-20060717075546-420s7b0bj9hzeowi-2
  bzrlib/tests/per_workingtree/__init__.py __init__.py-20060203003124-b2aa5aca21a8bfad
  bzrlib/tests/test_inv.py       testinv.py-20050722220913-1dc326138d1a5892
  bzrlib/tests/test_selftest.py  test_selftest.py-20051202044319-c110a115d8c0456a
  bzrlib/tests/test_workingtree.py testworkingtree.py-20051004024258-b88d0fe8f101d468
  bzrlib/workingtree.py          workingtree.py-20050511021032-29b6ec0a681e02e3
  doc/en/release-notes/bzr-2.4.txt bzr2.4.txt-20110114053217-k7ym9jfz243fddjm-1
=== modified file 'bzrlib/bzrdir.py'
--- a/bzrlib/bzrdir.py	2011-02-23 15:43:26 +0000
+++ b/bzrlib/bzrdir.py	2011-02-23 16:36:01 +0000
@@ -2125,8 +2125,10 @@
 
     def __get_workingtree_format(self):
         if self._workingtree_format is None:
-            from bzrlib.workingtree import WorkingTreeFormat
-            self._workingtree_format = WorkingTreeFormat.get_default_format()
+            from bzrlib.workingtree import (
+                format_registry as wt_format_registry,
+                )
+            self._workingtree_format = wt_format_registry.get_default()
         return self._workingtree_format
 
     def __set_workingtree_format(self, wt_format):

=== modified file 'bzrlib/tests/per_tree/__init__.py'
--- a/bzrlib/tests/per_tree/__init__.py	2011-02-04 18:12:44 +0000
+++ b/bzrlib/tests/per_tree/__init__.py	2011-02-19 15:36:42 +0000
@@ -38,7 +38,7 @@
 from bzrlib.revisiontree import RevisionTree
 from bzrlib.transform import TransformPreview
 from bzrlib.workingtree import (
-    WorkingTreeFormat,
+    format_registry,
     )
 from bzrlib.workingtree_4 import (
     DirStateRevisionTree,
@@ -332,7 +332,7 @@
         # for working tree format tests, preserve the tree
         scenario[1]["_workingtree_to_test_tree"] = return_parameter
     # add RevisionTree scenario
-    workingtree_format = WorkingTreeFormat._default_format
+    workingtree_format = format_registry.get_default()
     scenarios.append((RevisionTree.__name__,
         create_tree_scenario(transport_server, transport_readonly_server,
         workingtree_format, revision_tree_from_workingtree,)))
@@ -397,6 +397,6 @@
         # None here will cause a readonly decorator to be created
         # by the TestCaseWithTransport.get_readonly_transport method.
         None,
-        WorkingTreeFormat.get_formats())
+        format_registry._get_all())
     # add the tests for the sub modules
     return tests.multiply_tests(submod_tests, scenarios, standard_tests)

=== modified file 'bzrlib/tests/per_workingtree/__init__.py'
--- a/bzrlib/tests/per_workingtree/__init__.py	2011-02-04 18:12:44 +0000
+++ b/bzrlib/tests/per_workingtree/__init__.py	2011-02-19 15:36:42 +0000
@@ -120,7 +120,7 @@
         # None here will cause a readonly decorator to be created
         # by the TestCaseWithTransport.get_readonly_transport method.
         None,
-        workingtree.WorkingTreeFormat.get_formats()
+        workingtree.format_registry._get_all()
         )
 
     # add the tests for the sub modules

=== modified file 'bzrlib/tests/test_inv.py'
--- a/bzrlib/tests/test_inv.py	2011-02-04 18:12:44 +0000
+++ b/bzrlib/tests/test_inv.py	2011-02-19 15:36:42 +0000
@@ -24,6 +24,7 @@
     repository,
     revision,
     tests,
+    workingtree,
     )
 from bzrlib.inventory import (
     CHKInventory,
@@ -39,7 +40,6 @@
     TestCaseWithTransport,
     )
 from bzrlib.tests.scenarios import load_tests_apply_scenarios
-from bzrlib.workingtree import WorkingTreeFormat
 
 
 load_tests = load_tests_apply_scenarios
@@ -59,7 +59,7 @@
         scenarios.append((str(format.__name__), {
             'apply_delta':apply_inventory_Repository_add_inventory_by_delta,
             'format':format}))
-    for format in WorkingTreeFormat.get_formats():
+    for format in workingtree.format_registry._get_all():
         scenarios.append(
             (str(format.__class__.__name__) + ".update_basis_by_delta", {
             'apply_delta':apply_inventory_WT_basis,

=== modified file 'bzrlib/tests/test_selftest.py'
--- a/bzrlib/tests/test_selftest.py	2011-02-18 21:52:42 +0000
+++ b/bzrlib/tests/test_selftest.py	2011-02-23 16:36:01 +0000
@@ -379,7 +379,7 @@
                    workingtree.WorkingTreeFormat3(),]
         scenarios = make_scenarios(server1, server2, formats)
         self.assertEqual(7, len(scenarios))
-        default_wt_format = workingtree.WorkingTreeFormat4._default_format
+        default_wt_format = workingtree.format_registry.get_default()
         wt4_format = workingtree.WorkingTreeFormat4()
         wt5_format = workingtree.WorkingTreeFormat5()
         expected_scenarios = [

=== modified file 'bzrlib/tests/test_workingtree.py'
--- a/bzrlib/tests/test_workingtree.py	2011-02-04 18:18:19 +0000
+++ b/bzrlib/tests/test_workingtree.py	2011-02-19 16:51:30 +0000
@@ -21,6 +21,7 @@
     bzrdir,
     conflicts,
     errors,
+    symbol_versioning,
     transport,
     workingtree,
     )
@@ -62,10 +63,10 @@
 class TestDefaultFormat(TestCaseWithTransport):
 
     def test_get_set_default_format(self):
-        old_format = workingtree.WorkingTreeFormat.get_default_format()
+        old_format = workingtree.format_registry.get_default()
         # default is 3
         self.assertTrue(isinstance(old_format, workingtree.WorkingTreeFormat3))
-        workingtree.WorkingTreeFormat.set_default_format(SampleTreeFormat())
+        workingtree.format_registry.set_default(SampleTreeFormat())
         try:
             # the default branch format is used by the meta dir format
             # which is not the default bzrdir format at this point
@@ -75,8 +76,8 @@
             result = dir.create_workingtree()
             self.assertEqual(result, 'A tree')
         finally:
-            workingtree.WorkingTreeFormat.set_default_format(old_format)
-        self.assertEqual(old_format, workingtree.WorkingTreeFormat.get_default_format())
+            workingtree.format_registry.set_default(old_format)
+        self.assertEqual(old_format, workingtree.format_registry.get_default())
 
     def test_open(self):
         tree = self.make_branch_and_tree('.')
@@ -184,22 +185,55 @@
         # make a branch
         format.initialize(dir)
         # register a format for it.
-        workingtree.WorkingTreeFormat.register_format(format)
-        self.assertTrue(format in workingtree.WorkingTreeFormat.get_formats())
+        self.applyDeprecated(symbol_versioning.deprecated_in((2, 4, 0)),
+            workingtree.WorkingTreeFormat.register_format, format)
+        self.assertTrue(format in 
+            self.applyDeprecated(symbol_versioning.deprecated_in((2, 4, 0)),
+                workingtree.WorkingTreeFormat.get_formats))
         # which branch.Open will refuse (not supported)
         self.assertRaises(errors.UnsupportedFormatError, workingtree.WorkingTree.open, '.')
         # but open_downlevel will work
         self.assertEqual(format.open(dir), workingtree.WorkingTree.open_downlevel('.'))
         # unregister the format
-        workingtree.WorkingTreeFormat.unregister_format(format)
-        self.assertFalse(format in workingtree.WorkingTreeFormat.get_formats())
-
-    def test_register_unregister_extra_format(self):
+        self.applyDeprecated(symbol_versioning.deprecated_in((2, 4, 0)),
+            workingtree.WorkingTreeFormat.unregister_format, format)
+        self.assertFalse(format in
+            self.applyDeprecated(symbol_versioning.deprecated_in((2, 4, 0)),
+                workingtree.WorkingTreeFormat.get_formats))
+
+
+class TestWorkingTreeFormatRegistry(TestCase):
+
+    def setUp(self):
+        super(TestWorkingTreeFormatRegistry, self).setUp()
+        self.registry = workingtree.WorkingTreeFormatRegistry()
+
+    def test_register_unregister_format(self):
+        format = SampleTreeFormat()
+        self.registry.register(format)
+        self.assertEquals(format, self.registry.get("Sample tree format."))
+        self.registry.remove(format)
+        self.assertRaises(KeyError, self.registry.get, "Sample tree format.")
+
+    def test_get_all(self):
+        format = SampleTreeFormat()
+        self.assertEquals([], self.registry._get_all())
+        self.registry.register(format)
+        self.assertEquals([format], self.registry._get_all())
+
+    def test_register_extra(self):
         format = SampleExtraTreeFormat()
-        workingtree.WorkingTreeFormat.register_extra_format(format)
-        self.assertTrue(format in workingtree.WorkingTreeFormat.get_formats())
-        workingtree.WorkingTreeFormat.unregister_extra_format(format)
-        self.assertFalse(format in workingtree.WorkingTreeFormat.get_formats())
+        self.assertEquals([], self.registry._get_all())
+        self.registry.register_extra(format)
+        self.assertEquals([format], self.registry._get_all())
+
+    def test_register_extra_lazy(self):
+        self.assertEquals([], self.registry._get_all())
+        self.registry.register_extra_lazy("bzrlib.tests.test_workingtree",
+            "SampleExtraTreeFormat")
+        formats = self.registry._get_all()
+        self.assertEquals(1, len(formats))
+        self.assertIsInstance(formats[0], SampleExtraTreeFormat)
 
 
 class TestWorkingTreeFormat3(TestCaseWithTransport):

=== modified file 'bzrlib/workingtree.py'
--- a/bzrlib/workingtree.py	2011-02-11 17:58:56 +0000
+++ b/bzrlib/workingtree.py	2011-02-23 12:55:32 +0000
@@ -58,6 +58,7 @@
     ignores,
     inventory,
     merge,
+    registry,
     revision as _mod_revision,
     revisiontree,
     trace,
@@ -2858,6 +2859,67 @@
             return path[:-len(suffix)]
 
 
+class WorkingTreeFormatRegistry(registry.FormatRegistry):
+    """Registry for working tree formats."""
+
+    def __init__(self, other_registry=None):
+        super(WorkingTreeFormatRegistry, self).__init__(other_registry)
+        self._extra_formats = []
+        self._default_format = None
+
+    def register(self, format):
+        """Register a new repository format."""
+        super(WorkingTreeFormatRegistry, self).register(
+            format.get_format_string(), format)
+
+    def remove(self, format):
+        """Remove a registered repository format."""
+        super(WorkingTreeFormatRegistry, self).remove(format.get_format_string())
+
+    def register_extra(self, format):
+        """Register a repository format that can not be used in a metadir.
+
+        This is mainly useful to allow custom repository formats, such as older
+        Bazaar formats and foreign formats, to be tested.
+        """
+        self._extra_formats.append(registry._ObjectGetter(format))
+
+    def remove_extra(self, format):
+        """Remove an extra repository format.
+        """
+        self._extra_formats.remove(registry._ObjectGetter(format))
+
+    def register_extra_lazy(self, module_name, member_name):
+        """Register a repository format lazily.
+        """
+        self._extra_formats.append(
+            registry._LazyObjectGetter(module_name, member_name))
+
+    def get_default(self):
+        """Return the current default format."""
+        return self._default_format
+
+    def set_default(self, format):
+        self._default_format = format
+
+    def _get_extra(self):
+        result = []
+        for getter in self._extra_formats:
+            f = getter.get_obj()
+            if callable(f):
+                f = f()
+            result.append(f)
+        return result
+
+    def _get_all(self):
+        """Return all repository formats, even those not usable in metadirs.
+        """
+        return [self.get(k) for k in self.keys()] + self._get_extra()
+
+
+format_registry = WorkingTreeFormatRegistry()
+
+
 class WorkingTreeFormat(object):
     """An encapsulation of the initialization and open routines for a format.
 
@@ -2876,15 +2938,6 @@
     object will be created every time regardless.
     """
 
-    _default_format = None
-    """The default format used for new trees."""
-
-    _formats = {}
-    """The known formats."""
-
-    _extra_formats = []
-    """Extra formats that can not be used in a metadir."""
-
     requires_rich_root = False
 
     upgrade_recommended = False
@@ -2902,7 +2955,7 @@
         try:
             transport = a_bzrdir.get_workingtree_transport(None)
             format_string = transport.get_bytes("format")
-            return klass._formats[format_string]
+            return format_registry.get(format_string)
         except errors.NoSuchFile:
             raise errors.NoWorkingTree(base=transport.base)
         except KeyError:
@@ -2916,9 +2969,11 @@
         return not (self == other)
 
     @classmethod
+    @symbol_versioning.deprecated_method(
+        symbol_versioning.deprecated_in((2, 4, 0)))
     def get_default_format(klass):
         """Return the current default format."""
-        return klass._default_format
+        return format_registry.get_default()
 
     def get_format_string(self):
         """Return the ASCII format string that identifies this format."""
@@ -2946,28 +3001,40 @@
         return False
 
     @classmethod
+    @symbol_versioning.deprecated_method(
+        symbol_versioning.deprecated_in((2, 4, 0)))
     def register_format(klass, format):
-        klass._formats[format.get_format_string()] = format
+        format_registry.register(format)
 
     @classmethod
+    @symbol_versioning.deprecated_method(
+        symbol_versioning.deprecated_in((2, 4, 0)))
     def register_extra_format(klass, format):
-        klass._extra_formats.append(format)
+        format_registry.register_extra(format)
 
     @classmethod
+    @symbol_versioning.deprecated_method(
+        symbol_versioning.deprecated_in((2, 4, 0)))
     def unregister_extra_format(klass, format):
-        klass._extra_formats.remove(format)
+        format_registry.unregister_extra(format)
 
     @classmethod
+    @symbol_versioning.deprecated_method(
+        symbol_versioning.deprecated_in((2, 4, 0)))
     def get_formats(klass):
-        return klass._formats.values() + klass._extra_formats
+        return format_registry._get_all()
 
     @classmethod
+    @symbol_versioning.deprecated_method(
+        symbol_versioning.deprecated_in((2, 4, 0)))
     def set_default_format(klass, format):
-        klass._default_format = format
+        format_registry.set_default(format)
 
     @classmethod
+    @symbol_versioning.deprecated_method(
+        symbol_versioning.deprecated_in((2, 4, 0)))
     def unregister_format(klass, format):
-        del klass._formats[format.get_format_string()]
+        format_registry.remove(format)
 
 
 class WorkingTreeFormat2(WorkingTreeFormat):
@@ -3194,12 +3261,15 @@
 
 
 __default_format = WorkingTreeFormat6()
-WorkingTreeFormat.register_format(__default_format)
-WorkingTreeFormat.register_format(WorkingTreeFormat5())
-WorkingTreeFormat.register_format(WorkingTreeFormat4())
-WorkingTreeFormat.register_format(WorkingTreeFormat3())
-WorkingTreeFormat.set_default_format(__default_format)
+format_registry.register_lazy("Bazaar Working Tree Format 4 (bzr 0.15)\n",
+    "bzrlib.workingtree_4", "WorkingTreeFormat4")
+format_registry.register_lazy("Bazaar Working Tree Format 5 (bzr 1.11)\n",
+    "bzrlib.workingtree_4", "WorkingTreeFormat5")
+format_registry.register_lazy("Bazaar Working Tree Format 6 (bzr 1.14)\n",
+    "bzrlib.workingtree_4", "WorkingTreeFormat6")
+format_registry.register(WorkingTreeFormat3())
+format_registry.set_default(__default_format)
 # Register extra formats which have no format string are not discoverable
 # and not independently creatable. They are implicitly created as part of
 # e.g. older Bazaar formats or foreign formats.
-WorkingTreeFormat.register_extra_format(WorkingTreeFormat2())
+format_registry.register_extra(WorkingTreeFormat2())

=== modified file 'doc/en/release-notes/bzr-2.4.txt'
--- a/doc/en/release-notes/bzr-2.4.txt	2011-02-23 15:43:26 +0000
+++ b/doc/en/release-notes/bzr-2.4.txt	2011-02-23 16:36:01 +0000
@@ -148,6 +148,10 @@
   ``InterRepository.search_missing_revision_ids`` is deprecated.  It is
   replaced by the ``revision_ids`` parameter.  (Andrew Bennetts)
 
+* Working tree formats should now be registered on the format registry
+  (``bzrlib.working_tree.format_registry``) rather than using the class
+  methods on ``WorkingTreeFormat``. (Jelmer Vernooij, #714730)
+
 Internals
 *********
 




More information about the bazaar-commits mailing list