[MERGE][0.16] Fix incompatibility with <= 0.15 servers ("bad request 'Transport.is_readonly'")
Andrew Bennetts
andrew at canonical.com
Mon Apr 30 03:06:40 BST 2007
This bundle fixes a bug in 0.16rc1 that stops it from interoperating smoothly
with 0.15 (and earlier) servers. This was causing "bad request" errors when
doing "bzr push".
The actual fix is very short (a single hunk of 6 new lines), the rest of the
diff is improvements to the tests.
-Andrew.
-------------- next part --------------
# Bazaar revision bundle v0.9
#
# message:
# Remove another XXX.
# committer: Andrew Bennetts <andrew.bennetts at canonical.com>
# date: Mon 2007-04-30 12:04:06.042999983 +1000
=== modified file bzrlib/tests/test_remote.py
--- bzrlib/tests/test_remote.py
+++ bzrlib/tests/test_remote.py
@@ -44,6 +44,7 @@
from bzrlib.smart import server, medium
from bzrlib.smart.client import _SmartClient
from bzrlib.transport.memory import MemoryTransport
+from bzrlib.transport.remote import RemoteTransport
class BasicRemoteObjectTests(tests.TestCaseWithTransport):
@@ -60,12 +61,6 @@
self.transport.disconnect()
tests.TestCaseWithTransport.tearDown(self)
- def test_is_readonly(self):
- # XXX: this is a poor way to test RemoteTransport, but currently there's
- # no easy way to substitute in a fake client on a transport like we can
- # with RemoteBzrDir/Branch/Repository.
- self.assertEqual(self.transport.is_readonly(), False)
-
def test_create_remote_bzrdir(self):
b = remote.RemoteBzrDir(self.transport)
self.assertIsInstance(b, BzrDir)
@@ -104,20 +99,6 @@
self.assertIsInstance(d, BzrDir)
-class ReadonlyRemoteTransportTests(tests.TestCaseWithTransport):
-
- def setUp(self):
- self.transport_server = server.ReadonlySmartTCPServer_for_testing
- super(ReadonlyRemoteTransportTests, self).setUp()
-
- def test_is_readonly_yes(self):
- # XXX: this is a poor way to test RemoteTransport, but currently there's
- # no easy way to substitute in a fake client on a transport like we can
- # with RemoteBzrDir/Branch/Repository.
- transport = self.get_readonly_transport()
- self.assertEqual(transport.is_readonly(), True)
-
-
class FakeProtocol(object):
"""Lookalike SmartClientRequestProtocolOne allowing body reading tests."""
@@ -404,6 +385,44 @@
client._calls)
+class TestTransportIsReadonly(tests.TestCase):
+
+ def test_true(self):
+ client = FakeClient([(('yes',), '')])
+ transport = RemoteTransport('bzr://example.com/', medium=False,
+ _client=client)
+ self.assertEqual(True, transport.is_readonly())
+ self.assertEqual(
+ [('call', 'Transport.is_readonly', ())],
+ client._calls)
+
+ def test_false(self):
+ client = FakeClient([(('no',), '')])
+ transport = RemoteTransport('bzr://example.com/', medium=False,
+ _client=client)
+ self.assertEqual(False, transport.is_readonly())
+ self.assertEqual(
+ [('call', 'Transport.is_readonly', ())],
+ client._calls)
+
+ def test_error_from_old_server(self):
+ """bzr 0.15 and earlier servers don't recognise the is_readonly verb.
+
+ Clients should treat it as a "no" response, because is_readonly is only
+ advisory anyway (a transport could be read-write, but then the
+ underlying filesystem could be readonly anyway).
+ """
+ client = FakeClient([(
+ ('error', "Generic bzr smart protocol error: "
+ "bad request 'Transport.is_readonly'"), '')])
+ transport = RemoteTransport('bzr://example.com/', medium=False,
+ _client=client)
+ self.assertEqual(False, transport.is_readonly())
+ self.assertEqual(
+ [('call', 'Transport.is_readonly', ())],
+ client._calls)
+
+
class TestRemoteRepository(tests.TestCase):
"""Base for testing RemoteRepository protocol usage.
=== modified file bzrlib/transport/remote.py // last-changed:andrew.bennetts at ca
... nonical.com-20070430020205-ensbvu0t14yb3tk4
--- bzrlib/transport/remote.py
+++ bzrlib/transport/remote.py
@@ -74,7 +74,7 @@
# RemoteTransport is an adapter from the Transport object model to the
# SmartClient model, not an encoder.
- def __init__(self, url, clone_from=None, medium=None):
+ def __init__(self, url, clone_from=None, medium=None, _client=None):
"""Constructor.
:param medium: The medium to use for this RemoteTransport. This must be
@@ -97,6 +97,10 @@
# reuse same connection
self._medium = clone_from._medium
assert self._medium is not None
+ if _client is None:
+ self._client = client._SmartClient(self._medium)
+ else:
+ self._client = _client
def abspath(self, relpath):
"""Return the full url to the given relative path.
@@ -123,6 +127,12 @@
return True
elif resp == ('no', ):
return False
+ elif resp == ('error', "Generic bzr smart protocol error: "
+ "bad request 'Transport.is_readonly'"):
+ # XXX: nasty hack: pre 0.16 servers don't have a
+ # 'Transport.is_readonly' verb, so we do what pre 0.16 clients did:
+ # assume False.
+ return False
else:
self._translate_error(resp)
assert False, 'weird response %r' % (resp,)
@@ -160,12 +170,11 @@
def _call2(self, method, *args):
"""Call a method on the remote server."""
- return client._SmartClient(self._medium).call(method, *args)
+ return self._client.call(method, *args)
def _call_with_body_bytes(self, method, args, body):
"""Call a method on the remote server with body bytes."""
- smart_client = client._SmartClient(self._medium)
- return smart_client.call_with_body_bytes(method, args, body)
+ return self._client.call_with_body_bytes(method, args, body)
def has(self, relpath):
"""Indicate whether a remote file of the given name exists or not.
=== modified directory // last-changed:andrew.bennetts at canonical.com-200704300
... 20406-9vvmb4f9x8bdmvv8
# revision id: andrew.bennetts at canonical.com-20070430020406-9vvmb4f9x8bdmvv8
# sha1: 9f71faa3f519db5328c6da43388ce2dd89f4db1c
# inventory sha1: f57f3eced3971517a4640709207de71a283c6b3f
# parent ids:
# andrew.bennetts at canonical.com-20070430020205-ensbvu0t14yb3tk4
# base id: pqm at pqm.ubuntu.com-20070426211103-h84prqh7a4ad3ez2
# properties:
# branch-nick: hpss-older-server-compat-bug
# message:
# Add tests for RemoteTransport.is_readonly in the style of the other remote object tests.
# committer: Andrew Bennetts <andrew.bennetts at canonical.com>
# date: Mon 2007-04-30 12:02:05.078999996 +1000
=== modified file bzrlib/tests/test_remote.py // encoding:base64
LS0tIGJ6cmxpYi90ZXN0cy90ZXN0X3JlbW90ZS5weQorKysgYnpybGliL3Rlc3RzL3Rlc3RfcmVt
b3RlLnB5CkBAIC00NCw2ICs0NCw3IEBACiBmcm9tIGJ6cmxpYi5zbWFydCBpbXBvcnQgc2VydmVy
LCBtZWRpdW0KIGZyb20gYnpybGliLnNtYXJ0LmNsaWVudCBpbXBvcnQgX1NtYXJ0Q2xpZW50CiBm
cm9tIGJ6cmxpYi50cmFuc3BvcnQubWVtb3J5IGltcG9ydCBNZW1vcnlUcmFuc3BvcnQKK2Zyb20g
YnpybGliLnRyYW5zcG9ydC5yZW1vdGUgaW1wb3J0IFJlbW90ZVRyYW5zcG9ydAogCiAKIGNsYXNz
IEJhc2ljUmVtb3RlT2JqZWN0VGVzdHModGVzdHMuVGVzdENhc2VXaXRoVHJhbnNwb3J0KToKQEAg
LTYwLDEyICs2MSw2IEBACiAgICAgICAgIHNlbGYudHJhbnNwb3J0LmRpc2Nvbm5lY3QoKQogICAg
ICAgICB0ZXN0cy5UZXN0Q2FzZVdpdGhUcmFuc3BvcnQudGVhckRvd24oc2VsZikKIAotICAgIGRl
ZiB0ZXN0X2lzX3JlYWRvbmx5KHNlbGYpOgotICAgICAgICAjIFhYWDogdGhpcyBpcyBhIHBvb3Ig
d2F5IHRvIHRlc3QgUmVtb3RlVHJhbnNwb3J0LCBidXQgY3VycmVudGx5IHRoZXJlJ3MKLSAgICAg
ICAgIyBubyBlYXN5IHdheSB0byBzdWJzdGl0dXRlIGluIGEgZmFrZSBjbGllbnQgb24gYSB0cmFu
c3BvcnQgbGlrZSB3ZSBjYW4KLSAgICAgICAgIyB3aXRoIFJlbW90ZUJ6ckRpci9CcmFuY2gvUmVw
b3NpdG9yeS4KLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnRyYW5zcG9ydC5pc19yZWFk
b25seSgpLCBGYWxzZSkKLQogICAgIGRlZiB0ZXN0X2NyZWF0ZV9yZW1vdGVfYnpyZGlyKHNlbGYp
OgogICAgICAgICBiID0gcmVtb3RlLlJlbW90ZUJ6ckRpcihzZWxmLnRyYW5zcG9ydCkKICAgICAg
ICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGIsIEJ6ckRpcikKQEAgLTQwNCw2ICszOTksNDQgQEAK
ICAgICAgICAgICAgIGNsaWVudC5fY2FsbHMpCiAKIAorY2xhc3MgVGVzdFRyYW5zcG9ydElzUmVh
ZG9ubHkodGVzdHMuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfdHJ1ZShzZWxmKToKKyAgICAg
ICAgY2xpZW50ID0gRmFrZUNsaWVudChbKCgneWVzJywpLCAnJyldKQorICAgICAgICB0cmFuc3Bv
cnQgPSBSZW1vdGVUcmFuc3BvcnQoJ2J6cjovL2V4YW1wbGUuY29tLycsIG1lZGl1bT1GYWxzZSwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jbGllbnQ9Y2xpZW50KQorICAg
ICAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUsIHRyYW5zcG9ydC5pc19yZWFkb25seSgpKQorICAg
ICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgWygnY2FsbCcsICdUcmFuc3BvcnQu
aXNfcmVhZG9ubHknLCAoKSldLAorICAgICAgICAgICAgY2xpZW50Ll9jYWxscykKKworICAgIGRl
ZiB0ZXN0X2ZhbHNlKHNlbGYpOgorICAgICAgICBjbGllbnQgPSBGYWtlQ2xpZW50KFsoKCdubycs
KSwgJycpXSkKKyAgICAgICAgdHJhbnNwb3J0ID0gUmVtb3RlVHJhbnNwb3J0KCdienI6Ly9leGFt
cGxlLmNvbS8nLCBtZWRpdW09RmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBfY2xpZW50PWNsaWVudCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGYWxzZSwgdHJh
bnNwb3J0LmlzX3JlYWRvbmx5KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAg
ICAgICBbKCdjYWxsJywgJ1RyYW5zcG9ydC5pc19yZWFkb25seScsICgpKV0sCisgICAgICAgICAg
ICBjbGllbnQuX2NhbGxzKQorCisgICAgZGVmIHRlc3RfZXJyb3JfZnJvbV9vbGRfc2VydmVyKHNl
bGYpOgorICAgICAgICAiIiJienIgMC4xNSBhbmQgZWFybGllciBzZXJ2ZXJzIGRvbid0IHJlY29n
bmlzZSB0aGUgaXNfcmVhZG9ubHkgdmVyYi4KKyAgICAgICAgCisgICAgICAgIENsaWVudHMgc2hv
dWxkIHRyZWF0IGl0IGFzIGEgIm5vIiByZXNwb25zZSwgYmVjYXVzZSBpc19yZWFkb25seSBpcyBv
bmx5CisgICAgICAgIGFkdmlzb3J5IGFueXdheSAoYSB0cmFuc3BvcnQgY291bGQgYmUgcmVhZC13
cml0ZSwgYnV0IHRoZW4gdGhlCisgICAgICAgIHVuZGVybHlpbmcgZmlsZXN5c3RlbSBjb3VsZCBi
ZSByZWFkb25seSBhbnl3YXkpLgorICAgICAgICAiIiIKKyAgICAgICAgY2xpZW50ID0gRmFrZUNs
aWVudChbKAorICAgICAgICAgICAgKCdlcnJvcicsICJHZW5lcmljIGJ6ciBzbWFydCBwcm90b2Nv
bCBlcnJvcjogIgorICAgICAgICAgICAgICAgICAgICAgICJiYWQgcmVxdWVzdCAnVHJhbnNwb3J0
LmlzX3JlYWRvbmx5JyIpLCAnJyldKQorICAgICAgICB0cmFuc3BvcnQgPSBSZW1vdGVUcmFuc3Bv
cnQoJ2J6cjovL2V4YW1wbGUuY29tLycsIG1lZGl1bT1GYWxzZSwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIF9jbGllbnQ9Y2xpZW50KQorICAgICAgICBzZWxmLmFzc2VydEVx
dWFsKEZhbHNlLCB0cmFuc3BvcnQuaXNfcmVhZG9ubHkoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRF
cXVhbCgKKyAgICAgICAgICAgIFsoJ2NhbGwnLCAnVHJhbnNwb3J0LmlzX3JlYWRvbmx5JywgKCkp
XSwKKyAgICAgICAgICAgIGNsaWVudC5fY2FsbHMpCisKKwogY2xhc3MgVGVzdFJlbW90ZVJlcG9z
aXRvcnkodGVzdHMuVGVzdENhc2UpOgogICAgICIiIkJhc2UgZm9yIHRlc3RpbmcgUmVtb3RlUmVw
b3NpdG9yeSBwcm90b2NvbCB1c2FnZS4KICAgICAKCg==
=== modified file bzrlib/transport/remote.py // encoding:base64
LS0tIGJ6cmxpYi90cmFuc3BvcnQvcmVtb3RlLnB5CisrKyBienJsaWIvdHJhbnNwb3J0L3JlbW90
ZS5weQpAQCAtNzQsNyArNzQsNyBAQAogICAgICMgUmVtb3RlVHJhbnNwb3J0IGlzIGFuIGFkYXB0
ZXIgZnJvbSB0aGUgVHJhbnNwb3J0IG9iamVjdCBtb2RlbCB0byB0aGUgCiAgICAgIyBTbWFydENs
aWVudCBtb2RlbCwgbm90IGFuIGVuY29kZXIuCiAKLSAgICBkZWYgX19pbml0X18oc2VsZiwgdXJs
LCBjbG9uZV9mcm9tPU5vbmUsIG1lZGl1bT1Ob25lKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwg
dXJsLCBjbG9uZV9mcm9tPU5vbmUsIG1lZGl1bT1Ob25lLCBfY2xpZW50PU5vbmUpOgogICAgICAg
ICAiIiJDb25zdHJ1Y3Rvci4KIAogICAgICAgICA6cGFyYW0gbWVkaXVtOiBUaGUgbWVkaXVtIHRv
IHVzZSBmb3IgdGhpcyBSZW1vdGVUcmFuc3BvcnQuIFRoaXMgbXVzdCBiZQpAQCAtOTcsNiArOTcs
MTAgQEAKICAgICAgICAgICAgICMgcmV1c2Ugc2FtZSBjb25uZWN0aW9uCiAgICAgICAgICAgICBz
ZWxmLl9tZWRpdW0gPSBjbG9uZV9mcm9tLl9tZWRpdW0KICAgICAgICAgYXNzZXJ0IHNlbGYuX21l
ZGl1bSBpcyBub3QgTm9uZQorICAgICAgICBpZiBfY2xpZW50IGlzIE5vbmU6CisgICAgICAgICAg
ICBzZWxmLl9jbGllbnQgPSBjbGllbnQuX1NtYXJ0Q2xpZW50KHNlbGYuX21lZGl1bSkKKyAgICAg
ICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX2NsaWVudCA9IF9jbGllbnQKIAogICAgIGRlZiBh
YnNwYXRoKHNlbGYsIHJlbHBhdGgpOgogICAgICAgICAiIiJSZXR1cm4gdGhlIGZ1bGwgdXJsIHRv
IHRoZSBnaXZlbiByZWxhdGl2ZSBwYXRoLgpAQCAtMTY2LDEyICsxNzAsMTEgQEAKIAogICAgIGRl
ZiBfY2FsbDIoc2VsZiwgbWV0aG9kLCAqYXJncyk6CiAgICAgICAgICIiIkNhbGwgYSBtZXRob2Qg
b24gdGhlIHJlbW90ZSBzZXJ2ZXIuIiIiCi0gICAgICAgIHJldHVybiBjbGllbnQuX1NtYXJ0Q2xp
ZW50KHNlbGYuX21lZGl1bSkuY2FsbChtZXRob2QsICphcmdzKQorICAgICAgICByZXR1cm4gc2Vs
Zi5fY2xpZW50LmNhbGwobWV0aG9kLCAqYXJncykKIAogICAgIGRlZiBfY2FsbF93aXRoX2JvZHlf
Ynl0ZXMoc2VsZiwgbWV0aG9kLCBhcmdzLCBib2R5KToKICAgICAgICAgIiIiQ2FsbCBhIG1ldGhv
ZCBvbiB0aGUgcmVtb3RlIHNlcnZlciB3aXRoIGJvZHkgYnl0ZXMuIiIiCi0gICAgICAgIHNtYXJ0
X2NsaWVudCA9IGNsaWVudC5fU21hcnRDbGllbnQoc2VsZi5fbWVkaXVtKQotICAgICAgICByZXR1
cm4gc21hcnRfY2xpZW50LmNhbGxfd2l0aF9ib2R5X2J5dGVzKG1ldGhvZCwgYXJncywgYm9keSkK
KyAgICAgICAgcmV0dXJuIHNlbGYuX2NsaWVudC5jYWxsX3dpdGhfYm9keV9ieXRlcyhtZXRob2Qs
IGFyZ3MsIGJvZHkpCiAKICAgICBkZWYgaGFzKHNlbGYsIHJlbHBhdGgpOgogICAgICAgICAiIiJJ
bmRpY2F0ZSB3aGV0aGVyIGEgcmVtb3RlIGZpbGUgb2YgdGhlIGdpdmVuIG5hbWUgZXhpc3RzIG9y
IG5vdC4KCg==
=== modified directory // last-changed:andrew.bennetts at canonical.com-200704300
... 20205-ensbvu0t14yb3tk4
# revision id: andrew.bennetts at canonical.com-20070430020205-ensbvu0t14yb3tk4
# sha1: d54f0d952b817c7e024a3b9f46e7ed9400935d9a
# inventory sha1: f149d737b478b0edf5d4897e231a21bb992fe11f
# parent ids:
# andrew.bennetts at canonical.com-20070427030144-vz2vna1t31ymdgz9
# properties:
# branch-nick: hpss-older-server-compat-bug
# message:
# Fix incompatibility with < 0.16 smart servers.
# committer: Andrew Bennetts <andrew.bennetts at canonical.com>
# date: Fri 2007-04-27 13:01:44.474999905 +1000
=== modified file bzrlib/transport/remote.py // encoding:base64
LS0tIGJ6cmxpYi90cmFuc3BvcnQvcmVtb3RlLnB5CisrKyBienJsaWIvdHJhbnNwb3J0L3JlbW90
ZS5weQpAQCAtMTIzLDYgKzEyMywxMiBAQAogICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAg
ICAgZWxpZiByZXNwID09ICgnbm8nLCApOgogICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAg
ICAgIGVsaWYgcmVzcCA9PSAoJ2Vycm9yJywgIkdlbmVyaWMgYnpyIHNtYXJ0IHByb3RvY29sIGVy
cm9yOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhZCByZXF1ZXN0ICdUcmFu
c3BvcnQuaXNfcmVhZG9ubHknIik6CisgICAgICAgICAgICAjIFhYWDogbmFzdHkgaGFjazogcHJl
IDAuMTYgc2VydmVycyBkb24ndCBoYXZlIGEKKyAgICAgICAgICAgICMgJ1RyYW5zcG9ydC5pc19y
ZWFkb25seScgdmVyYiwgc28gd2UgZG8gd2hhdCBwcmUgMC4xNiBjbGllbnRzIGRpZDoKKyAgICAg
ICAgICAgICMgYXNzdW1lIEZhbHNlLgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAg
IGVsc2U6CiAgICAgICAgICAgICBzZWxmLl90cmFuc2xhdGVfZXJyb3IocmVzcCkKICAgICAgICAg
YXNzZXJ0IEZhbHNlLCAnd2VpcmQgcmVzcG9uc2UgJXInICUgKHJlc3AsKQoK
=== modified directory // last-changed:andrew.bennetts at canonical.com-200704270
... 30144-vz2vna1t31ymdgz9
# revision id: andrew.bennetts at canonical.com-20070427030144-vz2vna1t31ymdgz9
# sha1: f20719bdae5d589592f44b96c586633f214ae3ba
# inventory sha1: cf3b40c158bdedfef4ce18398eed7a78c1de165b
# parent ids:
# pqm at pqm.ubuntu.com-20070426211103-h84prqh7a4ad3ez2
# properties:
# branch-nick: hpss-older-server-compat-bug
More information about the bazaar
mailing list