From bd3cf45098b4735f62e6f0d2a165442f68f19780 Mon Sep 17 00:00:00 2001 From: Dmitry Trofimov Date: Wed, 5 Mar 2014 18:42:16 +0100 Subject: [PATCH] Launch terminal with fixed locale (IDEA-116401, IDEA-118832, IDEA-120131). --- .../EncodingEnvironmentUtil.java | 34 +++++++++++++------ .../terminal/LocalTerminalDirectRunner.java | 2 ++ 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/platform/platform-api/src/com/intellij/execution/configurations/EncodingEnvironmentUtil.java b/platform/platform-api/src/com/intellij/execution/configurations/EncodingEnvironmentUtil.java index 79fff54a9a7f..5f57c2d09541 100644 --- a/platform/platform-api/src/com/intellij/execution/configurations/EncodingEnvironmentUtil.java +++ b/platform/platform-api/src/com/intellij/execution/configurations/EncodingEnvironmentUtil.java @@ -40,28 +40,44 @@ public class EncodingEnvironmentUtil { * Sets default encoding on Mac if it's undefined.
* On Mac default character encoding is defined by several environment variables: LC_ALL, LC_CTYPE and LANG. * See details. - *

+ *

* Unfortunately, Mac OSX has a special behavior:
* These environment variables aren't passed to an IDE, if the IDE is launched from Spotlight.
* Unfortunately, even {@link com.intellij.util.EnvironmentUtil#getEnvironment()} doesn't have these variables.

* As a result, no encoding environment variables are passed to Ruby/Node.js/Python/other processes that are launched from IDE. * Thus, these processes wrongly assume that the default encoding is US-ASCII. *

- * + *

* The workaround this method applies is to set LC_CTYPE environment variable if LC_ALL, LC_CTYPE or LANG aren't set before.
* LC_CTYPE value is taken from "Settings | File Encodings". * * @param commandLine GeneralCommandLine instance - * @param project Project instance if any + * @param project Project instance if any */ public static void fixDefaultEncodingIfMac(@NotNull GeneralCommandLine commandLine, @Nullable Project project) { if (SystemInfo.isMac) { if (!isLocaleDefined(commandLine)) { - Charset charset = getCharset(project); - commandLine.getEnvironment().put(LC_CTYPE, charset.name()); - if (LOG.isDebugEnabled()) { - LOG.debug("Fixed mac locale: " + charset.name()); - } + fixLocale(commandLine.getEnvironment(), project); + } + } + } + + private static void fixLocale(@NotNull Map env, @Nullable Project project) { + Charset charset = getCharset(project); + env.put(LC_CTYPE, charset.name()); + if (LOG.isDebugEnabled()) { + LOG.debug("Fixed mac locale: " + charset.name()); + } + } + + + /** + * Sets default encoding on Mac if it's undefined.
+ */ + public static void fixDefaultEncodingIfMac(@NotNull Map env, @Nullable Project project) { + if (SystemInfo.isMac) { + if (!isLocaleDefined(env)) { + fixLocale(env, project); } } } @@ -100,6 +116,4 @@ public class EncodingEnvironmentUtil { } return charset; } - - } diff --git a/plugins/terminal/src/org/jetbrains/plugins/terminal/LocalTerminalDirectRunner.java b/plugins/terminal/src/org/jetbrains/plugins/terminal/LocalTerminalDirectRunner.java index 3d0ec61e5c0a..312f1c400676 100644 --- a/plugins/terminal/src/org/jetbrains/plugins/terminal/LocalTerminalDirectRunner.java +++ b/plugins/terminal/src/org/jetbrains/plugins/terminal/LocalTerminalDirectRunner.java @@ -1,6 +1,7 @@ package org.jetbrains.plugins.terminal; import com.intellij.execution.TaskExecutor; +import com.intellij.execution.configurations.EncodingEnvironmentUtil; import com.intellij.execution.process.*; import com.intellij.openapi.application.Application; import com.intellij.openapi.application.ApplicationManager; @@ -67,6 +68,7 @@ public class LocalTerminalDirectRunner extends AbstractTerminalRunner envs = new HashMap(System.getenv()); envs.put("TERM", "xterm"); + EncodingEnvironmentUtil.fixDefaultEncodingIfMac(envs, getProject()); try { return PtyProcess.exec(getCommand(), envs, currentProjectFolder()); }