diff options
author | Junio C Hamano <gitster@pobox.com> | 2009-03-12 21:43:38 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2009-03-12 21:43:38 -0700 |
commit | 8bb78b7201bd8a34347bf4f8bcb9b70952553ca0 (patch) | |
tree | a51a651268dedf7bf3fa72e1de519cf563809d20 /run-command.c | |
parent | builtin-revert.c: release index lock when cherry-picking an empty commit (diff) | |
parent | git: use run_command() to execute dashed externals (diff) | |
download | tgif-8bb78b7201bd8a34347bf4f8bcb9b70952553ca0.tar.xz |
Merge branch 'jk/maint-1.6.1-cleanup-after-exec-failure' into maint-1.6.1
* jk/maint-1.6.1-cleanup-after-exec-failure:
git: use run_command() to execute dashed externals
run_command(): help callers distinguish errors
run_command(): handle missing command errors more gracefully
git: s/run_command/run_builtin/
Diffstat (limited to 'run-command.c')
-rw-r--r-- | run-command.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/run-command.c b/run-command.c index c90cdc50e3..44fccc9d5e 100644 --- a/run-command.c +++ b/run-command.c @@ -118,7 +118,9 @@ int start_command(struct child_process *cmd) } else { execvp(cmd->argv[0], (char *const*) cmd->argv); } - die("exec %s failed.", cmd->argv[0]); + trace_printf("trace: exec '%s' failed: %s\n", cmd->argv[0], + strerror(errno)); + exit(127); } #else int s0 = -1, s1 = -1, s2 = -1; /* backups of stdin, stdout, stderr */ @@ -187,6 +189,7 @@ int start_command(struct child_process *cmd) #endif if (cmd->pid < 0) { + int err = errno; if (need_in) close_pair(fdin); else if (cmd->in) @@ -197,7 +200,9 @@ int start_command(struct child_process *cmd) close(cmd->out); if (need_err) close_pair(fderr); - return -ERR_RUN_COMMAND_FORK; + return err == ENOENT ? + -ERR_RUN_COMMAND_EXEC : + -ERR_RUN_COMMAND_FORK; } if (need_in) @@ -236,9 +241,14 @@ static int wait_or_whine(pid_t pid) if (!WIFEXITED(status)) return -ERR_RUN_COMMAND_WAITPID_NOEXIT; code = WEXITSTATUS(status); - if (code) + switch (code) { + case 127: + return -ERR_RUN_COMMAND_EXEC; + case 0: + return 0; + default: return -code; - return 0; + } } } |