[PATCH 1/4] git_connect: extend to take a pseudo format string for the program to run
- From
Mike Hommey <mh@glandium.org>
- Date
- Apr 28, 2016, 14:12 UTC
- Message-ID
- <1461852759-28429-2-git-send-email-mh@glandium.org>
- In-Reply-To
- <1461852759-28429-1-git-send-email-mh@glandium.org>
Currently, the path extracted from the url is passed as last argument to the program/command passed to git_connect(). In every case the function is used in the git code base, it's enough, but in order to allow the reuse of e.g. the GIT_SSH/GIT_SSH_COMMAND logic, additional flexibility is welcome.
With this change, when the program/command passed to git_connect() contains a "%s", that "%s" is replaced with the path from the url, allowing the path to be at a different position than last on the executed command line.
Signed-off-by: Mike Hommey <mh@glandium.org> --- connect.c | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-)
diff --git a/connect.c b/connect.c index dccf673..96c8c1d 100644 --- a/connect.c +++ b/connect.c @@ -658,6 +658,25 @@ static enum protocol parse_connect_url(const char *url_orig, char **ret_host, static struct child_process no_fork = CHILD_PROCESS_INIT; +static void prepare_connect_command(struct strbuf *cmd, const char *prog, + const char *path, int quote) +{ + const char *found = strstr(prog, "%s"); + if (found) + strbuf_add(cmd, prog, found - prog); + else { + strbuf_addstr(cmd, prog); + strbuf_addch(cmd, ' '); + } + if (quote) + sq_quote_buf(cmd, path); + else + strbuf_addstr(cmd, path); + + if (found) + strbuf_addstr(cmd, found + 2); +} + /* * This returns a dummy child_process if the transport protocol does not * need fork(2), or a struct child_process object if it does. Once done, @@ -717,18 +736,18 @@ struct child_process *git_connect(int fd[2], const char *url, * Note: Do not add any other headers here! Doing so * will cause older git-daemon servers to crash. */ + prepare_connect_command(&cmd, prog, path, 0); packet_write(fd[1], - "%s %s%chost=%s%c", - prog, path, 0, + "%s%chost=%s%c", + cmd.buf, 0, target_host, 0); + strbuf_release(&cmd); free(target_host); } else { conn = xmalloc(sizeof(*conn)); child_process_init(conn); - strbuf_addstr(&cmd, prog); - strbuf_addch(&cmd, ' '); - sq_quote_buf(&cmd, path); + prepare_connect_command(&cmd, prog, path, 1); /* remove repo-local variables from the environment */ conn->env = local_repo_env;
-- 2.8.1.5.g18c8a48