From a11ef0903e54a1206f5dfe23834405f0eaba565c Mon Sep 17 00:00:00 2001 From: nik Date: Fri, 13 Jul 2018 11:58:22 +0300 Subject: [PATCH] build scripts: print stacktrace if build failed with an exception (e.g. internal error in compiler) Ant don't print stacktrace of BuildException by default in org.apache.tools.ant.Main#startAnt so we need to print it manually (inspired by https://github.com/JetBrains/intellij-community/pull/819). Also it makes sense to show stacktrace as additional error details when running under TeamCity. --- .../build/impl/JpsCompilationRunner.groovy | 3 ++- .../impl/logging/BuildMessagesImpl.groovy | 5 +++- .../logging/TeamCityBuildMessageLogger.groovy | 25 +++++++++++++++---- 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/platform/build-scripts/groovy/org/jetbrains/intellij/build/impl/JpsCompilationRunner.groovy b/platform/build-scripts/groovy/org/jetbrains/intellij/build/impl/JpsCompilationRunner.groovy index bd828d2930da..a79a48a0e45e 100644 --- a/platform/build-scripts/groovy/org/jetbrains/intellij/build/impl/JpsCompilationRunner.groovy +++ b/platform/build-scripts/groovy/org/jetbrains/intellij/build/impl/JpsCompilationRunner.groovy @@ -37,6 +37,7 @@ import com.intellij.openapi.util.text.StringUtil import com.intellij.util.Processor import com.intellij.util.containers.MultiMap import groovy.transform.CompileStatic +import org.apache.tools.ant.BuildException import org.jetbrains.annotations.NonNls import org.jetbrains.annotations.NotNull import org.jetbrains.annotations.Nullable @@ -194,7 +195,7 @@ class JpsCompilationRunner { Standalone.runBuild(loader, compilationData.dataStorageRoot, messageHandler, scopes, false) } catch (Throwable e) { - context.messages.error("Compilation failed unexpectedly", e) + throw new BuildException("Compilation failed unexpectedly", e) } } if (!messageHandler.errorMessagesByCompiler.isEmpty()) { diff --git a/platform/build-scripts/groovy/org/jetbrains/intellij/build/impl/logging/BuildMessagesImpl.groovy b/platform/build-scripts/groovy/org/jetbrains/intellij/build/impl/logging/BuildMessagesImpl.groovy index 1c87fdf4e1cb..3d3f48b36671 100644 --- a/platform/build-scripts/groovy/org/jetbrains/intellij/build/impl/logging/BuildMessagesImpl.groovy +++ b/platform/build-scripts/groovy/org/jetbrains/intellij/build/impl/logging/BuildMessagesImpl.groovy @@ -94,7 +94,10 @@ class BuildMessagesImpl implements BuildMessages { @Override void error(String message, Throwable cause) { - throw new BuildException(message, cause) + def writer = new StringWriter() + new PrintWriter(writer).withCloseable { cause.printStackTrace(it) } + processMessage(new LogMessage(LogMessage.Kind.ERROR, "$message\n$writer")) + throw new BuildException(message) } @Override diff --git a/platform/build-scripts/groovy/org/jetbrains/intellij/build/impl/logging/TeamCityBuildMessageLogger.groovy b/platform/build-scripts/groovy/org/jetbrains/intellij/build/impl/logging/TeamCityBuildMessageLogger.groovy index eb3a155dea3f..98ca8527f29d 100644 --- a/platform/build-scripts/groovy/org/jetbrains/intellij/build/impl/logging/TeamCityBuildMessageLogger.groovy +++ b/platform/build-scripts/groovy/org/jetbrains/intellij/build/impl/logging/TeamCityBuildMessageLogger.groovy @@ -34,10 +34,26 @@ class TeamCityBuildMessageLogger extends BuildMessageLogger { @Override void processMessage(LogMessage message) { switch (message.kind) { - case LogMessage.Kind.ERROR: - case LogMessage.Kind.WARNING: case LogMessage.Kind.INFO: - logPlainMessage(message) + logPlainMessage(message, "") + break + case LogMessage.Kind.WARNING: + logPlainMessage(message, " status='WARNING'") + break + case LogMessage.Kind.ERROR: + def messageText = message.text.trim() + int lineEnd = messageText.indexOf('\n') + String firstLine + String details + if (lineEnd != -1) { + firstLine = messageText.substring(0, lineEnd) + details = " errorDetails='${escape(messageText.substring(lineEnd + 1))}'" + } + else { + firstLine = messageText + details = "" + } + printTeamCityMessage("message", true, "text='${escape(firstLine)}'$details status='ERROR'") break case LogMessage.Kind.PROGRESS: printTeamCityMessage("progressMessage", false, "'${escape(message.text)}'") @@ -89,8 +105,7 @@ class TeamCityBuildMessageLogger extends BuildMessageLogger { } } - void logPlainMessage(LogMessage message) { - String status = message.kind == LogMessage.Kind.WARNING ? " status='WARNING'" : "" + void logPlainMessage(LogMessage message, String status) { if (parallelTaskId != null || !status.isEmpty()) { printTeamCityMessage("message", true, "text='${escape(message.text)}'$status") }