D3397: wireproto: reimplement dispatch() for version 2 server
indygreg (Gregory Szorc)
phabricator at mercurial-scm.org
Tue Apr 17 05:30:47 UTC 2018
indygreg created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.
REVISION SUMMARY
The code is minimal. I'm trying to create a cleaner break between
version 1 and version 2 server code.
REPOSITORY
rHG Mercurial
REVISION DETAIL
https://phab.mercurial-scm.org/D3397
AFFECTED FILES
mercurial/wireproto.py
mercurial/wireprotov2server.py
CHANGE DETAILS
diff --git a/mercurial/wireprotov2server.py b/mercurial/wireprotov2server.py
--- a/mercurial/wireprotov2server.py
+++ b/mercurial/wireprotov2server.py
@@ -296,7 +296,7 @@
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 @@
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):
diff --git a/mercurial/wireproto.py b/mercurial/wireproto.py
--- a/mercurial/wireproto.py
+++ b/mercurial/wireproto.py
@@ -69,20 +69,10 @@
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 = {}
To: indygreg, #hg-reviewers
Cc: mercurial-devel
More information about the Mercurial-devel
mailing list