]> git.ipfire.org Git - thirdparty/git.git/commitdiff
completion: add and use --list-cmds=alias
authorNguyễn Thái Ngọc Duy <pclouds@gmail.com>
Sun, 20 May 2018 18:40:08 +0000 (20:40 +0200)
committerJunio C Hamano <gitster@pobox.com>
Mon, 21 May 2018 04:23:14 +0000 (13:23 +0900)
By providing aliases via --list-cmds=, we could simplify command
collection code in the script. We only issue one git command. Before
this patch that is "git config", after it's "git --list-cmds=". In
"git help" completion case we actually reduce one "git" process (for
getting guides) but that call was added in this series so it does not
really count.

A couple of bash functions are removed because they are not needed
anymore. __git_compute_all_commands() and $__git_all_commands stay
because they are still needed for completing pager.* config and
without "alias" group, the result is still cacheable.

There is a slight (good) change in _git_help() with this patch: before
"git help <tab>" shows external commands (as in _not_ part of git) as
well as part of $__git_all_commands. We have finer control over
command listing now and can exclude that because we can't provide a
man page for external commands anyway.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/git.txt
alias.c
alias.h
contrib/completion/git-completion.bash
git.c
t/t9902-completion.sh

index 820ab77fcb6e5c5a5f1edde511ecdbbba14726fd..75f50d237994038e15a84c94d0d86294dd5f52d8 100644 (file)
@@ -170,7 +170,7 @@ foo.bar= ...`) sets `foo.bar` to the empty string which `git config
        parse-options), main (all commands in libexec directory),
        others (all other commands in `$PATH` that have git- prefix),
        list-<category> (see categories in command-list.txt),
-       nohelpers (exclude helper commands).
+       nohelpers (exclude helper commands) and alias.
 
 GIT COMMANDS
 ------------
diff --git a/alias.c b/alias.c
index e9726ce8c5f305b711cc0696797405ed3742fe14..a7e4e57130d46188a4a0ee93871375218041344c 100644 (file)
--- a/alias.c
+++ b/alias.c
@@ -1,10 +1,12 @@
 #include "cache.h"
 #include "alias.h"
 #include "config.h"
+#include "string-list.h"
 
 struct config_alias_data {
        const char *alias;
        char *v;
+       struct string_list *list;
 };
 
 static int config_alias_cb(const char *key, const char *value, void *d)
@@ -12,8 +14,16 @@ static int config_alias_cb(const char *key, const char *value, void *d)
        struct config_alias_data *data = d;
        const char *p;
 
-       if (skip_prefix(key, "alias.", &p) && !strcasecmp(p, data->alias))
-               return git_config_string((const char **)&data->v, key, value);
+       if (!skip_prefix(key, "alias.", &p))
+               return 0;
+
+       if (data->alias) {
+               if (!strcasecmp(p, data->alias))
+                       return git_config_string((const char **)&data->v,
+                                                key, value);
+       } else if (data->list) {
+               string_list_append(data->list, p);
+       }
 
        return 0;
 }
@@ -27,6 +37,13 @@ char *alias_lookup(const char *alias)
        return data.v;
 }
 
+void list_aliases(struct string_list *list)
+{
+       struct config_alias_data data = { NULL, NULL, list };
+
+       read_early_config(config_alias_cb, &data);
+}
+
 #define SPLIT_CMDLINE_BAD_ENDING 1
 #define SPLIT_CMDLINE_UNCLOSED_QUOTE 2
 static const char *split_cmdline_errors[] = {
diff --git a/alias.h b/alias.h
index fbf1d22a943ea4e984434a54179bc9b6dfc4fa21..79933f2457ce265e2d141459308c8407488cca69 100644 (file)
--- a/alias.h
+++ b/alias.h
@@ -1,9 +1,12 @@
 #ifndef __ALIAS_H__
 #define __ALIAS_H__
 
+struct string_list;
+
 char *alias_lookup(const char *alias);
 int split_cmdline(char *cmdline, const char ***argv);
 /* Takes a negative value returned by split_cmdline */
 const char *split_cmdline_strerror(int cmdline_errno);
+void list_aliases(struct string_list *list);
 
 #endif
index 217c8a3d3b61180ac0fbb215504770dfb36a22d5..98f278fb9ad5052b636c9167f6db6bfb7e07e257 100644 (file)
@@ -834,51 +834,11 @@ __git_complete_strategy ()
        return 1
 }
 
