@@ -220,18 +220,6 @@ static const char **prepare_shell_cmd(struct argv_array *out, const char **argv)
220
220
return out -> argv ;
221
221
}
222
222
223
- #ifndef GIT_WINDOWS_NATIVE
224
- static int execv_shell_cmd (const char * * argv )
225
- {
226
- struct argv_array nargv = ARGV_ARRAY_INIT ;
227
- prepare_shell_cmd (& nargv , argv );
228
- trace_argv_printf (nargv .argv , "trace: exec:" );
229
- sane_execvp (nargv .argv [0 ], (char * * )nargv .argv );
230
- argv_array_clear (& nargv );
231
- return -1 ;
232
- }
233
- #endif
234
-
235
223
#ifndef GIT_WINDOWS_NATIVE
236
224
static int child_notifier = -1 ;
237
225
@@ -244,6 +232,21 @@ static void notify_parent(void)
244
232
*/
245
233
xwrite (child_notifier , "" , 1 );
246
234
}
235
+
236
+ static void prepare_cmd (struct argv_array * out , const struct child_process * cmd )
237
+ {
238
+ if (!cmd -> argv [0 ])
239
+ die ("BUG: command is empty" );
240
+
241
+ if (cmd -> git_cmd ) {
242
+ argv_array_push (out , "git" );
243
+ argv_array_pushv (out , cmd -> argv );
244
+ } else if (cmd -> use_shell ) {
245
+ prepare_shell_cmd (out , cmd -> argv );
246
+ } else {
247
+ argv_array_pushv (out , cmd -> argv );
248
+ }
249
+ }
247
250
#endif
248
251
249
252
static inline void set_cloexec (int fd )
@@ -372,9 +375,13 @@ int start_command(struct child_process *cmd)
372
375
#ifndef GIT_WINDOWS_NATIVE
373
376
{
374
377
int notify_pipe [2 ];
378
+ struct argv_array argv = ARGV_ARRAY_INIT ;
379
+
375
380
if (pipe (notify_pipe ))
376
381
notify_pipe [0 ] = notify_pipe [1 ] = -1 ;
377
382
383
+ prepare_cmd (& argv , cmd );
384
+
378
385
cmd -> pid = fork ();
379
386
failed_errno = errno ;
380
387
if (!cmd -> pid ) {
@@ -437,12 +444,9 @@ int start_command(struct child_process *cmd)
437
444
unsetenv (* cmd -> env );
438
445
}
439
446
}
440
- if (cmd -> git_cmd )
441
- execv_git_cmd (cmd -> argv );
442
- else if (cmd -> use_shell )
443
- execv_shell_cmd (cmd -> argv );
444
- else
445
- sane_execvp (cmd -> argv [0 ], (char * const * ) cmd -> argv );
447
+
448
+ sane_execvp (argv .argv [0 ], (char * const * ) argv .argv );
449
+
446
450
if (errno == ENOENT ) {
447
451
if (!cmd -> silent_exec_failure )
448
452
error ("cannot run %s: %s" , cmd -> argv [0 ],
@@ -458,7 +462,7 @@ int start_command(struct child_process *cmd)
458
462
mark_child_for_cleanup (cmd -> pid , cmd );
459
463
460
464
/*
461
- * Wait for child's execvp . If the execvp succeeds (or if fork()
465
+ * Wait for child's exec . If the exec succeeds (or if fork()
462
466
* failed), EOF is seen immediately by the parent. Otherwise, the
463
467
* child process sends a single byte.
464
468
* Note that use of this infrastructure is completely advisory,
@@ -467,14 +471,16 @@ int start_command(struct child_process *cmd)
467
471
close (notify_pipe [1 ]);
468
472
if (read (notify_pipe [0 ], & notify_pipe [1 ], 1 ) == 1 ) {
469
473
/*
470
- * At this point we know that fork() succeeded, but execvp ()
474
+ * At this point we know that fork() succeeded, but exec ()
471
475
* failed. Errors have been reported to our stderr.
472
476
*/
473
477
wait_or_whine (cmd -> pid , cmd -> argv [0 ], 0 );
474
478
failed_errno = errno ;
475
479
cmd -> pid = -1 ;
476
480
}
477
481
close (notify_pipe [0 ]);
482
+
483
+ argv_array_clear (& argv );
478
484
}
479
485
#else
480
486
{
0 commit comments