From: Joel Nothman <joel.nothman@gmail.com>
To: git@vger.kernel.org
Cc: Joel Nothman <joel.nothman@gmail.com>
Subject: [PATCH] help: include list of aliases in git-help --all
Date: Tue, 25 Feb 2014 11:48:34 +1100 [thread overview]
Message-ID: <1393289315-28982-1-git-send-email-joel.nothman@gmail.com> (raw)
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)
next reply other threads:[~2014-02-25 0:55 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-02-25 0:48 Joel Nothman [this message]
2014-02-25 19:15 ` [PATCH] help: include list of aliases in git-help --all Junio C Hamano
2014-02-25 21:20 ` Joel Nothman
2014-02-25 21:51 ` Junio C Hamano
2014-02-25 22:32 ` Joel Nothman
2014-02-25 23:01 ` Philip Oakley
2014-02-25 23:22 ` Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1393289315-28982-1-git-send-email-joel.nothman@gmail.com \
--to=joel.nothman@gmail.com \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).