From: Thomas Rast Date: Fri, 10 May 2013 15:06:07 GMT Subject: [PATCH] Support running an arbitrary git action through checkout Message-ID: <2d5cfb3be9487f607051cad3d5230434660307ba.1368198269.git.trast@inf.ethz.ch> [1] correctly observed that we are already wrapping three different operations under the git-checkout command. To lead that design -- and the Koan -- to the obvious conclusion, some additional work is required. With this patch, you can say git checkout --reset foo # reset HEAD to foo git checkout --bisect start # begin a bisection git checkout --rebase master # rebase the current branch on master and so on for any git command. Note that this actually shadows the long form of the existing --merge option. But since all reasonable Git users are extremely lazy typers, they will just use the short form (-m) and this change is not expected to cause them any problems. [1] http://stevelosh.com/blog/2013/04/git-koans/ Cc: Steve Losh Cc: Jeff King Signed-off-by: Thomas Rast --- builtin/checkout.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/builtin/checkout.c b/builtin/checkout.c index f5b50e5..17419a2 100644 --- a/builtin/checkout.c +++ b/builtin/checkout.c @@ -20,6 +20,8 @@ #include "resolve-undo.h" #include "submodule.h" #include "argv-array.h" +#include "help.h" +#include "exec_cmd.h" static const char * const checkout_usage[] = { N_("git checkout [options] "), @@ -1071,6 +1073,25 @@ int cmd_checkout(int argc, const char **argv, const char *prefix) OPT_END(), }; + if (argc > 1 && !prefixcmp(argv[1], "--")) { + const char *subcommand = argv[1] + 2; + struct cmdnames main_cmds, other_cmds; + + memset(&main_cmds, 0, sizeof(main_cmds)); + memset(&other_cmds, 0, sizeof(other_cmds)); + + load_command_list("git-", &main_cmds, &other_cmds); + + if (is_in_cmdlist(&main_cmds, subcommand) || + is_in_cmdlist(&other_cmds, subcommand)) { + const char **args = xmalloc((argc) * sizeof(char*)); + args[0] = subcommand; + memcpy(args+1, argv+2, argc*sizeof(char*)); + args[argc] = NULL; + execv_git_cmd(args); + } + } + memset(&opts, 0, sizeof(opts)); memset(&new, 0, sizeof(new)); opts.overwrite_ignore = 1; -- 1.8.3.rc1.425.g49e5819