[MERGE] Deprecate get_shared_medium, and pass medium + base directly into _SmartClient.

Andrew Bennetts andrew at canonical.com
Mon Mar 31 23:56:33 BST 2008


This is a small change that I did while working towards fixing
<https://bugs.launchpad.net/bzr/+bug/207558>.  It removes more lines than it
adds (even though it just deprecates rather than deletes
Transport.get_shared_medium) so I'm pretty sure it's a good idea :)

It makes it simpler to construct a _SmartClient directly, and removes the need
to use _SharedConnection objects to construct one.

-Andrew.

-------------- next part --------------
# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: andrew.bennetts at canonical.com-20080328085843-\
#   pdstuawpwy1hst6r
# target_branch: http://bazaar-vcs.org/bzr/bzr.dev
# testament_sha1: 984348717aa71828026ab4b84fd3a27d5e72d3fe
# timestamp: 2008-04-01 09:47:44 +1100
# source_branch: http://people.ubuntu.com/~andrew/bzr/bug-207558-\
#   exported/_SmartClient takes medium
# base_revision_id: pqm at pqm.ubuntu.com-20080328064220-ongijg78bfqhvbay
# 
# Begin patch
=== modified file 'bzrlib/bzrdir.py'
--- bzrlib/bzrdir.py	2008-03-26 09:50:48 +0000
+++ bzrlib/bzrdir.py	2008-03-28 08:05:51 +0000
@@ -2415,15 +2415,14 @@
     def initialize_on_transport(self, transport):
         try:
             # hand off the request to the smart server
-            shared_medium = transport.get_shared_medium()
+            client_medium = transport.get_smart_medium()
         except errors.NoSmartMedium:
             # TODO: lookup the local format from a server hint.
             local_dir_format = BzrDirMetaFormat1()
             return local_dir_format.initialize_on_transport(transport)
-        client = _SmartClient(shared_medium)
+        client = _SmartClient(client_medium, transport.base)
         path = client.remote_path_from_transport(transport)
-        response = _SmartClient(shared_medium).call('BzrDirFormat.initialize',
-                                                    path)
+        response = client.call('BzrDirFormat.initialize', path)
         assert response[0] in ('ok', ), 'unexpected response code %s' % (response,)
         return remote.RemoteBzrDir(transport)
 

=== modified file 'bzrlib/remote.py'
--- bzrlib/remote.py	2008-03-27 00:27:41 +0000
+++ bzrlib/remote.py	2008-03-28 08:58:43 +0000
@@ -62,11 +62,10 @@
         self._real_bzrdir = None
 
         if _client is None:
-            self._shared_medium = transport.get_shared_medium()
-            self._client = client._SmartClient(self._shared_medium)
+            medium = transport.get_smart_medium()
+            self._client = client._SmartClient(medium, transport.base)
         else:
             self._client = _client
-            self._shared_medium = None
             return
 
         path = self._path_for_remote_call(self._client)
@@ -277,7 +276,7 @@
             self._real_repository = None
         self.bzrdir = remote_bzrdir
         if _client is None:
-            self._client = client._SmartClient(self.bzrdir._shared_medium)
+            self._client = remote_bzrdir._client
         else:
             self._client = _client
         self._format = format
@@ -836,7 +835,7 @@
 
     def _get_parent_map(self, keys):
         """Helper for get_parent_map that performs the RPC."""
-        medium = self._client.get_smart_medium()
+        medium = self._client._medium
         if not medium._remote_is_at_least_1_2:
             # We already found out that the server can't understand
             # Repository.get_parent_map requests, so just fetch the whole
@@ -1055,7 +1054,7 @@
         return self._real_repository.has_signature_for_revision_id(revision_id)
 
     def get_data_stream_for_search(self, search):
-        medium = self._client.get_smart_medium()
+        medium = self._client._medium
         if not medium._remote_is_at_least_1_2:
             self._ensure_real()
             return self._real_repository.get_data_stream_for_search(search)
@@ -1229,7 +1228,7 @@
         if _client is not None:
             self._client = _client
         else:
-            self._client = client._SmartClient(self.bzrdir._shared_medium)
+            self._client = remote_bzrdir._client
         self.repository = remote_repository
         if real_branch is not None:
             self._real_branch = real_branch

=== modified file 'bzrlib/smart/client.py'
--- bzrlib/smart/client.py	2008-03-05 15:48:27 +0000
+++ bzrlib/smart/client.py	2008-03-28 08:05:51 +0000
@@ -23,15 +23,14 @@
 
 class _SmartClient(object):
 
-    def __init__(self, shared_connection):
+    def __init__(self, medium, base):
         """Constructor.
 
-        :param shared_connection: a bzrlib.transport._SharedConnection
+        :param medium: a SmartClientMedium
+        :param base: a URL
         """
-        self._shared_connection = shared_connection
-
-    def get_smart_medium(self):
-        return self._shared_connection.connection
+        self._medium = medium
+        self._base = base
 
     def call(self, method, *args):
         """Call a method on the remote server."""
