changeset 26829:58f1645f72c3 stable

bundle2: attribute remote failures to remote (issue4788) Before bundle2, hook output from hook failures was prefixed with "remote: ". Up to this point with bundle2, the output was converted to the message to print in an Abort exception. This had 2 implications: 1) It was unclear whether an error message came from the local repo or the remote 2) The exit code changed from 1 to 255 This patch changes the handling of error:abort bundle2 parts during push to prefix the error message with "remote: ". This restores the old behavior. We still preserve the behavior of raising an Abort during bundle2 application failure. This is a regression from pre-bundle2 because the exit code changed. Because we no longer raise an Abort with the remote's message, we needed to insert a message for the new Abort. So, I invented a new error message for that. This is another change from pre-bundle2. However, I like the new error message because it states unambiguously who aborted the push failed, which I think is important for users so they can decide what's next.
author Gregory Szorc <gregory.szorc@gmail.com>
date Sat, 24 Oct 2015 00:39:22 +0100
parents 00e75baa810f
children 65387a30430e
files mercurial/bundle2.py mercurial/exchange.py tests/test-bundle2-exchange.t tests/test-ssh-bundle1.t tests/test-ssh.t
diffstat 5 files changed, 32 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/bundle2.py	Sat Oct 24 00:39:26 2015 +0100
+++ b/mercurial/bundle2.py	Sat Oct 24 00:39:22 2015 +0100
@@ -1408,10 +1408,14 @@
     if op.reply is None:
         op.reply = bundle20(op.ui, caps)
 
+class AbortFromPart(error.Abort):
+    """Sub-class of Abort that denotes an error from a bundle2 part."""
+
 @parthandler('error:abort', ('message', 'hint'))
 def handleerrorabort(op, inpart):
     """Used to transmit abort error over the wire"""
-    raise error.Abort(inpart.params['message'], hint=inpart.params.get('hint'))
+    raise AbortFromPart(inpart.params['message'],
+                        hint=inpart.params.get('hint'))
 
 @parthandler('error:pushkey', ('namespace', 'key', 'new', 'old', 'ret',
                                'in-reply-to'))
--- a/mercurial/exchange.py	Sat Oct 24 00:39:26 2015 +0100
+++ b/mercurial/exchange.py	Sat Oct 24 00:39:22 2015 +0100
@@ -798,6 +798,9 @@
             op = bundle2.processbundle(pushop.repo, reply, trgetter)
         except error.BundleValueError as exc:
             raise error.Abort('missing support for %s' % exc)
+        except bundle2.AbortFromPart as exc:
+            pushop.ui.status(_('remote: %s\n') % exc)
+            raise error.Abort(_('push failed on remote'), hint=exc.hint)
     except error.PushkeyFailed as exc:
         partid = int(exc.partid)
         if partid not in pushop.pkfailcb:
--- a/tests/test-bundle2-exchange.t	Sat Oct 24 00:39:26 2015 +0100
+++ b/tests/test-bundle2-exchange.t	Sat Oct 24 00:39:22 2015 +0100
@@ -518,14 +518,16 @@
   $ hg -R main push ssh://user@dummy/other -r e7ec4e813ba6
   pushing to ssh://user@dummy/other
   searching for changes
-  abort: Abandon ship!
+  remote: Abandon ship!
+  abort: push failed on remote
   (don't panic)
   [255]
 
   $ hg -R main push http://localhost:$HGPORT2/ -r e7ec4e813ba6
   pushing to http://localhost:$HGPORT2/
   searching for changes
-  abort: Abandon ship!
+  remote: Abandon ship!
+  abort: push failed on remote
   (don't panic)
   [255]
 
@@ -624,7 +626,8 @@
   remote: transaction abort!
   remote: Cleaning up the mess...
   remote: rollback completed
-  abort: pretxnclose.failpush hook exited with status 1
+  remote: pretxnclose.failpush hook exited with status 1
+  abort: push failed on remote
   [255]
 
   $ hg -R main push http://localhost:$HGPORT2/ -r e7ec4e813ba6
@@ -639,7 +642,8 @@
   remote: transaction abort!
   remote: Cleaning up the mess...
   remote: rollback completed
-  abort: pretxnclose.failpush hook exited with status 1
+  remote: pretxnclose.failpush hook exited with status 1
+  abort: push failed on remote
   [255]
 
 (check that no 'pending' files remain)
@@ -684,7 +688,8 @@
   remote: transaction abort!
   remote: Cleaning up the mess...
   remote: rollback completed
-  abort: pretxnchangegroup hook exited with status 1
+  remote: pretxnchangegroup hook exited with status 1
+  abort: push failed on remote
   [255]
   $ hg -R main push http://localhost:$HGPORT2/ -r e7ec4e813ba6
   pushing to http://localhost:$HGPORT2/
@@ -697,7 +702,8 @@
   remote: transaction abort!
   remote: Cleaning up the mess...
   remote: rollback completed
-  abort: pretxnchangegroup hook exited with status 1
+  remote: pretxnchangegroup hook exited with status 1
+  abort: push failed on remote
   [255]
 
 Check output capture control.
@@ -733,7 +739,8 @@
   remote: transaction abort!
   remote: Cleaning up the mess...
   remote: rollback completed
-  abort: pretxnchangegroup hook exited with status 1
+  remote: pretxnchangegroup hook exited with status 1
+  abort: push failed on remote
   [255]
   $ hg -R main push http://localhost:$HGPORT2/ -r e7ec4e813ba6
   pushing to http://localhost:$HGPORT2/
@@ -746,7 +753,8 @@
   remote: transaction abort!
   remote: Cleaning up the mess...
   remote: rollback completed
-  abort: pretxnchangegroup hook exited with status 1
+  remote: pretxnchangegroup hook exited with status 1
+  abort: push failed on remote
   [255]
 
 Check abort from mandatory pushkey
@@ -928,7 +936,8 @@
   $ hg push
   pushing to ssh://user@dummy/lazylock
   searching for changes
-  abort: Lock should not be taken
+  remote: Lock should not be taken
+  abort: push failed on remote
   [255]
 
   $ cat >> ../lazylock/.hg/hgrc <<EOF
--- a/tests/test-ssh-bundle1.t	Sat Oct 24 00:39:26 2015 +0100
+++ b/tests/test-ssh-bundle1.t	Sat Oct 24 00:39:22 2015 +0100
@@ -533,7 +533,8 @@
   remote: adding manifests
   remote: adding file changes
   remote: added 1 changesets with 1 changes to 1 files
-  remote: hook failure!transaction abort!
+  remote: hook failure!
+  remote: transaction abort!
   remote: rollback completed
   remote: abort: pretxnchangegroup.fail hook failed
   [1]
--- a/tests/test-ssh.t	Sat Oct 24 00:39:26 2015 +0100
+++ b/tests/test-ssh.t	Sat Oct 24 00:39:22 2015 +0100
@@ -397,7 +397,8 @@
   pushing to ssh://user@dummy/*/remote (glob)
   searching for changes
   remote: Permission denied
-  abort: pretxnopen.hg-ssh hook failed
+  remote: pretxnopen.hg-ssh hook failed
+  abort: push failed on remote
   [255]
 
   $ cd ..
@@ -527,6 +528,7 @@
   remote: hook failure!
   remote: transaction abort!
   remote: rollback completed
-  abort: pretxnchangegroup.fail hook failed
+  remote: pretxnchangegroup.fail hook failed
+  abort: push failed on remote
   [255]