From 51bcd73e6f599e57d57619bf128cfe38a4b47181 Mon Sep 17 00:00:00 2001 From: Dennis Ushakov Date: Mon, 21 Jan 2013 18:36:38 +0400 Subject: [PATCH] SHELL env vars loading moved to the platform --- .../execution/process/UnixProcessManager.java | 39 +++++++++++++++++-- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/platform/util/src/com/intellij/execution/process/UnixProcessManager.java b/platform/util/src/com/intellij/execution/process/UnixProcessManager.java index c16b8964cb4f..603d4778a193 100644 --- a/platform/util/src/com/intellij/execution/process/UnixProcessManager.java +++ b/platform/util/src/com/intellij/execution/process/UnixProcessManager.java @@ -54,6 +54,8 @@ public class UnixProcessManager { } } + private static Map ourCachedConsoleEnv; + private UnixProcessManager() { } @@ -187,17 +189,21 @@ public class UnixProcessManager { } public static void processPSOutput(String[] cmd, Processor processor) { + processCommandOutput(cmd, processor, true); + } + + public static void processCommandOutput(String[] cmd, Processor processor, boolean skipFirstLine) { try { Process p = Runtime.getRuntime().exec(cmd); - processPSOutput(p, processor); + processCommandOutput(p, processor, skipFirstLine); } catch (IOException e) { throw new IllegalStateException(e); } } - public static void processPSOutput(Process psProcess, Processor processor) throws IOException { + private static void processCommandOutput(Process psProcess, Processor processor, boolean skipFirstLine) throws IOException { @SuppressWarnings({"IOResourceOpenedButNotSafelyClosed"}) BufferedReader stdOutput = new BufferedReader(new InputStreamReader(psProcess.getInputStream())); @@ -206,7 +212,9 @@ public class UnixProcessManager { try { String s; - stdOutput.readLine(); //ps output header + if (skipFirstLine) { + stdOutput.readLine(); //ps output header + } while ((s = stdOutput.readLine()) != null) { processor.process(s); } @@ -256,6 +264,31 @@ public class UnixProcessManager { return res.toString(); } + public static Map getOrLoadConsoleEnvironment() { + if (ourCachedConsoleEnv == null) { + loadConsoleEnvironment(); + } + return ourCachedConsoleEnv; + } + + private static void loadConsoleEnvironment() { + final Map env = new HashMap(); + final String shell = System.getenv("SHELL"); + if (shell != null && (shell.contains("bash") || shell.contains("zsh"))) { + processCommandOutput(new String[] {shell, "--login", "-c", "printenv"}, new Processor() { + @Override + public boolean process(String s) { + final String[] split = s.split("=", 2); + if (split.length > 1) { + env.put(split[0], split[1]); + } + return false; + } + }, false); + } + ourCachedConsoleEnv = !env.isEmpty() ? Collections.unmodifiableMap(env) : System.getenv(); + } + public interface CLib extends Library { int getpid();