Joel Nothman <joel.nothman@xxxxxxxxx> writes: > Git help --all had listed all git commands, but no configured aliases. > This includes aliases as a separate listing, after commands in the main > git directory and other $PATH directories. ... and why is this a good thing? > > Signed-off-by: Joel Nothman <joel.nothman <at> gmail.com> > --- > Documentation/git-help.txt | 4 +-- > builtin/help.c | 7 ++--- > help.c | 64 +++++++++++++++++++++++++++++++++++----------- > help.h | 7 ++++- > 4 files changed, 61 insertions(+), 21 deletions(-) > > diff --git a/Documentation/git-help.txt b/Documentation/git-help.txt > index b21e9d7..c9fe791 100644 > --- a/Documentation/git-help.txt > +++ b/Documentation/git-help.txt > @@ -40,8 +40,8 @@ OPTIONS > ------- > -a:: > --all:: > - Prints all the available commands on the standard output. This > - option overrides any given command or guide name. > + Prints all the available commands and aliases on the standard output. > + This option overrides any given command or guide name. > > -g:: > --guides:: > diff --git a/builtin/help.c b/builtin/help.c > index 1fdefeb..d1dfecd 100644 > --- a/builtin/help.c > +++ b/builtin/help.c > @@ -38,7 +38,7 @@ static int show_guides = 0; > static unsigned int colopts; > static enum help_format help_format = HELP_FORMAT_NONE; > static struct option builtin_help_options[] = { > - OPT_BOOL('a', "all", &show_all, N_("print all available commands")), > + OPT_BOOL('a', "all", &show_all, N_("print all available commands and aliases")), > OPT_BOOL('g', "guides", &show_guides, N_("print list of useful guides")), > OPT_SET_INT('m', "man", &help_format, N_("show man page"), HELP_FORMAT_MAN), > OPT_SET_INT('w', "web", &help_format, N_("show manual in web browser"), > @@ -453,6 +453,7 @@ int cmd_help(int argc, const char **argv, const char *prefix) > int nongit; > const char *alias; > enum help_format parsed_help_format; > + struct cmdnames alias_cmds; > > argc = parse_options(argc, argv, prefix, builtin_help_options, > builtin_help_usage, 0); > @@ -461,8 +462,8 @@ int cmd_help(int argc, const char **argv, const char *prefix) > if (show_all) { > git_config(git_help_config, NULL); > printf(_("usage: %s%s"), _(git_usage_string), "\n\n"); > - load_command_list("git-", &main_cmds, &other_cmds); > - list_commands(colopts, &main_cmds, &other_cmds); > + load_commands_and_aliases("git-", &main_cmds, &other_cmds, &alias_cmds); > + list_commands(colopts, &main_cmds, &other_cmds, &alias_cmds); > } > > if (show_guides) > diff --git a/help.c b/help.c > index df7d16d..3c14af4 100644 > --- a/help.c > +++ b/help.c > @@ -86,7 +86,7 @@ static void pretty_print_string_list(struct cmdnames *cmds, > int i; > > for (i = 0; i < cmds->cnt; i++) > - string_list_append(&list, cmds->names[i]->name); > + string_list_append(&list, cmds->names[i]->name); > /* > * always enable column display, we only consult column.* > * about layout strategy and stuff > @@ -202,8 +202,48 @@ void load_command_list(const char *prefix, > exclude_cmds(other_cmds, main_cmds); > } > > +static struct cmdnames aliases; > + > +static void add_cmd_list(struct cmdnames *cmds, struct cmdnames *old) > +{ > + int i; > + ALLOC_GROW(cmds->names, cmds->cnt + old->cnt, cmds->alloc); > + > + for (i = 0; i < old->cnt; i++) > + cmds->names[cmds->cnt++] = old->names[i]; > + free(old->names); > + old->cnt = 0; > + old->names = NULL; > +} > + > +static int load_aliases_cb(const char *var, const char *value, void *cb) > +{ > + if (starts_with(var, "alias.")) > + add_cmdname(&aliases, var + 6, strlen(var + 6)); > + return 0; > +} > + > +void load_commands_and_aliases(const char *prefix, > + struct cmdnames *main_cmds, > + struct cmdnames *other_cmds, > + struct cmdnames *alias_cmds) > +{ > + load_command_list(prefix, main_cmds, other_cmds); > + > + /* reuses global aliases from unknown command functionality */ > + git_config(load_aliases_cb, NULL); > + > + add_cmd_list(alias_cmds, &aliases); > + qsort(alias_cmds->names, alias_cmds->cnt, > + sizeof(*alias_cmds->names), cmdname_compare); > + uniq(alias_cmds); > + exclude_cmds(alias_cmds, main_cmds); > + exclude_cmds(alias_cmds, other_cmds); > +} > + > void list_commands(unsigned int colopts, > - struct cmdnames *main_cmds, struct cmdnames *other_cmds) > + struct cmdnames *main_cmds, struct cmdnames *other_cmds, > + struct cmdnames *alias_cmds) > { > if (main_cmds->cnt) { > const char *exec_path = git_exec_path(); > @@ -219,6 +259,13 @@ void list_commands(unsigned int colopts, > pretty_print_string_list(other_cmds, colopts); > putchar('\n'); > } > + > + if (alias_cmds->cnt) { > + printf_ln(_("aliases defined in git configuration")); > + putchar('\n'); > + pretty_print_string_list(alias_cmds, colopts); > + putchar('\n'); > + } > } > > void list_common_cmds_help(void) > @@ -248,7 +295,6 @@ int is_in_cmdlist(struct cmdnames *c, const char *s) > } > > static int autocorrect; > -static struct cmdnames aliases; > > static int git_unknown_cmd_config(const char *var, const char *value, void *cb) > { > @@ -270,18 +316,6 @@ static int levenshtein_compare(const void *p1, const void *p2) > return l1 != l2 ? l1 - l2 : strcmp(s1, s2); > } > > -static void add_cmd_list(struct cmdnames *cmds, struct cmdnames *old) > -{ > - int i; > - ALLOC_GROW(cmds->names, cmds->cnt + old->cnt, cmds->alloc); > - > - for (i = 0; i < old->cnt; i++) > - cmds->names[cmds->cnt++] = old->names[i]; > - free(old->names); > - old->cnt = 0; > - old->names = NULL; > -} > - > /* An empirically derived magic number */ > #define SIMILARITY_FLOOR 7 > #define SIMILAR_ENOUGH(x) ((x) < SIMILARITY_FLOOR) > diff --git a/help.h b/help.h > index b21d7c9..3939bc6 100644 > --- a/help.h > +++ b/help.h > @@ -21,11 +21,16 @@ extern const char *help_unknown_cmd(const char *cmd); > extern void load_command_list(const char *prefix, > struct cmdnames *main_cmds, > struct cmdnames *other_cmds); > +extern void load_commands_and_aliases(const char *prefix, > + struct cmdnames *main_cmds, > + struct cmdnames *other_cmds, > + struct cmdnames *alias_cmds); > extern void add_cmdname(struct cmdnames *cmds, const char *name, int len); > /* Here we require that excludes is a sorted list. */ > extern void exclude_cmds(struct cmdnames *cmds, struct cmdnames *excludes); > extern int is_in_cmdlist(struct cmdnames *cmds, const char *name); > -extern void list_commands(unsigned int colopts, struct cmdnames *main_cmds, struct cmdnames *other_cmds); > +extern void list_commands(unsigned int colopts, struct cmdnames *main_cmds, > + struct cmdnames *other_cmds, struct cmdnames *alias_cmds); > > /* > * call this to die(), when it is suspected that the user mistyped a -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html