Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix for #2885 - output correct JAVA env setters in Windows bash sessions #2886

Merged
merged 3 commits into from
Nov 22, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/scripts/generate-os-packages.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -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"
Expand Down
2 changes: 2 additions & 0 deletions modules/cli/src/main/scala/coursier/cli/jvm/Java.scala
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,8 @@ object Java extends CoursierCommand[JavaOptions] {
val script =
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)
Expand Down
2 changes: 2 additions & 0 deletions modules/cli/src/main/scala/coursier/cli/jvm/JavaHome.scala
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@ object JavaHome extends CoursierCommand[JavaHomeOptions] {
val script =
if (params.env.windowsScript)
coursier.jvm.JavaHome.finalBatScript(envUpdate)
else if (params.env.windowsPosixScript)
coursier.jvm.JavaHome.finalBashScript(envUpdate).replace('\\', '/')
else
coursier.jvm.JavaHome.finalBashScript(envUpdate)
print(script)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down
59 changes: 50 additions & 9 deletions modules/cli/src/main/scala/coursier/cli/params/EnvParams.scala
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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?
Expand Down Expand Up @@ -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(_))

Expand All @@ -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
)
}
}
}