-# __git_commands requires 1 argument:
-# 1: the command group, either "all" or "porcelain"
-__git_commands () {
-       case "$1" in
-       porcelain)
-               if test -n "$GIT_TESTING_PORCELAIN_COMMAND_LIST"
-               then
-                       printf "%s" "$GIT_TESTING_PORCELAIN_COMMAND_LIST"
-               else
-                       git --list-cmds=list-mainporcelain,others,nohelpers,list-complete
-               fi
-               ;;
-       all)
-               if test -n "$GIT_TESTING_ALL_COMMAND_LIST"
-               then
-                       printf "%s" "$GIT_TESTING_ALL_COMMAND_LIST"
-               else
-                       git --list-cmds=main,others,nohelpers
-               fi
-               ;;
-       esac
-}
-
-__git_list_all_commands ()
-{
-       __git_commands all
-}
-
 __git_all_commands=
 __git_compute_all_commands ()
 {
        test -n "$__git_all_commands" ||
-       __git_all_commands=$(__git_list_all_commands)
-}
-
-__git_list_porcelain_commands ()
-{
-       __git_commands porcelain
-}
-
-__git_porcelain_commands=
-__git_compute_porcelain_commands ()
-{
-       test -n "$__git_porcelain_commands" ||
-       __git_porcelain_commands=$(__git_list_porcelain_commands)
+       __git_all_commands=$(git --list-cmds=main,others,alias,nohelpers)
 }
 
 # Lists all set config variables starting with the given section prefix,
@@ -896,11 +856,6 @@ __git_pretty_aliases ()
        __git_get_config_variables "pretty"
 }
 
-__git_aliases ()
-{
-       __git_get_config_variables "alias"
-}
-
 # __git_aliased_command requires 1 argument
 __git_aliased_command ()
 {
@@ -1500,13 +1455,6 @@ _git_grep ()
        __git_complete_refs
 }
 
-__git_all_guides=
-__git_compute_all_guides ()
-{
-       test -n "$__git_all_guides" ||
-       __git_all_guides=$(git --list-cmds=list-guide)
-}
-
 _git_help ()
 {
        case "$cur" in
@@ -1515,11 +1463,12 @@ _git_help ()
                return
                ;;
        esac
-       __git_compute_all_commands
-       __git_compute_all_guides
-       __gitcomp "$__git_all_commands $(__git_aliases) $__git_all_guides
-               gitk
-               "
+       if test -n "$GIT_TESTING_ALL_COMMAND_LIST"
+       then
+               __gitcomp "$GIT_TESTING_ALL_COMMAND_LIST $(git --list-cmds=alias,list-guide) gitk"
+       else
+               __gitcomp "$(git --list-cmds=main,nohelpers,alias,list-guide) gitk"
+       fi
 }
 
 _git_init ()
@@ -3058,8 +3007,14 @@ __git_main ()
                        --help
                        "
                        ;;
-               *)     __git_compute_porcelain_commands
-                      __gitcomp "$__git_porcelain_commands $(__git_aliases)" ;;
+               *)
+                       if test -n "$GIT_TESTING_PORCELAIN_COMMAND_LIST"
+                       then
+                               __gitcomp "$GIT_TESTING_PORCELAIN_COMMAND_LIST"
+                       else
+                               __gitcomp "$(git --list-cmds=list-mainporcelain,others,nohelpers,alias,list-complete)"
+                       fi
+                       ;;
                esac
                return
        fi
diff --git a/git.c b/git.c
index f6ae79ffaf7266326bb90bce154bfd9761364c75..63acd9ea81ea9d339f98ebb78a389fc632d89fe3 100644 (file)
--- a/git.c
+++ b/git.c
@@ -75,6 +75,8 @@ static int list_cmds(const char *spec)
                        list_all_other_cmds(&list);
                else if (match_token(spec, len, "nohelpers"))
                        exclude_helpers_from_list(&list);
+               else if (match_token(spec, len, "alias"))
+                       list_aliases(&list);
                else if (len > 5 && !strncmp(spec, "list-", 5)) {
                        struct strbuf sb = STRBUF_INIT;
 
index 2f166793808951095232f8af448a45b80684fee2..5863b1acac67534f5e86f8401c70b97112fd7978 100755 (executable)
@@ -1192,17 +1192,6 @@ test_expect_success '__git_pretty_aliases' '
        test_cmp expect actual
 '
 
-test_expect_success '__git_aliases' '
-       cat >expect <<-EOF &&
-       ci
-       co
-       EOF
-       test_config alias.ci commit &&
-       test_config alias.co checkout &&
-       __git_aliases >actual &&
-       test_cmp expect actual
-'
-
 test_expect_success 'basic' '
        run_completion "git " &&
        # built-in
@@ -1511,13 +1500,6 @@ test_expect_success 'sourcing the completion script clears cached commands' '
        verbose test -z "$__git_all_commands"
 '
 
-test_expect_success 'sourcing the completion script clears cached porcelain commands' '
-       __git_compute_porcelain_commands &&
-       verbose test -n "$__git_porcelain_commands" &&
-       . "$GIT_BUILD_DIR/contrib/completion/git-completion.bash" &&
-       verbose test -z "$__git_porcelain_commands"
-'
-
 test_expect_success !GETTEXT_POISON 'sourcing the completion script clears cached merge strategies' '
        __git_compute_merge_strategies &&
        verbose test -n "$__git_merge_strategies" &&