]> git.ipfire.org Git - thirdparty/git.git/commitdiff
Merge branch 'rh/complete-symbolic-ref'
authorJunio C Hamano <gitster@pobox.com>
Wed, 8 May 2024 17:18:45 +0000 (10:18 -0700)
committerJunio C Hamano <gitster@pobox.com>
Wed, 8 May 2024 17:18:45 +0000 (10:18 -0700)
Command line completion script (in contrib/) learned to complete
"git symbolic-ref" a bit better (you need to enable plumbing
commands to be completed with GIT_COMPLETION_SHOW_ALL_COMMANDS).

* rh/complete-symbolic-ref:
  completion: add docs on how to add subcommand completions
  completion: improve docs for using __git_complete
  completion: add 'symbolic-ref'

contrib/completion/git-completion.bash
t/t9902-completion.sh

index 75193ded4bdeda01fc440db26b08e40ae2d3a73f..5c0ddeb3d4fb60fc6b8e5d08b4b0e779544ff15d 100644 (file)
 # Note that "git" is optional --- '!f() { : commit; ...}; f' would complete
 # just like the 'git commit' command.
 #
-# If you have a command that is not part of git, but you would still
-# like completion, you can use __git_complete:
+# To add completion for git subcommands that are implemented in external
+# scripts, define a function of the form '_git_${subcommand}' while replacing
+# all dashes with underscores, and the main git completion will make use of it.
+# For example, to add completion for 'git do-stuff' (which could e.g. live
+# in /usr/bin/git-do-stuff), name the completion function '_git_do_stuff'.
+# See _git_show, _git_bisect etc. below for more examples.
+#
+# If you have a shell command that is not part of git (and is not called as a
+# git subcommand), but you would still like git-style completion for it, use
+# __git_complete. For example, to use the same completion as for 'git log' also
+# for the 'gl' command:
 #
 #   __git_complete gl git_log
 #
-# Or if it's a main command (i.e. git or gitk):
+# Or if the 'gk' command should be completed the same as 'gitk':
 #
 #   __git_complete gk gitk
 #
+# The second parameter of __git_complete gives the completion function; it is
+# resolved as a function named "$2", or "__$2_main", or "_$2" in that order.
+# In the examples above, the actual functions used for completion will be
+# _git_log and __gitk_main.
+#
 # Compatible with bash 3.2.57.
 #
 # You can set the following environment variables to influence the behavior of
@@ -3581,6 +3595,17 @@ _git_svn ()
        fi
 }
 
+_git_symbolic_ref () {
+       case "$cur" in
+       --*)
+               __gitcomp_builtin symbolic-ref
+               return
+               ;;
+       esac
+
+       __git_complete_refs
+}
+
 _git_tag ()
 {
        local i c="$__git_cmd_idx" f=0
index 569cf2310434358d268028ea8d26361727bf8652..963f865f27ed0589600d780745ff09865a2f9c7e 100755 (executable)
@@ -2518,6 +2518,29 @@ test_expect_success 'complete tree filename with metacharacters' '
        EOF
 '
 
+test_expect_success 'symbolic-ref completes builtin options' '
+       test_completion "git symbolic-ref --d" <<-\EOF
+       --delete Z
+       EOF
+'
+
+test_expect_success 'symbolic-ref completes short ref names' '
+       test_completion "git symbolic-ref foo m" <<-\EOF
+       main Z
+       mybranch Z
+       mytag Z
+       EOF
+'
+
+test_expect_success 'symbolic-ref completes full ref names' '
+       test_completion "git symbolic-ref foo refs/" <<-\EOF
+       refs/heads/main Z
+       refs/heads/mybranch Z
+       refs/tags/mytag Z
+       refs/tags/A Z
+       EOF
+'
+
 test_expect_success PERL 'send-email' '
        test_completion "git send-email --cov" <<-\EOF &&
        --cover-from-description=Z