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.

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
-- 
1.8.3.4 (Apple Git-47)

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to