[PATCH 3/3] help: respect aliases

Subsystems: the rest

STALE3708d

5 messages, 3 authors, 2016-06-15 · open the first message on its own page

[PATCH 3/3] help: respect aliases

From: Jeff King <hidden>
Date: 2016-06-15 22:44:16

If we have an alias "foo" defined, then the help text for
"foo" (via "git help foo" or "git foo --help") now shows the
definition of the alias.

Before showing an alias definition, we make sure that there
is no git command which would override the alias (so that
even though you may have a "log" alias, even though it will
not work, we don't want to it supersede "git help log").

Signed-off-by: Jeff King <redacted>
---
 help.c |   33 ++++++++++++++++++++++++++++++++-
 1 files changed, 32 insertions(+), 1 deletions(-)
diff --git a/help.c b/help.c
index 5feb849..e57a50e 100644
--- a/help.c
+++ b/help.c
@@ -210,7 +210,7 @@ static unsigned int list_commands_in_dir(struct cmdnames *cmds,
 	return longest;
 }
 
-static void list_commands(void)
+static unsigned int load_command_list(void)
 {
 	unsigned int longest = 0;
 	unsigned int len;
@@ -250,6 +250,14 @@ static void list_commands(void)
 	uniq(&other_cmds);
 	exclude_cmds(&other_cmds, &main_cmds);
 
+	return longest;
+}
+
+static void list_commands(void)
+{
+	unsigned int longest = load_command_list();
+	const char *exec_path = git_exec_path();
+
 	if (main_cmds.cnt) {
 		printf("available git commands in '%s'\n", exec_path);
 		printf("----------------------------");
@@ -284,6 +292,22 @@ void list_common_cmds_help(void)
 	}
 }
 
+static int is_in_cmdlist(struct cmdnames *c, const char *s)
+{
+	int i;
+	for (i = 0; i < c->cnt; i++)
+		if (!strcmp(s, c->names[i]->name))
+			return 1;
+	return 0;
+}
+
+static int is_git_command(const char *s)
+{
+	load_command_list();
+	return is_in_cmdlist(&main_cmds, s) ||
+		is_in_cmdlist(&other_cmds, s);
+}
+
 static const char *cmd_to_page(const char *git_cmd)
 {
 	if (!git_cmd)
@@ -372,6 +396,7 @@ int cmd_version(int argc, const char **argv, const char *prefix)
 int cmd_help(int argc, const char **argv, const char *prefix)
 {
 	int nongit;
+	const char *alias;
 
 	setup_git_directory_gently(&nongit);
 	git_config(git_help_config);
@@ -391,6 +416,12 @@ int cmd_help(int argc, const char **argv, const char *prefix)
 		return 0;
 	}
 
+	alias = alias_lookup(argv[0]);
+	if (alias && !is_git_command(argv[0])) {
+		printf("`git %s' is aliased to `%s'\n", argv[0], alias);
+		return 0;
+	}
+
 	switch (help_format) {
 	case HELP_FORMAT_MAN:
 		show_man_page(argv[0]);
-- 
1.5.4.3.305.g073a4

Re: [PATCH 3/3] help: respect aliases

From: Jay Soffian <hidden>
Date: 2016-06-15 22:44:16

On Sun, Feb 24, 2008 at 5:17 PM, Jeff King [off-list ref] wrote:
If we have an alias "foo" defined, then the help text for
 "foo" (via "git help foo" or "git foo --help") now shows the
 definition of the alias.
Heh, now I can kill this alias of mine:

    h          = "!sh -c 'git alias \"$1\" || git help \"$1\"' -"

:-)

This too would be less ugly as a built-in:

    alias      = "! sh -c 'if test -z \"$1\"; then git config --list \
                  | expand \
                  | sed \"/^alias\\./!d; s/^alias\\.//; s/=/ /; s/  */ /g\" \
                  | sort | while read n v; do \
                  printf \"%-16s\" \"$n\"; echo \"$v\" | gnused \
                  \"s/\\(.\\{68\\}\\) /\\1\\n\t\t/g\" | expand; \
                  done; else git config \"alias.$1\"; fi' -"
:-)

j.

Re: [PATCH 3/3] help: respect aliases

From: Johannes Schindelin <hidden>
Date: 2016-06-15 22:44:17

Hi,

On Sun, 24 Feb 2008, Jay Soffian wrote:
This too would be less ugly as a built-in:

    alias      = "! sh -c 'if test -z \"$1\"; then git config --list \
                  | expand \
                  | sed \"/^alias\\./!d; s/^alias\\.//; s/=/ /; s/  */ /g\" \
                  | sort | while read n v; do \
                  printf \"%-16s\" \"$n\"; echo \"$v\" | gnused \
                  \"s/\\(.\\{68\\}\\) /\\1\\n\t\t/g\" | expand; \
                  done; else git config \"alias.$1\"; fi' -"
Wow.  This would look less ugly as an alias like this, too:

alias = "!sh -c 'case $# in \
        0) git config --get-regexp \"^alias\\.\" | sed \"s/^alias\\.//\";; \
        *) git config \"alias.$0\" ;; \
        esac'"

which incidentally fixes a bug in your alias: you ignore $0 which is the 
first parameter when using the sh -c '' idiom.

Of course, you can change the sed call to your liking...

Ciao,
Dscho

Re: [PATCH 3/3] help: respect aliases

From: Jay Soffian <hidden>
Date: 2016-06-15 22:44:17

On Tue, Feb 26, 2008 at 7:43 AM, Johannes Schindelin
[off-list ref] wrote:
 On Sun, 24 Feb 2008, Jay Soffian wrote:

 > This too would be less ugly as a built-in:
 >
 >  [elided so as not to burn anyone's eyes out again :-) -- jay]

 Wow.  This would look less ugly as an alias like this, too:

 alias = "!sh -c 'case $# in \
        0) git config --get-regexp \"^alias\\.\" | sed \"s/^alias\\.//\";; \
        *) git config \"alias.$0\" ;; \
        esac'"

 which incidentally fixes a bug in your alias: you ignore $0 which is the
 first parameter when using the sh -c '' idiom.
Test mine. Test yours. See which works. :-)

At least on my system, I had to use:

  sh -c '...' -

And then refer to $1.
 Of course, you can change the sed call to your liking...
Most of the ugliness in mine is that I crammed the whitespace down and
that I'm using a quite involved pipeline to reformat all my aliases so
they fit into my terminal window.

But the --get-regexp is a good tip.

j.

Re: [PATCH 3/3] help: respect aliases

From: Johannes Schindelin <hidden>
Date: 2016-06-15 22:44:17

Hi,

On Tue, 26 Feb 2008, Jay Soffian wrote:
On Tue, Feb 26, 2008 at 7:43 AM, Johannes Schindelin
[off-list ref] wrote:
quoted
 On Sun, 24 Feb 2008, Jay Soffian wrote:

 > This too would be less ugly as a built-in:
 >
 >  [elided so as not to burn anyone's eyes out again :-) -- jay]

 Wow.  This would look less ugly as an alias like this, too:

 alias = "!sh -c 'case $# in \
        0) git config --get-regexp \"^alias\\.\" | sed \"s/^alias\\.//\";; \
        *) git config \"alias.$0\" ;; \
        esac'"

 which incidentally fixes a bug in your alias: you ignore $0 which is the
 first parameter when using the sh -c '' idiom.
Test mine. Test yours. See which works. :-)
I tested only mine.  It works.

Ciao,
Dscho
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help