diff --git a/python/intellij.python.community.impl.iml b/python/intellij.python.community.impl.iml index f28d30771660..db46cbbded1a 100644 --- a/python/intellij.python.community.impl.iml +++ b/python/intellij.python.community.impl.iml @@ -117,5 +117,6 @@ + \ No newline at end of file diff --git a/python/src/com/jetbrains/python/sdk/add/target/conda/PyAddCondaTools.kt b/python/src/com/jetbrains/python/sdk/add/target/conda/PyAddCondaTools.kt index 9f1ddb6c17fa..a8c4c3f6b3eb 100644 --- a/python/src/com/jetbrains/python/sdk/add/target/conda/PyAddCondaTools.kt +++ b/python/src/com/jetbrains/python/sdk/add/target/conda/PyAddCondaTools.kt @@ -12,7 +12,6 @@ import com.intellij.openapi.project.Project import com.intellij.openapi.projectRoots.Sdk import com.intellij.openapi.projectRoots.impl.ProjectJdkImpl import com.intellij.openapi.projectRoots.impl.SdkConfigurationUtil -import com.intellij.execution.target.FullPathOnTarget import com.jetbrains.python.sdk.PythonSdkAdditionalData import com.jetbrains.python.sdk.PythonSdkType import com.jetbrains.python.sdk.flavors.PyFlavorAndData @@ -24,6 +23,7 @@ import kotlinx.coroutines.withContext import java.nio.file.Path import kotlin.coroutines.CoroutineContext import kotlin.io.path.isExecutable +import kotlin.io.path.pathString /** * See [com.jetbrains.env.conda.PyCondaSdkTest] @@ -42,6 +42,7 @@ suspend fun PyCondaCommand.createCondaSdkFromExistingEnv(condaIdentity: PyCondaE PythonSdkType.getInstance()) sdk.sdkAdditionalData = additionalData sdk.homePath = sdk.getPythonBinaryPath(project).getOrThrow() + saveLocalPythonCondaPath(Path.of(fullCondaPathOnTarget)) return sdk } @@ -57,7 +58,12 @@ suspend fun PyCondaCommand.createCondaSdkAlongWithNewEnv(newCondaEnvInfo: NewCon val error = ProcessHandlerReader(process).runProcessAndGetError(uiContext, sink) return error?.let { Result.failure(Exception(it)) } - ?: Result.success(createCondaSdkFromExistingEnv(PyCondaEnvIdentity.NamedEnv(newCondaEnvInfo.envName), existingSdks, project)) + ?: Result.success( + createCondaSdkFromExistingEnv(PyCondaEnvIdentity.NamedEnv(newCondaEnvInfo.envName), existingSdks, project)).apply { + onSuccess { + saveLocalPythonCondaPath(Path.of(this@createCondaSdkAlongWithNewEnv.fullCondaPathOnTarget)) + } + } } /** @@ -65,7 +71,7 @@ suspend fun PyCondaCommand.createCondaSdkAlongWithNewEnv(newCondaEnvInfo: NewCon */ suspend fun suggestCondaPath(configuration: TargetEnvironmentConfiguration?): FullPathOnTarget? { val request = configuration?.createEnvironmentRequest(null) ?: LocalTargetEnvironmentRequest() - val possiblePaths: Array = when (request.targetPlatform.platform) { + var possiblePaths: Array = when (request.targetPlatform.platform) { Platform.UNIX -> arrayOf("~/anaconda3/bin/conda", "~/miniconda3/bin/conda", "/usr/local/bin/conda", @@ -80,6 +86,12 @@ suspend fun suggestCondaPath(configuration: TargetEnvironmentConfiguration?): Fu "%USERPROFILE%\\Miniconda3\\condabin\\conda.bat" ) } + // If conda is local then store path + if (configuration == null) { + loadLocalPythonCondaPath()?.let { + possiblePaths = arrayOf(it.pathString) + possiblePaths + } + } return possiblePaths.firstNotNullOfOrNull { request.getExpandedPathIfExecutable(it) } } diff --git a/python/src/com/jetbrains/python/sdk/add/target/conda/PyCondaLocalPathStorage.kt b/python/src/com/jetbrains/python/sdk/add/target/conda/PyCondaLocalPathStorage.kt new file mode 100644 index 000000000000..ffa2eae73f5c --- /dev/null +++ b/python/src/com/jetbrains/python/sdk/add/target/conda/PyCondaLocalPathStorage.kt @@ -0,0 +1,17 @@ +// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package com.jetbrains.python.sdk.add.target.conda + +import com.intellij.ide.util.PropertiesComponent +import java.nio.file.Path +import kotlin.io.path.pathString + +private const val PYCHARM_CONDA_FULL_LOCAL_PATH = "PYCHARM_CONDA_FULL_LOCAL_PATH" + + +fun saveLocalPythonCondaPath(condaPath: Path) { + PropertiesComponent.getInstance().setValue(PYCHARM_CONDA_FULL_LOCAL_PATH, condaPath.pathString) +} + +fun loadLocalPythonCondaPath(): Path? = PropertiesComponent.getInstance().getValue(PYCHARM_CONDA_FULL_LOCAL_PATH)?.let { + Path.of(it) +} \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/env/conda/PyCondaTest.kt b/python/testSrc/com/jetbrains/env/conda/PyCondaTest.kt index c3e86559e9d1..a88d29c60ff1 100644 --- a/python/testSrc/com/jetbrains/env/conda/PyCondaTest.kt +++ b/python/testSrc/com/jetbrains/env/conda/PyCondaTest.kt @@ -9,6 +9,8 @@ import com.intellij.execution.target.local.LocalTargetEnvironmentRequest import com.intellij.testFramework.ProjectRule import com.jetbrains.getPythonVersion import com.jetbrains.python.psi.LanguageLevel +import com.jetbrains.python.sdk.add.target.conda.loadLocalPythonCondaPath +import com.jetbrains.python.sdk.add.target.conda.saveLocalPythonCondaPath import com.jetbrains.python.sdk.flavors.conda.CondaEnvSdkFlavor import com.jetbrains.python.sdk.flavors.conda.NewCondaEnvRequest.* import com.jetbrains.python.sdk.flavors.conda.PyCondaEnv @@ -33,6 +35,13 @@ internal class PyCondaTest { @JvmField internal val chain = RuleChain.outerRule(ProjectRule()).around(condaRule).around(yamlRule) + + @Test + fun testLocalPathSaveLoad() { + saveLocalPythonCondaPath(condaRule.condaPath) + Assert.assertEquals("Incorrectly loaded path", condaRule.condaPath, loadLocalPythonCondaPath()) + } + @Test fun testCondaCreateByYaml() = runTest { PyCondaEnv.createEnv(condaRule.condaCommand,