From 3b7e6974c32c0bf8135ff995f6e416c5c9100cb2 Mon Sep 17 00:00:00 2001 From: Eugene Yokota Date: Wed, 27 Jun 2018 06:26:38 -0400 Subject: [PATCH 1/2] Fixes stacktrace of backgroun run Ref https://github.com/sbt/sbt/issues/4121 sbt already has the facility to trim stack traces. This sets the trace level of the background run, which fixes the upper half of the `run` stacktrace. ``` [error] (run-main-0) java.lang.Exception [error] java.lang.Exception [error] at Hello$.delayedEndpoint$Hello$1(Hello.scala:5) [error] at Hello$delayedInit$body.apply(Hello.scala:1) [error] at scala.Function0.apply$mcV$sp(Function0.scala:34) [error] at scala.Function0.apply$mcV$sp$(Function0.scala:34) [error] at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12) [error] at scala.App.$anonfun$main$1$adapted(App.scala:76) [error] at scala.collection.immutable.List.foreach(List.scala:389) [error] at scala.App.main(App.scala:76) [error] at scala.App.main$(App.scala:74) [error] at Hello$.main(Hello.scala:1) [error] at Hello.main(Hello.scala) [error] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [error] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) [error] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [error] at java.lang.reflect.Method.invoke(Method.java:498) [error] java.lang.RuntimeException: Nonzero exit code: 1 [error] at sbt.Run$.executeTrapExit(Run.scala:127) [error] at sbt.Run.run(Run.scala:77) [error] at sbt.Defaults$.$anonfun$bgRunTask$5(Defaults.scala:1254) [error] at sbt.Defaults$.$anonfun$bgRunTask$5$adapted(Defaults.scala:1249) [error] at sbt.internal.BackgroundThreadPool.$anonfun$run$1(DefaultBackgroundJobService.scala:377) [error] at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12) [error] at scala.util.Try$.apply(Try.scala:209) [error] at sbt.internal.BackgroundThreadPool$BackgroundRunnable.run(DefaultBackgroundJobService.scala:299) [error] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [error] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [error] at java.lang.Thread.run(Thread.java:748) [error] (Compile / run) Nonzero exit code: 1 ``` The bottom half requires a similar fix to the foreground log. --- main/src/main/scala/sbt/Defaults.scala | 2 ++ main/src/main/scala/sbt/internal/LogManager.scala | 8 +++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/main/src/main/scala/sbt/Defaults.scala b/main/src/main/scala/sbt/Defaults.scala index bd28131d9..5d5055c33 100755 --- a/main/src/main/scala/sbt/Defaults.scala +++ b/main/src/main/scala/sbt/Defaults.scala @@ -154,6 +154,8 @@ object Defaults extends BuildCommon { classpathEntryDefinesClass :== FileValueCache(Locate.definesClass _).get, traceLevel in run :== 0, traceLevel in runMain :== 0, + traceLevel in bgRun :== 0, + traceLevel in fgRun :== 0, traceLevel in console :== Int.MaxValue, traceLevel in consoleProject :== Int.MaxValue, autoCompilerPlugins :== true, diff --git a/main/src/main/scala/sbt/internal/LogManager.scala b/main/src/main/scala/sbt/internal/LogManager.scala index 982b6a45c..8409f01c2 100644 --- a/main/src/main/scala/sbt/internal/LogManager.scala +++ b/main/src/main/scala/sbt/internal/LogManager.scala @@ -198,13 +198,19 @@ object LogManager { val scope = task.scope val screenLevel = getOr(logLevel.key, data, scope, state, Level.Info) val backingLevel = getOr(persistLogLevel.key, data, scope, state, Level.Debug) + val screenTrace = getOr(traceLevel.key, data, scope, state, 0) val execOpt = state.currentCommand val loggerName: String = s"bg-${task.key.label}-${generateId.incrementAndGet}" val channelName: Option[String] = execOpt flatMap (_.source map (_.channelName)) // val execId: Option[String] = execOpt flatMap { _.execId } val log = LogExchange.logger(loggerName, channelName, None) LogExchange.unbindLoggerAppenders(loggerName) - val consoleOpt = consoleLocally(state, console) + val consoleOpt = consoleLocally(state, console) map { + case a: ConsoleAppender => + a.setTrace(screenTrace) + a + case a => a + } LogExchange.bindLoggerAppenders( loggerName, (consoleOpt.toList map { _ -> screenLevel }) ::: (relay -> backingLevel) :: Nil From 306ee82db3e885ffadbaba9ced542c960363436f Mon Sep 17 00:00:00 2001 From: Eugene Yokota Date: Wed, 27 Jun 2018 07:09:59 -0400 Subject: [PATCH 2/2] Use MessageOnlyException for "Nonzero exit code" --- build.sbt | 2 +- run/src/main/scala/sbt/Run.scala | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/build.sbt b/build.sbt index 93237deed..ee744ae6c 100644 --- a/build.sbt +++ b/build.sbt @@ -302,7 +302,7 @@ lazy val runProj = (project in file("run")) exclude[DirectMissingMethodProblem]("sbt.OutputStrategy#LoggedOutput.copy$default$*"), ) ) - .configure(addSbtIO, addSbtUtilLogging, addSbtCompilerClasspath) + .configure(addSbtIO, addSbtUtilLogging, addSbtUtilControl, addSbtCompilerClasspath) val sbtProjDepsCompileScopeFilter = ScopeFilter(inDependencies(LocalProject("sbtProj"), includeRoot = false), inConfigurations(Compile)) diff --git a/run/src/main/scala/sbt/Run.scala b/run/src/main/scala/sbt/Run.scala index a1fb598d6..6c6e599a6 100644 --- a/run/src/main/scala/sbt/Run.scala +++ b/run/src/main/scala/sbt/Run.scala @@ -12,6 +12,7 @@ import java.lang.reflect.{ Method, Modifier } import Modifier.{ isPublic, isStatic } import sbt.internal.inc.classpath.ClasspathUtilities import sbt.internal.inc.ScalaInstance +import sbt.internal.util.MessageOnlyException import sbt.io.Path @@ -29,7 +30,9 @@ class ForkRun(config: ForkOptions) extends ScalaRun { if (exitCode == 0) Success(()) else Failure( - new RuntimeException(s"""Nonzero exit code returned from $label: $exitCode""".stripMargin) + new MessageOnlyException( + s"""Nonzero exit code returned from $label: $exitCode""".stripMargin + ) ) val process = fork(mainClass, classpath, options, log) def cancel() = { @@ -124,6 +127,6 @@ object Run { if (exitCode == 0) { log.debug("Exited with code 0") Success(()) - } else Failure(new RuntimeException("Nonzero exit code: " + exitCode)) + } else Failure(new MessageOnlyException("Nonzero exit code: " + exitCode)) } }