git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH] help: include list of aliases in git-help --all

From
Junio C Hamano <gitster@pobox.com>
Date
Feb 25, 2014, 19:15 UTC
Message-ID
<xmqqsir757hy.fsf@gitster.dls.corp.google.com>
In-Reply-To
<1393289315-28982-1-git-send-email-joel.nothman@gmail.com>
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?
Show 182 quoted lines
>
> 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
Previous: Joel NothmanNext: Joel Nothman
Message 2 of 7 in “help: include list of aliases in git-help --all”
  1. help: include list of aliases in git-help --allJoel Nothman, Feb 25, 2014
  2. Junio C HamanoFeb 25, 2014
  3. Joel NothmanFeb 25, 2014
  4. Junio C HamanoFeb 25, 2014
  5. Joel NothmanFeb 25, 2014
  6. Philip OakleyFeb 25, 2014
  7. Junio C HamanoFeb 25, 2014

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.