diff options
author | Junio C Hamano <gitster@pobox.com> | 2009-02-03 00:26:12 -0800 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2009-02-03 00:26:12 -0800 |
commit | 1487eb68f7fd145151caa9a11ee00283629b75ef (patch) | |
tree | f745afc9bab5014851864b9d0046f9e3b9774acd /git.c | |
parent | 2ea3c17189bf9ca459879129ca190792b5451f05 (diff) | |
parent | d8e96fd86d415554a9c2e09ffb929a9e22fdad25 (diff) | |
download | git-1487eb68f7fd145151caa9a11ee00283629b75ef.tar.gz git-1487eb68f7fd145151caa9a11ee00283629b75ef.tar.xz |
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 'git.c')
-rw-r--r-- | git.c | 21 |
1 files changed, 15 insertions, 6 deletions
@@ -2,6 +2,7 @@ #include "exec_cmd.h" #include "cache.h" #include "quote.h" +#include "run-command.h" const char git_usage_string[] = "git [--version] [--exec-path[=GIT_EXEC_PATH]] [-p|--paginate|--no-pager] [--bare] [--git-dir=GIT_DIR] [--work-tree=GIT_WORK_TREE] [--help] COMMAND [ARGS]"; @@ -219,7 +220,7 @@ struct cmd_struct { int option; }; -static int run_command(struct cmd_struct *p, int argc, const char **argv) +static int run_builtin(struct cmd_struct *p, int argc, const char **argv) { int status; struct stat st; @@ -384,7 +385,7 @@ static void handle_internal_command(int argc, const char **argv) struct cmd_struct *p = commands+i; if (strcmp(p->cmd, cmd)) continue; - exit(run_command(p, argc, argv)); + exit(run_builtin(p, argc, argv)); } } @@ -392,6 +393,7 @@ static void execv_dashed_external(const char **argv) { struct strbuf cmd = STRBUF_INIT; const char *tmp; + int status; strbuf_addf(&cmd, "git-%s", argv[0]); @@ -406,10 +408,17 @@ static void execv_dashed_external(const char **argv) trace_argv_printf(argv, "trace: exec:"); - /* execvp() can only ever return if it fails */ - execvp(cmd.buf, (char **)argv); - - trace_printf("trace: exec failed: %s\n", strerror(errno)); + /* + * if we fail because the command is not found, it is + * OK to return. Otherwise, we just pass along the status code. + */ + status = run_command_v_opt(argv, 0); + if (status != -ERR_RUN_COMMAND_EXEC) { + if (IS_RUN_COMMAND_ERR(status)) + die("unable to run '%s'", argv[0]); + exit(-status); + } + errno = ENOENT; /* as if we called execvp */ argv[0] = tmp; |