diff mercurial/wireproto.py @ 11586:ddaaaa23bb8f

protocol: move basic ssh client commands to wirerepository
author Matt Mackall <mpm@selenic.com>
date Wed, 14 Jul 2010 16:34:57 -0500
parents 5d907fbb9703
children a036f6bd1da3
line wrap: on
line diff
--- a/mercurial/wireproto.py	Wed Jul 14 16:19:27 2010 -0500
+++ b/mercurial/wireproto.py	Wed Jul 14 16:34:57 2010 -0500
@@ -7,9 +7,85 @@
 
 from i18n import _
 from node import bin, hex
-import urllib, streamclone
+import urllib
+import streamclone, repo, error, encoding
 import pushkey as pushkey_
 
+# client side
+
+class wirerepository(repo.repository):
+    def lookup(self, key):
+        self.requirecap('lookup', _('look up remote revision'))
+        d = self._call("lookup", key=key)
+        success, data = d[:-1].split(" ", 1)
+        if int(success):
+            return bin(data)
+        self._abort(error.RepoError(data))
+
+    def heads(self):
+        d = self._call("heads")
+        try:
+            return map(bin, d[:-1].split(" "))
+        except:
+            self.abort(error.ResponseError(_("unexpected response:"), d))
+
+    def branchmap(self):
+        d = self._call("branchmap")
+        try:
+            branchmap = {}
+            for branchpart in d.splitlines():
+                branchheads = branchpart.split(' ')
+                branchname = urllib.unquote(branchheads[0])
+                # Earlier servers (1.3.x) send branch names in (their) local
+                # charset. The best we can do is assume it's identical to our
+                # own local charset, in case it's not utf-8.
+                try:
+                    branchname.decode('utf-8')
+                except UnicodeDecodeError:
+                    branchname = encoding.fromlocal(branchname)
+                branchheads = [bin(x) for x in branchheads[1:]]
+                branchmap[branchname] = branchheads
+            return branchmap
+        except TypeError:
+            self._abort(error.ResponseError(_("unexpected response:"), d))
+
+    def branches(self, nodes):
+        n = " ".join(map(hex, nodes))
+        d = self._call("branches", nodes=n)
+        try:
+            br = [tuple(map(bin, b.split(" "))) for b in d.splitlines()]
+            return br
+        except:
+            self._abort(error.ResponseError(_("unexpected response:"), d))
+
+    def between(self, pairs):
+        n = " ".join(["-".join(map(hex, p)) for p in pairs])
+        d = self._call("between", pairs=n)
+        try:
+            p = [l and map(bin, l.split(" ")) or [] for l in d.splitlines()]
+            return p
+        except:
+            self._abort(error.ResponseError(_("unexpected response:"), d))
+
+    def pushkey(self, namespace, key, old, new):
+        if not self.capable('pushkey'):
+            return False
+        d = self._call("pushkey",
+                      namespace=namespace, key=key, old=old, new=new)
+        return bool(int(d))
+
+    def listkeys(self, namespace):
+        if not self.capable('pushkey'):
+            return {}
+        d = self._call("listkeys", namespace=namespace)
+        r = {}
+        for l in d.splitlines():
+            k, v = l.split('\t')
+            r[k.decode('string-escape')] = v.decode('string-escape')
+        return r
+
+# server side
+
 def dispatch(repo, proto, command):
     if command not in commands:
         return False