From 54aaec4828675d4b090e91bb3de67d4c097b07c7 Mon Sep 17 00:00:00 2001 From: Andrey Vlasovskikh Date: Thu, 4 Oct 2018 21:02:12 +0300 Subject: [PATCH] PY-31773 Prepend (not append) virtualenv's bin/ directory to PATH It should take precedence according to the virtualenvs 'activate' script. --- .../python/run/PythonCommandLineState.java | 2 +- .../jetbrains/python/sdk/PythonEnvUtil.java | 19 +++++++++++++++---- .../jetbrains/python/sdk/PythonSdkType.java | 4 ++-- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/python/src/com/jetbrains/python/run/PythonCommandLineState.java b/python/src/com/jetbrains/python/run/PythonCommandLineState.java index 1c2219d60e8c..51d5c2c0f617 100644 --- a/python/src/com/jetbrains/python/run/PythonCommandLineState.java +++ b/python/src/com/jetbrains/python/run/PythonCommandLineState.java @@ -383,7 +383,7 @@ public abstract class PythonCommandLineState extends CommandLineState { for (Map.Entry e : myConfig.getEnvs().entrySet()) { if (environment.containsKey(e.getKey())) { if ("PATH".equals(e.getKey())) { - env.put(e.getKey(), PythonEnvUtil.appendToPathEnvVar(env.get("PATH"), e.getValue())); + env.put(e.getKey(), PythonEnvUtil.addToPathEnvVar(env.get("PATH"), e.getValue(), true)); } else { env.put(e.getKey(), e.getValue()); diff --git a/python/src/com/jetbrains/python/sdk/PythonEnvUtil.java b/python/src/com/jetbrains/python/sdk/PythonEnvUtil.java index 48ab5234ff15..9f61d850f116 100644 --- a/python/src/com/jetbrains/python/sdk/PythonEnvUtil.java +++ b/python/src/com/jetbrains/python/sdk/PythonEnvUtil.java @@ -60,18 +60,29 @@ public class PythonEnvUtil { } /** - * Appends a value to the end os a path-like environment variable, using system-dependent path separator. + * Adds a value to the end os a path-like environment variable, using system-dependent path separator. * * @param source path-like string to append to * @param value what to append + * @param asPrefix if true, adds a value as a prefix, otherwise as a suffix * @return modified path-like string */ @NotNull - public static String appendToPathEnvVar(@Nullable String source, @NotNull String value) { + public static String addToPathEnvVar(@Nullable String source, @NotNull String value, boolean asPrefix) { if (StringUtil.isEmpty(source)) return value; Set paths = Sets.newHashSet(source.split(File.pathSeparator)); - return !paths.contains(value) ? source + File.pathSeparator + value : source; + if (!paths.contains(value)) { + if (asPrefix) { + return value + File.pathSeparator + source; + } + else { + return source + File.pathSeparator + value; + } + } + else { + return source; + } } public static void addPathsToEnv(@NotNull Map env, String key, @NotNull Collection values) { @@ -83,7 +94,7 @@ public class PythonEnvUtil { public static void addPathToEnv(@NotNull Map env, String key, String value) { if (!StringUtil.isEmpty(value)) { if (env.containsKey(key)) { - env.put(key, appendToPathEnvVar(env.get(key), value)); + env.put(key, addToPathEnvVar(env.get(key), value, false)); } else { env.put(key, value); diff --git a/python/src/com/jetbrains/python/sdk/PythonSdkType.java b/python/src/com/jetbrains/python/sdk/PythonSdkType.java index 4cb002897d70..98600d17d9d4 100644 --- a/python/src/com/jetbrains/python/sdk/PythonSdkType.java +++ b/python/src/com/jetbrains/python/sdk/PythonSdkType.java @@ -363,11 +363,11 @@ public final class PythonSdkType extends SdkType { Map env = commandLine.getEnvironment(); String pathValue; if (env.containsKey(PATH)) { - pathValue = PythonEnvUtil.appendToPathEnvVar(env.get(PATH), virtualenvBin); + pathValue = PythonEnvUtil.addToPathEnvVar(env.get(PATH), virtualenvBin, true); } else if (passParentEnvironment) { // append to PATH - pathValue = PythonEnvUtil.appendToPathEnvVar(System.getenv(PATH), virtualenvBin); + pathValue = PythonEnvUtil.addToPathEnvVar(System.getenv(PATH), virtualenvBin, true); } else { pathValue = virtualenvBin;