From f01f9667696188ce820ce190235cbdb9310c0b50 Mon Sep 17 00:00:00 2001 From: Alexey Katsman Date: Sat, 25 Jul 2026 16:30:03 +0200 Subject: [PATCH] PY-88674 create remote interpreters for the selected module Propagate the originating module through target wizards and language runtime configuration so interpreter setup uses the selected subproject instead of the root module. Adjust target upload and download mappings to synchronize project files relative to the remote working directory for sub-projects. GitOrigin-RevId: ec0a7280ee1c266c4c9f14c653779c914905300a --- .../execution-impl/api-dump-unreviewed.txt | 5 +++ .../execution/target/TargetCustomToolPanel.kt | 8 +++-- .../target/TargetCustomToolWizardStepBase.kt | 1 + .../target/TargetEnvironmentLanguagesPanel.kt | 34 +++++++++++++++---- .../target/TargetEnvironmentWizard.kt | 22 ++++++++++-- .../execution/target/TargetWizardModel.kt | 2 ++ .../execution/wsl/target/WslTargetType.kt | 13 +++++-- .../target/wizard/WslTargetLanguageStep.kt | 4 +-- .../wsl/target/wizard/WslTargetWizardModel.kt | 27 ++++++++++++--- platform/execution/api-dump-unreviewed.txt | 2 ++ .../execution/target/LanguageRuntimeType.kt | 8 +++++ .../execution/target/TargetEnvironmentType.kt | 7 ++++ .../impl/TargetEnvironmentRequestHandler.kt | 2 +- .../impl/processLaunchers/targets.kt | 10 ++++-- .../python/sdk/AddInterpreterActions.kt | 18 ++++++---- .../com/jetbrains/python/sdk/uv/impl/UvCli.kt | 2 +- .../target/PythonLanguageRuntimeType.kt | 13 +++++-- .../python/target/PythonLanguageRuntimeUI.kt | 19 +++++++---- 18 files changed, 158 insertions(+), 39 deletions(-) diff --git a/platform/execution-impl/api-dump-unreviewed.txt b/platform/execution-impl/api-dump-unreviewed.txt index 679479741b73..c69c08cb31fc 100644 --- a/platform/execution-impl/api-dump-unreviewed.txt +++ b/platform/execution-impl/api-dump-unreviewed.txt @@ -1124,6 +1124,7 @@ f:com.intellij.execution.target.TargetCustomToolWizardStepBase$Companion - f:getID():java.lang.Object f:com.intellij.execution.target.TargetEnvironmentLanguagesPanel - (com.intellij.openapi.project.Project,com.intellij.execution.target.TargetEnvironmentType,java.util.function.Supplier,com.intellij.execution.target.ContributedConfigurationsList,kotlin.jvm.functions.Function0):V +- (com.intellij.openapi.project.Project,com.intellij.openapi.module.Module,com.intellij.execution.target.TargetEnvironmentType,java.util.function.Supplier,com.intellij.execution.target.ContributedConfigurationsList,kotlin.jvm.functions.Function0):V - f:applyAll():V - f:disposeUIResources():V - f:getComponent():javax.swing.JComponent @@ -1135,12 +1136,14 @@ f:com.intellij.execution.target.TargetEnvironmentWizard - com.intellij.ide.wizard.AbstractWizardEx - sf:Companion:com.intellij.execution.target.TargetEnvironmentWizard$Companion - (com.intellij.openapi.project.Project,java.lang.String,com.intellij.execution.target.TargetEnvironmentConfiguration,java.util.List):V +- sf:createWizard(com.intellij.openapi.module.Module,com.intellij.execution.target.TargetEnvironmentType,com.intellij.execution.target.LanguageRuntimeType):com.intellij.execution.target.TargetEnvironmentWizard - sf:createWizard(com.intellij.openapi.project.Project,com.intellij.execution.target.TargetEnvironmentType,com.intellij.execution.target.LanguageRuntimeType):com.intellij.execution.target.TargetEnvironmentWizard - doCancelAction():V - f:getProject():com.intellij.openapi.project.Project - f:getSubject():com.intellij.execution.target.TargetEnvironmentConfiguration - show():V f:com.intellij.execution.target.TargetEnvironmentWizard$Companion +- f:createWizard(com.intellij.openapi.module.Module,com.intellij.execution.target.TargetEnvironmentType,com.intellij.execution.target.LanguageRuntimeType):com.intellij.execution.target.TargetEnvironmentWizard - f:createWizard(com.intellij.openapi.project.Project,com.intellij.execution.target.TargetEnvironmentType,com.intellij.execution.target.LanguageRuntimeType):com.intellij.execution.target.TargetEnvironmentWizard - f:defaultDialogInsets():com.intellij.util.ui.JBInsets a:com.intellij.execution.target.TargetEnvironmentWizardStepKt @@ -1175,6 +1178,7 @@ a:com.intellij.execution.target.TargetWizardModel - f:commit():V - p:doCommit():V - a:getLanguageConfigForIntrospection():com.intellij.execution.target.LanguageRuntimeConfiguration +- a:getModule():com.intellij.openapi.module.Module - a:getProject():com.intellij.openapi.project.Project - a:getSubject():com.intellij.execution.target.TargetEnvironmentConfiguration - prepareTarget():V @@ -1605,6 +1609,7 @@ f:com.intellij.execution.wsl.target.WslTargetType - createDefaultConfig():com.intellij.execution.wsl.target.WslTargetEnvironmentConfiguration - createEnvironmentRequest(com.intellij.openapi.project.Project,com.intellij.execution.wsl.target.WslTargetEnvironmentConfiguration):com.intellij.execution.target.TargetEnvironmentRequest - createSerializer(com.intellij.execution.wsl.target.WslTargetEnvironmentConfiguration):com.intellij.execution.wsl.target.WslTargetEnvironmentConfiguration +- createStepsForNewWizard(com.intellij.openapi.module.Module,com.intellij.execution.wsl.target.WslTargetEnvironmentConfiguration,com.intellij.execution.target.LanguageRuntimeType):java.util.List - createStepsForNewWizard(com.intellij.openapi.project.Project,com.intellij.execution.wsl.target.WslTargetEnvironmentConfiguration,com.intellij.execution.target.LanguageRuntimeType):java.util.List - duplicateConfig(com.intellij.execution.wsl.target.WslTargetEnvironmentConfiguration):com.intellij.execution.wsl.target.WslTargetEnvironmentConfiguration - getDisplayName():java.lang.String diff --git a/platform/execution-impl/src/com/intellij/execution/target/TargetCustomToolPanel.kt b/platform/execution-impl/src/com/intellij/execution/target/TargetCustomToolPanel.kt index 61881d797557..677f465e7c42 100644 --- a/platform/execution-impl/src/com/intellij/execution/target/TargetCustomToolPanel.kt +++ b/platform/execution-impl/src/com/intellij/execution/target/TargetCustomToolPanel.kt @@ -1,6 +1,7 @@ // Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.execution.target +import com.intellij.openapi.module.Module import com.intellij.openapi.options.Configurable import com.intellij.openapi.project.Project import com.intellij.openapi.ui.ValidationInfo @@ -18,6 +19,7 @@ import javax.swing.JPanel @ApiStatus.Internal class TargetCustomToolPanel( private val project: Project, + private val module: Module?, private val targetEnvironmentType: TargetEnvironmentType<*>, private val targetSupplier: Supplier, private val language: LanguageRuntimeConfiguration, @@ -69,7 +71,9 @@ class TargetCustomToolPanel( } private fun createRuntimePanel(language: LanguageRuntimeConfiguration): LanguagePanel { - val configurable = language.getRuntimeType().createConfigurable(project, language, targetEnvironmentType, targetSupplier) + val configurable = module?.let { + language.getRuntimeType().createConfigurable(it, language, targetEnvironmentType, targetSupplier) + } ?: language.getRuntimeType().createConfigurable(project, language, targetEnvironmentType, targetSupplier) (configurable as? CustomToolLanguageConfigurable<*>)?.apply { introspectable?.let { setIntrospectable(it) } stateChangedCallback?.let { registerStateChangedCallback(it) } @@ -91,4 +95,4 @@ class TargetCustomToolPanel( val configurable: Configurable, val panel: JComponent, ) -} \ No newline at end of file +} diff --git a/platform/execution-impl/src/com/intellij/execution/target/TargetCustomToolWizardStepBase.kt b/platform/execution-impl/src/com/intellij/execution/target/TargetCustomToolWizardStepBase.kt index 1c68b170c91f..446ba9b08ca5 100644 --- a/platform/execution-impl/src/com/intellij/execution/target/TargetCustomToolWizardStepBase.kt +++ b/platform/execution-impl/src/com/intellij/execution/target/TargetCustomToolWizardStepBase.kt @@ -49,6 +49,7 @@ abstract class TargetCustomToolWizardStepBase( // TODO [targets] get rid of `!!` in `model.languageConfigForIntrospection!!` customToolPanel = TargetCustomToolPanel( project = model.project, + module = model.module, targetEnvironmentType = model.subject.getTargetType(), targetSupplier = ::editingTargetConfiguration, language = model.languageConfigForIntrospection!!, diff --git a/platform/execution-impl/src/com/intellij/execution/target/TargetEnvironmentLanguagesPanel.kt b/platform/execution-impl/src/com/intellij/execution/target/TargetEnvironmentLanguagesPanel.kt index 1e510b951de1..32d5ee22f430 100644 --- a/platform/execution-impl/src/com/intellij/execution/target/TargetEnvironmentLanguagesPanel.kt +++ b/platform/execution-impl/src/com/intellij/execution/target/TargetEnvironmentLanguagesPanel.kt @@ -5,6 +5,7 @@ import com.intellij.execution.ExecutionBundle import com.intellij.openapi.actionSystem.ActionUpdateThread import com.intellij.openapi.actionSystem.AnAction import com.intellij.openapi.actionSystem.AnActionEvent +import com.intellij.openapi.module.Module import com.intellij.openapi.options.Configurable import com.intellij.openapi.project.Project import com.intellij.openapi.util.NlsActions @@ -26,11 +27,28 @@ import javax.swing.JPanel typealias LanguagesList = ContributedConfigurationsList> -class TargetEnvironmentLanguagesPanel(private val project: Project, - private val targetEnvironmentType: TargetEnvironmentType<*>, - private val targetSupplier: Supplier, - val languagesList: LanguagesList, - private val parentRefresh: () -> Unit) { +class TargetEnvironmentLanguagesPanel( + private val project: Project, + private val module: Module?, + private val targetEnvironmentType: TargetEnvironmentType<*>, + private val targetSupplier: Supplier, + val languagesList: LanguagesList, + private val parentRefresh: () -> Unit, +) { + + constructor( + project: Project, + targetEnvironmentType: TargetEnvironmentType<*>, + targetSupplier: Supplier, + languagesList: LanguagesList, + parentRefresh: () -> Unit, + ) : + this(project = project, + module = null, + targetEnvironmentType = targetEnvironmentType, + targetSupplier = targetSupplier, + languagesList = languagesList, + parentRefresh = parentRefresh) private val languagePanels = mutableListOf() @@ -92,7 +110,9 @@ class TargetEnvironmentLanguagesPanel(private val project: Project, } private fun createRuntimePanel(language: LanguageRuntimeConfiguration): LanguagePanel { - val configurable = language.getRuntimeType().createConfigurable(project, language, targetEnvironmentType, targetSupplier) + val configurable = module?.let { + language.getRuntimeType().createConfigurable(it, language, targetEnvironmentType, targetSupplier) + } ?: language.getRuntimeType().createConfigurable(project, language, targetEnvironmentType, targetSupplier) val panel = panel { row { val separator = TitledSeparator(language.getRuntimeType().configurableDescription) @@ -166,4 +186,4 @@ class TargetEnvironmentLanguagesPanel(private val project: Project, private data class LanguagePanel(val language: LanguageRuntimeConfiguration, val configurable: Configurable, val panel: JComponent) -} \ No newline at end of file +} diff --git a/platform/execution-impl/src/com/intellij/execution/target/TargetEnvironmentWizard.kt b/platform/execution-impl/src/com/intellij/execution/target/TargetEnvironmentWizard.kt index 65ee83b8dac2..0e3cab07141b 100644 --- a/platform/execution-impl/src/com/intellij/execution/target/TargetEnvironmentWizard.kt +++ b/platform/execution-impl/src/com/intellij/execution/target/TargetEnvironmentWizard.kt @@ -4,6 +4,7 @@ package com.intellij.execution.target import com.intellij.execution.ExecutionBundle import com.intellij.ide.wizard.AbstractWizardEx import com.intellij.ide.wizard.AbstractWizardStepEx +import com.intellij.openapi.module.Module import com.intellij.openapi.project.Project import com.intellij.openapi.ui.ValidationInfo import com.intellij.openapi.util.NlsContexts @@ -47,6 +48,18 @@ class TargetEnvironmentWizard(val project: Project, @JvmStatic fun createWizard( project: Project, targetType: TargetEnvironmentType, runtimeType: LanguageRuntimeType<*>? + ): TargetEnvironmentWizard? = createWizard(project, null, targetType, runtimeType) + + @JvmStatic + fun createWizard( + module: Module, targetType: TargetEnvironmentType, runtimeType: LanguageRuntimeType<*>? + ): TargetEnvironmentWizard? = createWizard(module.project, module, targetType, runtimeType) + + private fun createWizard( + project: Project, + module: Module?, + targetType: TargetEnvironmentType, + runtimeType: LanguageRuntimeType<*>?, ): TargetEnvironmentWizard? { if (!targetType.providesNewWizard(project, runtimeType)) { @@ -54,7 +67,12 @@ class TargetEnvironmentWizard(val project: Project, } val config = targetType.createDefaultConfig() - val steps = targetType.createStepsForNewWizard(project, config, runtimeType) ?: return null + val steps = if (module == null) { + targetType.createStepsForNewWizard(project, config, runtimeType) + } + else { + targetType.createStepsForNewWizard(module, config, runtimeType) + } ?: return null return TargetEnvironmentWizard( project, ExecutionBundle.message("run.on.targets.wizard.title.new.target"), config, steps) @@ -69,4 +87,4 @@ class TargetEnvironmentWizard(val project: Project, interface ValidationCallbackConsumer : Consumer<() -> Unit> { fun doValidateAll(): MutableList } -} \ No newline at end of file +} diff --git a/platform/execution-impl/src/com/intellij/execution/target/TargetWizardModel.kt b/platform/execution-impl/src/com/intellij/execution/target/TargetWizardModel.kt index d94a18838804..9a5e4324542d 100644 --- a/platform/execution-impl/src/com/intellij/execution/target/TargetWizardModel.kt +++ b/platform/execution-impl/src/com/intellij/execution/target/TargetWizardModel.kt @@ -1,10 +1,12 @@ // Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.execution.target +import com.intellij.openapi.module.Module import com.intellij.openapi.project.Project abstract class TargetWizardModel { abstract val project: Project + abstract val module: Module? abstract val subject: TargetEnvironmentConfiguration diff --git a/platform/execution-impl/src/com/intellij/execution/wsl/target/WslTargetType.kt b/platform/execution-impl/src/com/intellij/execution/wsl/target/WslTargetType.kt index 582f221d28b8..005723954143 100644 --- a/platform/execution-impl/src/com/intellij/execution/wsl/target/WslTargetType.kt +++ b/platform/execution-impl/src/com/intellij/execution/wsl/target/WslTargetType.kt @@ -15,6 +15,7 @@ import com.intellij.execution.wsl.target.wizard.WslTargetWizardModel import com.intellij.execution.wsl.ui.browseWslPath import com.intellij.icons.AllIcons import com.intellij.ide.wizard.AbstractWizardStepEx +import com.intellij.openapi.module.Module import com.intellij.openapi.options.Configurable import com.intellij.openapi.project.Project import com.intellij.openapi.ui.TextComponentAccessor @@ -46,8 +47,16 @@ class WslTargetType : TargetEnvironmentType(T override fun createStepsForNewWizard(project: Project, configToConfigure: WslTargetEnvironmentConfiguration, - runtimeType: LanguageRuntimeType<*>?): List { - val model = WslTargetWizardModel(project, configToConfigure, runtimeType, null) + runtimeType: LanguageRuntimeType<*>?): List = + createStepsForNewWizard(WslTargetWizardModel(project, configToConfigure, runtimeType, null), runtimeType) + + override fun createStepsForNewWizard(module: Module, + configToConfigure: WslTargetEnvironmentConfiguration, + runtimeType: LanguageRuntimeType<*>?): List = + createStepsForNewWizard(WslTargetWizardModel(module, configToConfigure, runtimeType, null), runtimeType) + + private fun createStepsForNewWizard(model: WslTargetWizardModel, + runtimeType: LanguageRuntimeType<*>?): List { val isCustomToolConfiguration = runtimeType is CustomToolLanguageRuntimeType model.isCustomToolConfiguration = isCustomToolConfiguration return listOf( diff --git a/platform/execution-impl/src/com/intellij/execution/wsl/target/wizard/WslTargetLanguageStep.kt b/platform/execution-impl/src/com/intellij/execution/wsl/target/wizard/WslTargetLanguageStep.kt index 5a7ace324e80..4f2a07781a8c 100644 --- a/platform/execution-impl/src/com/intellij/execution/wsl/target/wizard/WslTargetLanguageStep.kt +++ b/platform/execution-impl/src/com/intellij/execution/wsl/target/wizard/WslTargetLanguageStep.kt @@ -31,8 +31,8 @@ internal class WslTargetLanguageStep(model: WslTargetWizardModel) : WslTargetSte model.applyChanges() val targetSupplier: () -> TargetEnvironmentConfiguration = { model.subject } - languagesPanel = TargetEnvironmentLanguagesPanel(model.project, model.subject.getTargetType(), - targetSupplier, languagesForEditing) { + languagesPanel = TargetEnvironmentLanguagesPanel(model.project, model.module, + model.subject.getTargetType(), targetSupplier, languagesForEditing) { forceMainPanelLayout() }.also { mainPanel.addToCenter(it.component) diff --git a/platform/execution-impl/src/com/intellij/execution/wsl/target/wizard/WslTargetWizardModel.kt b/platform/execution-impl/src/com/intellij/execution/wsl/target/wizard/WslTargetWizardModel.kt index d446731f6bb3..2fe3d1c3dd00 100644 --- a/platform/execution-impl/src/com/intellij/execution/wsl/target/wizard/WslTargetWizardModel.kt +++ b/platform/execution-impl/src/com/intellij/execution/wsl/target/wizard/WslTargetWizardModel.kt @@ -8,13 +8,32 @@ import com.intellij.execution.target.getRuntimeType import com.intellij.execution.target.getTargetType import com.intellij.execution.wsl.WSLDistribution import com.intellij.execution.wsl.target.WslTargetEnvironmentConfiguration +import com.intellij.openapi.module.Module import com.intellij.openapi.project.Project import org.jetbrains.annotations.Nls -class WslTargetWizardModel(override val project: Project, - override val subject: WslTargetEnvironmentConfiguration, - runtimeType: LanguageRuntimeType<*>?, - var distribution: WSLDistribution?) : TargetWizardModel() { +class WslTargetWizardModel private constructor( + override val project: Project, + override val subject: WslTargetEnvironmentConfiguration, + runtimeType: LanguageRuntimeType<*>?, + var distribution: WSLDistribution?, + override val module: Module?, +) : TargetWizardModel() { + + constructor( + project: Project, + subject: WslTargetEnvironmentConfiguration, + runtimeType: LanguageRuntimeType<*>?, + distribution: WSLDistribution?, + ) : this(project, subject, runtimeType, distribution, null) + + constructor( + module: Module, + subject: WslTargetEnvironmentConfiguration, + runtimeType: LanguageRuntimeType<*>?, + distribution: WSLDistribution?, + ) : this(module.project, subject, runtimeType, distribution, module) + internal var isCustomToolConfiguration: Boolean = false override var languageConfigForIntrospection: LanguageRuntimeConfiguration? = runtimeType?.createDefaultConfig() diff --git a/platform/execution/api-dump-unreviewed.txt b/platform/execution/api-dump-unreviewed.txt index 3d1b8b8c991e..f28a27076080 100644 --- a/platform/execution/api-dump-unreviewed.txt +++ b/platform/execution/api-dump-unreviewed.txt @@ -700,6 +700,7 @@ f:com.intellij.execution.target.LanguageRuntimeConfiguration$VolumeState a:com.intellij.execution.target.LanguageRuntimeType - sf:Companion:com.intellij.execution.target.LanguageRuntimeType$Companion - sf:EXTENSION_NAME:com.intellij.openapi.extensions.ExtensionPointName +- createConfigurable(com.intellij.openapi.module.Module,com.intellij.execution.target.LanguageRuntimeConfiguration,com.intellij.execution.target.TargetEnvironmentType,java.util.function.Supplier):com.intellij.openapi.options.Configurable - a:createConfigurable(com.intellij.openapi.project.Project,com.intellij.execution.target.LanguageRuntimeConfiguration,com.intellij.execution.target.TargetEnvironmentType,java.util.function.Supplier):com.intellij.openapi.options.Configurable - createIntrospector(com.intellij.execution.target.LanguageRuntimeConfiguration):com.intellij.execution.target.LanguageRuntimeType$Introspector - a:findLanguageRuntime(com.intellij.execution.target.TargetEnvironmentConfiguration):com.intellij.execution.target.LanguageRuntimeConfiguration @@ -835,6 +836,7 @@ a:com.intellij.execution.target.TargetEnvironmentType - sf:EXTENSION_NAME:com.intellij.openapi.extensions.ExtensionPointName - a:createConfigurable(com.intellij.openapi.project.Project,com.intellij.execution.target.TargetEnvironmentConfiguration,com.intellij.execution.target.LanguageRuntimeType,com.intellij.openapi.options.Configurable):com.intellij.openapi.options.Configurable - a:createEnvironmentRequest(com.intellij.openapi.project.Project,com.intellij.execution.target.TargetEnvironmentConfiguration):com.intellij.execution.target.TargetEnvironmentRequest +- createStepsForNewWizard(com.intellij.openapi.module.Module,com.intellij.execution.target.TargetEnvironmentConfiguration,com.intellij.execution.target.LanguageRuntimeType):java.util.List - createStepsForNewWizard(com.intellij.openapi.project.Project,com.intellij.execution.target.TargetEnvironmentConfiguration,com.intellij.execution.target.LanguageRuntimeType):java.util.List - sf:duplicateTargetConfiguration(com.intellij.execution.target.TargetEnvironmentType,com.intellij.execution.target.TargetEnvironmentConfiguration):com.intellij.execution.target.TargetEnvironmentConfiguration - sf:findInstance(java.lang.Class):com.intellij.execution.target.TargetEnvironmentType diff --git a/platform/execution/src/com/intellij/execution/target/LanguageRuntimeType.kt b/platform/execution/src/com/intellij/execution/target/LanguageRuntimeType.kt index 9ec620488e9c..b55ce74e71a9 100644 --- a/platform/execution/src/com/intellij/execution/target/LanguageRuntimeType.kt +++ b/platform/execution/src/com/intellij/execution/target/LanguageRuntimeType.kt @@ -5,6 +5,7 @@ import com.intellij.execution.RunnerAndConfigurationSettings import com.intellij.execution.process.ProcessOutput import com.intellij.execution.target.LanguageRuntimeType.Companion.EXTENSION_NAME import com.intellij.openapi.extensions.ExtensionPointName +import com.intellij.openapi.module.Module import com.intellij.openapi.options.Configurable import com.intellij.openapi.project.Project import com.intellij.openapi.util.NlsContexts @@ -62,6 +63,13 @@ abstract class LanguageRuntimeType(id: String) targetSupplier: Supplier, ): Configurable + open fun createConfigurable( + module: Module, + config: C, + targetEnvironmentType: TargetEnvironmentType<*>, + targetSupplier: Supplier, + ): Configurable = createConfigurable(module.project, config, targetEnvironmentType, targetSupplier) + abstract fun findLanguageRuntime(target: TargetEnvironmentConfiguration): C? companion object { diff --git a/platform/execution/src/com/intellij/execution/target/TargetEnvironmentType.kt b/platform/execution/src/com/intellij/execution/target/TargetEnvironmentType.kt index 4cb87f961724..fb66d9fa0b93 100644 --- a/platform/execution/src/com/intellij/execution/target/TargetEnvironmentType.kt +++ b/platform/execution/src/com/intellij/execution/target/TargetEnvironmentType.kt @@ -6,6 +6,7 @@ import com.intellij.execution.target.TargetEnvironmentType.Companion.getTargetTy import com.intellij.ide.wizard.AbstractWizardStepEx import com.intellij.openapi.components.PersistentStateComponent import com.intellij.openapi.extensions.ExtensionPointName +import com.intellij.openapi.module.Module import com.intellij.openapi.options.Configurable import com.intellij.openapi.project.Project import org.jetbrains.annotations.ApiStatus @@ -41,6 +42,12 @@ abstract class TargetEnvironmentType(id: Str open fun createStepsForNewWizard(project: Project, configToConfigure: C, runtimeType: LanguageRuntimeType<*>?) : List? = null + /** + * Prepares the wizard for setting up the new configuration instance of this type. + */ + open fun createStepsForNewWizard(module: Module, configToConfigure: C, runtimeType: LanguageRuntimeType<*>?) + : List? = createStepsForNewWizard(module.project, configToConfigure, runtimeType) + /** * Instantiates a new environment factory for given prepared [configuration][config]. */ diff --git a/python/python-exec-service/src/com/intellij/python/community/execService/impl/TargetEnvironmentRequestHandler.kt b/python/python-exec-service/src/com/intellij/python/community/execService/impl/TargetEnvironmentRequestHandler.kt index 1824a8514c5b..fa249f622761 100644 --- a/python/python-exec-service/src/com/intellij/python/community/execService/impl/TargetEnvironmentRequestHandler.kt +++ b/python/python-exec-service/src/com/intellij/python/community/execService/impl/TargetEnvironmentRequestHandler.kt @@ -96,7 +96,7 @@ abstract class TargetEnvironmentRequestHandler(pri } } localDirs.filterNot { localPath -> - request.uploadVolumes.any { it.localRootPath == localPath } + request.uploadVolumes.any { localPath.startsWith(it.localRootPath) } }.associateWith { localPath -> val localPathToTargetRes = localPathToTarget(localPath) val root = TargetEnvironment.UploadRoot( diff --git a/python/python-exec-service/src/com/intellij/python/community/execService/impl/processLaunchers/targets.kt b/python/python-exec-service/src/com/intellij/python/community/execService/impl/processLaunchers/targets.kt index 8f95488179c6..dbf499bb2895 100644 --- a/python/python-exec-service/src/com/intellij/python/community/execService/impl/processLaunchers/targets.kt +++ b/python/python-exec-service/src/com/intellij/python/community/execService/impl/processLaunchers/targets.kt @@ -242,13 +242,19 @@ private class TargetProcessCommands( private suspend fun downloadAfterExecution() { if (downloadConfig == null) return + val workingDirOnTarget = info.cwd ?: return targetEnv.downloadVolumes.forEach { (_, volume) -> + if (!workingDirOnTarget.startsWith(volume.targetRoot)) return@forEach + val downloadRelativeDir = if (workingDirOnTarget != volume.targetRoot) { + workingDirOnTarget.substringAfter(volume.targetRoot + "/") + "/" + } + else workingDirOnTarget val paths = downloadConfig.relativePaths.takeIf { it.isNotEmpty() } ?: listOf(".") for (path in paths) { coroutineToIndicator { try { - volume.download(path, it) + volume.download(downloadRelativeDir + path, it) } catch (e: IOException) { fileLogger().warn("Could not download $path: ${e.message}") @@ -326,7 +332,7 @@ private fun mapDownloadRoots( if (matchingUpload != null) { TargetEnvironment.DownloadRoot( - localRootPath = localDir, + localRootPath = matchingUpload.localRootPath, targetRootPath = matchingUpload.targetRootPath, ) } diff --git a/python/src/com/jetbrains/python/sdk/AddInterpreterActions.kt b/python/src/com/jetbrains/python/sdk/AddInterpreterActions.kt index 8ae695900753..a3ac38e44975 100644 --- a/python/src/com/jetbrains/python/sdk/AddInterpreterActions.kt +++ b/python/src/com/jetbrains/python/sdk/AddInterpreterActions.kt @@ -93,12 +93,12 @@ fun collectAddInterpreterActions(moduleOrProject: ModuleOrProject, onSdkCreated: if (targetModuleSitsOn == null) { add(createAddLocalInterpreterAction(moduleOrProject, onSdkCreated::accept)) } - addAll(collectNewInterpreterOnTargetActions(moduleOrProject.project, targetModuleSitsOn, onSdkCreated::accept)) + addAll(collectNewInterpreterOnTargetActions(moduleOrProject, targetModuleSitsOn, onSdkCreated::accept)) } } private fun collectNewInterpreterOnTargetActions( - project: Project, + moduleOrProject: ModuleOrProject, targetTypeModuleSitsOn: TargetConfigurationWithLocalFsAccess?, onSdkCreated: (Sdk) -> Unit, ): List = @@ -106,8 +106,8 @@ private fun collectNewInterpreterOnTargetActions( .filter { it.getTargetType().isSystemCompatible() } .filter { targetTypeModuleSitsOn == null || targetTypeModuleSitsOn.allowCreationTargetOfThisType(it.getTargetType()) } // filter create new interpreter actions on targets that need to be associated with module like PyDockerComposeTargetEnvironmentFactory - .filterNot { project.isDefault && it.needAssociateWithModule() } - .map { AddInterpreterOnTargetAction(project, it.getTargetType(), onSdkCreated) } + .filterNot { moduleOrProject.project.isDefault && it.needAssociateWithModule() } + .map { AddInterpreterOnTargetAction(moduleOrProject, it.getTargetType(), onSdkCreated) } internal class AddLocalInterpreterAction( private val moduleOrProject: ModuleOrProject, @@ -131,17 +131,21 @@ internal class AddLocalInterpreterAction( } internal class AddInterpreterOnTargetAction( - private val project: Project, + private val moduleOrProject: ModuleOrProject, private val targetType: TargetEnvironmentType<*>, private val onSdkCreated: (Sdk) -> Unit, ) : DialogAction( dynamicText = PyBundle.messagePointer("python.sdk.action.add.interpreter.based.on.target.text", targetType.displayName), icon = targetType.icon, target = targetType.displayName, - project = project, + project = moduleOrProject.project, ), DumbAware { override fun createDialog(): TargetEnvironmentWizard? { - val wizard = TargetEnvironmentWizard.createWizard(project, targetType, PythonLanguageRuntimeType.Helper.getInstance()) + val runtimeType = PythonLanguageRuntimeType.Helper.getInstance() + val wizard = when (moduleOrProject) { + is ModuleAndProject -> TargetEnvironmentWizard.createWizard(moduleOrProject.module, targetType, runtimeType) + is ProjectOnly -> TargetEnvironmentWizard.createWizard(moduleOrProject.project, targetType, runtimeType) + } wizard?.let { Disposer.register(it.disposable, Disposable { diff --git a/python/src/com/jetbrains/python/sdk/uv/impl/UvCli.kt b/python/src/com/jetbrains/python/sdk/uv/impl/UvCli.kt index 0e87610f537c..881a9b7cec44 100644 --- a/python/src/com/jetbrains/python/sdk/uv/impl/UvCli.kt +++ b/python/src/com/jetbrains/python/sdk/uv/impl/UvCli.kt @@ -117,4 +117,4 @@ internal suspend fun

