From: Junio C Hamano Date: Wed, 20 Aug 2008 01:05:43 +0000 (-0700) Subject: Build-in "git-shell" X-Git-Tag: v1.6.1-rc1~303^2~1 X-Git-Url: https://git.tokkee.org/?a=commitdiff_plain;h=daa0cc9a92c9c2c714aa5f7da6d0ff65b93e0698;p=git.git Build-in "git-shell" This trivially makes "git-shell" a built-in. It makes the executable even fatter, though. And MinGW removed git-shell only because of the funny dependencies; there is no reason to do so anymore. Signed-off-by: Junio C Hamano Tested-on-MinGW-by: Johannes Sixt --- diff --git a/Makefile b/Makefile index 71339e109..7c585e866 100644 --- a/Makefile +++ b/Makefile @@ -546,6 +546,7 @@ BUILTIN_OBJS += builtin-rev-parse.o BUILTIN_OBJS += builtin-revert.o BUILTIN_OBJS += builtin-rm.o BUILTIN_OBJS += builtin-send-pack.o +BUILTIN_OBJS += builtin-shell.o BUILTIN_OBJS += builtin-shortlog.o BUILTIN_OBJS += builtin-show-branch.o BUILTIN_OBJS += builtin-show-ref.o @@ -821,7 +822,6 @@ EXTLIBS += -lz ifndef NO_POSIX_ONLY_PROGRAMS PROGRAMS += git-daemon$X PROGRAMS += git-imap-send$X - PROGRAMS += git-shell$X endif ifndef NO_OPENSSL OPENSSL_LIBSSL = -lssl diff --git a/builtin-shell.c b/builtin-shell.c new file mode 100644 index 000000000..3cf97d4f5 --- /dev/null +++ b/builtin-shell.c @@ -0,0 +1,90 @@ +#include "cache.h" +#include "quote.h" +#include "exec_cmd.h" +#include "strbuf.h" +#include "builtin.h" + +static int do_generic_cmd(const char *me, char *arg) +{ + const char *my_argv[4]; + + setup_path(); + if (!arg || !(arg = sq_dequote(arg))) + die("bad argument"); + if (prefixcmp(me, "git-")) + die("bad command"); + + my_argv[0] = me + 4; + my_argv[1] = arg; + my_argv[2] = NULL; + + return execv_git_cmd(my_argv); +} + +static int do_cvs_cmd(const char *me, char *arg) +{ + const char *cvsserver_argv[3] = { + "cvsserver", "server", NULL + }; + + if (!arg || strcmp(arg, "server")) + die("git-cvsserver only handles server: %s", arg); + + setup_path(); + 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 }, +}; + +int cmd_shell(int argc, const char **argv, const char *prefix) +{ + char *prog; + struct commands *cmd; + + /* + * Special hack to pretend to be a CVS server + */ + if (argc == 2 && !strcmp(argv[1], "cvs server")) + argv--; + + /* + * We do not accept anything but "-c" followed by "cmd arg", + * where "cmd" is a very limited subset of git commands. + */ + else if (argc != 3 || strcmp(argv[1], "-c")) + die("What do you think I am? A shell?"); + + prog = xstrdup(argv[2]); + if (!strncmp(prog, "git", 3) && isspace(prog[3])) + /* Accept "git foo" as if the caller said "git-foo". */ + prog[3] = '-'; + + for (cmd = cmd_list ; cmd->name ; cmd++) { + int len = strlen(cmd->name); + char *arg; + if (strncmp(cmd->name, prog, len)) + continue; + arg = NULL; + switch (prog[len]) { + case '\0': + arg = NULL; + break; + case ' ': + arg = prog + len + 1; + break; + default: + continue; + } + exit(cmd->exec(cmd->name, arg)); + } + die("unrecognized command '%s'", prog); +} diff --git a/builtin.h b/builtin.h index f3502d305..2b57a5eb6 100644 --- a/builtin.h +++ b/builtin.h @@ -88,6 +88,7 @@ extern int cmd_rev_parse(int argc, const char **argv, const char *prefix); extern int cmd_revert(int argc, const char **argv, const char *prefix); extern int cmd_rm(int argc, const char **argv, const char *prefix); extern int cmd_send_pack(int argc, const char **argv, const char *prefix); +extern int cmd_shell(int argc, const char **argv, const char *prefix); extern int cmd_shortlog(int argc, const char **argv, const char *prefix); extern int cmd_show(int argc, const char **argv, const char *prefix); extern int cmd_show_branch(int argc, const char **argv, const char *prefix); diff --git a/git.c b/git.c index 37b1d76a0..89e464573 100644 --- a/git.c +++ b/git.c @@ -338,6 +338,7 @@ static void handle_internal_command(int argc, const char **argv) { "revert", cmd_revert, RUN_SETUP | NEED_WORK_TREE }, { "rm", cmd_rm, RUN_SETUP }, { "send-pack", cmd_send_pack, RUN_SETUP }, + { "shell", cmd_shell }, { "shortlog", cmd_shortlog, USE_PAGER }, { "show-branch", cmd_show_branch, RUN_SETUP }, { "show", cmd_show, RUN_SETUP | USE_PAGER }, diff --git a/shell.c b/shell.c deleted file mode 100644 index 0f6a727a8..000000000 --- a/shell.c +++ /dev/null @@ -1,89 +0,0 @@ -#include "cache.h" -#include "quote.h" -#include "exec_cmd.h" -#include "strbuf.h" - -static int do_generic_cmd(const char *me, char *arg) -{ - const char *my_argv[4]; - - setup_path(); - if (!arg || !(arg = sq_dequote(arg))) - die("bad argument"); - if (prefixcmp(me, "git-")) - die("bad command"); - - my_argv[0] = me + 4; - my_argv[1] = arg; - my_argv[2] = NULL; - - return execv_git_cmd(my_argv); -} - -static int do_cvs_cmd(const char *me, char *arg) -{ - const char *cvsserver_argv[3] = { - "cvsserver", "server", NULL - }; - - if (!arg || strcmp(arg, "server")) - die("git-cvsserver only handles server: %s", arg); - - setup_path(); - 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 }, -}; - -int main(int argc, char **argv) -{ - char *prog; - struct commands *cmd; - - /* - * Special hack to pretend to be a CVS server - */ - if (argc == 2 && !strcmp(argv[1], "cvs server")) - argv--; - - /* - * We do not accept anything but "-c" followed by "cmd arg", - * where "cmd" is a very limited subset of git commands. - */ - else if (argc != 3 || strcmp(argv[1], "-c")) - die("What do you think I am? A shell?"); - - prog = argv[2]; - if (!strncmp(prog, "git", 3) && isspace(prog[3])) - /* Accept "git foo" as if the caller said "git-foo". */ - prog[3] = '-'; - - for (cmd = cmd_list ; cmd->name ; cmd++) { - int len = strlen(cmd->name); - char *arg; - if (strncmp(cmd->name, prog, len)) - continue; - arg = NULL; - switch (prog[len]) { - case '\0': - arg = NULL; - break; - case ' ': - arg = prog + len + 1; - break; - default: - continue; - } - exit(cmd->exec(cmd->name, arg)); - } - die("unrecognized command '%s'", prog); -}