mirror of
https://github.com/facebook/sapling.git
synced 2024-10-11 09:17:30 +03:00
6a6926de03
"Real" batching only makes sense for wirepeers, but it greatly simplifies the clients of peer instances if they can be ignorant to actual batching capabilities of that peer. By moving the not-really-batched batching code into peer.peer, all peer instances now work with the batching API, thus simplifying users. This leaves a couple of name forwards in wirepeer.py. Originally I had planned to clean those up, but it kind of unclarifies other bits of code that want to use batching, so I think it makes sense for the names to stay exposed by wireproto. Specifically, almost nothing is currently aware of peer (see largefiles.proto for an example), so making them be aware of the peer module *and* the wireproto module seems like some abstraction leakage. I *think* the right long-term fix would actually be to make wireproto an implementation detail that clients wouldn't need to know about, but I don't really know what that would entail at the moment. As far as I'm aware, no clients of batching in third-party extensions will need updating, which is nice icing.
53 lines
1.2 KiB
Python
53 lines
1.2 KiB
Python
from mercurial import wireproto
|
|
|
|
class proto(object):
|
|
def __init__(self, args):
|
|
self.args = args
|
|
def getargs(self, spec):
|
|
args = self.args
|
|
args.setdefault('*', {})
|
|
names = spec.split()
|
|
return [args[n] for n in names]
|
|
|
|
class clientpeer(wireproto.wirepeer):
|
|
def __init__(self, serverrepo):
|
|
self.serverrepo = serverrepo
|
|
|
|
def _capabilities(self):
|
|
return ['batch']
|
|
|
|
def _call(self, cmd, **args):
|
|
return wireproto.dispatch(self.serverrepo, proto(args), cmd)
|
|
|
|
@wireproto.batchable
|
|
def greet(self, name):
|
|
f = wireproto.future()
|
|
yield {'name': mangle(name)}, f
|
|
yield unmangle(f.value)
|
|
|
|
class serverrepo(object):
|
|
def greet(self, name):
|
|
return "Hello, " + name
|
|
|
|
def filtered(self, name):
|
|
return self
|
|
|
|
def mangle(s):
|
|
return ''.join(chr(ord(c) + 1) for c in s)
|
|
def unmangle(s):
|
|
return ''.join(chr(ord(c) - 1) for c in s)
|
|
|
|
def greet(repo, proto, name):
|
|
return mangle(repo.greet(unmangle(name)))
|
|
|
|
wireproto.commands['greet'] = (greet, 'name',)
|
|
|
|
srv = serverrepo()
|
|
clt = clientpeer(srv)
|
|
|
|
print clt.greet("Foobar")
|
|
b = clt.batch()
|
|
fs = [b.greet(s) for s in ["Fo, =;:<o", "Bar"]]
|
|
b.submit()
|
|
print [f.value for f in fs]
|