]> git.ipfire.org Git - thirdparty/git.git/blobdiff - contrib/completion/git-completion.bash
Merge branch 'jk/complete-branch-force-delete'
[thirdparty/git.git] / contrib / completion / git-completion.bash
index 463a3124da0a98715e074bf057dac1b67f79b3be..7dc6cd8eb8381d66a75e443970adb768befe866c 100644 (file)
 # tell the completion to use commit completion.  This also works with aliases
 # of form "!sh -c '...'".  For example, "!sh -c ': git commit ; ... '".
 #
+# If you have a command that is not part of git, but you would still
+# like completion, you can use __git_complete:
+#
+#   __git_complete gl git_log
+#
+# Or if it's a main command (i.e. git or gitk):
+#
+#   __git_complete gk gitk
+#
 # Compatible with bash 3.2.57.
 #
 # You can set the following environment variables to influence the behavior of
@@ -1438,8 +1447,10 @@ _git_branch ()
        while [ $c -lt $cword ]; do
                i="${words[c]}"
                case "$i" in
-               -d|--delete|-m|--move)  only_local_ref="y" ;;
-               -r|--remotes)           has_r="y" ;;
+               -d|-D|--delete|-m|-M|--move|-c|-C|--copy)
+                       only_local_ref="y" ;;
+               -r|--remotes)
+                       has_r="y" ;;
                esac
                ((c++))
        done
@@ -3358,15 +3369,19 @@ __git_support_parseopt_helper () {
        esac
 }
 
+__git_have_func () {
+       declare -f -- "$1" >/dev/null 2>&1
+}
+
 __git_complete_command () {
        local command="$1"
        local completion_func="_git_${command//-/_}"
-       if ! declare -f $completion_func >/dev/null 2>/dev/null &&
-               declare -f _completion_loader >/dev/null 2>/dev/null
+       if ! __git_have_func $completion_func &&
+               __git_have_func _completion_loader
        then
                _completion_loader "git-$command"
        fi
-       if declare -f $completion_func >/dev/null 2>/dev/null
+       if __git_have_func $completion_func
        then
                $completion_func
                return 0
@@ -3493,10 +3508,7 @@ __git_func_wrap ()
        $1
 }
 
-# Setup completion for certain functions defined above by setting common
-# variables and workarounds.
-# This is NOT a public function; use at your own risk.
-__git_complete ()
+___git_complete ()
 {
        local wrapper="__git_wrap${2}"
        eval "$wrapper () { __git_func_wrap $2 ; }"
@@ -3504,13 +3516,33 @@ __git_complete ()
                || complete -o default -o nospace -F $wrapper $1
 }
 
-__git_complete git __git_main
-__git_complete gitk __gitk_main
+# Setup the completion for git commands
+# 1: command or alias
+# 2: function to call (e.g. `git`, `gitk`, `git_fetch`)
+__git_complete ()
+{
+       local func
+
+       if __git_have_func $2; then
+               func=$2
+       elif __git_have_func __$2_main; then
+               func=__$2_main
+       elif __git_have_func _$2; then
+               func=_$2
+       else
+               echo "ERROR: could not find function '$2'" 1>&2
+               return 1
+       fi
+       ___git_complete $1 $func
+}
+
+___git_complete git __git_main
+___git_complete gitk __gitk_main
 
 # The following are necessary only for Cygwin, and only are needed
 # when the user has tab-completed the executable name and consequently
 # included the '.exe' suffix.
 #
 if [ "$OSTYPE" = cygwin ]; then
-       __git_complete git.exe __git_main
+       ___git_complete git.exe __git_main
 fi