PY-57184: Store local conda path

We can't store it for random target since target lacks of ID, but for local it is possible

GitOrigin-RevId: e8f68f8e68347e5493daab7ca15f81f1e42eda66
This commit is contained in:
Ilya.Kazakevich
2022-11-08 03:11:58 +00:00
committed by intellij-monorepo-bot
parent d783fbc288
commit 6358b3a523
4 changed files with 42 additions and 3 deletions
@@ -117,5 +117,6 @@
<orderEntry type="library" name="jackson" level="project" />
<orderEntry type="library" name="jackson-databind" level="project" />
<orderEntry type="module" module-name="intellij.python.community.core.impl" />
<orderEntry type="module" module-name="intellij.platform.core" />
</component>
</module>
@@ -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<FullPathOnTarget> = when (request.targetPlatform.platform) {
var possiblePaths: Array<FullPathOnTarget> = 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) }
}
@@ -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)
}
+9
View File
@@ -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,