createUvCli( PyResult.localizedError(error.message) } else PyResult.success(UvCliImpl(dispatcher, path!!, fileSystem)) -} \ No newline at end of file +} diff --git a/python/src/com/jetbrains/python/target/PythonLanguageRuntimeType.kt b/python/src/com/jetbrains/python/target/PythonLanguageRuntimeType.kt index 26e732a35022..ef32763a0445 100644 --- a/python/src/com/jetbrains/python/target/PythonLanguageRuntimeType.kt +++ b/python/src/com/jetbrains/python/target/PythonLanguageRuntimeType.kt @@ -7,8 +7,10 @@ import com.intellij.execution.target.LanguageRuntimeType import com.intellij.execution.target.TargetEnvironmentConfiguration import com.intellij.execution.target.TargetEnvironmentType import com.intellij.openapi.components.PersistentStateComponent +import com.intellij.openapi.module.Module import com.intellij.openapi.options.Configurable import com.intellij.openapi.project.Project +import com.intellij.openapi.project.modules import com.intellij.openapi.util.NlsSafe import com.jetbrains.python.PyBundle import com.jetbrains.python.parser.icons.PythonParserIcons @@ -47,7 +49,14 @@ internal class PythonLanguageRuntimeType : LanguageRuntimeType, targetSupplier: Supplier): Configurable = - PythonLanguageRuntimeUI(project, config, targetSupplier) + PythonLanguageRuntimeUI(project.modules.first(), config, targetSupplier) + + override fun createConfigurable( + module: Module, + config: PythonLanguageRuntimeConfiguration, + targetEnvironmentType: TargetEnvironmentType<*>, + targetSupplier: Supplier, + ): Configurable = PythonLanguageRuntimeUI(module, config, targetSupplier) override fun findLanguageRuntime(target: TargetEnvironmentConfiguration): PythonLanguageRuntimeConfiguration? = target.runtimes.findByType() @@ -56,4 +65,4 @@ internal class PythonLanguageRuntimeType : LanguageRuntimeType, ) : BoundConfigurable(message("configurable.name.python.language")), CustomToolLanguageConfigurable { - private val module: Module = project.modules.first() // TODO get the real one, this behaviour was copied from legacy "createSdkForTarget" + private val project get() = module.project + private var introspectable: LanguageRuntimeType.Introspectable? = null private var stateChangedCallback: (() -> Unit)? = null @@ -56,7 +57,7 @@ internal class PythonLanguageRuntimeUI( override fun createPanel(): DialogPanel { val targetEnvironmentConfiguration = targetSupplier.get() val model = PythonLocalAddInterpreterModel( - ProjectPathFlows.create(Path.of(project.basePath!!)), + ProjectPathFlows.create(getProjectPath()), TargetFileSystem( targetEnvironmentConfiguration = targetEnvironmentConfiguration, pythonLanguageRuntimeConfiguration = config, @@ -129,4 +130,8 @@ internal class PythonLanguageRuntimeUI( } override fun validate(): Collection = validationErrors + + private fun getProjectPath(): Path = + module.baseDir?.path?.toNioPathOrNull() + ?: project.basePath?.toNioPathOrNull()!! }