Skip to content

Commit

Permalink
[MSHARED-1014] Optionally inherit system environment variables by Com…
Browse files Browse the repository at this point in the history
…mandline
  • Loading branch information
slawekjaranowski committed Jan 3, 2022
1 parent 89b81b6 commit ba3468e
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 19 deletions.
37 changes: 32 additions & 5 deletions src/main/java/org/apache/maven/shared/utils/cli/Commandline.java
Original file line number Diff line number Diff line change
Expand Up @@ -65,12 +65,14 @@
public class Commandline
implements Cloneable
{
private final List<Arg> arguments = new Vector<Arg>();
private final List<Arg> arguments = new Vector<>();

private final Map<String, String> envVars = Collections.synchronizedMap( new LinkedHashMap<String, String>() );

private Shell shell;

private boolean shellEnvironmentInherited = true;

/**
* Create a new command line object.
* Shell is autodetected from operating system.
Expand Down Expand Up @@ -198,14 +200,13 @@ public void addArguments( String... line )
*/
public void addEnvironment( String name, String value )
{
//envVars.add( name + "=" + value );
envVars.put( name, value );
}

/**
* Add system environment variables.
*/
public void addSystemEnvironment()
private void addSystemEnvironment()
{
Properties systemEnvVars = CommandLineUtils.getSystemEnvVars();

Expand All @@ -226,7 +227,11 @@ public void addSystemEnvironment()
*/
public String[] getEnvironmentVariables()
{
addSystemEnvironment();
if ( isShellEnvironmentInherited() )
{
addSystemEnvironment();
}

List<String> environmentVars = new ArrayList<>();
for ( String name : envVars.keySet() )
{
Expand Down Expand Up @@ -297,7 +302,7 @@ public String[] getArguments()
*/
public String[] getArguments( boolean mask )
{
List<String> result = new ArrayList<String>( arguments.size() * 2 );
List<String> result = new ArrayList<>( arguments.size() * 2 );
for ( Arg argument : arguments )
{
Argument arg = (Argument) argument;
Expand Down Expand Up @@ -377,6 +382,28 @@ public void clearArgs()
arguments.clear();
}

/**
* Indicates whether the environment variables of the current process should be propagated to the executing Command.
* By default, the current environment variables are inherited by the new Command line execution.
*
* @return <code>true</code> if the environment variables should be propagated, <code>false</code> otherwise.
*/
public boolean isShellEnvironmentInherited()
{
return shellEnvironmentInherited;
}

/**
* Specifies whether the environment variables of the current process should be propagated to the executing Command.
*
* @param shellEnvironmentInherited <code>true</code> if the environment variables should be propagated,
* <code>false</code> otherwise.
*/
public void setShellEnvironmentInherited( boolean shellEnvironmentInherited )
{
this.shellEnvironmentInherited = shellEnvironmentInherited;
}

/**
* Execute the command.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.hasItemInArray;
import static org.hamcrest.Matchers.not;
import static org.hamcrest.collection.IsArrayWithSize.emptyArray;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
Expand Down Expand Up @@ -56,9 +57,8 @@ public void testGetSystemEnvVarsCaseInsensitive()

@Test
public void testEnsureCaseSensitivity()
throws Exception
{
Map<String, String> data = new HashMap<String, String>();
Map<String, String> data = new HashMap<>();
data.put( "abz", "cool" );
assertTrue( CommandLineUtils.ensureCaseSensitivity( data, false ).containsKey( "ABZ" ) );
assertTrue( CommandLineUtils.ensureCaseSensitivity( data, true ).containsKey( "abz" ) );
Expand All @@ -69,7 +69,6 @@ public void testEnsureCaseSensitivity()
*/
@Test
public void testGetSystemEnvVarsWindows()
throws Exception
{
if ( !Os.isFamily( Os.FAMILY_WINDOWS ) )
{
Expand Down Expand Up @@ -103,14 +102,9 @@ public void testTranslateCommandline()
assertCmdLineArgs( new String[] { "foo", " ' ", "bar" }, "foo \" ' \" bar" );
}


@Test
public void givenASingleQuoteMarkInArgument_whenExecutingCode_thenNoExceptionIsThrown() throws Exception {
new Commandline("echo \"let's go\"").execute();
}

@Test
public void givenADoubleQuoteMarkInArgument_whenExecutingCode_thenCommandLineExceptionIsThrown() throws Exception {
public void givenADoubleQuoteMarkInArgument_whenExecutingCode_thenCommandLineExceptionIsThrown()
{
try {
new Commandline("echo \"let\"s go\"").execute();
} catch (CommandLineException e) {
Expand All @@ -124,8 +118,7 @@ public void givenADoubleQuoteMarkInArgument_whenExecutingCode_thenCommandLineExc
@Test
public void givenASingleQuoteMarkInArgument_whenExecutingCode_thenExitCode0Returned() throws Exception {
final Process p = new Commandline("echo \"let's go\"").execute();
// Note, this sleep should be removed when java version reaches Java 8
Thread.sleep(1000);
p.waitFor();
assertEquals(0, p.exitValue());
}

Expand Down Expand Up @@ -160,7 +153,9 @@ public void givenAnEscapedSingleQuoteMarkInArgument_whenTranslatingToCmdLineArgs
public void givenAnEscapedDoubleQuoteMarkInArgument_whenTranslatingToCmdLineArgs_thenNoExceptionIsThrown()
throws Exception
{
new Commandline( "echo \"let\\\"s go\"" ).execute();
Process p = new Commandline( "echo \"let\\\"s go\"" ).execute();
p.waitFor();
assertEquals(0, p.exitValue());
}

private void assertCmdLineArgs( final String[] expected, final String cmdLine )
Expand All @@ -185,7 +180,7 @@ public void environmentVariableWithNullShouldNotBeSet() {
}

@Test
public void environmentVariableFromSystemIsCopied() {
public void environmentVariableFromSystemIsCopiedByDefault() {

Commandline commandline = new Commandline();

Expand All @@ -195,6 +190,18 @@ public void environmentVariableFromSystemIsCopied() {
assertThat(environmentVariables, hasItemInArray( "TEST_SHARED_ENV=TestValue" ) );
}

@Test
public void environmentVariableFromSystemIsNotCopiedIfInheritedIsFalse() {

Commandline commandline = new Commandline();
commandline.setShellEnvironmentInherited( false );

String[] environmentVariables = commandline.getEnvironmentVariables();

assertNotNull(environmentVariables);
assertThat(environmentVariables, emptyArray() );
}

@Test
public void environmentVariableFromSystemIsRemoved() {

Expand Down

0 comments on commit ba3468e

Please sign in to comment.