Skip to content

Commit

Permalink
Update
Browse files Browse the repository at this point in the history
  • Loading branch information
DmitryDodzin committed Dec 16, 2024
1 parent b1a1e7f commit 34c74d0
Showing 1 changed file with 43 additions and 21 deletions.
Original file line number Diff line number Diff line change
@@ -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<MirrordProjectService>()

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,
Expand All @@ -22,35 +54,25 @@ class PythonCommandLineProvider : PythonCommandLineTargetEnvironmentProvider {
val service = project.service<MirrordProjectService>()

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 ->
Expand Down

0 comments on commit 34c74d0

Please sign in to comment.