changeset 11587:a036f6bd1da3

protocol: unify basic http client requests
author Matt Mackall <mpm@selenic.com>
date Wed, 14 Jul 2010 16:35:51 -0500
parents ddaaaa23bb8f
children 8a1f625e971d
files mercurial/httprepo.py mercurial/wireproto.py
diffstat 2 files changed, 17 insertions(+), 89 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/httprepo.py	Wed Jul 14 16:34:57 2010 -0500
+++ b/mercurial/httprepo.py	Wed Jul 14 16:35:51 2010 -0500
@@ -8,7 +8,7 @@
 
 from node import bin, hex, nullid
 from i18n import _
-import repo, changegroup, statichttprepo, error, url, util, pushkey
+import repo, changegroup, statichttprepo, error, url, util, wireproto
 import os, urllib, urllib2, urlparse, zlib, httplib
 import errno, socket
 import encoding
@@ -22,7 +22,7 @@
         raise IOError(None, _('connection ended unexpectedly'))
     yield zd.flush()
 
-class httprepository(repo.repository):
+class httprepository(wireproto.wirerepository):
     def __init__(self, ui, path):
         self.path = path
         self.caps = None
@@ -138,62 +138,11 @@
             # if using keepalive, allow connection to be reused
             fp.close()
 
-    def lookup(self, key):
-        self.requirecap('lookup', _('look up remote revision'))
-        d = self.do_cmd("lookup", key = key).read()
-        success, data = d[:-1].split(' ', 1)
-        if int(success):
-            return bin(data)
-        raise error.RepoError(data)
-
-    def heads(self):
-        d = self.do_read("heads")
-        try:
-            return map(bin, d[:-1].split(" "))
-        except:
-            raise error.ResponseError(_("unexpected response:"), d)
+    def _call(self, cmd, **args):
+        return self.do_read(cmd, **args)
 
-    def branchmap(self):
-        d = self.do_read("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.do_read("branches", nodes=n)
-        try:
-            br = [tuple(map(bin, b.split(" "))) for b in d.splitlines()]
-            return br
-        except:
-            raise error.ResponseError(_("unexpected response:"), d)
-
-    def between(self, pairs):
-        batch = 8 # avoid giant requests
-        r = []
-        for i in xrange(0, len(pairs), batch):
-            n = " ".join(["-".join(map(hex, p)) for p in pairs[i:i + batch]])
-            d = self.do_read("between", pairs=n)
-            try:
-                r += [l and map(bin, l.split(" ")) or []
-                      for l in d.splitlines()]
-            except:
-                raise error.ResponseError(_("unexpected response:"), d)
-        return r
+    def _abort(self, exception):
+        raise exception
 
     def changegroup(self, nodes, kind):
         n = " ".join(map(hex, nodes))
@@ -259,31 +208,6 @@
     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.do_cmd("pushkey", data="", # force a POST
-                        namespace=namespace, key=key, old=old, new=new).read()
-        code, output = d.split('\n', 1)
-        try:
-            ret = bool(int(code))
-        except ValueError, err:
-            raise error.ResponseError(
-                _('push failed (unexpected response):'), d)
-        for l in output.splitlines(True):
-            self.ui.status(_('remote: '), l)
-        return ret
-
-    def listkeys(self, namespace):
-        if not self.capable('pushkey'):
-            return {}
-        d = self.do_cmd("listkeys", namespace=namespace).read()
-        r = {}
-        for l in d.splitlines():
-            k, v = l.split('\t')
-            r[k.decode('string-escape')] = v.decode('string-escape')
-        return r
-
 class httpsrepository(httprepository):
     def __init__(self, ui, path):
         if not url.has_https:
--- a/mercurial/wireproto.py	Wed Jul 14 16:34:57 2010 -0500
+++ b/mercurial/wireproto.py	Wed Jul 14 16:35:51 2010 -0500
@@ -59,13 +59,17 @@
             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))
+        batch = 8 # avoid giant requests
+        r = []
+        for i in xrange(0, len(pairs), batch):
+            n = " ".join(["-".join(map(hex, p)) for p in pairs[i:i + batch]])
+            d = self._call("between", pairs=n)
+            try:
+                r += [l and map(bin, l.split(" ")) or []
+                      for l in d.splitlines()]
+            except:
+                self._abort(error.ResponseError(_("unexpected response:"), d))
+        return r
 
     def pushkey(self, namespace, key, old, new):
         if not self.capable('pushkey'):