pushkey: gracefully handle prepushkey hook failure (issue4455) stable
authorPierre-Yves David <pierre-yves.david@fb.com>
Sat, 29 Nov 2014 19:17:47 -0800
branchstable
changeset 23416 53a65929ef1f
parent 23415 cdbb85489c41
child 23417 442bb30171db
pushkey: gracefully handle prepushkey hook failure (issue4455) This allow to gracefully report the failure of the bookmark push and carry on. Before this change set. Local push would plain quit and wireprotocol would failed in various ungraceful way.
mercurial/localrepo.py
tests/test-bookmarks-pushpull.t
tests/test-hook.t
tests/test-ssh.t
--- a/mercurial/localrepo.py	Sat Nov 29 19:13:35 2014 -0800
+++ b/mercurial/localrepo.py	Sat Nov 29 19:17:47 2014 -0800
@@ -1754,8 +1754,14 @@
         return ret
 
     def pushkey(self, namespace, key, old, new):
-        self.hook('prepushkey', throw=True, namespace=namespace, key=key,
-                  old=old, new=new)
+        try:
+            self.hook('prepushkey', throw=True, namespace=namespace, key=key,
+                      old=old, new=new)
+        except error.HookAbort, exc:
+            self.ui.write_err(_("pushkey-abort: %s\n") % exc)
+            if exc.hint:
+                self.ui.write_err(_("(%s)\n") % exc.hint)
+            return False
         self.ui.debug('pushing key for "%s:%s"\n' % (namespace, key))
         ret = pushkey.push(self, namespace, key, old, new)
         self.hook('pushkey', namespace=namespace, key=key, old=old, new=new,
--- a/tests/test-bookmarks-pushpull.t	Sat Nov 29 19:13:35 2014 -0800
+++ b/tests/test-bookmarks-pushpull.t	Sat Nov 29 19:17:47 2014 -0800
@@ -486,4 +486,77 @@
   no changes found
   [1]
 
-  $ cd ..
+
+Check hook preventing push (issue4455)
+======================================
+
+  $ hg bookmarks
+   * @                         0:55482a6fb4b1
+  $ hg log -G
+  @  0:55482a6fb4b1 initial
+  
+  $ hg init ../issue4455-dest
+  $ hg push ../issue4455-dest # changesets only
+  pushing to ../issue4455-dest
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files
+  $ cat >> .hg/hgrc << EOF
+  > [paths]
+  > local=../issue4455-dest/
+  > ssh=ssh://user@dummy/issue4455-dest
+  > http=http://localhost:$HGPORT/
+  > [ui]
+  > ssh=python "$TESTDIR/dummyssh"
+  > EOF
+  $ cat >> ../issue4455-dest/.hg/hgrc << EOF
+  > [hooks]
+  > prepushkey=false
+  > [web]
+  > push_ssl = false
+  > allow_push = *
+  > EOF
+  $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
+  $ hg -R ../issue4455-dest serve -p $HGPORT -d --pid-file=../issue4455.pid -E ../issue4455-error.log
+  $ cat ../issue4455.pid >> $DAEMON_PIDS
+
+Local push
+----------
+
+  $ hg push -B @ local
+  pushing to $TESTTMP/issue4455-dest (glob)
+  searching for changes
+  no changes found
+  pushkey-abort: prepushkey hook exited with status 1
+  exporting bookmark @ failed!
+  [1]
+  $ hg -R ../issue4455-dest/ bookmarks
+  no bookmarks set
+
+Using ssh
+---------
+
+  $ hg push -B @ ssh
+  pushing to ssh://user@dummy/issue4455-dest
+  searching for changes
+  no changes found
+  remote: pushkey-abort: prepushkey hook exited with status 1
+  exporting bookmark @ failed!
+  [1]
+  $ hg -R ../issue4455-dest/ bookmarks
+  no bookmarks set
+
+Using http
+----------
+
+  $ hg push -B @ http
+  pushing to http://localhost:$HGPORT/
+  searching for changes
+  no changes found
+  remote: pushkey-abort: prepushkey hook exited with status 1
+  exporting bookmark @ failed!
+  [1]
+  $ hg -R ../issue4455-dest/ bookmarks
+  no bookmarks set
--- a/tests/test-hook.t	Sat Nov 29 19:13:35 2014 -0800
+++ b/tests/test-hook.t	Sat Nov 29 19:17:47 2014 -0800
@@ -215,8 +215,9 @@
   no changes found
   listkeys hook: HG_NAMESPACE=phases HG_VALUES={'cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b': '1', 'publishing': 'True'}
   prepushkey.forbid hook: HG_KEY=baz HG_NAMESPACE=bookmarks HG_NEW=0000000000000000000000000000000000000000
-  abort: prepushkey hook exited with status 1
-  [255]
+  pushkey-abort: prepushkey hook exited with status 1
+  exporting bookmark baz failed!
+  [1]
   $ cd ../a
 
 test that prelistkeys can prevent listing keys
--- a/tests/test-ssh.t	Sat Nov 29 19:13:35 2014 -0800
+++ b/tests/test-ssh.t	Sat Nov 29 19:17:47 2014 -0800
@@ -392,9 +392,9 @@
   remote: Permission denied
   remote: abort: prechangegroup.hg-ssh hook failed
   remote: Permission denied
-  remote: abort: prepushkey.hg-ssh hook failed
-  abort: unexpected response: empty string
-  [255]
+  remote: pushkey-abort: prepushkey.hg-ssh hook failed
+  updating 6c0482d977a3 to public failed!
+  [1]
 
   $ cd ..