# HG changeset patch # User Gregory Szorc # Date 2018-04-17 05:00:52 # Node ID 99accae4cc596f0cb925d3ebe8ab959e95f60df2 # Parent 352932a1190577f277bba37403e5ad61f17b9cfb wireproto: reimplement dispatch() for version 2 server The code is minimal. I'm trying to create a cleaner break between version 1 and version 2 server code. Differential Revision: https://phab.mercurial-scm.org/D3397 diff --git a/mercurial/wireproto.py b/mercurial/wireproto.py --- a/mercurial/wireproto.py +++ b/mercurial/wireproto.py @@ -69,20 +69,10 @@ def getdispatchrepo(repo, proto, command def dispatch(repo, proto, command): repo = getdispatchrepo(repo, proto, command) - transportversion = wireprototypes.TRANSPORTS[proto.name]['version'] - commandtable = commandsv2 if transportversion == 2 else commands - func, spec = commandtable[command] - + func, spec = commands[command] args = proto.getargs(spec) - # Version 1 protocols define arguments as a list. Version 2 uses a dict. - if isinstance(args, list): - return func(repo, proto, *args) - elif isinstance(args, dict): - return func(repo, proto, **args) - else: - raise error.ProgrammingError('unexpected type returned from ' - 'proto.getargs(): %s' % type(args)) + return func(repo, proto, *args) def options(cmd, keys, others): opts = {} diff --git a/mercurial/wireprotov2server.py b/mercurial/wireprotov2server.py --- a/mercurial/wireprotov2server.py +++ b/mercurial/wireprotov2server.py @@ -296,7 +296,7 @@ def _httpv2runcommand(ui, repo, req, res res.setbodybytes(_('command in frame must match command in URL')) return True - rsp = wireproto.dispatch(repo, proto, command['command']) + rsp = dispatch(repo, proto, command['command']) res.status = b'200 OK' res.headers[b'Content-Type'] = FRAMINGTYPE @@ -328,6 +328,17 @@ def _httpv2runcommand(ui, repo, req, res raise error.ProgrammingError('unhandled event from reactor: %s' % action) +def getdispatchrepo(repo, proto, command): + return repo.filtered('served') + +def dispatch(repo, proto, command): + repo = getdispatchrepo(repo, proto, command) + + func, spec = wireproto.commandsv2[command] + args = proto.getargs(spec) + + return func(repo, proto, **args) + @zi.implementer(wireprototypes.baseprotocolhandler) class httpv2protocolhandler(object): def __init__(self, req, ui, args=None):