Merge branch 'terminalProjectEnv' of https://github.com/sblundy/intellij-community into sblundy-terminalProjectEnv

This commit is contained in:
Dmitry Trofimov
2018-10-22 17:44:48 +02:00
5 changed files with 77 additions and 11 deletions
+1
View File
@@ -19,5 +19,6 @@
<orderEntry type="library" scope="TEST" name="JUnit4" level="project" />
<orderEntry type="module" module-name="intellij.platform.testFramework" scope="TEST" />
<orderEntry type="library" name="jediterm-pty" level="project" />
<orderEntry type="module" module-name="intellij.platform.lang.impl" />
</component>
</module>
@@ -17,11 +17,17 @@ package org.jetbrains.plugins.terminal;
import com.google.common.collect.Lists;
import com.intellij.execution.TaskExecutor;
import com.intellij.execution.process.ProcessAdapter;
import com.intellij.execution.process.ProcessEvent;
import com.intellij.execution.process.ProcessHandler;
import com.intellij.execution.process.ProcessWaitFor;
import com.intellij.internal.statistic.service.fus.collectors.FUSUsageContext;
import com.intellij.execution.configurations.EncodingEnvironmentUtil;
import com.intellij.execution.process.*;
import com.intellij.openapi.application.Application;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.components.PathMacroManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.SystemInfo;
@@ -46,6 +52,7 @@ import java.io.IOException;
import java.io.OutputStream;
import java.net.URL;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;
@@ -117,14 +124,29 @@ public class LocalTerminalDirectRunner extends AbstractTerminalRunner<PtyProcess
return new LocalTerminalDirectRunner(project);
}
private Map<String, String> getTerminalEnvironment() {
Map<String, String> envs = new HashMap<String, String>();
if (TerminalOptionsProvider.Companion.getInstance().passParentEnvs()) {
envs.putAll(System.getenv());
}
envs.put("TERM", "xterm-256color");
EncodingEnvironmentUtil.setLocaleEnvironmentIfMac(envs, myDefaultCharset);
PathMacroManager macroManager = PathMacroManager.getInstance(myProject);
for (Map.Entry<String, String> env : TerminalOptionsProvider.Companion.getInstance().getUserSpecifiedEnvs().entrySet()) {
envs.put(env.getKey(), macroManager.expandPath(env.getValue()));
}
return envs;
}
@Override
protected PtyProcess createProcess(@Nullable String directory) throws ExecutionException {
Map<String, String> envs = new THashMap<>(SystemInfo.isWindows ? CaseInsensitiveStringHashingStrategy.INSTANCE
: ContainerUtil.canonicalStrategy());
envs.putAll(System.getenv());
if (!SystemInfo.isWindows) {
envs.put("TERM", "xterm-256color");
}
Map<String, String> envs = getTerminalEnvironment();
if (SystemInfo.isMac) {
EnvironmentUtil.setLocaleEnv(envs, myDefaultCharset);
@@ -7,6 +7,7 @@ import com.intellij.openapi.components.State
import com.intellij.openapi.components.Storage
import com.intellij.openapi.util.SystemInfo
import java.io.File
import java.util.HashMap
/**
* @author traff
@@ -80,6 +81,8 @@ class TerminalOptionsProvider : PersistentStateComponent<TerminalOptionsProvider
var myOverrideIdeShortcuts: Boolean = true
var myShellIntegration: Boolean = true
var myHighlightHyperlinks: Boolean = true
var myUserSpecifiedEnvs: Map<String, String> = hashMapOf("PROJECT_DIR" to "\$PROJECT_DIR$")
var myPassParentEnvs = true
}
fun setCloseSessionOnLogout(closeSessionOnLogout: Boolean) {
@@ -118,6 +121,22 @@ class TerminalOptionsProvider : PersistentStateComponent<TerminalOptionsProvider
myState.myHighlightHyperlinks = highlight
}
fun getUserSpecifiedEnvs(): Map<String, String> {
return myState.myUserSpecifiedEnvs
}
fun setUserSpecifiedEnvs(userSpecifiedEnvs: Map<String, String>) {
myState.myUserSpecifiedEnvs = userSpecifiedEnvs
}
fun setPassParentEnvs(passParentEnvs: Boolean) {
myState.myPassParentEnvs = passParentEnvs
}
fun passParentEnvs(): Boolean {
return myState.myPassParentEnvs
}
val defaultShellPath: String
get() {
val shell = System.getenv("SHELL")
@@ -14,9 +14,6 @@
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="7" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
</constraints>
<properties/>
<clientProperties>
<BorderFactoryClass class="java.lang.String" value=""/>
</clientProperties>
<border type="none"/>
<children>
<vspacer id="d777c">
@@ -24,7 +21,7 @@
<grid row="2" column="0" row-span="7" col-span="4" vsize-policy="6" hsize-policy="1" anchor="0" fill="2" indent="0" use-parent-layout="false"/>
</constraints>
</vspacer>
<grid id="871ca" binding="myProjectSettingsPanel" layout-manager="GridLayoutManager" row-count="1" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<grid id="871ca" binding="myProjectSettingsPanel" layout-manager="GridLayoutManager" row-count="2" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="0" bottom="0" right="0"/>
<constraints>
<grid row="0" column="0" row-span="1" col-span="4" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
@@ -47,6 +44,22 @@
</constraints>
<properties/>
</component>
<component id="a7470" class="javax.swing.JLabel">
<constraints>
<grid row="1" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text value="Environment Variables"/>
</properties>
</component>
<component id="9454c" class="com.intellij.execution.configuration.EnvironmentVariablesTextFieldWithBrowseButton" binding="myEnvVarField">
<constraints>
<grid row="1" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text value=""/>
</properties>
</component>
</children>
</grid>
<grid id="5c27f" binding="myGlobalSettingsPanel" layout-manager="GridLayoutManager" row-count="10" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
@@ -2,6 +2,7 @@
package org.jetbrains.plugins.terminal;
import com.google.common.collect.Lists;
import com.intellij.execution.configuration.EnvironmentVariablesTextFieldWithBrowseButton;
import com.intellij.openapi.fileChooser.FileChooserDescriptor;
import com.intellij.openapi.options.ConfigurationException;
import com.intellij.openapi.options.UnnamedConfigurable;
@@ -32,12 +33,16 @@ public class TerminalSettingsPanel {
private JBCheckBox myPasteOnMiddleButtonCheckBox;
private JBCheckBox myCopyOnSelectionCheckBox;
private JBCheckBox myOverrideIdeShortcuts;
private JBCheckBox myShellIntegration;
private TextFieldWithBrowseButton myStartDirectoryField;
private JPanel myProjectSettingsPanel;
private JPanel myGlobalSettingsPanel;
private JPanel myConfigurablesPanel;
private JBCheckBox myHighlightHyperlinks;
private EnvironmentVariablesTextFieldWithBrowseButton myEnvVarField;
private TerminalOptionsProvider myOptionsProvider;
private TerminalProjectOptionsProvider myProjectOptionsProvider;
@@ -113,7 +118,9 @@ public class TerminalSettingsPanel {
|| (myOverrideIdeShortcuts.isSelected() != myOptionsProvider.overrideIdeShortcuts())
|| (myShellIntegration.isSelected() != myOptionsProvider.shellIntegration())
|| (myHighlightHyperlinks.isSelected() != myOptionsProvider.highlightHyperlinks()) ||
myConfigurables.stream().anyMatch(c -> c.isModified());
myConfigurables.stream().anyMatch(c -> c.isModified())
|| !Comparing.equal(myEnvVarField.getEnvs(), myOptionsProvider.getUserSpecifiedEnvs())
|| (myEnvVarField.isPassParentEnvs() != myOptionsProvider.passParentEnvs());
}
public void apply() {
@@ -136,6 +143,8 @@ public class TerminalSettingsPanel {
//pass
}
});
myOptionsProvider.setUserSpecifiedEnvs(myEnvVarField.getEnvs());
myOptionsProvider.setPassParentEnvs(myEnvVarField.isPassParentEnvs());
}
public void reset() {
@@ -151,6 +160,8 @@ public class TerminalSettingsPanel {
myShellIntegration.setSelected(myOptionsProvider.shellIntegration());
myHighlightHyperlinks.setSelected(myOptionsProvider.highlightHyperlinks());
myConfigurables.forEach(c -> c.reset());
myEnvVarField.setEnvs(myOptionsProvider.getUserSpecifiedEnvs());
myEnvVarField.setPassParentEnvs(myOptionsProvider.passParentEnvs());
}
public Color getDefaultValueColor() {