diff mercurial/wireproto.py @ 11581:4530b3307fb9

protocol: introduce wireproto.py - add a protocol-independent dispatcher - move most of the basic commands from sshserver to wireproto - dispatch through wireproto first
author Matt Mackall <mpm@selenic.com>
date Wed, 14 Jul 2010 15:25:15 -0500
parents
children 944c23762c3c
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mercurial/wireproto.py	Wed Jul 14 15:25:15 2010 -0500
@@ -0,0 +1,75 @@
+# wireproto.py - generic wire protocol support functions
+#
+# Copyright 2005-2010 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+from i18n import _
+from node import bin, hex
+import urllib
+import pushkey as pushkey_
+
+def dispatch(repo, proto, command):
+    if command not in commands:
+        return False
+    func, spec = commands[command]
+    args = proto.getargs(spec)
+    proto.respond(func(repo, *args))
+    return True
+
+def between(repo, pairs):
+    pairs = [map(bin, p.split("-")) for p in pairs.split(" ")]
+    r = []
+    for b in repo.between(pairs):
+        r.append(" ".join(map(hex, b)) + "\n")
+    return "".join(r)
+
+def branchmap(repo):
+    branchmap = repo.branchmap()
+    heads = []
+    for branch, nodes in branchmap.iteritems():
+        branchname = urllib.quote(branch)
+        branchnodes = [hex(node) for node in nodes]
+        heads.append('%s %s' % (branchname, ' '.join(branchnodes)))
+    return '\n'.join(heads)
+
+def branches(repo, nodes):
+    nodes = map(bin, nodes.split(" "))
+    r = []
+    for b in repo.branches(nodes):
+        r.append(" ".join(map(hex, b)) + "\n")
+    return "".join(r)
+
+def heads(repo):
+    h = repo.heads()
+    return " ".join(map(hex, h)) + "\n"
+
+def listkeys(repo, namespace):
+    d = pushkey_.list(repo, namespace).items()
+    t = '\n'.join(['%s\t%s' % (k.encode('string-escape'),
+                               v.encode('string-escape')) for k, v in d])
+    return t
+
+def lookup(repo, key):
+    try:
+        r = hex(repo.lookup(key))
+        success = 1
+    except Exception, inst:
+        r = str(inst)
+        success = 0
+    return "%s %s\n" % (success, r)
+
+def pushkey(repo, namespace, key, old, new):
+    r = pushkey_.push(repo, namespace, key, old, new)
+    return '%s\n' % int(r)
+
+commands = {
+    'between': (between, 'pairs'),
+    'branchmap': (branchmap, ''),
+    'branches': (branches, 'nodes'),
+    'heads': (heads, ''),
+    'listkeys': (listkeys, 'namespace'),
+    'lookup': (lookup, 'key'),
+    'pushkey': (pushkey, 'namespace key old new'),
+}