From eec1d32daf075136921cb8aec3de6ec17dd36a4d Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Sat, 27 Jul 2013 17:18:38 +0200 Subject: [PATCH] print messages even if the push is aborted --- .../sonia/scm/web/HgHookCallbackServlet.java | 92 ++++++++++++++----- .../resources/sonia/scm/python/scmhooks.py | 11 ++- 2 files changed, 75 insertions(+), 28 deletions(-) diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgHookCallbackServlet.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgHookCallbackServlet.java index 24d7c4eab3..b42f8440ec 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgHookCallbackServlet.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgHookCallbackServlet.java @@ -35,6 +35,7 @@ package sonia.scm.web; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.Strings; import com.google.common.io.Closeables; import com.google.inject.Inject; import com.google.inject.Provider; @@ -52,10 +53,11 @@ import sonia.scm.repository.HgRepositoryHandler; import sonia.scm.repository.RepositoryHookType; import sonia.scm.repository.RepositoryNotFoundException; import sonia.scm.repository.RepositoryUtil; -import sonia.scm.repository.spi.HgHookContextProvider; -import sonia.scm.repository.spi.HookEventFacade; import sonia.scm.repository.api.HgHookMessage; import sonia.scm.repository.api.HgHookMessage.Severity; +import sonia.scm.repository.api.HookMessageProvider; +import sonia.scm.repository.spi.HgHookContextProvider; +import sonia.scm.repository.spi.HookEventFacade; import sonia.scm.security.CipherUtil; import sonia.scm.security.Tokens; import sonia.scm.util.HttpUtil; @@ -273,6 +275,8 @@ public class HgHookCallbackServlet extends HttpServlet String node, RepositoryHookType type) throws IOException { + HgHookContextProvider context = null; + try { if (type == RepositoryHookType.PRE_RECEIVE) @@ -280,9 +284,8 @@ public class HgHookCallbackServlet extends HttpServlet contextProvider.get().setPending(true); } - HgHookContextProvider context = new HgHookContextProvider(handler, - repositoryName, hookManager, node, - type); + context = new HgHookContextProvider(handler, repositoryName, hookManager, + node, type); hookEventFacade.handle(HgRepositoryHandler.TYPE_NAME, repositoryName).fireHookEvent(type, context); @@ -305,7 +308,7 @@ public class HgHookCallbackServlet extends HttpServlet } catch (Exception ex) { - sendError(response, ex); + sendError(response, context, ex); } } @@ -363,6 +366,29 @@ public class HgHookCallbackServlet extends HttpServlet } } + /** + * Method description + * + * + * @param writer + * @param msg + */ + private void printMessage(PrintWriter writer, HgHookMessage msg) + { + writer.append('_'); + + if (msg.getSeverity() == Severity.ERROR) + { + writer.append("e[SCM] Error: "); + } + else + { + writer.append("n[SCM] "); + } + + writer.println(msg.getMessage()); + } + /** * Method description * @@ -386,21 +412,7 @@ public class HgHookCallbackServlet extends HttpServlet { writer = resonse.getWriter(); - for (HgHookMessage msg : msgs) - { - writer.append('_'); - - if (msg.getSeverity() == Severity.ERROR) - { - writer.append("e[SCM] Error: "); - } - else - { - writer.append("n[SCM] "); - } - - writer.println(msg.getMessage()); - } + printMessages(writer, msgs); } finally { @@ -409,31 +421,63 @@ public class HgHookCallbackServlet extends HttpServlet } } + /** + * Method description + * + * + * @param writer + * @param msgs + */ + private void printMessages(PrintWriter writer, List msgs) + { + for (HgHookMessage msg : msgs) + { + printMessage(writer, msg); + } + } + /** * Method description * * * @param response + * @param context * @param ex * * @throws IOException */ - private void sendError(HttpServletResponse response, Exception ex) + private void sendError(HttpServletResponse response, + HgHookContextProvider context, Exception ex) throws IOException { logger.warn("hook ended with exception", ex); response.setStatus(HttpServletResponse.SC_CONFLICT); String msg = ex.getMessage(); + List msgs = null; - if (msg != null) + if (context != null) + { + msgs = context.getHgMessageProvider().getMessages(); + } + + if (!Strings.isNullOrEmpty(msg) || Util.isNotEmpty(msgs)) { PrintWriter writer = null; try { writer = response.getWriter(); - writer.println(msg); + + if (Util.isNotEmpty(msgs)) + { + printMessages(writer, msgs); + } + + if (!Strings.isNullOrEmpty(msg)) + { + printMessage(writer, new HgHookMessage(Severity.ERROR, msg)); + } } finally { 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 7de4bf9a28..85cb1d6e65 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 @@ -42,6 +42,11 @@ baseUrl = os.environ['SCM_URL'] challenge = os.environ['SCM_CHALLENGE'] credentials = os.environ['SCM_CREDENTIALS'] +def printMessages(ui, msgs): + for line in msgs: + if line.startswith("_e") or line.startswith("_n"): + ui.warn(line[2:]); + def callHookUrl(ui, repo, hooktype, node): abort = True try: @@ -55,16 +60,14 @@ def callHookUrl(ui, repo, hooktype, node): conn = opener.open(req) if conn.code >= 200 and conn.code < 300: ui.debug( "scm-hook " + hooktype + " success with status code " + str(conn.code) + "\n" ) - for line in conn: - if line.startswith("_e") or line.startswith("_n"): - ui.warn(line[2:]); + printMessages(ui, conn) abort = False else: ui.warn( "ERROR: scm-hook failed with error code " + str(conn.code) + "\n" ) except urllib2.URLError, e: msg = e.read(); if len(msg) > 0: - ui.warn( "ERROR: " + msg) + printMessages(ui, msg.splitlines(True)) else: ui.warn( "ERROR: scm-hook failed with error code " + str(e.getcode()) + "\n" ) except ValueError: