From 63c9a1ae9346be4a94d326d20750bd92ca0f0bfa Mon Sep 17 00:00:00 2001 From: Ethan Atkins Date: Fri, 18 Dec 2020 16:07:42 -0800 Subject: [PATCH 1/7] Catch RejectedExecutionException in MainLoop sbt 1.4.x was printing a very verbose and annoying RejectedExectionException when the user cancelled tasks with ctrl+c. Fixes #6192 --- main/src/main/scala/sbt/MainLoop.scala | 9 ++++++++- tasks/src/main/scala/sbt/ConcurrentRestrictions.scala | 4 +++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/main/src/main/scala/sbt/MainLoop.scala b/main/src/main/scala/sbt/MainLoop.scala index 384b05cf2..e404cd801 100644 --- a/main/src/main/scala/sbt/MainLoop.scala +++ b/main/src/main/scala/sbt/MainLoop.scala @@ -8,6 +8,7 @@ package sbt import java.io.PrintWriter +import java.util.concurrent.RejectedExecutionException import java.util.Properties import sbt.BasicCommandStrings.{ StashOnFailure, networkExecPrefix } @@ -240,6 +241,13 @@ object MainLoop { FastTrackCommands .evaluate(termState, exec.commandLine) .getOrElse(Command.process(exec.commandLine, termState)) + } catch { + case _: RejectedExecutionException => + // No stack trace since this is just to notify the user which command they cancelled + object Cancelled extends Throwable(exec.commandLine, null, true, false) { + override def toString: String = s"Cancelled: ${exec.commandLine}" + } + throw Cancelled } finally { // Flush the terminal output after command evaluation to ensure that all output // is displayed in the thin client before we report the command status. Also @@ -328,5 +336,4 @@ object MainLoop { if (prevState.onFailure.isDefined && state.onFailure.isEmpty && state.currentCommand.fold(true)(_ != StashOnFailure)) ExitCode(ErrorCodes.UnknownError) else ExitCode.Success - } diff --git a/tasks/src/main/scala/sbt/ConcurrentRestrictions.scala b/tasks/src/main/scala/sbt/ConcurrentRestrictions.scala index d2407ccf4..f57b2f02e 100644 --- a/tasks/src/main/scala/sbt/ConcurrentRestrictions.scala +++ b/tasks/src/main/scala/sbt/ConcurrentRestrictions.scala @@ -305,7 +305,9 @@ object ConcurrentRestrictions { def take(): R = { if (closed.get) - throw new IllegalStateException("Tried to get values for a closed completion service") + throw new RejectedExecutionException( + "Tried to get values for a closed completion service" + ) jservice.take().get() } } From 95148f12f5384bdce0d2124ad251d2ed126cf70b Mon Sep 17 00:00:00 2001 From: Eugene Yokota Date: Fri, 15 Jan 2021 16:43:19 -0500 Subject: [PATCH 2/7] Avoid the whitespace after completion --- .../src/main/scala/sbt/internal/util/LineReader.scala | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/internal/util-complete/src/main/scala/sbt/internal/util/LineReader.scala b/internal/util-complete/src/main/scala/sbt/internal/util/LineReader.scala index 3475bff1d..be0be0097 100644 --- a/internal/util-complete/src/main/scala/sbt/internal/util/LineReader.scala +++ b/internal/util-complete/src/main/scala/sbt/internal/util/LineReader.scala @@ -63,11 +63,14 @@ object LineReader { * `testOnly testOnly\ com.foo.FooSpec` instead of `testOnly com.foo.FooSpec`. */ if (c.append.nonEmpty) { - if (!pl.line().endsWith(" ")) { - candidates.add(new Candidate(pl.line().split(" ").last + c.append)) - } else { - candidates.add(new Candidate(c.append)) + val cand = pl.line() match { + case line if line.endsWith(" ") => c.append + case line => line.split(" ").last + c.append } + // https://github.com/jline/jline3/blob/9a4971868e4bdd29a36e454de01f54d3cd6071e0/reader/src/main/java/org/jline/reader/Candidate.java#L123-L131 + // "If the candidate is complete and is selected, a space separator will be added." + val complete = false + candidates.add(new Candidate(cand, cand, null, null, null, null, complete)) } } } From e6282f5a711871d124ceaaa89659901325b72f8d Mon Sep 17 00:00:00 2001 From: Cyrille Chepelov Date: Fri, 22 Jan 2021 17:10:35 +0100 Subject: [PATCH 3/7] bump lm-coursier-shaded to 2.0.6 (includes coursier 2.0.9) --- project/Dependencies.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Dependencies.scala b/project/Dependencies.scala index e60739662..1d8f3fc53 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -77,7 +77,7 @@ object Dependencies { def addSbtZincCompile = addSbtModule(sbtZincPath, "zincCompileJVM2_12", zincCompile) def addSbtZincCompileCore = addSbtModule(sbtZincPath, "zincCompileCoreJVM2_12", zincCompileCore) - val lmCoursierShaded = "io.get-coursier" %% "lm-coursier-shaded" % "2.0.5" + val lmCoursierShaded = "io.get-coursier" %% "lm-coursier-shaded" % "2.0.6" def sjsonNew(n: String) = Def.setting("com.eed3si9n" %% n % "0.9.1") // contrabandSjsonNewVersion.value From 416429f83e5f604369c98d316489f91184ccf432 Mon Sep 17 00:00:00 2001 From: Eugene Yokota Date: Sun, 24 Jan 2021 23:36:02 -0500 Subject: [PATCH 4/7] Deprecate externalPom Ref #5493 --- .../scala/sbt/internal/util/appmacro/ContextUtil.scala | 2 +- main/src/main/scala/sbt/Defaults.scala | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/core-macros/src/main/scala/sbt/internal/util/appmacro/ContextUtil.scala b/core-macros/src/main/scala/sbt/internal/util/appmacro/ContextUtil.scala index 4bec6e63d..e87b13a21 100644 --- a/core-macros/src/main/scala/sbt/internal/util/appmacro/ContextUtil.scala +++ b/core-macros/src/main/scala/sbt/internal/util/appmacro/ContextUtil.scala @@ -157,7 +157,7 @@ final class ContextUtil[C <: blackbox.Context](val ctx: C) { case _ => () } - @deprecated("1.3.0", "Use that variant that specifies the M instance types to exclude") + @deprecated("Use that variant that specifies the M instance types to exclude", since = "1.3.0") /** * A function that checks the provided tree for illegal references to M instances defined in the * expression passed to the macro and for illegal dereferencing of M instances. diff --git a/main/src/main/scala/sbt/Defaults.scala b/main/src/main/scala/sbt/Defaults.scala index 6bd2b83c9..6061072db 100644 --- a/main/src/main/scala/sbt/Defaults.scala +++ b/main/src/main/scala/sbt/Defaults.scala @@ -4175,6 +4175,10 @@ trait BuildExtra extends BuildCommon with DefExtra { baseDirectory.value / name } + @deprecated( + "externalIvyFile is not supported by Couriser, and will be removed in the future", + since = "1.5.0" + ) def externalIvyFile( file: Initialize[File] = inBase("ivy.xml"), iScala: Initialize[Option[ScalaModuleInfo]] = scalaModuleInfo @@ -4186,6 +4190,10 @@ trait BuildExtra extends BuildCommon with DefExtra { managedScalaInstance.value ) + @deprecated( + "externalPom is not supported by Coursier, and will be removed in the future", + since = "1.5.0" + ) def externalPom( file: Initialize[File] = inBase("pom.xml"), iScala: Initialize[Option[ScalaModuleInfo]] = scalaModuleInfo, From 192bca6a0ad1d8ae4d2cb32a56d91837900584ff Mon Sep 17 00:00:00 2001 From: Sam Halliday Date: Thu, 21 Jan 2021 10:33:44 +0000 Subject: [PATCH 5/7] Terminal support for GNU Emacs --- .../src/main/scala/sbt/internal/util/Util.scala | 2 ++ .../src/main/scala/sbt/internal/util/Terminal.scala | 8 ++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/internal/util-collection/src/main/scala/sbt/internal/util/Util.scala b/internal/util-collection/src/main/scala/sbt/internal/util/Util.scala index 06afd24a7..0155306c8 100644 --- a/internal/util-collection/src/main/scala/sbt/internal/util/Util.scala +++ b/internal/util-collection/src/main/scala/sbt/internal/util/Util.scala @@ -64,6 +64,8 @@ object Util { lazy val isNonCygwinWindows: Boolean = isWindows && !isCygwin lazy val isCygwinWindows: Boolean = isWindows && isCygwin + lazy val isEmacs: Boolean = Option(System.getenv("INSIDE_EMACS")).isDefined + def nil[A]: List[A] = List.empty[A] def nilSeq[A]: Seq[A] = Seq.empty[A] def none[A]: Option[A] = (None: Option[A]) diff --git a/internal/util-logging/src/main/scala/sbt/internal/util/Terminal.scala b/internal/util-logging/src/main/scala/sbt/internal/util/Terminal.scala index d7cca5535..dac378cdf 100644 --- a/internal/util-logging/src/main/scala/sbt/internal/util/Terminal.scala +++ b/internal/util-logging/src/main/scala/sbt/internal/util/Terminal.scala @@ -317,7 +317,10 @@ object Terminal { props .map(_.color) .orElse(isColorEnabledProp) - .getOrElse(logFormatEnabled.getOrElse(true) && ((hasConsole && !isDumbTerminal) || isCI)) + .getOrElse( + logFormatEnabled + .getOrElse(true) && ((hasConsole && !isDumbTerminal) || isCI || Util.isEmacs) + ) } private[this] lazy val isColorEnabledProp: Option[Boolean] = sys.props.get("sbt.color").orElse(sys.props.get("sbt.colour")).flatMap(parseLogOption) @@ -867,7 +870,8 @@ object Terminal { .map(_.supershell) .getOrElse(System.getProperty("sbt.supershell") match { case null => - !(sys.env.contains("BUILD_NUMBER") || sys.env.contains("CI")) && isColorEnabled + !(sys.env.contains("BUILD_NUMBER") || sys.env + .contains("CI")) && isColorEnabled && !Util.isEmacs case "true" => true case _ => false }) From c1c04387d03017d8c43af62cc0da66d0841d1c04 Mon Sep 17 00:00:00 2001 From: Sam Halliday Date: Thu, 21 Jan 2021 10:34:48 +0000 Subject: [PATCH 6/7] git ignore .bsp --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 0fe4c39e5..a9190442a 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,5 @@ npm-debug.log .idea .bloop .metals +.bsp/ /project/metals.sbt From 75311c6e57ed5da77f4cbb038448880ef5df743f Mon Sep 17 00:00:00 2001 From: Sam Halliday Date: Thu, 21 Jan 2021 10:51:00 +0000 Subject: [PATCH 7/7] nohup the server from GNU Emacs --- .../main/scala/sbt/internal/client/NetworkClient.scala | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/main-command/src/main/scala/sbt/internal/client/NetworkClient.scala b/main-command/src/main/scala/sbt/internal/client/NetworkClient.scala index 9e47c279e..9ae1125c8 100644 --- a/main-command/src/main/scala/sbt/internal/client/NetworkClient.scala +++ b/main-command/src/main/scala/sbt/internal/client/NetworkClient.scala @@ -330,8 +330,14 @@ class NetworkClient( val cmd = List(arguments.sbtScript) ++ arguments.sbtArguments ++ List(BasicCommandStrings.DashDashDetachStdio, BasicCommandStrings.DashDashServer) + + // https://github.com/sbt/sbt/issues/6271 + val nohup = + if (Util.isEmacs && !Util.isWindows) List("nohup") + else Nil + val processBuilder = - new ProcessBuilder(cmd: _*) + new ProcessBuilder((nohup ++ cmd): _*) .directory(arguments.baseDirectory) .redirectInput(Redirect.PIPE) processBuilder.environment.put(Terminal.TERMINAL_PROPS, props)