@@ -47,7 +46,7 @@
             result, smart_protocol = smart_client.call_expecting_body(...)
             body = smart_protocol.read_body_bytes()
         """
-        request = self.get_smart_medium().get_request()
+        request = self._medium.get_request()
         smart_protocol = protocol.SmartClientRequestProtocolTwo(request)
         smart_protocol.call(method, *args)
         return smart_protocol.read_response_tuple(expect_body=True), smart_protocol
@@ -61,7 +60,7 @@
                 raise TypeError('args must be byte strings, not %r' % (args,))
         if type(body) is not str:
             raise TypeError('body must be byte string, not %r' % (body,))
-        request = self.get_smart_medium().get_request()
+        request = self._medium.get_request()
         smart_protocol = protocol.SmartClientRequestProtocolOne(request)
         smart_protocol.call_with_body_bytes((method, ) + args, body)
         return smart_protocol.read_response_tuple()
@@ -75,7 +74,7 @@
                 raise TypeError('args must be byte strings, not %r' % (args,))
         if type(body) is not str:
             raise TypeError('body must be byte string, not %r' % (body,))
-        request = self.get_smart_medium().get_request()
+        request = self._medium.get_request()
         smart_protocol = protocol.SmartClientRequestProtocolTwo(request)
         smart_protocol.call_with_body_bytes((method, ) + args, body)
         return smart_protocol.read_response_tuple(expect_body=True), smart_protocol
@@ -87,11 +86,11 @@
         anything but path, so it is only safe to use it in requests sent over
         the medium from the matching transport.
         """
-        base = self._shared_connection.base
+        base = self._base
         if base.startswith('bzr+http://') or base.startswith('bzr+https://'):
-            medium_base = self._shared_connection.base
+            medium_base = self._base
         else:
-            medium_base = urlutils.join(self._shared_connection.base, '/')
+            medium_base = urlutils.join(self._base, '/')
             
         rel_url = urlutils.relative_url(medium_base, transport.base)
         return urllib.unquote(rel_url)

=== modified file 'bzrlib/tests/test_remote.py'
--- bzrlib/tests/test_remote.py	2008-03-28 06:42:20 +0000
+++ bzrlib/tests/test_remote.py	2008-03-28 08:05:51 +0000
@@ -140,7 +140,7 @@
         self.responses = responses
         self._calls = []
         self.expecting_body = False
-        _SmartClient.__init__(self, FakeMedium(fake_medium_base, self._calls))
+        _SmartClient.__init__(self, FakeMedium(self._calls), fake_medium_base)
 
     def call(self, method, *args):
         self._calls.append(('call', method, args))
@@ -162,14 +162,6 @@
 
 class FakeMedium(object):
 
-    def __init__(self, base, client_calls):
-        self.base = base
-        self.connection = FakeConnection(client_calls)
-        self._client_calls = client_calls
-
-
-class FakeConnection(object):
-
     def __init__(self, client_calls):
         self._remote_is_at_least_1_2 = True
         self._client_calls = client_calls

=== modified file 'bzrlib/tests/test_smart_transport.py'
--- bzrlib/tests/test_smart_transport.py	2008-01-22 06:56:59 +0000
+++ bzrlib/tests/test_smart_transport.py	2008-03-28 08:05:51 +0000
@@ -2047,7 +2047,7 @@
         input = StringIO("\n")
         output = StringIO()
         client_medium = medium.SmartSimplePipesClientMedium(input, output)
-        smart_client = client._SmartClient(client_medium)
+        smart_client = client._SmartClient(client_medium, 'ignored base')
         self.assertRaises(TypeError,
             smart_client.call_with_body_bytes, method, args, body)
         self.assertEqual("", output.getvalue())

=== modified file 'bzrlib/transport/__init__.py'
--- bzrlib/transport/__init__.py	2008-03-26 22:03:05 +0000
+++ bzrlib/transport/__init__.py	2008-03-28 08:58:43 +0000
@@ -626,6 +626,7 @@
         """
         raise errors.NoSmartMedium(self)
 
+    @deprecated_method(one_four)
     def get_shared_medium(self):
         """Return a smart client shared medium for this transport if possible.
 

=== modified file 'bzrlib/transport/remote.py'
--- bzrlib/transport/remote.py	2008-01-15 11:29:22 +0000
+++ bzrlib/transport/remote.py	2008-03-28 08:58:43 +0000
@@ -35,6 +35,7 @@
     urlutils,
     )
 from bzrlib.smart import client, medium, protocol
+from bzrlib.symbol_versioning import (deprecated_method, one_four)
 
 
 class _SmartStat(object):
@@ -104,9 +105,14 @@
             self._shared_connection = transport._SharedConnection(medium,
                                                                   credentials,
                                                                   self.base)
+        else:
+            if medium is None:
+                # No medium was specified, so share the medium from the
+                # _from_transport.
+                medium = self._shared_connection.connection
 
         if _client is None:
-            self._client = client._SmartClient(self.get_shared_medium())
+            self._client = client._SmartClient(medium, self.base)
         else:
             self._client = _client
 
@@ -144,6 +150,7 @@
     def get_smart_medium(self):
         return self._get_connection()
 
+    @deprecated_method(one_four)
     def get_shared_medium(self):
         return self._get_shared_connection()
 

# Begin bundle
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
l4Jg3afPeA5DLkEun/i7kinChIP2z6XA


More information about the bazaar mailing list