From 63a78b8541833f41942dc8fa6c6966159693b0de Mon Sep 17 00:00:00 2001 From: philwalk Date: Thu, 16 Nov 2023 18:55:44 -0700 Subject: [PATCH 1/3] fix for #2885 --- .github/scripts/generate-os-packages.sh | 4 ++-- modules/cli/src/main/scala/coursier/cli/jvm/Java.scala | 8 +++++--- .../cli/src/main/scala/coursier/cli/jvm/JavaHome.scala | 9 ++++++--- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/.github/scripts/generate-os-packages.sh b/.github/scripts/generate-os-packages.sh index 6b31afb80b..562ee7e213 100755 --- a/.github/scripts/generate-os-packages.sh +++ b/.github/scripts/generate-os-packages.sh @@ -6,7 +6,7 @@ ARCHITECTURE=$(uname -m) ARTIFACTS_DIR="artifacts/" mkdir -p "$ARTIFACTS_DIR" -if [[ "$OSTYPE" == "msys" ]]; then +if [[ -z "$OSTYPE" ]]; then mill="./mill.bat" else mill="./mill" @@ -17,7 +17,7 @@ launcher() { local launcherMillCommand="cliNativeImageLauncher" local launcherName - if [[ "$OSTYPE" == "msys" ]]; then + if [[ "$OS" == "Windows_NT" ]]; then launcherName="cs.exe" else launcherName="cs" diff --git a/modules/cli/src/main/scala/coursier/cli/jvm/Java.scala b/modules/cli/src/main/scala/coursier/cli/jvm/Java.scala index d24430056c..fcf898ccbd 100644 --- a/modules/cli/src/main/scala/coursier/cli/jvm/Java.scala +++ b/modules/cli/src/main/scala/coursier/cli/jvm/Java.scala @@ -140,20 +140,22 @@ object Java extends CoursierCommand[JavaOptions] { sys.exit(1) } + def windowsShell = Option(System.getenv("OSTYPE")).getOrElse("") + if (params.env.env) { val script = - if (params.env.windowsScript) + if (params.env.windowsScript && windowsShell.isEmpty) coursier.jvm.JavaHome.finalBatScript(envUpdate) else ShellUtil.shell() match { case Some(Shell.Fish) => coursier.jvm.JavaHome.finalFishScript(envUpdate) - case _ => coursier.jvm.JavaHome.finalBashScript(envUpdate) + case _ => coursier.jvm.JavaHome.finalBashScript(envUpdate).replace('\\', '/') } print(script) } else if (params.env.disableEnv) { val script = - if (params.env.windowsScript) + if (params.env.windowsScript && windowsShell.isEmpty) coursier.jvm.JavaHome.disableBatScript() else ShellUtil.shell() match { diff --git a/modules/cli/src/main/scala/coursier/cli/jvm/JavaHome.scala b/modules/cli/src/main/scala/coursier/cli/jvm/JavaHome.scala index 9b82999323..2ea0bf861f 100644 --- a/modules/cli/src/main/scala/coursier/cli/jvm/JavaHome.scala +++ b/modules/cli/src/main/scala/coursier/cli/jvm/JavaHome.scala @@ -44,17 +44,20 @@ object JavaHome extends CoursierCommand[JavaHomeOptions] { } lazy val envUpdate = javaHome.environmentFor(isSystem, home) + + def windowsShell = Option(System.getenv("OSTYPE")).getOrElse("") + if (params.env.env) { val script = - if (params.env.windowsScript) + if (params.env.windowsScript && windowsShell.isEmpty) coursier.jvm.JavaHome.finalBatScript(envUpdate) else - coursier.jvm.JavaHome.finalBashScript(envUpdate) + coursier.jvm.JavaHome.finalBashScript(envUpdate).replace('\\', '/') print(script) } else if (params.env.disableEnv) { val script = - if (params.env.windowsScript) + if (params.env.windowsScript && windowsShell.isEmpty) coursier.jvm.JavaHome.disableBatScript() else coursier.jvm.JavaHome.disableBashScript() From c159545b62a3ad088554395ec122b33ccb03bcea Mon Sep 17 00:00:00 2001 From: philwalk Date: Fri, 17 Nov 2023 09:56:49 -0700 Subject: [PATCH 2/3] fix native-launcher test --- .github/scripts/generate-os-packages.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/scripts/generate-os-packages.sh b/.github/scripts/generate-os-packages.sh index 562ee7e213..16e972f784 100755 --- a/.github/scripts/generate-os-packages.sh +++ b/.github/scripts/generate-os-packages.sh @@ -17,7 +17,7 @@ launcher() { local launcherMillCommand="cliNativeImageLauncher" local launcherName - if [[ "$OS" == "Windows_NT" ]]; then + if [[ "${OS-}" == "Windows_NT" ]]; then launcherName="cs.exe" else launcherName="cs" From 79e8923de626ef15d7c5699cd595584231ebce5c Mon Sep 17 00:00:00 2001 From: Alexandre Archambault Date: Mon, 20 Nov 2023 16:21:21 +0100 Subject: [PATCH 3/3] Manage Windows Posix script via command-line options --- .../main/scala/coursier/cli/jvm/Java.scala | 10 ++-- .../scala/coursier/cli/jvm/JavaHome.scala | 11 ++-- .../coursier/cli/options/EnvOptions.scala | 6 +- .../scala/coursier/cli/params/EnvParams.scala | 59 ++++++++++++++++--- 4 files changed, 65 insertions(+), 21 deletions(-) diff --git a/modules/cli/src/main/scala/coursier/cli/jvm/Java.scala b/modules/cli/src/main/scala/coursier/cli/jvm/Java.scala index fcf898ccbd..4e638fa98f 100644 --- a/modules/cli/src/main/scala/coursier/cli/jvm/Java.scala +++ b/modules/cli/src/main/scala/coursier/cli/jvm/Java.scala @@ -140,22 +140,22 @@ object Java extends CoursierCommand[JavaOptions] { sys.exit(1) } - def windowsShell = Option(System.getenv("OSTYPE")).getOrElse("") - if (params.env.env) { val script = - if (params.env.windowsScript && windowsShell.isEmpty) + if (params.env.windowsScript) coursier.jvm.JavaHome.finalBatScript(envUpdate) + else if (params.env.windowsPosixScript) + coursier.jvm.JavaHome.finalBashScript(envUpdate).replace('\\', '/') else ShellUtil.shell() match { case Some(Shell.Fish) => coursier.jvm.JavaHome.finalFishScript(envUpdate) - case _ => coursier.jvm.JavaHome.finalBashScript(envUpdate).replace('\\', '/') + case _ => coursier.jvm.JavaHome.finalBashScript(envUpdate) } print(script) } else if (params.env.disableEnv) { val script = - if (params.env.windowsScript && windowsShell.isEmpty) + if (params.env.windowsScript) coursier.jvm.JavaHome.disableBatScript() else ShellUtil.shell() match { diff --git a/modules/cli/src/main/scala/coursier/cli/jvm/JavaHome.scala b/modules/cli/src/main/scala/coursier/cli/jvm/JavaHome.scala index 2ea0bf861f..4ee4b178ed 100644 --- a/modules/cli/src/main/scala/coursier/cli/jvm/JavaHome.scala +++ b/modules/cli/src/main/scala/coursier/cli/jvm/JavaHome.scala @@ -44,20 +44,19 @@ object JavaHome extends CoursierCommand[JavaHomeOptions] { } lazy val envUpdate = javaHome.environmentFor(isSystem, home) - - def windowsShell = Option(System.getenv("OSTYPE")).getOrElse("") - if (params.env.env) { val script = - if (params.env.windowsScript && windowsShell.isEmpty) + if (params.env.windowsScript) coursier.jvm.JavaHome.finalBatScript(envUpdate) - else + else if (params.env.windowsPosixScript) coursier.jvm.JavaHome.finalBashScript(envUpdate).replace('\\', '/') + else + coursier.jvm.JavaHome.finalBashScript(envUpdate) print(script) } else if (params.env.disableEnv) { val script = - if (params.env.windowsScript && windowsShell.isEmpty) + if (params.env.windowsScript) coursier.jvm.JavaHome.disableBatScript() else coursier.jvm.JavaHome.disableBashScript() diff --git a/modules/cli/src/main/scala/coursier/cli/options/EnvOptions.scala b/modules/cli/src/main/scala/coursier/cli/options/EnvOptions.scala index 2efb8c2114..96c70b431b 100644 --- a/modules/cli/src/main/scala/coursier/cli/options/EnvOptions.scala +++ b/modules/cli/src/main/scala/coursier/cli/options/EnvOptions.scala @@ -18,7 +18,11 @@ final case class EnvOptions( @Group(OptionGroup.scripting) @Hidden - windowsScript: Boolean = Properties.isWin, + windowsScript: Option[Boolean] = None, + + @Group(OptionGroup.scripting) + @Hidden + windowsPosixScript: Option[Boolean] = None, @Group(OptionGroup.scripting) @HelpMessage("Sets the default JVM to be used") diff --git a/modules/cli/src/main/scala/coursier/cli/params/EnvParams.scala b/modules/cli/src/main/scala/coursier/cli/params/EnvParams.scala index a65b0b03e1..8ce55979b1 100644 --- a/modules/cli/src/main/scala/coursier/cli/params/EnvParams.scala +++ b/modules/cli/src/main/scala/coursier/cli/params/EnvParams.scala @@ -3,6 +3,7 @@ package coursier.cli.params import java.nio.file.{Path, Paths} import cats.data.{Validated, ValidatedNel} +import cats.implicits._ import coursier.cli.options.EnvOptions import coursier.env.{EnvironmentUpdate, ProfileUpdater, WindowsEnvVarUpdater} import coursier.launcher.internal.Windows @@ -15,7 +16,8 @@ final case class EnvParams( disableEnv: Boolean, setup: Boolean, homeOpt: Option[Path], - windowsScript: Boolean + windowsScript: Boolean, + windowsPosixScript: Boolean ) { def anyFlag: Boolean = env || setup // TODO Allow to customize some parameters of WindowsEnvVarUpdater / ProfileUpdater? @@ -87,6 +89,10 @@ final case class EnvParams( } object EnvParams { + + def defaultWindowsPosixScript: Boolean = + Properties.isWin && Option(System.getenv("OSTYPE")).exists(_.trim.nonEmpty) + def apply(options: EnvOptions): ValidatedNel[String, EnvParams] = { val homeOpt = options.userHome.filter(_.nonEmpty).map(Paths.get(_)) @@ -103,14 +109,49 @@ object EnvParams { else Validated.validNel(()) - flagsV.map { _ => - EnvParams( - options.env, - options.disableEnv, - options.setup, - homeOpt, - options.windowsScript - ) + val windowsScriptValues0 = (options.windowsScript, options.windowsPosixScript) match { + case (Some(true), Some(true)) => + Validated.invalidNel("Cannot specify both --windows-script and --windows-posix-script") + case (Some(true), _) => + Validated.validNel(Some(true)) + case (_, Some(true)) => + Validated.validNel(Some(false)) + case (Some(false), Some(false)) => + Validated.validNel(None) + case (None, Some(false)) => + Validated.validNel { + if (Properties.isWin) Some(true) + else None + } + case (Some(false), None) => + Validated.validNel { + if (defaultWindowsPosixScript) Some(false) + else None + } + case (None, None) => + Validated.validNel { + if (defaultWindowsPosixScript) Some(false) + else if (Properties.isWin) Some(true) + else None + } + } + + val windowsScriptValues = windowsScriptValues0.map { + case Some(true) => (true, false) + case Some(false) => (false, true) + case None => (false, false) + } + + (flagsV, windowsScriptValues).mapN { + case (_, (windowsScript, windowsPosixScript)) => + EnvParams( + options.env, + options.disableEnv, + options.setup, + homeOpt, + windowsScript, + windowsPosixScript + ) } } }