summaryrefslogtreecommitdiff
path: root/run-command.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2009-02-03 00:26:12 -0800
committerJunio C Hamano <gitster@pobox.com>2009-02-03 00:26:12 -0800
commit1487eb68f7fd145151caa9a11ee00283629b75ef (patch)
treef745afc9bab5014851864b9d0046f9e3b9774acd /run-command.c
parent2ea3c17189bf9ca459879129ca190792b5451f05 (diff)
parentd8e96fd86d415554a9c2e09ffb929a9e22fdad25 (diff)
downloadgit-1487eb68f7fd145151caa9a11ee00283629b75ef.tar.gz
Merge branch 'jk/maint-cleanup-after-exec-failure'
* jk/maint-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.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/run-command.c b/run-command.c
index db9ce59204..b05c734d05 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;
+ }
}
}