]> git.ipfire.org Git - thirdparty/git.git/blobdiff - contrib/completion/git-completion.bash
Merge branch 'en/fetch-negotiation-default-fix'
[thirdparty/git.git] / contrib / completion / git-completion.bash
index ebeffaa982a11a0386bfb04419896cd2e22c904d..23e4c9089089068e4ea73f914cca9c5d1e993f27 100644 (file)
@@ -2986,6 +2986,34 @@ _git_show_branch ()
        __git_complete_revlist
 }
 
+__gitcomp_directories ()
+{
+       local _tmp_dir _tmp_completions _found=0
+
+       # Get the directory of the current token; this differs from dirname
+       # in that it keeps up to the final trailing slash.  If no slash found
+       # that's fine too.
+       [[ "$cur" =~ .*/ ]]
+       _tmp_dir=$BASH_REMATCH
+
+       # Find possible directory completions, adding trailing '/' characters,
+       # de-quoting, and handling unusual characters.
+       while IFS= read -r -d $'\0' c ; do
+               # If there are directory completions, find ones that start
+               # with "$cur", the current token, and put those in COMPREPLY
+               if [[ $c == "$cur"* ]]; then
+                       COMPREPLY+=("$c/")
+                       _found=1
+               fi
+       done < <(git ls-tree -z -d --name-only HEAD $_tmp_dir)
+
+       if [[ $_found == 0 ]] && [[ "$cur" =~ /$ ]]; then
+               # No possible further completions any deeper, so assume we're at
+               # a leaf directory and just consider it complete
+               __gitcomp_direct_append "$cur "
+       fi
+}
+
 _git_sparse_checkout ()
 {
        local subcommands="list init set disable add reapply"
@@ -3002,7 +3030,7 @@ _git_sparse_checkout ()
        set,*|add,*)
                if [ "$(__git config core.sparseCheckoutCone)" == "true" ] ||
                [ -n "$(__git_find_on_cmdline --cone)" ]; then
-                       __gitcomp "$(git ls-tree -d -r HEAD --name-only)"
+                       __gitcomp_directories
                fi
        esac
 }