Fail fast when multiple addons are run

This commit is contained in:
eikek
2022-05-19 23:58:53 +02:00
parent 29a5894884
commit 47bd6cd0ba
7 changed files with 226 additions and 9 deletions

View File

@ -46,7 +46,12 @@ object AddonExecutor {
in.cacheDir,
in.addons
)
rs <- ctx.traverse(c => runAddon(logger.withAddon(c), in.env)(c))
rs <-
if (cfg.failFast) ctx.foldLeftM(List.empty[AddonResult]) { (res, c) =>
if (res.headOption.exists(_.isFailure)) res.pure[F]
else runAddon(logger.withAddon(c), in.env)(c).map(r => r :: res)
}
else ctx.traverse(c => runAddon(logger.withAddon(c), in.env)(c))
pure = ctx.foldl(true)((b, c) => b && c.meta.isPure)
} yield AddonExecutionResult(rs, pure)
}

View File

@ -15,7 +15,8 @@ case class AddonExecutorConfig(
runTimeout: Duration,
nspawn: NSpawn,
nixRunner: NixConfig,
dockerRunner: DockerConfig
dockerRunner: DockerConfig,
failFast: Boolean
)
object AddonExecutorConfig {

View File

@ -25,6 +25,7 @@ sealed trait AddonResult {
}
object AddonResult {
val emptySuccess: AddonResult = success(AddonOutput.empty)
/** The addon was run successful, but decoding its stdout failed. */
case class DecodingError(message: String) extends AddonResult {