From 3966d2fcb2eedd133303d9be1a3356478d33ad07 Mon Sep 17 00:00:00 2001 From: Ethan Atkins Date: Sun, 27 Sep 2020 10:16:04 -0700 Subject: [PATCH] Catch interrupted exceptions in blockUntilNextExec It is possible for an InterruptedException to be thrown here because of logic in NetworkClient. This seemed to be the root cause of the fix I tried in ca251eb7c8e09ee0aad88b2ff36e976f7432fb4f so I'm reverting that commit. Revert "Catch interrupted exception in shell" This reverts commit ca251eb7c8e09ee0aad88b2ff36e976f7432fb4f. --- main/src/main/scala/sbt/Main.scala | 24 +++++++++---------- .../scala/sbt/internal/CommandExchange.scala | 3 ++- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/main/src/main/scala/sbt/Main.scala b/main/src/main/scala/sbt/Main.scala index 4207d7fd0..8f1617c02 100644 --- a/main/src/main/scala/sbt/Main.scala +++ b/main/src/main/scala/sbt/Main.scala @@ -1041,19 +1041,17 @@ object BuiltinCommands { .extract(s1) .getOpt(Keys.minForcegcInterval) .getOrElse(GCUtil.defaultMinForcegcInterval) - try { - val exec: Exec = getExec(s1, minGCInterval) - val newState = s1 - .copy( - onFailure = Some(Exec(Shell, None)), - remainingCommands = exec +: Exec(Shell, None) +: s1.remainingCommands - ) - .setInteractive(true) - val res = - if (exec.commandLine.trim.isEmpty) newState - else newState.clearGlobalLog - res - } catch { case _: InterruptedException => s1.exit(true) } + val exec: Exec = getExec(s1, minGCInterval) + val newState = s1 + .copy( + onFailure = Some(Exec(Shell, None)), + remainingCommands = exec +: Exec(Shell, None) +: s1.remainingCommands + ) + .setInteractive(true) + val res = + if (exec.commandLine.trim.isEmpty) newState + else newState.clearGlobalLog + res } } diff --git a/main/src/main/scala/sbt/internal/CommandExchange.scala b/main/src/main/scala/sbt/internal/CommandExchange.scala index 5c3520779..1f97340bf 100644 --- a/main/src/main/scala/sbt/internal/CommandExchange.scala +++ b/main/src/main/scala/sbt/internal/CommandExchange.scala @@ -91,7 +91,7 @@ private[sbt] final class CommandExchange { case s @ Seq(_, _) => Some(s.min) case s => s.headOption } - Option(deadline match { + try Option(deadline match { case Some(d: Deadline) => commandQueue.poll(d.timeLeft.toMillis + 1, TimeUnit.MILLISECONDS) match { case null if idleDeadline.fold(false)(_.isOverdue) => @@ -106,6 +106,7 @@ private[sbt] final class CommandExchange { } case _ => commandQueue.take }) + catch { case _: InterruptedException => None } } poll match { case Some(exec) if exec.source.fold(true)(s => channels.exists(_.name == s.channelName)) =>