1 package org.apache.maven.shared.utils.cli.shell;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 import java.util.ArrayList;
24 import java.util.List;
25 import org.apache.maven.shared.utils.Os;
26 import org.apache.maven.shared.utils.StringUtils;
27
28
29
30
31 public class BourneShell
32 extends Shell
33 {
34 private static final char[] BASH_QUOTING_TRIGGER_CHARS =
35 { ' ', '$', ';', '&', '|', '<', '>', '*', '?', '(', ')', '[', ']', '{', '}', '`' };
36
37 public BourneShell()
38 {
39 setShellCommand( "/bin/sh" );
40 setArgumentQuoteDelimiter( '\'' );
41 setExecutableQuoteDelimiter( '\"' );
42 setSingleQuotedArgumentEscaped( true );
43 setSingleQuotedExecutableEscaped( false );
44 setQuotedExecutableEnabled( true );
45 }
46
47
48
49
50 public String getExecutable()
51 {
52 if ( Os.isFamily( Os.FAMILY_WINDOWS ) )
53 {
54 return super.getExecutable();
55 }
56
57 return unifyQuotes( super.getExecutable() );
58 }
59
60 public List<String> getShellArgsList()
61 {
62 List<String> shellArgs = new ArrayList<String>();
63 List<String> existingShellArgs = super.getShellArgsList();
64
65 if ( ( existingShellArgs != null ) && !existingShellArgs.isEmpty() )
66 {
67 shellArgs.addAll( existingShellArgs );
68 }
69
70 shellArgs.add( "-c" );
71
72 return shellArgs;
73 }
74
75 public String[] getShellArgs()
76 {
77 String[] shellArgs = super.getShellArgs();
78 if ( shellArgs == null )
79 {
80 shellArgs = new String[0];
81 }
82
83 if ( ( shellArgs.length > 0 ) && !shellArgs[shellArgs.length - 1].equals( "-c" ) )
84 {
85 String[] newArgs = new String[shellArgs.length + 1];
86
87 System.arraycopy( shellArgs, 0, newArgs, 0, shellArgs.length );
88 newArgs[shellArgs.length] = "-c";
89
90 shellArgs = newArgs;
91 }
92
93 return shellArgs;
94 }
95
96 protected String getExecutionPreamble()
97 {
98 if ( getWorkingDirectoryAsString() == null )
99 {
100 return null;
101 }
102
103 String dir = getWorkingDirectoryAsString();
104 StringBuilder sb = new StringBuilder();
105 sb.append( "cd " );
106
107 sb.append( unifyQuotes( dir ) );
108 sb.append( " && " );
109
110 return sb.toString();
111 }
112
113 protected char[] getQuotingTriggerChars()
114 {
115 return BASH_QUOTING_TRIGGER_CHARS;
116 }
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135 private static String unifyQuotes( String path )
136 {
137 if ( path == null )
138 {
139 return null;
140 }
141
142 if ( path.indexOf( ' ' ) == -1 && path.indexOf( '\'' ) != -1 && path.indexOf( '"' ) == -1 )
143 {
144 return StringUtils.escape( path );
145 }
146
147 return StringUtils.quoteAndEscape( path, '\"', BASH_QUOTING_TRIGGER_CHARS );
148 }
149 }