diff --git a/build.sbt b/build.sbt index e23addb45..81949a48c 100644 --- a/build.sbt +++ b/build.sbt @@ -1071,6 +1071,7 @@ lazy val mainProj = (project in file("main")) exclude[MissingClassProblem]("sbt.internal.server.BuildServerReporter$"), exclude[IncompatibleTemplateDefProblem]("sbt.internal.server.BuildServerReporter"), exclude[MissingClassProblem]("sbt.internal.CustomHttp*"), + exclude[ReversedMissingMethodProblem]("sbt.JobHandle.isAutoCancel"), ) ) .configure( diff --git a/main/src/main/scala/sbt/BackgroundJobService.scala b/main/src/main/scala/sbt/BackgroundJobService.scala index 6dc8deb81..62aaec76d 100644 --- a/main/src/main/scala/sbt/BackgroundJobService.scala +++ b/main/src/main/scala/sbt/BackgroundJobService.scala @@ -100,4 +100,5 @@ abstract class JobHandle { def id: Long def humanReadableName: String def spawningTask: ScopedKey[_] + def isAutoCancel: Boolean } diff --git a/main/src/main/scala/sbt/Defaults.scala b/main/src/main/scala/sbt/Defaults.scala index 1a8f61463..a86e7a0a1 100644 --- a/main/src/main/scala/sbt/Defaults.scala +++ b/main/src/main/scala/sbt/Defaults.scala @@ -2039,6 +2039,11 @@ object Defaults extends BuildCommon { def foregroundRunMainTask: Initialize[InputTask[Unit]] = Def.inputTask { val handle = bgRunMain.evaluated + handle match { + case threadJobHandle: AbstractBackgroundJobService#ThreadJobHandle => + threadJobHandle.isAutoCancel = true + case _ => + } val service = bgJobService.value service.waitForTry(handle).get } @@ -2047,6 +2052,11 @@ object Defaults extends BuildCommon { def foregroundRunTask: Initialize[InputTask[Unit]] = Def.inputTask { val handle = bgRun.evaluated + handle match { + case threadJobHandle: AbstractBackgroundJobService#ThreadJobHandle => + threadJobHandle.isAutoCancel = true + case _ => + } val service = bgJobService.value service.waitForTry(handle).get } diff --git a/main/src/main/scala/sbt/internal/DefaultBackgroundJobService.scala b/main/src/main/scala/sbt/internal/DefaultBackgroundJobService.scala index ffce759d2..218cb3289 100644 --- a/main/src/main/scala/sbt/internal/DefaultBackgroundJobService.scala +++ b/main/src/main/scala/sbt/internal/DefaultBackgroundJobService.scala @@ -114,7 +114,8 @@ private[sbt] abstract class AbstractBackgroundJobService extends BackgroundJobSe override val spawningTask: ScopedKey[_], val logger: ManagedLogger, val workingDirectory: File, - val job: BackgroundJob + val job: BackgroundJob, + @volatile var isAutoCancel: Boolean = false, ) extends AbstractJobHandle { // EC for onStop handler below implicit val executionContext: ExecutionContext = @@ -140,6 +141,7 @@ private[sbt] abstract class AbstractBackgroundJobService extends BackgroundJobSe private final class DeadHandle(override val id: Long, override val humanReadableName: String) extends AbstractJobHandle { override val spawningTask: ScopedKey[_] = unknownTask + override val isAutoCancel = false } def doRunInBackground( @@ -513,7 +515,7 @@ private[sbt] object DefaultBackgroundJobService { backgroundJobServices .values() .forEach(jobService => { - jobService.jobs.foreach(jobService.stop) + jobService.jobs.filter(_.isAutoCancel).foreach(jobService.stop) }) }