diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py --- a/mercurial/localrepo.py +++ b/mercurial/localrepo.py @@ -1754,8 +1754,14 @@ class localrepository(object): 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, diff --git a/tests/test-bookmarks-pushpull.t b/tests/test-bookmarks-pushpull.t --- a/tests/test-bookmarks-pushpull.t +++ b/tests/test-bookmarks-pushpull.t @@ -486,4 +486,77 @@ pushing an unchanged bookmark should res 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 diff --git a/tests/test-hook.t b/tests/test-hook.t --- a/tests/test-hook.t +++ b/tests/test-hook.t @@ -215,8 +215,9 @@ test that prepushkey can prevent incomin 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 diff --git a/tests/test-ssh.t b/tests/test-ssh.t --- a/tests/test-ssh.t +++ b/tests/test-ssh.t @@ -392,9 +392,9 @@ Test hg-ssh in read-only mode: 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 ..