Re: [PATCH v2] help -a: improve and make --verbose default

2018-10-01 Thread Taylor Blau
On Sat, Sep 29, 2018 at 08:08:14AM +0200, Nguyễn Thái Ngọc Duy wrote:
> When you type "git help" (or just "git") you are greeted with a list
> with commonly used commands and their short description and are
> suggested to use "git help -a" or "git help -g" for more details.
>
> "git help -av" would be more friendly and inline with what is shown
> with "git help" since it shows list of commands with description as
> well, and commands are properly grouped.
>
> "help -av" does not show everything "help -a" shows though. Add
> external command section in "help -av" for this. While at there, add a
> section for aliases as well (until now aliases have no UI, just "git
> config").
>
> Signed-off-by: Nguyễn Thái Ngọc Duy 
> ---
>  v2 makes 'help -av' default and the user would need to type 'help -a
>  --no-verbose' to get the old printout back. 'help -av' also has
>  external commands and aliases.

Thanks. This looks like what I would have expected based on my
recollection of the discussion earlier on v1, so this has my:

  Reviewed-by: Taylor Blau 

Thanks,
Taylor


[PATCH v2] help -a: improve and make --verbose default

2018-09-28 Thread Nguyễn Thái Ngọc Duy
When you type "git help" (or just "git") you are greeted with a list
with commonly used commands and their short description and are
suggested to use "git help -a" or "git help -g" for more details.

"git help -av" would be more friendly and inline with what is shown
with "git help" since it shows list of commands with description as
well, and commands are properly grouped.

"help -av" does not show everything "help -a" shows though. Add
external command section in "help -av" for this. While at there, add a
section for aliases as well (until now aliases have no UI, just "git
config").

Signed-off-by: Nguyễn Thái Ngọc Duy 
---
 v2 makes 'help -av' default and the user would need to type 'help -a
 --no-verbose' to get the old printout back. 'help -av' also has
 external commands and aliases.

 Documentation/git-help.txt |  8 +++---
 builtin/help.c |  2 +-
 help.c | 50 +++---
 t/t0012-help.sh|  4 +--
 4 files changed, 54 insertions(+), 10 deletions(-)

diff --git a/Documentation/git-help.txt b/Documentation/git-help.txt
index 83d25d825a..206e3aef64 100644
--- a/Documentation/git-help.txt
+++ b/Documentation/git-help.txt
@@ -8,7 +8,7 @@ git-help - Display help information about Git
 SYNOPSIS
 
 [verse]
-'git help' [-a|--all [--verbose]] [-g|--guide]
+'git help' [-a|--all [--[no-]verbose]] [-g|--guide]
   [-i|--info|-m|--man|-w|--web] [COMMAND|GUIDE]
 
 DESCRIPTION
@@ -42,8 +42,10 @@ OPTIONS
 --all::
Prints all the available commands on the standard output. This
option overrides any given command or guide name.
-   When used with `--verbose` print description for all recognized
-   commands.
+
+--verbose::
+   When used with `--all` print description for all recognized
+   commands. This is the default.
 
 -c::
 --config::
diff --git a/builtin/help.c b/builtin/help.c
index 8d4f6dd301..d83dac2839 100644
--- a/builtin/help.c
+++ b/builtin/help.c
@@ -38,7 +38,7 @@ static const char *html_path;
 static int show_all = 0;
 static int show_guides = 0;
 static int show_config;
-static int verbose;
+static int verbose = 1;
 static unsigned int colopts;
 static enum help_format help_format = HELP_FORMAT_NONE;
 static int exclude_guides;
diff --git a/help.c b/help.c
index 96f6d221ed..4745b32299 100644
--- a/help.c
+++ b/help.c
@@ -98,7 +98,8 @@ static int cmd_name_cmp(const void *elem1, const void *elem2)
return strcmp(e1->name, e2->name);
 }
 
-static void print_cmd_by_category(const struct category_description *catdesc)
+static void print_cmd_by_category(const struct category_description *catdesc,
+ int *longest_p)
 {
struct cmdname_help *cmds;
int longest = 0;
@@ -124,6 +125,8 @@ static void print_cmd_by_category(const struct 
category_description *catdesc)
print_command_list(cmds, mask, longest);
}
free(cmds);
+   if (longest_p)
+   *longest_p = longest;
 }
 
 void add_cmdname(struct cmdnames *cmds, const char *name, int len)
@@ -307,7 +310,7 @@ void list_commands(unsigned int colopts,
 void list_common_cmds_help(void)
 {
puts(_("These are common Git commands used in various situations:"));
-   print_cmd_by_category(common_categories);
+   print_cmd_by_category(common_categories, NULL);
 }
 
 void list_all_main_cmds(struct string_list *list)
@@ -405,7 +408,7 @@ void list_common_guides_help(void)
{ CAT_guide, N_("The common Git guides are:") },
{ 0, NULL }
};
-   print_cmd_by_category(catdesc);
+   print_cmd_by_category(catdesc, NULL);
putchar('\n');
 }
 
@@ -494,9 +497,48 @@ void list_config_help(int for_human)
string_list_clear(&keys, 0);
 }
 
+static int get_alias(const char *var, const char *value, void *data)
+{
+   struct string_list *list = data;
+
+   if (skip_prefix(var, "alias.", &var))
+   string_list_append(list, var)->util = xstrdup(value);
+
+   return 0;
+}
+
 void list_all_cmds_help(void)
 {
-   print_cmd_by_category(main_categories);
+   struct string_list others = STRING_LIST_INIT_DUP;
+   struct string_list alias_list = STRING_LIST_INIT_DUP;
+   struct cmdname_help *aliases;
+   int i, longest;
+
+   printf_ln(_("See 'git help ' to read about a specific 
subcommand"));
+   print_cmd_by_category(main_categories, &longest);
+
+   list_all_other_cmds(&others);
+   if (others.nr)
+   printf("\n%s\n", _("External commands"));
+   for (i = 0; i < others.nr; i++)
+   printf("   %s\n", others.items[i].string);
+   string_list_clear(&others, 0);
+
+   git_config(get_alias, &alias_list);
+   string_list_sort(&alias_list);
+   if (alias_list.nr) {
+   printf("\n%s\n", _("Command aliases"));
+   ALLOC_ARRAY(aliases, alias_list.nr + 1);
+   for (i = 0; i < alias_list.nr; i+