From 681d320e647795eeae1273c86ce8c6a87c81bf15 Mon Sep 17 00:00:00 2001 From: vlad Date: Wed, 30 Oct 2024 05:20:11 +0400 Subject: [PATCH] add fallback way to retrieve `JAVA_HOME` via shell when `System.getenv()` fails --- .../java/com/osacky/doctor/DoctorPlugin.kt | 27 +++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/doctor-plugin/src/main/java/com/osacky/doctor/DoctorPlugin.kt b/doctor-plugin/src/main/java/com/osacky/doctor/DoctorPlugin.kt index a55a49d0..5db52423 100644 --- a/doctor-plugin/src/main/java/com/osacky/doctor/DoctorPlugin.kt +++ b/doctor-plugin/src/main/java/com/osacky/doctor/DoctorPlugin.kt @@ -47,7 +47,7 @@ class DoctorPlugin : Plugin { val intervalMeasurer = IntervalMeasurer() val pillBoxPrinter = PillBoxPrinter(target.logger) val daemonChecker = BuildDaemonChecker(extension, createDaemonChecker(os, cliCommandExecutor), pillBoxPrinter) - val javaHomeCheck = createJavaHomeCheck(extension, pillBoxPrinter) + val javaHomeCheck = createJavaHomeCheck(extension, pillBoxPrinter, cliCommandExecutor) val appleRosettaTranslationCheck = AppleRosettaTranslationCheck( os, @@ -161,12 +161,35 @@ class DoctorPlugin : Plugin { private fun createJavaHomeCheck( extension: DoctorExtension, pillBoxPrinter: PillBoxPrinter, + cliCommandExecutor: CliCommandExecutor, ): JavaHomeCheck { val jvmVariables = - JvmVariables(environmentJavaHome = System.getenv(JAVA_HOME), gradleJavaHome = Jvm.current().javaHome.path) + JvmVariables(environmentJavaHome = getenv(JAVA_HOME, cliCommandExecutor), gradleJavaHome = Jvm.current().javaHome.path) return JavaHomeCheck(jvmVariables, extension.javaHomeHandler, pillBoxPrinter) } + private fun getenv(name: String, cliCommandExecutor: CliCommandExecutor) = + System.getenv(name) ?: cliCommandExecutor.getenv(name) + + private fun CliCommandExecutor.getenv(name: String): String { + val isWindows = System.getProperty("os.name")?.contains("windows", ignoreCase = true) == true + + return execute( + if (isWindows) { + arrayOf("cmd.exe", "/c", "echo %$name%") + } else { + arrayOf( + (System.getenv("SHELL") ?: "/bin/bash"), + "-c", + "source ~/.bashrc 2>/dev/null; source ~/.zshrc 2>/dev/null; echo \$$name", + ) + } + ) + .trim() + .takeUnless { output -> isWindows && output == "%$name%" } // in case Windows outputs with %NAME% if the value is absent + .orEmpty() + } + private fun tagFreshDaemon( target: Project, buildScanApi: BuildScanAdapter,