X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=connect.c;h=54f7bf7915d199b4d1aa449dca018e8b78593368;hb=ce0bd64299ae148ef61a63edcac635de41254cb5;hp=d6f4e4c3a7748a30528dce609ae3b6db09d4bd1d;hpb=58e3fb40f7ca1c28f9105c15166884f80bb22e55;p=git.git diff --git a/connect.c b/connect.c index d6f4e4c3..54f7bf79 100644 --- a/connect.c +++ b/connect.c @@ -1,3 +1,4 @@ +#include "git-compat-util.h" #include "cache.h" #include "pkt-line.h" #include "quote.h" @@ -73,7 +74,7 @@ int get_ack(int fd, unsigned char *result_sha1) line[--len] = 0; if (!strcmp(line, "NAK")) return 0; - if (!strncmp(line, "ACK ", 3)) { + if (!strncmp(line, "ACK ", 4)) { if (!get_sha1_hex(line+4, result_sha1)) { if (strstr(line+45, "continue")) return 2; @@ -99,7 +100,7 @@ int path_match(const char *path, int nr, char **match) if (pathlen > len && path[pathlen - len - 1] != '/') continue; *s = 0; - return 1; + return (i + 1); } return 0; } @@ -566,6 +567,7 @@ int git_connect(int fd[2], char *url, const char *prog) int pipefd[2][2]; pid_t pid; enum protocol protocol = PROTO_LOCAL; + int free_path = 0; host = strstr(url, "://"); if(host) { @@ -609,16 +611,23 @@ int git_connect(int fd[2], char *url, const char *prog) char *ptr = path; if (path[1] == '~') path++; - else + else { path = strdup(ptr); + free_path = 1; + } *ptr = '\0'; } if (protocol == PROTO_GIT) { + int ret; if (git_use_proxy(host)) - return git_proxy_connect(fd, prog, host, path); - return git_tcp_connect(fd, prog, host, path); + ret = git_proxy_connect(fd, prog, host, path); + else + ret = git_tcp_connect(fd, prog, host, path); + if (free_path) + free(path); + return ret; } if (pipe(pipefd[0]) < 0 || pipe(pipefd[1]) < 0) @@ -644,14 +653,22 @@ int git_connect(int fd[2], char *url, const char *prog) ssh_basename++; execlp(ssh, ssh_basename, host, command, NULL); } - else + else { + unsetenv(ALTERNATE_DB_ENVIRONMENT); + unsetenv(DB_ENVIRONMENT); + unsetenv(GIT_DIR_ENVIRONMENT); + unsetenv(GRAFT_ENVIRONMENT); + unsetenv(INDEX_ENVIRONMENT); execlp("sh", "sh", "-c", command, NULL); + } die("exec failed"); - } + } fd[0] = pipefd[0][0]; fd[1] = pipefd[1][1]; close(pipefd[0][1]); close(pipefd[1][0]); + if (free_path) + free(path); return pid; }