From 34c74d02e12d401eb5de27a8a7e4e4e76a8e9edb Mon Sep 17 00:00:00 2001 From: Dmitry Dodzin Date: Mon, 16 Dec 2024 15:26:41 +0200 Subject: [PATCH] Update --- .../pycharm/PythonCommandLineProvider.kt | 64 +++++++++++++------ 1 file changed, 43 insertions(+), 21 deletions(-) diff --git a/modules/products/pycharm/src/main/kotlin/com/metalbear/mirrord/products/pycharm/PythonCommandLineProvider.kt b/modules/products/pycharm/src/main/kotlin/com/metalbear/mirrord/products/pycharm/PythonCommandLineProvider.kt index 48f9c16f..d0364daa 100644 --- a/modules/products/pycharm/src/main/kotlin/com/metalbear/mirrord/products/pycharm/PythonCommandLineProvider.kt +++ b/modules/products/pycharm/src/main/kotlin/com/metalbear/mirrord/products/pycharm/PythonCommandLineProvider.kt @@ -1,18 +1,50 @@ package com.metalbear.mirrord.products.pycharm +import com.intellij.execution.target.TargetEnvironmentRequest import com.intellij.execution.wsl.target.WslTargetEnvironmentRequest import com.intellij.openapi.components.service import com.intellij.openapi.project.Project -import com.intellij.openapi.util.SystemInfo import com.jetbrains.python.run.AbstractPythonRunConfiguration import com.jetbrains.python.run.PythonExecution import com.jetbrains.python.run.PythonRunParams import com.jetbrains.python.run.target.HelpersAwareTargetEnvironmentRequest import com.jetbrains.python.run.target.PythonCommandLineTargetEnvironmentProvider -import com.metalbear.mirrord.MirrordBinaryManager import com.metalbear.mirrord.MirrordProjectService class PythonCommandLineProvider : PythonCommandLineTargetEnvironmentProvider { + private class DockerRuntimeConfig(val inner: TargetEnvironmentRequest) { + + var runCliOptions: String? + get() { + val runCliOptionsField = inner.javaClass.getDeclaredField("myRunCliOptions"); + return if (runCliOptionsField.trySetAccessible()) { + runCliOptionsField.get(inner) as String + } else { + null + } + } + set(value) { + inner + .javaClass + .getMethod("setRunCliOptions", Class.forName("java.lang.String")) + .invoke(inner, value) + } + } + + private fun extendContainerTargetEnvironment(project: Project, runParams: PythonRunParams, docker: DockerRuntimeConfig) { + val service = project.service() + + service.execManager.wrapper("pycharm", runParams.getEnvs()).apply { + this.wsl = null + }.containerStart()?.let { executionInfo -> + docker.runCliOptions?.let { + executionInfo.extraArgs.add(it) + } + + docker.runCliOptions = executionInfo.extraArgs.joinToString(" ") + } + } + override fun extendTargetEnvironment( project: Project, helpersAwareTargetRequest: HelpersAwareTargetEnvironmentRequest, @@ -22,35 +54,25 @@ class PythonCommandLineProvider : PythonCommandLineTargetEnvironmentProvider { val service = project.service() if (runParams is AbstractPythonRunConfiguration<*>) { - val wsl = helpersAwareTargetRequest.targetEnvironmentRequest.let { - if (it is WslTargetEnvironmentRequest) { - it.configuration.distribution - } else { - null - } - } - val docker = helpersAwareTargetRequest.targetEnvironmentRequest.let { if (it.javaClass.name.startsWith("com.intellij.docker")) { - it + DockerRuntimeConfig(it) } else { null } } if (docker != null) { - service.execManager.wrapper("pycharm", runParams.getEnvs()).apply { - this.wsl = wsl - }.containerStart()?.let { executionInfo -> - val runCliOptionsField = docker.javaClass.getDeclaredField("myRunCliOptions"); - if (runCliOptionsField.trySetAccessible()) { - val runCliOptions = runCliOptionsField.get(docker) as String - executionInfo.extraArgs.add(runCliOptions); + extendContainerTargetEnvironment(project, runParams, docker) + } else { + val wsl = helpersAwareTargetRequest.targetEnvironmentRequest.let { + if (it is WslTargetEnvironmentRequest) { + it.configuration.distribution + } else { + null } - - docker.javaClass.getMethod("setRunCliOptions", Class.forName("java.lang.String")).invoke(docker, executionInfo.extraArgs.joinToString(" ")) } - } else { + service.execManager.wrapper("pycharm", runParams.getEnvs()).apply { this.wsl = wsl }.start()?.let { executionInfo ->