Johannes Schindelin [off-list ref] writes:
quoted
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;
}