comparison mercurial/localrepo.py @ 24799:d99d7e3f5cda

bundle2-localpeer: properly propagate the server output on error (issue4594) In case of errors, output parts salvaged from the reply bundle need to be processed for outputting their content. This concludes our quest for fixing issue4594.
author Pierre-Yves David <pierre-yves.david@fb.com>
date Thu, 16 Apr 2015 04:01:51 -0400
parents 9fbf0a2a72a1
children 57f1dbc99631
comparison
equal deleted inserted replaced
24798:9fbf0a2a72a1 24799:d99d7e3f5cda
134 # API is finally improved. 134 # API is finally improved.
135 stream = util.chunkbuffer(ret.getchunks()) 135 stream = util.chunkbuffer(ret.getchunks())
136 ret = bundle2.getunbundler(self.ui, stream) 136 ret = bundle2.getunbundler(self.ui, stream)
137 return ret 137 return ret
138 except Exception, exc: 138 except Exception, exc:
139 # If the exception contains output salvaged from a bundle2
140 # reply, we need to make sure it is printed before continuing
141 # to fail. So we build a bundle2 with such output and consume
142 # it directly.
143 #
144 # This is not very elegant but allows a "simple" solution for
145 # issue4594
146 output = getattr(exc, '_bundle2salvagedoutput', ())
147 if output:
148 bundler = bundle2.bundle20(self._repo.ui)
149 for out in output:
150 bundler.addpart(out)
151 stream = util.chunkbuffer(bundler.getchunks())
152 b = bundle2.getunbundler(self.ui, stream)
153 bundle2.processbundle(self._repo, b)
139 raise 154 raise
140 except error.PushRaced, exc: 155 except error.PushRaced, exc:
141 raise error.ResponseError(_('push failed:'), str(exc)) 156 raise error.ResponseError(_('push failed:'), str(exc))
142 157
143 def lock(self): 158 def lock(self):