From 2d103b7f958939cc912f9bcc55dae47cda7c1492 Mon Sep 17 00:00:00 2001 From: Matt Harbison Date: Fri, 22 Jun 2018 16:33:52 -0400 Subject: [PATCH] optionally print tracebacks when the Mercurial hook swallows an exception If `ui.traceback=True` is set on the server, this prints the stacktrace for the exception on the client side. Otherwise, nothing happens. I tried allowing the exception to propagate back to Mercurial, but then the client sees this message with 4.4.2 and 4.6.1: abort: remote error: Mercurial/Python process ends with return code 1 Something odd changed when upgrading from CentOS 7.4 to 7.5 around forwarding requests from the loopback address that I don't fully understand. First, we were getting a ValueError from inside `opener.open()` saying that 'localhost' didn't match the host listed in the SSL certificate. That wasn't visible until adding this. Then what happened is a connection refused out of the same function, so the traceback is added to the other handler too. Running the equivalent command on the command line from the 'vcs' host stopped working in 7.5: $ curl https://vcs.domain.com/hook/hg/?ping=true curl: (7) Failed connect to vcs.domain.com:443; Connection refused But it works when run on another machine targeting that same 'vcs' host. Adding another firewall rule allows everything to work from the 'vcs' host again: $ iptables -t nat -I OUTPUT -p tcp -o lo --dport 443 -j REDIRECT --to-ports 8443 --- .../src/main/resources/sonia/scm/python/scmhooks.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scm-plugins/scm-hg-plugin/src/main/resources/sonia/scm/python/scmhooks.py b/scm-plugins/scm-hg-plugin/src/main/resources/sonia/scm/python/scmhooks.py index e9a58d589f..73b5bfe083 100644 --- a/scm-plugins/scm-hg-plugin/src/main/resources/sonia/scm/python/scmhooks.py +++ b/scm-plugins/scm-hg-plugin/src/main/resources/sonia/scm/python/scmhooks.py @@ -78,8 +78,10 @@ def callHookUrl(ui, repo, hooktype, node): printMessages(ui, msg.splitlines(True)) else: ui.warn( "ERROR: scm-hook failed with an unknown error\n" ) + ui.traceback() except ValueError: ui.warn( "scm-hook failed with an exception\n" ) + ui.traceback() return abort def callback(ui, repo, hooktype, node=None, source=None, pending=None, **kwargs):