Show More
@@ -138,19 +138,7 b' class httprepository(wireproto.wirerepos' | |||
|
138 | 138 | # if using keepalive, allow connection to be reused |
|
139 | 139 | fp.close() |
|
140 | 140 | |
|
141 | def _abort(self, exception): | |
|
142 | raise exception | |
|
143 | ||
|
144 | def _decompress(self, stream): | |
|
145 | return util.chunkbuffer(zgenerator(stream)) | |
|
146 | ||
|
147 | def unbundle(self, cg, heads, source): | |
|
148 | '''Send cg (a readable file-like object representing the | |
|
149 | changegroup to push, typically a chunkbuffer object) to the | |
|
150 | remote server as a bundle. Return an integer response code: | |
|
151 | non-zero indicates a successful push (see | |
|
152 | localrepository.addchangegroup()), and zero indicates either | |
|
153 | error or nothing to push.''' | |
|
141 | def _callpush(self, cmd, cg, **args): | |
|
154 | 142 | # have to stream bundle to a temp file because we do not have |
|
155 | 143 | # http 1.1 chunked transfer. |
|
156 | 144 | |
@@ -170,21 +158,12 b' class httprepository(wireproto.wirerepos' | |||
|
170 | 158 | |
|
171 | 159 | tempname = changegroup.writebundle(cg, None, type) |
|
172 | 160 | fp = url.httpsendfile(tempname, "rb") |
|
161 | headers = {'Content-Type': 'application/mercurial-0.1'} | |
|
162 | ||
|
173 | 163 | try: |
|
174 | 164 | try: |
|
175 |
r |
|
|
176 | 'unbundle', data=fp, | |
|
177 | headers={'Content-Type': 'application/mercurial-0.1'}, | |
|
178 | heads=' '.join(map(hex, heads))) | |
|
179 | resp_code, output = resp.split('\n', 1) | |
|
180 | try: | |
|
181 | ret = int(resp_code) | |
|
182 | except ValueError, err: | |
|
183 | raise error.ResponseError( | |
|
184 | _('push failed (unexpected response):'), resp) | |
|
185 | for l in output.splitlines(True): | |
|
186 | self.ui.status(_('remote: '), l) | |
|
187 | return ret | |
|
165 | r = self._call(cmd, data=fp, headers=headers, **args) | |
|
166 | return r.split('\n', 1) | |
|
188 | 167 | except socket.error, err: |
|
189 | 168 | if err.args[0] in (errno.ECONNRESET, errno.EPIPE): |
|
190 | 169 | raise util.Abort(_('push failed: %s') % err.args[1]) |
@@ -193,6 +172,12 b' class httprepository(wireproto.wirerepos' | |||
|
193 | 172 | fp.close() |
|
194 | 173 | os.unlink(tempname) |
|
195 | 174 | |
|
175 | def _abort(self, exception): | |
|
176 | raise exception | |
|
177 | ||
|
178 | def _decompress(self, stream): | |
|
179 | return util.chunkbuffer(zgenerator(stream)) | |
|
180 | ||
|
196 | 181 | class httpsrepository(httprepository): |
|
197 | 182 | def __init__(self, ui, path): |
|
198 | 183 | if not url.has_https: |
@@ -128,6 +128,21 b' class sshrepository(wireproto.wirereposi' | |||
|
128 | 128 | self._callstream(cmd, **args) |
|
129 | 129 | return self._recv() |
|
130 | 130 | |
|
131 | def _callpush(self, cmd, fp, **args): | |
|
132 | r = self._call(cmd, **args) | |
|
133 | if r: | |
|
134 | return '', r | |
|
135 | while 1: | |
|
136 | d = fp.read(4096) | |
|
137 | if not d: | |
|
138 | break | |
|
139 | self._send(d) | |
|
140 | self._send("", flush=True) | |
|
141 | r = self._recv() | |
|
142 | if r: | |
|
143 | return '', r | |
|
144 | return self._recv(), '' | |
|
145 | ||
|
131 | 146 | def _decompress(self, stream): |
|
132 | 147 | return stream |
|
133 | 148 | |
@@ -155,35 +170,6 b' class sshrepository(wireproto.wirereposi' | |||
|
155 | 170 | def unlock(self): |
|
156 | 171 | self._call("unlock") |
|
157 | 172 | |
|
158 | def unbundle(self, cg, heads, source): | |
|
159 | '''Send cg (a readable file-like object representing the | |
|
160 | changegroup to push, typically a chunkbuffer object) to the | |
|
161 | remote server as a bundle. Return an integer indicating the | |
|
162 | result of the push (see localrepository.addchangegroup()).''' | |
|
163 | d = self._call("unbundle", heads=' '.join(map(hex, heads))) | |
|
164 | if d: | |
|
165 | # remote may send "unsynced changes" | |
|
166 | self._abort(error.RepoError(_("push refused: %s") % d)) | |
|
167 | ||
|
168 | while 1: | |
|
169 | d = cg.read(4096) | |
|
170 | if not d: | |
|
171 | break | |
|
172 | self._send(d) | |
|
173 | ||
|
174 | self._send("", flush=True) | |
|
175 | ||
|
176 | r = self._recv() | |
|
177 | if r: | |
|
178 | # remote may send "unsynced changes" | |
|
179 | self._abort(error.RepoError(_("push failed: %s") % r)) | |
|
180 | ||
|
181 | r = self._recv() | |
|
182 | try: | |
|
183 | return int(r) | |
|
184 | except: | |
|
185 | self._abort(error.ResponseError(_("unexpected response:"), r)) | |
|
186 | ||
|
187 | 173 | def addchangegroup(self, cg, source, url): |
|
188 | 174 | '''Send a changegroup to the remote server. Return an integer |
|
189 | 175 | similar to unbundle(). DEPRECATED, since it requires locking the |
@@ -103,6 +103,26 b' class wirerepository(repo.repository):' | |||
|
103 | 103 | return self._decompress(self._callstream("changegroupsubset", |
|
104 | 104 | bases=bases, heads=heads)) |
|
105 | 105 | |
|
106 | def unbundle(self, cg, heads, source): | |
|
107 | '''Send cg (a readable file-like object representing the | |
|
108 | changegroup to push, typically a chunkbuffer object) to the | |
|
109 | remote server as a bundle. Return an integer indicating the | |
|
110 | result of the push (see localrepository.addchangegroup()).''' | |
|
111 | ||
|
112 | ret, output = self._callpush("unbundle", cg, heads=' '.join(map(hex, heads))) | |
|
113 | if ret == "": | |
|
114 | raise error.ResponseError( | |
|
115 | _('push failed:'), output) | |
|
116 | try: | |
|
117 | ret = int(ret) | |
|
118 | except ValueError, err: | |
|
119 | raise error.ResponseError( | |
|
120 | _('push failed (unexpected response):'), ret) | |
|
121 | ||
|
122 | for l in output.splitlines(True): | |
|
123 | self.ui.status(_('remote: '), l) | |
|
124 | return ret | |
|
125 | ||
|
106 | 126 | # server side |
|
107 | 127 | |
|
108 | 128 | def dispatch(repo, proto, command): |
General Comments 0
You need to be logged in to leave comments.
Login now