Johannes Schindelin <Johannes.Schindelin@xxxxxx> writes: >> I only eyeball-tested it and looks Okay, but that does not assure us >> much ;-). Is this change easy to test using local transport? > > Seems like it breaks down with git-shell. But then, I think that we just > have to fix execv_git_cmd() to call builtins via "git" instead. So in execv_git_cmd(), instead of doing the strbuf_addf(), we do something like this (and drop your patch)? --- exec_cmd.c | 34 +++++++++++++--------------------- 1 files changed, 13 insertions(+), 21 deletions(-) diff --git a/exec_cmd.c b/exec_cmd.c index 2d0a758..2920335 100644 --- a/exec_cmd.c +++ b/exec_cmd.c @@ -65,32 +65,24 @@ 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]); - - /* - * 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, -1, "trace: exec:"); + int i; + const char **args; + + for (i = 0; argv[i]; i++) + ; + args = xcalloc(i + 1, sizeof(*args)); + for (i = 0; argv[i]; i++) + args[i+1] = argv[i]; + args[0] = "git"; + args[i+1] = NULL; + trace_argv_printf(args, -1, "trace: exec:"); /* execvp() can only ever return if it fails */ - execvp(cmd.buf, (char **)argv); + execvp(args[0], (char **)args); trace_printf("trace: exec failed: %s\n", strerror(errno)); - argv[0] = tmp; - - strbuf_release(&cmd); - + free(args); return -1; } - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html