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,