diff -r 0c4d5e01b31f -r 9fbf0a2a72a1 mercurial/localrepo.py --- a/mercurial/localrepo.py Thu Apr 16 03:17:37 2015 -0400 +++ b/mercurial/localrepo.py Thu Apr 16 05:09:37 2015 -0400 @@ -125,15 +125,18 @@ This function handles the repo locking itself.""" try: - cg = exchange.readbundle(self.ui, cg, None) - ret = exchange.unbundle(self._repo, cg, heads, 'push', url) - if util.safehasattr(ret, 'getchunks'): - # This is a bundle20 object, turn it into an unbundler. - # This little dance should be dropped eventually when the API - # is finally improved. - stream = util.chunkbuffer(ret.getchunks()) - ret = bundle2.getunbundler(self.ui, stream) - return ret + try: + cg = exchange.readbundle(self.ui, cg, None) + ret = exchange.unbundle(self._repo, cg, heads, 'push', url) + if util.safehasattr(ret, 'getchunks'): + # This is a bundle20 object, turn it into an unbundler. + # This little dance should be dropped eventually when the + # API is finally improved. + stream = util.chunkbuffer(ret.getchunks()) + ret = bundle2.getunbundler(self.ui, stream) + return ret + except Exception, exc: + raise except error.PushRaced, exc: raise error.ResponseError(_('push failed:'), str(exc))