At http://people.ubuntu.com/~robertc/baz2.0/bzrdir.network_name
------------------------------------------------------------ revno: 4071 revision-id: [email protected] parent: [email protected] committer: Robert Collins <[email protected]> branch nick: bzrdir.network_name timestamp: Tue 2009-03-03 12:06:25 +1100 message: Add a BzrDirFormat.network_name. === modified file 'NEWS' --- a/NEWS 2009-03-02 15:54:09 +0000 +++ b/NEWS 2009-03-03 01:06:25 +0000 @@ -170,8 +170,9 @@ ``resume_write_group`` methods. These are currently only useful with pack repositories. (Andrew Bennetts, Robert Collins) - * ``RepositoryFormat`` objects now have a ``network_name`` for passing - the format across RPC calls. (Robert Collins, Andrew Bennetts) + * ``BzrDirFormat``, ``BranchFormat`` and ``RepositoryFormat`` objects + now have a ``network_name`` for passing the format across RPC calls. + (Robert Collins, Andrew Bennetts) * ``RepositoryFormat`` objects now all have a new attribute ``_serializer`` used by fetch when reserialising is required. === modified file 'bzrlib/branch.py' --- a/bzrlib/branch.py 2009-03-02 04:45:02 +0000 +++ b/bzrlib/branch.py 2009-03-03 01:06:25 +0000 @@ -1709,7 +1709,7 @@ network_format_registry = registry.FormatRegistry() """Registry of formats indexed by their network name. -The network name for a repository format is an identifier that can be used when +The network name for a branch format is an identifier that can be used when referring to formats with smart server operations. See BranchFormat.network_name() for more detail. """ === modified file 'bzrlib/bzrdir.py' --- a/bzrlib/bzrdir.py 2009-02-26 06:01:51 +0000 +++ b/bzrlib/bzrdir.py 2009-03-03 01:06:25 +0000 @@ -1779,6 +1779,16 @@ """ return True + def network_name(self): + """A simple byte string uniquely identifying this format for RPC calls. + + Bzr control formats use thir disk format string to identify the format + over the wire. Its possible that other control formats have more + complex detection requirements, so we permit them to use any unique and + immutable string they desire. + """ + raise NotImplementedError(self.network_name) + def same_model(self, target_format): return (self.repository_format.rich_root_data == target_format.rich_root_data) @@ -1829,6 +1839,8 @@ @classmethod def register_format(klass, format): klass._formats[format.get_format_string()] = format + # bzr native formats have a network name of their format string. + network_format_registry.register(format.get_format_string(), format) @classmethod def register_control_format(klass, format): @@ -1923,6 +1935,9 @@ """ return False + def network_name(self): + return self.get_format_string() + def _open(self, transport): """See BzrDirFormat._open.""" return BzrDir4(transport, self) @@ -1981,6 +1996,9 @@ result._init_workingtree() return result + def network_name(self): + return self.get_format_string() + def _open(self, transport): """See BzrDirFormat._open.""" return BzrDir5(transport, self) @@ -2038,6 +2056,9 @@ result._init_workingtree() return result + def network_name(self): + return self.get_format_string() + def _open(self, transport): """See BzrDirFormat._open.""" return BzrDir6(transport, self) @@ -2125,6 +2146,9 @@ """See BzrDirFormat.get_format_description().""" return "Meta directory format 1" + def network_name(self): + return self.get_format_string() + def _open(self, transport): """See BzrDirFormat._open.""" return BzrDirMeta1(transport, self) @@ -2174,6 +2198,15 @@ __set_workingtree_format) +network_format_registry = registry.FormatRegistry() +"""Registry of formats indexed by their network name. + +The network name for a BzrDirFormat is an identifier that can be used when +referring to formats with smart server operations. See +BzrDirFormat.network_name() for more detail. +""" + + # Register bzr control format BzrDirFormat.register_control_format(BzrDirFormat) @@ -2706,12 +2739,22 @@ class RemoteBzrDirFormat(BzrDirMetaFormat1): """Format representing bzrdirs accessed via a smart server""" + def __init__(self): + BzrDirMetaFormat1.__init__(self) + self._network_name = None + def get_format_description(self): return 'bzr remote bzrdir' def get_format_string(self): raise NotImplementedError(self.get_format_string) + def network_name(self): + if self._network_name: + return self._network_name + else: + raise AssertionError("No network name set.") + @classmethod def probe_transport(klass, transport): """Return a RemoteBzrDirFormat object if it looks possible.""" @@ -2830,7 +2873,7 @@ """Register a metadir subformat. These all use a BzrDirMetaFormat1 bzrdir, but can be parameterized - by the Repository format. + by the Repository/Branch/WorkingTreeformats. :param repository_format: The fully-qualified repository format class name as a string. === modified file 'bzrlib/remote.py' --- a/bzrlib/remote.py 2009-03-02 07:13:41 +0000 +++ b/bzrlib/remote.py 2009-03-03 01:06:25 +0000 @@ -112,6 +112,7 @@ raise errors.UnexpectedSmartServerResponse(response) if response == ('no',): raise errors.NotBranchError(path=transport.base) + self._ensure_real() def _ensure_real(self): """Ensure that there is a _real_bzrdir set. @@ -121,6 +122,8 @@ if not self._real_bzrdir: self._real_bzrdir = BzrDir.open_from_transport( self.root_transport, _server_formats=False) + self._format._network_name = \ + self._real_bzrdir._format.network_name() def _translate_error(self, err, **context): _translate_error(err, bzrdir=self, **context) === modified file 'bzrlib/tests/bzrdir_implementations/test_bzrdir.py' --- a/bzrlib/tests/bzrdir_implementations/test_bzrdir.py 2009-03-02 03:38:07 +0000 +++ b/bzrlib/tests/bzrdir_implementations/test_bzrdir.py 2009-03-03 01:06:25 +0000 @@ -1165,6 +1165,26 @@ opened_dir._format) self.failUnless(isinstance(opened_dir, bzrdir.BzrDir)) + def test_format_network_name(self): + # All control formats must have a network name. + dir = self.make_bzrdir('.') + format = dir._format + network_name = format.network_name() + self.assertIsInstance(network_name, str) + # We want to test that the network_name matches the actual format on + # disk. For local control dirsthat means that using network_name as a + # key in the registry gives back the same format. For remote obects + # we check that the network_name of the RemoteBzrDirFormat we have + # locally matches the actual format present on disk. + if isinstance(format, bzrdir.RemoteBzrDirFormat): + dir._ensure_real() + real_dir = dir._real_bzrdir + self.assertEqual(real_dir._format.network_name(), network_name) + else: + registry = bzrdir.network_format_registry + looked_up_format = registry.get(network_name) + self.assertEqual(format.__class__, looked_up_format.__class__) + def test_open_not_bzrdir(self): # test the formats specific behaviour for no-content or similar dirs. self.assertRaises(NotBranchError, -- bazaar-commits mailing list [email protected] https://lists.ubuntu.com/mailman/listinfo/bazaar-commits
