Patchwork [7,of,7] bundle2-localpeer: properly propagate the server output on error (issue4594)

login
register
mail settings
Submitter Pierre-Yves David
Date April 16, 2015, 9:25 a.m.
Message ID <1e4021549a5155bef6b4.1429176349@marginatus.alto.octopoid.net>
Download mbox | patch
Permalink /patch/8709/
State Accepted
Headers show

Comments

Pierre-Yves David - April 16, 2015, 9:25 a.m.
# HG changeset patch
# User Pierre-Yves David <pierre-yves.david@fb.com>
# Date 1429171311 14400
#      Thu Apr 16 04:01:51 2015 -0400
# Node ID 1e4021549a5155bef6b41ceccbd1becedc029422
# Parent  14b4d54ac72d694498c899df4fd180d144fcac7f
bundle2-localpeer: properly propagate the server output on error (issue4594)

In case of errors, output parts salvaged from the reply bundle needs to be
processed for outputting their content. This concludes our quest for fixing
issue4594.
Matt Mackall - April 17, 2015, 1:22 a.m.
On Thu, 2015-04-16 at 05:25 -0400, Pierre-Yves David wrote:
> # HG changeset patch
> # User Pierre-Yves David <pierre-yves.david@fb.com>
> # Date 1429171311 14400
> #      Thu Apr 16 04:01:51 2015 -0400
> # Node ID 1e4021549a5155bef6b41ceccbd1becedc029422
> # Parent  14b4d54ac72d694498c899df4fd180d144fcac7f
> bundle2-localpeer: properly propagate the server output on error (issue4594)

These are queued for default, thanks.

Patch

diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py
--- a/mercurial/localrepo.py
+++ b/mercurial/localrepo.py
@@ -134,10 +134,25 @@  class localpeer(peer.peerrepository):
                     # API is finally improved.
                     stream = util.chunkbuffer(ret.getchunks())
                     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 fails. 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))
 
     def lock(self):
diff --git a/tests/test-bundle2-exchange.t b/tests/test-bundle2-exchange.t
--- a/tests/test-bundle2-exchange.t
+++ b/tests/test-bundle2-exchange.t
@@ -559,10 +559,14 @@  Doing the actual push: hook abort
   pushing to other
   searching for changes
   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]
 
   $ hg -R main push ssh://user@dummy/other -r e7ec4e813ba6
   pushing to ssh://user@dummy/other