All of lore.kernel.org
 help / color / mirror / Atom feed
From: Junio C Hamano <gitster@pobox.com>
To: Joel Nothman <joel.nothman@gmail.com>
Cc: git@vger.kernel.org
Subject: Re: [PATCH] help: include list of aliases in git-help --all
Date: Tue, 25 Feb 2014 11:15:21 -0800	[thread overview]
Message-ID: <xmqqsir757hy.fsf@gitster.dls.corp.google.com> (raw)
In-Reply-To: <1393289315-28982-1-git-send-email-joel.nothman@gmail.com> (Joel Nothman's message of "Tue, 25 Feb 2014 11:48:34 +1100")

Joel Nothman <joel.nothman@gmail.com> 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

  reply	other threads:[~2014-02-25 19:15 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-02-25  0:48 [PATCH] help: include list of aliases in git-help --all Joel Nothman
2014-02-25 19:15 ` Junio C Hamano [this message]
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=xmqqsir757hy.fsf@gitster.dls.corp.google.com \
    --to=gitster@pobox.com \
    --cc=git@vger.kernel.org \
    --cc=joel.nothman@gmail.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.