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.
This commit is contained in:
nik
2018-07-13 11:58:54 +03:00
parent 8dc929d05b
commit a11ef0903e
3 changed files with 26 additions and 7 deletions
@@ -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()) {
@@ -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
@@ -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")
}