From 8a9fdccfb0283d3576bf99cb21d76ad7aee865a9 Mon Sep 17 00:00:00 2001 From: Semyon Proshev Date: Wed, 20 Mar 2019 17:52:54 +0300 Subject: [PATCH] Increase usage of cached sdk env --- .../python/sdk/PyVirtualEnvTerminalCustomizer.kt | 2 +- .../quickfix/GenerateBinaryStubsFix.java | 2 +- .../python/run/PythonCommandLineState.java | 9 +-------- .../com/jetbrains/python/sdk/PythonSdkType.java | 14 +++++++++++++- .../com/jetbrains/python/sdk/PythonSdkUpdater.java | 3 +-- .../com/jetbrains/python/sdk/flavors/PyCondaRun.kt | 2 +- .../python/sdk/skeletons/PySkeletonGenerator.java | 4 ++-- 7 files changed, 20 insertions(+), 16 deletions(-) diff --git a/python/python-terminal/src/com/jetbrains/python/sdk/PyVirtualEnvTerminalCustomizer.kt b/python/python-terminal/src/com/jetbrains/python/sdk/PyVirtualEnvTerminalCustomizer.kt index 821d94dfd14c..9176d2ad36c1 100644 --- a/python/python-terminal/src/com/jetbrains/python/sdk/PyVirtualEnvTerminalCustomizer.kt +++ b/python/python-terminal/src/com/jetbrains/python/sdk/PyVirtualEnvTerminalCustomizer.kt @@ -51,7 +51,7 @@ class PyVirtualEnvTerminalCustomizer : LocalTerminalCustomizer() { } else { //for other shells we read envs from activate script by the default shell and pass them to the process - envs.putAll(PythonSdkType.activateVirtualEnv(path)) + envs.putAll(PythonSdkType.activateVirtualEnv(sdk)) } } } diff --git a/python/src/com/jetbrains/python/inspections/quickfix/GenerateBinaryStubsFix.java b/python/src/com/jetbrains/python/inspections/quickfix/GenerateBinaryStubsFix.java index f30d7615a7f7..a2d1fd7e7b2d 100644 --- a/python/src/com/jetbrains/python/inspections/quickfix/GenerateBinaryStubsFix.java +++ b/python/src/com/jetbrains/python/inspections/quickfix/GenerateBinaryStubsFix.java @@ -175,7 +175,7 @@ public class GenerateBinaryStubsFix implements LocalQuickFix { GeneralCommandLine cmd = PythonHelper.EXTRA_SYSPATH.newCommandLine(homePath, Lists.newArrayList(myQualifiedName)); final ProcessOutput runResult = PySdkUtil.getProcessOutput(cmd, new File(homePath).getParent(), - PythonSdkType.activateVirtualEnv(homePath), 5000 + PythonSdkType.activateVirtualEnv(mySdk), 5000 ); if (runResult.getExitCode() == 0 && !runResult.isTimeout()) { final String extraPath = runResult.getStdout(); diff --git a/python/src/com/jetbrains/python/run/PythonCommandLineState.java b/python/src/com/jetbrains/python/run/PythonCommandLineState.java index b7b86361017d..33e1cb893d6c 100644 --- a/python/src/com/jetbrains/python/run/PythonCommandLineState.java +++ b/python/src/com/jetbrains/python/run/PythonCommandLineState.java @@ -369,14 +369,7 @@ public abstract class PythonCommandLineState extends CommandLineState { Sdk sdk = PythonSdkType.findSdkByPath(sdkHome); if (sdk != null && (Registry.is("python.activate.virtualenv.on.run") && PythonSdkType.isVirtualEnv(sdkHome) || PythonSdkType.isConda(sdk))) { - Map environment = sdk.getUserData(PythonSdkType.ENVIRONMENT_KEY); - - if (environment == null) { - environment = PythonSdkType.activateVirtualEnv(sdkHome); - - sdk.putUserData(PythonSdkType.ENVIRONMENT_KEY, environment); - } - + Map environment = PythonSdkType.activateVirtualEnv(sdk); env.putAll(environment); for (Map.Entry e : myConfig.getEnvs().entrySet()) { diff --git a/python/src/com/jetbrains/python/sdk/PythonSdkType.java b/python/src/com/jetbrains/python/sdk/PythonSdkType.java index be8c08cad1c5..1a398bdb0915 100644 --- a/python/src/com/jetbrains/python/sdk/PythonSdkType.java +++ b/python/src/com/jetbrains/python/sdk/PythonSdkType.java @@ -101,7 +101,7 @@ public final class PythonSdkType extends SdkType { private static final Key> SDK_CREATOR_COMPONENT_KEY = Key.create("#com.jetbrains.python.sdk.creatorComponent"); private static final Predicate REMOTE_SDK_PREDICATE = PythonSdkType::isRemote; - public static final Key> ENVIRONMENT_KEY = Key.create("ENVIRONMENT_KEY"); + private static final Key> ENVIRONMENT_KEY = Key.create("ENVIRONMENT_KEY"); public static PythonSdkType getInstance() { return SdkType.findInstance(PythonSdkType.class); @@ -972,6 +972,18 @@ public final class PythonSdkType extends SdkType { return !isRemote(sdk); } + @NotNull + public static Map activateVirtualEnv(@NotNull Sdk sdk) { + final Map cached = sdk.getUserData(ENVIRONMENT_KEY); + if (cached != null) return cached; + + final String sdkHome = sdk.getHomePath(); + if (sdkHome == null) return Collections.emptyMap(); + + final Map environment = activateVirtualEnv(sdkHome); + sdk.putUserData(ENVIRONMENT_KEY, environment); + return environment; + } @NotNull public static Map activateVirtualEnv(@NotNull String sdkHome) { diff --git a/python/src/com/jetbrains/python/sdk/PythonSdkUpdater.java b/python/src/com/jetbrains/python/sdk/PythonSdkUpdater.java index a50db50e5328..3c6c72b8c361 100644 --- a/python/src/com/jetbrains/python/sdk/PythonSdkUpdater.java +++ b/python/src/com/jetbrains/python/sdk/PythonSdkUpdater.java @@ -122,8 +122,7 @@ public class PythonSdkUpdater implements StartupActivity { String sdkHome = sdk.getHomePath(); if (sdkHome != null && (PythonSdkType.isVirtualEnv(sdkHome) || PythonSdkType.isConda(sdk))) { final Future updateSdkFeature = application.executeOnPooledThread(() -> { - sdk.putUserData(PythonSdkType.ENVIRONMENT_KEY, - PythonSdkType.activateVirtualEnv(sdkHome)); // pre-cache virtualenv activated environment + PythonSdkType.activateVirtualEnv(sdk); // pre-cache virtualenv activated environment }); if (ApplicationManager.getApplication().isUnitTestMode()) { // Running SDK update in background is inappropriate for tests: test may complete before update and updater thread will leak diff --git a/python/src/com/jetbrains/python/sdk/flavors/PyCondaRun.kt b/python/src/com/jetbrains/python/sdk/flavors/PyCondaRun.kt index 66a11415527d..c9f02c59e39a 100644 --- a/python/src/com/jetbrains/python/sdk/flavors/PyCondaRun.kt +++ b/python/src/com/jetbrains/python/sdk/flavors/PyCondaRun.kt @@ -21,7 +21,7 @@ fun runConda(condaExecutable: String, arguments: List): ProcessOutput { @Throws(PyExecutionException::class) fun runConda(sdk: Sdk, arguments: List): ProcessOutput { - return findCondaExecutable(sdk).let { run(it, arguments, sdk.getUserData(PythonSdkType.ENVIRONMENT_KEY) ?: readCondaEnv(it)) } + return run(findCondaExecutable(sdk), arguments, PythonSdkType.activateVirtualEnv(sdk)) } @Throws(PyExecutionException::class) diff --git a/python/src/com/jetbrains/python/sdk/skeletons/PySkeletonGenerator.java b/python/src/com/jetbrains/python/sdk/skeletons/PySkeletonGenerator.java index 9afcd007fd69..8e77a78d8b67 100644 --- a/python/src/com/jetbrains/python/sdk/skeletons/PySkeletonGenerator.java +++ b/python/src/com/jetbrains/python/sdk/skeletons/PySkeletonGenerator.java @@ -212,7 +212,7 @@ public class PySkeletonGenerator { "-d", mySkeletonsPath, // output dir "-b", // for builtins }, - PythonSdkType.activateVirtualEnv(binaryPath), MINUTE * 5 + PythonSdkType.activateVirtualEnv(sdk), MINUTE * 5 ); runResult.checkSuccess(LOG); LOG.info("Rebuilding builtin skeletons took " + (System.currentTimeMillis() - startTime) + " ms"); @@ -233,7 +233,7 @@ public class PySkeletonGenerator { final ProcessOutput process = getProcessOutput(parentDir, ArrayUtil.toStringArray(cmd), - PythonSdkType.activateVirtualEnv(homePath), + PythonSdkType.activateVirtualEnv(sdk), MINUTE * 4); // see PY-3898 LOG.info("Retrieving binary module list took " + (System.currentTimeMillis() - startTime) + " ms");