comparison mercurial/httprepo.py @ 11589:e8d22fe2ddab

protocol: clean up call-like functions in http and ssh clients
author Matt Mackall <mpm@selenic.com>
date Wed, 14 Jul 2010 17:07:10 -0500
parents 8a1f625e971d
children 0d9cb3f3b0a1
comparison
equal deleted inserted replaced
11588:8a1f625e971d 11589:e8d22fe2ddab
52 # look up capabilities only when needed 52 # look up capabilities only when needed
53 53
54 def get_caps(self): 54 def get_caps(self):
55 if self.caps is None: 55 if self.caps is None:
56 try: 56 try:
57 self.caps = set(self.do_read('capabilities').split()) 57 self.caps = set(self._call('capabilities').split())
58 except error.RepoError: 58 except error.RepoError:
59 self.caps = set() 59 self.caps = set()
60 self.ui.debug('capabilities: %s\n' % 60 self.ui.debug('capabilities: %s\n' %
61 (' '.join(self.caps or ['none']))) 61 (' '.join(self.caps or ['none'])))
62 return self.caps 62 return self.caps
64 capabilities = property(get_caps) 64 capabilities = property(get_caps)
65 65
66 def lock(self): 66 def lock(self):
67 raise util.Abort(_('operation not supported over http')) 67 raise util.Abort(_('operation not supported over http'))
68 68
69 def do_cmd(self, cmd, **args): 69 def _callstream(self, cmd, **args):
70 data = args.pop('data', None) 70 data = args.pop('data', None)
71 headers = args.pop('headers', {}) 71 headers = args.pop('headers', {})
72 self.ui.debug("sending %s command\n" % cmd) 72 self.ui.debug("sending %s command\n" % cmd)
73 q = {"cmd": cmd} 73 q = {"cmd": cmd}
74 q.update(args) 74 q.update(args)
128 raise error.RepoError(_("'%s' uses newer protocol %s") % 128 raise error.RepoError(_("'%s' uses newer protocol %s") %
129 (safeurl, version)) 129 (safeurl, version))
130 130
131 return resp 131 return resp
132 132
133 def do_read(self, cmd, **args): 133 def _call(self, cmd, **args):
134 fp = self.do_cmd(cmd, **args) 134 fp = self._callstream(cmd, **args)
135 try: 135 try:
136 return fp.read() 136 return fp.read()
137 finally: 137 finally:
138 # if using keepalive, allow connection to be reused 138 # if using keepalive, allow connection to be reused
139 fp.close() 139 fp.close()
140 140
141 def _call(self, cmd, **args):
142 return self.do_read(cmd, **args)
143
144 def _callstream(self, cmd, **args):
145 return self.do_cmd(cmd, **args)
146
147 def _abort(self, exception): 141 def _abort(self, exception):
148 raise exception 142 raise exception
149 143
150 def changegroup(self, nodes, kind): 144 def changegroup(self, nodes, kind):
151 n = " ".join(map(hex, nodes)) 145 n = " ".join(map(hex, nodes))
152 f = self.do_cmd("changegroup", roots=n) 146 f = self._callstream("changegroup", roots=n)
153 return util.chunkbuffer(zgenerator(f)) 147 return util.chunkbuffer(zgenerator(f))
154 148
155 def changegroupsubset(self, bases, heads, source): 149 def changegroupsubset(self, bases, heads, source):
156 self.requirecap('changegroupsubset', _('look up remote changes')) 150 self.requirecap('changegroupsubset', _('look up remote changes'))
157 baselst = " ".join([hex(n) for n in bases]) 151 baselst = " ".join([hex(n) for n in bases])
158 headlst = " ".join([hex(n) for n in heads]) 152 headlst = " ".join([hex(n) for n in heads])
159 f = self.do_cmd("changegroupsubset", bases=baselst, heads=headlst) 153 f = self._callstream("changegroupsubset", bases=baselst, heads=headlst)
160 return util.chunkbuffer(zgenerator(f)) 154 return util.chunkbuffer(zgenerator(f))
161 155
162 def unbundle(self, cg, heads, source): 156 def unbundle(self, cg, heads, source):
163 '''Send cg (a readable file-like object representing the 157 '''Send cg (a readable file-like object representing the
164 changegroup to push, typically a chunkbuffer object) to the 158 changegroup to push, typically a chunkbuffer object) to the
185 179
186 tempname = changegroup.writebundle(cg, None, type) 180 tempname = changegroup.writebundle(cg, None, type)
187 fp = url.httpsendfile(tempname, "rb") 181 fp = url.httpsendfile(tempname, "rb")
188 try: 182 try:
189 try: 183 try:
190 resp = self.do_read( 184 resp = self._call(
191 'unbundle', data=fp, 185 'unbundle', data=fp,
192 headers={'Content-Type': 'application/mercurial-0.1'}, 186 headers={'Content-Type': 'application/mercurial-0.1'},
193 heads=' '.join(map(hex, heads))) 187 heads=' '.join(map(hex, heads)))
194 resp_code, output = resp.split('\n', 1) 188 resp_code, output = resp.split('\n', 1)
195 try: 189 try: