completion: add and use --list-cmds=nohelpers
authorNguyễn Thái Ngọc Duy <pclouds@gmail.com>
Sun, 20 May 2018 18:40:07 +0000 (20:40 +0200)
committerJunio C Hamano <gitster@pobox.com>
Mon, 21 May 2018 04:23:14 +0000 (13:23 +0900)
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
contrib/completion/git-completion.bash
git.c
index c423810eacc75bbd09b1a77072e121c2d2c0eac9..820ab77fcb6e5c5a5f1edde511ecdbbba14726fd 100644 (file)
@@ -169,7 +169,8 @@ foo.bar= ...`) sets `foo.bar` to the empty string which `git config
        groups are: builtins, parseopt (builtin commands that use
        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)
+       list-<category> (see categories in command-list.txt),
+       nohelpers (exclude helper commands).
 
 GIT COMMANDS
 ------------
index cd1d8e553f33ddd8efe4098434aebe245e735b81..217c8a3d3b61180ac0fbb215504770dfb36a22d5 100644 (file)
@@ -843,7 +843,7 @@ __git_commands () {
                then
                        printf "%s" "$GIT_TESTING_PORCELAIN_COMMAND_LIST"
                else
-                       git --list-cmds=list-mainporcelain,others,list-complete
+                       git --list-cmds=list-mainporcelain,others,nohelpers,list-complete
                fi
                ;;
        all)
@@ -851,27 +851,15 @@ __git_commands () {
                then
                        printf "%s" "$GIT_TESTING_ALL_COMMAND_LIST"
                else
-                       git --list-cmds=main,others
+                       git --list-cmds=main,others,nohelpers
                fi
                ;;
        esac
 }
 
-__git_list_commands ()
-{
-       local i IFS=" "$'\n'
-       for i in $(__git_commands $1)
-       do
-               case $i in
-               *--*)             : helper pattern;;
-               *) echo $i;;
-               esac
-       done
-}
-
 __git_list_all_commands ()
 {
-       __git_list_commands all
+       __git_commands all
 }
 
 __git_all_commands=
@@ -883,7 +871,7 @@ __git_compute_all_commands ()
 
 __git_list_porcelain_commands ()
 {
-       __git_list_commands porcelain
+       __git_commands porcelain
 }
 
 __git_porcelain_commands=
diff --git a/git.c b/git.c
index 19f73b3fa3ff26b7f148b3c8824cce50f2268d21..f6ae79ffaf7266326bb90bce154bfd9761364c75 100644 (file)
--- a/git.c
+++ b/git.c
@@ -39,6 +39,18 @@ static int use_pager = -1;
 
 static void list_builtins(struct string_list *list, unsigned int exclude_option);
 
+static void exclude_helpers_from_list(struct string_list *list)
+{
+       int i = 0;
+
+       while (i < list->nr) {
+               if (strstr(list->items[i].string, "--"))
+                       unsorted_string_list_delete_item(list, i, 0);
+               else
+                       i++;
+       }
+}
+
 static int match_token(const char *spec, int len, const char *token)
 {
        int token_len = strlen(token);
@@ -61,6 +73,8 @@ static int list_cmds(const char *spec)
                        list_all_main_cmds(&list);
                else if (match_token(spec, len, "others"))
                        list_all_other_cmds(&list);
+               else if (match_token(spec, len, "nohelpers"))
+                       exclude_helpers_from_list(&list);
                else if (len > 5 && !strncmp(spec, "list-", 5)) {
                        struct strbuf sb = STRBUF_INIT;