# HG changeset patch # User Matt Mackall # Date 1279143351 18000 # Node ID a036f6bd1da3a06938a59d40758e8d264f527fc4 # Parent ddaaaa23bb8fc6d38d1899bec3c6e40b5c05e266 protocol: unify basic http client requests diff -r ddaaaa23bb8f -r a036f6bd1da3 mercurial/httprepo.py --- 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: diff -r ddaaaa23bb8f -r a036f6bd1da3 mercurial/wireproto.py --- 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'):