connect: tell server that the client understands v1
[gitweb.git] / connect.c
index a5e708a618cd71b230437b5c172d8c78bfcfd3b1..b8695a2fa28b5fd9eb9dc4b3e0291b481c57bd6a 100644 (file)
--- a/connect.c
+++ b/connect.c
@@ -871,6 +871,7 @@ struct child_process *git_connect(int fd[2], const char *url,
                printf("Diag: path=%s\n", path ? path : "NULL");
                conn = NULL;
        } else if (protocol == PROTO_GIT) {
+               struct strbuf request = STRBUF_INIT;
                /*
                 * Set up virtual host information based on where we will
                 * connect, unless the user has overridden us in
@@ -898,13 +899,25 @@ 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.
                 */
-               packet_write_fmt(fd[1],
-                            "%s %s%chost=%s%c",
-                            prog, path, 0,
-                            target_host, 0);
+               strbuf_addf(&request,
+                           "%s %s%chost=%s%c",
+                           prog, path, 0,
+                           target_host, 0);
+
+               /* If using a new version put that stuff here after a second null byte */
+               if (get_protocol_version_config() > 0) {
+                       strbuf_addch(&request, '\0');
+                       strbuf_addf(&request, "version=%d%c",
+                                   get_protocol_version_config(), '\0');
+               }
+
+               packet_write(fd[1], request.buf, request.len);
+
                free(target_host);
+               strbuf_release(&request);
        } else {
                struct strbuf cmd = STRBUF_INIT;
+               const char *const *var;
 
                conn = xmalloc(sizeof(*conn));
                child_process_init(conn);
@@ -917,7 +930,9 @@ struct child_process *git_connect(int fd[2], const char *url,
                sq_quote_buf(&cmd, path);
 
                /* remove repo-local variables from the environment */
-               conn->env = local_repo_env;
+               for (var = local_repo_env; *var; var++)
+                       argv_array_push(&conn->env_array, *var);
+
                conn->use_shell = 1;
                conn->in = conn->out = -1;
                if (protocol == PROTO_SSH) {
@@ -971,6 +986,14 @@ struct child_process *git_connect(int fd[2], const char *url,
                        }
 
                        argv_array_push(&conn->args, ssh);
+
+                       if (get_protocol_version_config() > 0) {
+                               argv_array_push(&conn->args, "-o");
+                               argv_array_push(&conn->args, "SendEnv=" GIT_PROTOCOL_ENVIRONMENT);
+                               argv_array_pushf(&conn->env_array, GIT_PROTOCOL_ENVIRONMENT "=version=%d",
+                                                get_protocol_version_config());
+                       }
+
                        if (flags & CONNECT_IPV4)
                                argv_array_push(&conn->args, "-4");
                        else if (flags & CONNECT_IPV6)
@@ -985,6 +1008,10 @@ struct child_process *git_connect(int fd[2], const char *url,
                        argv_array_push(&conn->args, ssh_host);
                } else {
                        transport_check_allowed("file");
+                       if (get_protocol_version_config() > 0) {
+                               argv_array_pushf(&conn->env_array, GIT_PROTOCOL_ENVIRONMENT "=version=%d",
+                                                get_protocol_version_config());
+                       }
                }
                argv_array_push(&conn->args, cmd.buf);