]>
Commit | Line | Data |
---|---|---|
2b541bf8 JS |
1 | #!/bin/sh |
2 | # | |
3 | # Copyright (c) 2009 Ilari Liusvaara | |
4 | # | |
5 | ||
6 | test_description='Test run command' | |
7 | ||
fdc8f79f | 8 | TEST_PASSES_SANITIZE_LEAK=true |
2b541bf8 JS |
9 | . ./test-lib.sh |
10 | ||
c0f19bf3 JN |
11 | cat >hello-script <<-EOF |
12 | #!$SHELL_PATH | |
13 | cat hello-script | |
14 | EOF | |
c0f19bf3 | 15 | |
9a780a38 | 16 | test_expect_success MINGW 'subprocess inherits only std handles' ' |
eea4a7f4 JS |
17 | test-tool run-command inherited-handle |
18 | ' | |
19 | ||
321fd823 | 20 | test_expect_success 'start_command reports ENOENT (slash)' ' |
e5a329a2 | 21 | test-tool run-command start-command-ENOENT ./does-not-exist 2>err && |
6789275d | 22 | test_grep "\./does-not-exist" err |
2b541bf8 JS |
23 | ' |
24 | ||
321fd823 | 25 | test_expect_success 'start_command reports ENOENT (no slash)' ' |
e5a329a2 | 26 | test-tool run-command start-command-ENOENT does-not-exist 2>err && |
6789275d | 27 | test_grep "does-not-exist" err |
321fd823 JK |
28 | ' |
29 | ||
c0f19bf3 JN |
30 | test_expect_success 'run_command can run a command' ' |
31 | cat hello-script >hello.sh && | |
32 | chmod +x hello.sh && | |
ae6a51f5 | 33 | test-tool run-command run-command ./hello.sh >actual 2>err && |
c0f19bf3 JN |
34 | |
35 | test_cmp hello-script actual && | |
1c5e94f4 | 36 | test_must_be_empty err |
c0f19bf3 JN |
37 | ' |
38 | ||
89ba9a79 JH |
39 | |
40 | test_lazy_prereq RUNS_COMMANDS_FROM_PWD ' | |
41 | write_script runs-commands-from-pwd <<-\EOF && | |
42 | true | |
43 | EOF | |
44 | runs-commands-from-pwd >/dev/null 2>&1 | |
45 | ' | |
46 | ||
47 | test_expect_success !RUNS_COMMANDS_FROM_PWD 'run_command is restricted to PATH' ' | |
321fd823 JK |
48 | write_script should-not-run <<-\EOF && |
49 | echo yikes | |
50 | EOF | |
e5a329a2 | 51 | test_must_fail test-tool run-command run-command should-not-run 2>err && |
6789275d | 52 | test_grep "should-not-run" err |
321fd823 JK |
53 | ' |
54 | ||
c2d3119d BW |
55 | test_expect_success !MINGW 'run_command can run a script without a #! line' ' |
56 | cat >hello <<-\EOF && | |
57 | cat hello-script | |
58 | EOF | |
59 | chmod +x hello && | |
ae6a51f5 | 60 | test-tool run-command run-command ./hello >actual 2>err && |
c2d3119d BW |
61 | |
62 | test_cmp hello-script actual && | |
1c5e94f4 | 63 | test_must_be_empty err |
c2d3119d BW |
64 | ' |
65 | ||
94028310 BW |
66 | test_expect_success 'run_command does not try to execute a directory' ' |
67 | test_when_finished "rm -rf bin1 bin2" && | |
68 | mkdir -p bin1/greet bin2 && | |
69 | write_script bin2/greet <<-\EOF && | |
70 | cat bin2/greet | |
71 | EOF | |
72 | ||
73 | PATH=$PWD/bin1:$PWD/bin2:$PATH \ | |
ae6a51f5 | 74 | test-tool run-command run-command greet >actual 2>err && |
94028310 | 75 | test_cmp bin2/greet actual && |
1c5e94f4 | 76 | test_must_be_empty err |
94028310 BW |
77 | ' |
78 | ||
79 | test_expect_success POSIXPERM 'run_command passes over non-executable file' ' | |
80 | test_when_finished "rm -rf bin1 bin2" && | |
81 | mkdir -p bin1 bin2 && | |
82 | write_script bin1/greet <<-\EOF && | |
83 | cat bin1/greet | |
84 | EOF | |
85 | chmod -x bin1/greet && | |
86 | write_script bin2/greet <<-\EOF && | |
87 | cat bin2/greet | |
88 | EOF | |
89 | ||
90 | PATH=$PWD/bin1:$PWD/bin2:$PATH \ | |
ae6a51f5 | 91 | test-tool run-command run-command greet >actual 2>err && |
94028310 | 92 | test_cmp bin2/greet actual && |
1c5e94f4 | 93 | test_must_be_empty err |
94028310 BW |
94 | ' |
95 | ||
c0f19bf3 JN |
96 | test_expect_success POSIXPERM 'run_command reports EACCES' ' |
97 | cat hello-script >hello.sh && | |
98 | chmod -x hello.sh && | |
ae6a51f5 | 99 | test_must_fail test-tool run-command run-command ./hello.sh 2>err && |
c0f19bf3 JN |
100 | |
101 | grep "fatal: cannot exec.*hello.sh" err | |
102 | ' | |
103 | ||
eae69530 | 104 | test_expect_success POSIXPERM,SANITY 'unreadable directory in PATH' ' |
38f865c2 JK |
105 | mkdir local-command && |
106 | test_when_finished "chmod u+rwx local-command && rm -fr local-command" && | |
107 | git config alias.nitfol "!echo frotz" && | |
108 | chmod a-rx local-command && | |
109 | ( | |
110 | PATH=./local-command:$PATH && | |
111 | git nitfol >actual | |
112 | ) && | |
113 | echo frotz >expect && | |
114 | test_cmp expect actual | |
115 | ' | |
116 | ||
c553c72e SB |
117 | cat >expect <<-EOF |
118 | preloaded output of a child | |
119 | Hello | |
120 | World | |
121 | preloaded output of a child | |
122 | Hello | |
123 | World | |
124 | preloaded output of a child | |
125 | Hello | |
126 | World | |
127 | preloaded output of a child | |
128 | Hello | |
129 | World | |
130 | EOF | |
131 | ||
132 | test_expect_success 'run_command runs in parallel with more jobs available than tasks' ' | |
fe004a43 ÆAB |
133 | test-tool run-command run-command-parallel 5 sh -c "printf \"%s\n%s\n\" Hello World" >out 2>actual && |
134 | test_must_be_empty out && | |
c553c72e SB |
135 | test_cmp expect actual |
136 | ' | |
137 | ||
fd3aaf53 ÆAB |
138 | test_expect_success 'run_command runs ungrouped in parallel with more jobs available than tasks' ' |
139 | test-tool run-command --ungroup run-command-parallel 5 sh -c "printf \"%s\n%s\n\" Hello World" >out 2>err && | |
140 | test_line_count = 8 out && | |
141 | test_line_count = 4 err | |
142 | ' | |
143 | ||
c553c72e | 144 | test_expect_success 'run_command runs in parallel with as many jobs as tasks' ' |
fe004a43 ÆAB |
145 | test-tool run-command run-command-parallel 4 sh -c "printf \"%s\n%s\n\" Hello World" >out 2>actual && |
146 | test_must_be_empty out && | |
c553c72e SB |
147 | test_cmp expect actual |
148 | ' | |
149 | ||
fd3aaf53 ÆAB |
150 | test_expect_success 'run_command runs ungrouped in parallel with as many jobs as tasks' ' |
151 | test-tool run-command --ungroup run-command-parallel 4 sh -c "printf \"%s\n%s\n\" Hello World" >out 2>err && | |
152 | test_line_count = 8 out && | |
153 | test_line_count = 4 err | |
154 | ' | |
155 | ||
c553c72e | 156 | test_expect_success 'run_command runs in parallel with more tasks than jobs available' ' |
fe004a43 ÆAB |
157 | test-tool run-command run-command-parallel 3 sh -c "printf \"%s\n%s\n\" Hello World" >out 2>actual && |
158 | test_must_be_empty out && | |
c553c72e SB |
159 | test_cmp expect actual |
160 | ' | |
161 | ||
fd3aaf53 ÆAB |
162 | test_expect_success 'run_command runs ungrouped in parallel with more tasks than jobs available' ' |
163 | test-tool run-command --ungroup run-command-parallel 3 sh -c "printf \"%s\n%s\n\" Hello World" >out 2>err && | |
164 | test_line_count = 8 out && | |
165 | test_line_count = 4 err | |
166 | ' | |
167 | ||
c553c72e SB |
168 | cat >expect <<-EOF |
169 | preloaded output of a child | |
170 | asking for a quick stop | |
171 | preloaded output of a child | |
172 | asking for a quick stop | |
173 | preloaded output of a child | |
174 | asking for a quick stop | |
175 | EOF | |
176 | ||
177 | test_expect_success 'run_command is asked to abort gracefully' ' | |
fe004a43 ÆAB |
178 | test-tool run-command run-command-abort 3 false >out 2>actual && |
179 | test_must_be_empty out && | |
c553c72e SB |
180 | test_cmp expect actual |
181 | ' | |
182 | ||
fd3aaf53 ÆAB |
183 | test_expect_success 'run_command is asked to abort gracefully (ungroup)' ' |
184 | test-tool run-command --ungroup run-command-abort 3 false >out 2>err && | |
185 | test_must_be_empty out && | |
186 | test_line_count = 6 err | |
187 | ' | |
188 | ||
c553c72e SB |
189 | cat >expect <<-EOF |
190 | no further jobs available | |
191 | EOF | |
192 | ||
193 | test_expect_success 'run_command outputs ' ' | |
fe004a43 ÆAB |
194 | test-tool run-command run-command-no-jobs 3 sh -c "printf \"%s\n%s\n\" Hello World" >out 2>actual && |
195 | test_must_be_empty out && | |
c553c72e SB |
196 | test_cmp expect actual |
197 | ' | |
198 | ||
fd3aaf53 ÆAB |
199 | test_expect_success 'run_command outputs (ungroup) ' ' |
200 | test-tool run-command --ungroup run-command-no-jobs 3 sh -c "printf \"%s\n%s\n\" Hello World" >out 2>err && | |
201 | test_must_be_empty out && | |
202 | test_cmp expect err | |
203 | ' | |
204 | ||
c61a975d NTND |
205 | test_trace () { |
206 | expect="$1" | |
207 | shift | |
ae6a51f5 | 208 | GIT_TRACE=1 test-tool run-command "$@" run-command true 2>&1 >/dev/null | \ |
06718d4a JS |
209 | sed -e 's/.* run_command: //' -e '/trace: .*/d' \ |
210 | -e '/RUNTIME_PREFIX requested/d' >actual && | |
c61a975d NTND |
211 | echo "$expect true" >expect && |
212 | test_cmp expect actual | |
213 | } | |
214 | ||
215 | test_expect_success 'GIT_TRACE with environment variables' ' | |
216 | test_trace "abc=1 def=2" env abc=1 env def=2 && | |
217 | test_trace "abc=2" env abc env abc=1 env abc=2 && | |
218 | test_trace "abc=2" env abc env abc=2 && | |
219 | ( | |
220 | abc=1 && export abc && | |
221 | test_trace "def=1" env abc=1 env def=1 | |
222 | ) && | |
223 | ( | |
224 | abc=1 && export abc && | |
225 | test_trace "def=1" env abc env abc=1 env def=1 | |
226 | ) && | |
227 | test_trace "def=1" env non-exist env def=1 && | |
228 | test_trace "abc=2" env abc=1 env abc env abc=2 && | |
229 | ( | |
230 | abc=1 def=2 && export abc def && | |
231 | test_trace "unset abc def;" env abc env def | |
232 | ) && | |
233 | ( | |
234 | abc=1 def=2 && export abc def && | |
235 | test_trace "unset def; abc=3" env abc env def env abc=3 | |
236 | ) && | |
237 | ( | |
238 | abc=1 && export abc && | |
239 | test_trace "unset abc;" env abc=2 env abc | |
240 | ) | |
241 | ' | |
242 | ||
9e9da23c JS |
243 | test_expect_success MINGW 'verify curlies are quoted properly' ' |
244 | : force the rev-parse through the MSYS2 Bash && | |
245 | git -c alias.r="!git rev-parse" r -- a{b}c >actual && | |
246 | cat >expect <<-\EOF && | |
247 | -- | |
248 | a{b}c | |
249 | EOF | |
250 | test_cmp expect actual | |
251 | ' | |
252 | ||
71f4960b AM |
253 | test_expect_success MINGW 'can spawn .bat with argv[0] containing spaces' ' |
254 | bat="$TRASH_DIRECTORY/bat with spaces in name.bat" && | |
255 | ||
256 | # Every .bat invocation will log its arguments to file "out" | |
257 | rm -f out && | |
258 | echo "echo %* >>out" >"$bat" && | |
259 | ||
260 | # Ask git to invoke .bat; clone will fail due to fake SSH helper | |
261 | test_must_fail env GIT_SSH="$bat" git clone myhost:src ssh-clone && | |
262 | ||
263 | # Spawning .bat can fail if there are two quoted cmd.exe arguments. | |
264 | # .bat itself is first (due to spaces in name), so just one more is | |
265 | # needed to verify. GIT_SSH will invoke .bat multiple times: | |
266 | # 1) -G myhost | |
267 | # 2) myhost "git-upload-pack src" | |
268 | # First invocation will always succeed. Test the second one. | |
269 | grep "git-upload-pack" out | |
eb7c7863 JS |
270 | ' |
271 | ||
2b541bf8 | 272 | test_done |