Merge branch 'rt/help-unknown'
authorJunio C Hamano <gitster@pobox.com>
Fri, 9 Sep 2016 04:49:48 +0000 (21:49 -0700)
committerJunio C Hamano <gitster@pobox.com>
Fri, 9 Sep 2016 04:49:48 +0000 (21:49 -0700)
"git nosuchcommand --help" said "No manual entry for gitnosuchcommand",
which was not intuitive, given that "git nosuchcommand" said "git:
'nosuchcommand' is not a git command".

* rt/help-unknown:
help: make option --help open man pages only for Git commands
help: introduce option --exclude-guides

1  2 
git.c
diff --combined git.c
index 0f1937fd0c23da7c316540b8f9a6b05746011506,6ade0bc93807c2bd2f2f325d203643ea32a9cd8c..1c61151758531889e2a2e60e66799283240dc89a
--- 1/git.c
--- 2/git.c
+++ b/git.c
@@@ -522,21 -522,34 +522,34 @@@ static void strip_extension(const char 
  
  static void handle_builtin(int argc, const char **argv)
  {
+       struct argv_array args = ARGV_ARRAY_INIT;
        const char *cmd;
        struct cmd_struct *builtin;
  
        strip_extension(argv);
        cmd = argv[0];
  
-       /* Turn "git cmd --help" into "git help cmd" */
+       /* Turn "git cmd --help" into "git help --exclude-guides cmd" */
        if (argc > 1 && !strcmp(argv[1], "--help")) {
+               int i;
                argv[1] = argv[0];
                argv[0] = cmd = "help";
+               for (i = 0; i < argc; i++) {
+                       argv_array_push(&args, argv[i]);
+                       if (!i)
+                               argv_array_push(&args, "--exclude-guides");
+               }
+               argc++;
+               argv = args.argv;
        }
  
        builtin = get_builtin(cmd);
        if (builtin)
                exit(run_builtin(builtin, argc, argv));
+       argv_array_clear(&args);
  }
  
  static void execv_dashed_external(const char **argv)
@@@ -609,15 -622,48 +622,15 @@@ static int run_argv(int *argcp, const c
        return done_alias;
  }
  
 -/*
 - * Many parts of Git have subprograms communicate via pipe, expect the
 - * upstream of a pipe to die with SIGPIPE when the downstream of a
 - * pipe does not need to read all that is written.  Some third-party
 - * programs that ignore or block SIGPIPE for their own reason forget
 - * to restore SIGPIPE handling to the default before spawning Git and
 - * break this carefully orchestrated machinery.
 - *
 - * Restore the way SIGPIPE is handled to default, which is what we
 - * expect.
 - */
 -static void restore_sigpipe_to_default(void)
 -{
 -      sigset_t unblock;
 -
 -      sigemptyset(&unblock);
 -      sigaddset(&unblock, SIGPIPE);
 -      sigprocmask(SIG_UNBLOCK, &unblock, NULL);
 -      signal(SIGPIPE, SIG_DFL);
 -}
 -
 -int main(int argc, char **av)
 +int cmd_main(int argc, const char **argv)
  {
 -      const char **argv = (const char **) av;
        const char *cmd;
        int done_help = 0;
  
 -      cmd = git_extract_argv0_path(argv[0]);
 +      cmd = argv[0];
        if (!cmd)
                cmd = "git-help";
  
 -      /*
 -       * Always open file descriptors 0/1/2 to avoid clobbering files
 -       * in die().  It also avoids messing up when the pipes are dup'ed
 -       * onto stdin/stdout/stderr in the child processes we spawn.
 -       */
 -      sanitize_stdfds();
 -
 -      restore_sigpipe_to_default();
 -
 -      git_setup_gettext();
 -
        trace_command_performance(argv);
  
        /*