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.
--- a/mercurial/localrepo.py Thu Apr 16 05:09:37 2015 -0400
+++ b/mercurial/localrepo.py Thu Apr 16 04:01:51 2015 -0400
@@ -136,6 +136,21 @@
ret = bundle2.getunbundler(self.ui, stream)
return ret
except Exception, exc:
+ # If the exception contains output salvaged from a bundle2
+ # reply, we need to make sure it is printed before continuing
+ # to fail. So we build a bundle2 with such output and consume
+ # it directly.
+ #
+ # This is not very elegant but allows a "simple" solution for
+ # issue4594
+ output = getattr(exc, '_bundle2salvagedoutput', ())
+ if output:
+ bundler = bundle2.bundle20(self._repo.ui)
+ for out in output:
+ bundler.addpart(out)
+ stream = util.chunkbuffer(bundler.getchunks())
+ b = bundle2.getunbundler(self.ui, stream)
+ bundle2.processbundle(self._repo, b)
raise
except error.PushRaced, exc:
raise error.ResponseError(_('push failed:'), str(exc))
--- a/tests/test-bundle2-exchange.t Thu Apr 16 05:09:37 2015 -0400
+++ b/tests/test-bundle2-exchange.t Thu Apr 16 04:01:51 2015 -0400
@@ -561,6 +561,10 @@
pre-close-tip:e7ec4e813ba6 draft
transaction abort!
rollback completed
+ remote: adding changesets
+ remote: adding manifests
+ remote: adding file changes
+ remote: added 1 changesets with 1 changes to 1 files
abort: pretxnclose.failpush hook exited with status 1
[255]