diff options
author | Junio C Hamano <gitster@pobox.com> | 2008-07-01 15:21:52 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2008-07-01 15:21:52 -0700 |
commit | 9d54ea6760cc4d7ee526d12cd00218bf19b79bf5 (patch) | |
tree | b783aca8a1e4440b022ac19f163678170a3565c7 | |
parent | 605acb6d0dd9dba21f2b11dfe8772d7718b881a6 (diff) | |
parent | 7550be0a2bbf47aaa63c806bb5d7fcb8ab197cf8 (diff) | |
download | git-9d54ea6760cc4d7ee526d12cd00218bf19b79bf5.tar.gz git-9d54ea6760cc4d7ee526d12cd00218bf19b79bf5.tar.xz |
Merge branch 'jc/dashless' (early part)
* 'jc/dashless' (early part):
Prepare execv_git_cmd() for removal of builtins from the filesystem
git-shell: accept "git foo" form
-rw-r--r-- | exec_cmd.c | 31 | ||||
-rw-r--r-- | git.c | 32 |
2 files changed, 43 insertions, 20 deletions
diff --git a/exec_cmd.c b/exec_cmd.c index e189caca6..0f8f4b5b7 100644 --- a/exec_cmd.c +++ b/exec_cmd.c @@ -65,32 +65,25 @@ void setup_path(const char *cmd_path) int execv_git_cmd(const char **argv) { - struct strbuf cmd; - const char *tmp; - - strbuf_init(&cmd, 0); - strbuf_addf(&cmd, "git-%s", argv[0]); + int argc; + const char **nargv; - /* - * argv[0] must be the git command, but the argv array - * belongs to the caller, and may be reused in - * subsequent loop iterations. Save argv[0] and - * restore it on error. - */ - tmp = argv[0]; - argv[0] = cmd.buf; + for (argc = 0; argv[argc]; argc++) + ; /* just counting */ + nargv = xmalloc(sizeof(*nargv) * (argc + 2)); - trace_argv_printf(argv, "trace: exec:"); + nargv[0] = "git"; + for (argc = 0; argv[argc]; argc++) + nargv[argc + 1] = argv[argc]; + nargv[argc + 1] = NULL; + trace_argv_printf(nargv, "trace: exec:"); /* execvp() can only ever return if it fails */ - execvp(cmd.buf, (char **)argv); + execvp("git", (char **)nargv); trace_printf("trace: exec failed: %s\n", strerror(errno)); - argv[0] = tmp; - - strbuf_release(&cmd); - + free(nargv); return -1; } @@ -384,6 +384,36 @@ static void handle_internal_command(int argc, const char **argv) } } +static void execv_dashed_external(const char **argv) +{ + struct strbuf cmd; + const char *tmp; + + strbuf_init(&cmd, 0); + strbuf_addf(&cmd, "git-%s", argv[0]); + + /* + * argv[0] must be the git command, but the argv array + * belongs to the caller, and may be reused in + * subsequent loop iterations. Save argv[0] and + * restore it on error. + */ + tmp = argv[0]; + argv[0] = cmd.buf; + + 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)); + + argv[0] = tmp; + + strbuf_release(&cmd); +} + + int main(int argc, const char **argv) { const char *cmd = argv[0] ? argv[0] : "git-help"; @@ -448,7 +478,7 @@ int main(int argc, const char **argv) handle_internal_command(argc, argv); /* .. then try the external ones */ - execv_git_cmd(argv); + execv_dashed_external(argv); /* It could be an alias -- this works around the insanity * of overriding "git log" with "git show" by having |