diff options
-rw-r--r-- | shell.c | 27 |
1 files changed, 26 insertions, 1 deletions
@@ -1,6 +1,7 @@ #include "cache.h" #include "quote.h" #include "exec_cmd.h" +#include "strbuf.h" static int do_generic_cmd(const char *me, char *arg) { @@ -18,12 +19,34 @@ static int do_generic_cmd(const char *me, char *arg) return execv_git_cmd(my_argv); } +static int do_cvs_cmd(const char *me, char *arg) +{ + const char *cvsserver_argv[3] = { + "cvsserver", "server", NULL + }; + const char *oldpath = getenv("PATH"); + struct strbuf newpath = STRBUF_INIT; + + if (!arg || strcmp(arg, "server")) + die("git-cvsserver only handles server: %s", arg); + + strbuf_addstr(&newpath, git_exec_path()); + strbuf_addch(&newpath, ':'); + strbuf_addstr(&newpath, oldpath); + + setenv("PATH", strbuf_detach(&newpath, NULL), 1); + + return execv_git_cmd(cvsserver_argv); +} + + static struct commands { const char *name; int (*exec)(const char *me, char *arg); } cmd_list[] = { { "git-receive-pack", do_generic_cmd }, { "git-upload-pack", do_generic_cmd }, + { "cvs", do_cvs_cmd }, { NULL }, }; @@ -32,8 +55,10 @@ int main(int argc, char **argv) char *prog; struct commands *cmd; + if (argc == 2 && !strcmp(argv[1], "cvs server")) + argv--; /* We want to see "-c cmd args", and nothing else */ - if (argc != 3 || strcmp(argv[1], "-c")) + else if (argc != 3 || strcmp(argv[1], "-c")) die("What do you think I am? A shell?"); prog = argv[2]; |