# HG changeset patch # User Matt Mackall # Date 1279139115 18000 # Node ID 26c7d4fc31bfb9d76320646973507b409ef3532b # Parent 4530b3307fb9ae7f24c7e3d5e7c3c172656ba686 protocol: use new wireproto infrastructure in ssh - add protocol helper - insert wireproto into dispatcher - drop duplicate functions from hgweb implementation diff -r 4530b3307fb9 -r 26c7d4fc31bf mercurial/hgweb/hgweb_mod.py --- a/mercurial/hgweb/hgweb_mod.py Wed Jul 14 15:25:15 2010 -0500 +++ b/mercurial/hgweb/hgweb_mod.py Wed Jul 14 15:25:15 2010 -0500 @@ -7,7 +7,7 @@ # GNU General Public License version 2 or any later version. import os -from mercurial import ui, hg, hook, error, encoding, templater +from mercurial import ui, hg, hook, error, encoding, templater, wireproto from common import get_mtime, ErrorResponse, permhooks from common import HTTP_OK, HTTP_BAD_REQUEST, HTTP_NOT_FOUND, HTTP_SERVER_ERROR from request import wsgirequest @@ -22,6 +22,33 @@ 'pushkey': 'push', } +class webproto(object): + def __init__(self, req): + self.req = req + self.response = '' + def getargs(self, args): + data = {} + keys = args.split() + for k in keys: + if k == '*': + star = {} + for key in self.req.form.keys(): + if key not in keys: + star[key] = self.req.form[key][0] + data['*'] = star + else: + data[k] = self.req.form[k][0] + return [data[k] for k in keys] + def respond(self, s): + HGTYPE = 'application/mercurial-0.1' + self.req.respond(HTTP_OK, HGTYPE, length=len(s)) + self.response = s + +def callproto(repo, req, cmd): + p = webproto(req) + r = wireproto.dispatch(repo, p, cmd) + yield p.response + class hgweb(object): def __init__(self, repo, name=None, baseui=None): if isinstance(repo, str): @@ -123,6 +150,8 @@ if cmd == 'unbundle': req.drain() raise + if cmd in wireproto.commands: + return callproto(self.repo, req, cmd) method = getattr(protocol, cmd) return method(self.repo, req) except ErrorResponse, inst: diff -r 4530b3307fb9 -r 26c7d4fc31bf mercurial/hgweb/protocol.py --- a/mercurial/hgweb/protocol.py Wed Jul 14 15:25:15 2010 -0500 +++ b/mercurial/hgweb/protocol.py Wed Jul 14 15:25:15 2010 -0500 @@ -23,51 +23,6 @@ HGTYPE = 'application/mercurial-0.1' basecaps = 'lookup changegroupsubset branchmap pushkey'.split() -def lookup(repo, req): - try: - r = hex(repo.lookup(req.form['key'][0])) - success = 1 - except Exception, inst: - r = str(inst) - success = 0 - resp = "%s %s\n" % (success, r) - req.respond(HTTP_OK, HGTYPE, length=len(resp)) - yield resp - -def heads(repo, req): - resp = " ".join(map(hex, repo.heads())) + "\n" - req.respond(HTTP_OK, HGTYPE, length=len(resp)) - yield resp - -def branchmap(repo, req): - branches = repo.branchmap() - heads = [] - for branch, nodes in branches.iteritems(): - branchname = urllib.quote(branch) - branchnodes = [hex(node) for node in nodes] - heads.append('%s %s' % (branchname, ' '.join(branchnodes))) - resp = '\n'.join(heads) - req.respond(HTTP_OK, HGTYPE, length=len(resp)) - yield resp - -def branches(repo, req): - nodes = [] - if 'nodes' in req.form: - nodes = map(bin, req.form['nodes'][0].split(" ")) - resp = cStringIO.StringIO() - for b in repo.branches(nodes): - resp.write(" ".join(map(hex, b)) + "\n") - resp = resp.getvalue() - req.respond(HTTP_OK, HGTYPE, length=len(resp)) - yield resp - -def between(repo, req): - pairs = [map(bin, p.split("-")) - for p in req.form['pairs'][0].split(" ")] - resp = ''.join(" ".join(map(hex, b)) + "\n" for b in repo.between(pairs)) - req.respond(HTTP_OK, HGTYPE, length=len(resp)) - yield resp - def changegroup(repo, req): req.respond(HTTP_OK, HGTYPE) nodes = [] @@ -204,22 +159,3 @@ yield chunk except streamclone.StreamException, inst: yield str(inst) - -def pushkey(repo, req): - namespace = req.form['namespace'][0] - key = req.form['key'][0] - old = req.form['old'][0] - new = req.form['new'][0] - - r = repo.pushkey(namespace, key, old, new) - r = '%d\n' % int(r) - req.respond(HTTP_OK, HGTYPE, length=len(r)) - yield r - -def listkeys(repo, req): - namespace = req.form['namespace'][0] - d = repo.listkeys(namespace).items() - t = '\n'.join(['%s\t%s' % (k.encode('string-escape'), - v.encode('string-escape')) for k, v in d]) - req.respond(HTTP_OK, HGTYPE, length=len(t)) - yield t diff -r 4530b3307fb9 -r 26c7d4fc31bf tests/test-hgweb-commands --- a/tests/test-hgweb-commands Wed Jul 14 15:25:15 2010 -0500 +++ b/tests/test-hgweb-commands Wed Jul 14 15:25:15 2010 -0500 @@ -46,9 +46,9 @@ echo % heads "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '?cmd=heads' echo % lookup -"$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '?cmd=lookup&node=1' +"$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '?cmd=lookup&key=1' echo % branches -"$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '?cmd=branches' +"$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '?cmd=branches&nodes=0000000000000000000000000000000000000000' echo % changegroup "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '?cmd=changegroup' \ | $TESTDIR/printrepr.py diff -r 4530b3307fb9 -r 26c7d4fc31bf tests/test-hgweb-commands.out --- a/tests/test-hgweb-commands.out Wed Jul 14 15:25:15 2010 -0500 +++ b/tests/test-hgweb-commands.out Wed Jul 14 15:25:15 2010 -0500 @@ -852,11 +852,11 @@ % lookup 200 Script output follows -0 'key' +1 a4f92ed23982be056b9852de5dfe873eaac7f0de % branches 200 Script output follows -1d22e65f027e5a0609357e7d8e7508cd2ba5d2fe 2ef0ac749a14e4f57a5a822464a0902c6f7f448f 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000 +0000000000000000000000000000000000000000 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000 % changegroup 200 Script output follows