changeset 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
files mercurial/sshrepo.py mercurial/wireproto.py
diffstat 2 files changed, 87 insertions(+), 74 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/sshrepo.py	Wed Jul 14 16:19:27 2010 -0500
+++ b/mercurial/sshrepo.py	Wed Jul 14 16:34:57 2010 -0500
@@ -7,7 +7,7 @@
 
 from node import bin, hex
 from i18n import _
-import repo, util, error, encoding
+import repo, util, error, encoding, wireproto
 import re, urllib
 
 class remotelock(object):
@@ -20,7 +20,7 @@
         if self.repo:
             self.release()
 
-class sshrepository(repo.repository):
+class sshrepository(wireproto.wirerepository):
     def __init__(self, ui, path, create=0):
         self._url = path
         self.ui = ui
@@ -101,6 +101,10 @@
         self.cleanup()
         raise exception
 
+    def _abort(self, exception):
+        self.cleanup()
+        raise exception
+
     def cleanup(self):
         try:
             self.pipeo.close()
@@ -128,6 +132,10 @@
         self.do_cmd(cmd, **args)
         return self._recv()
 
+    def _call(self, cmd, **args):
+        self.do_cmd(cmd, **args)
+        return self._recv()
+
     def _recv(self):
         l = self.pipei.readline()
         self.readerr()
@@ -152,60 +160,6 @@
     def unlock(self):
         self.call("unlock")
 
-    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)
-        else:
-            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:
-            raise 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 changegroup(self, nodes, kind):
         n = " ".join(map(hex, nodes))
         return self.do_cmd("changegroup", roots=n)
@@ -273,21 +227,4 @@
     def stream_out(self):
         return self.do_cmd('stream_out')
 
-    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
-
 instance = sshrepository
--- 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