@@ -2986,6 +2986,36 @@ _git_show_branch ()
__git_complete_revlist
}
+__gitcomp_directories ()
+{
+ local _tmp_dir _tmp_completions
+
+ # 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
+ _tmp_completions="$(git ls-tree -d --name-only HEAD $_tmp_dir |
+ sed -e s%$%/%)"
+
+ if [[ -n "$_tmp_completions" ]]; then
+ # There were some directory completions, so find ones that
+ # start with "$cur", the current token, and put those in COMPREPLY
+ local i=0 c IFS=$' \t\n'
+ for c in $_tmp_completions; do
+ if [[ $c == "$cur"* ]]; then
+ COMPREPLY+=("$c")
+ fi
+ done
+ elif [[ "$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 +3032,7 @@ _git_sparse_checkout ()
set,*|add,*)
if [ $(__git config core.sparseCheckoutCone) ] ||
[ "$(__git_find_on_cmdline --cone)" ]; then
- __gitcomp "$(git ls-tree -d -r HEAD --name-only)"
+ __gitcomp_directories
fi
esac
}
@@ -1480,21 +1480,30 @@ test_expect_success 'cone mode sparse-checkout completes directory names' '
(
cd sparse-checkout &&
test_completion "git sparse-checkout set f" <<-\EOF
- folder1 Z
- folder1/0 Z
- folder1/0/1 Z
- folder2 Z
- folder2/0 Z
- folder3 Z
+ folder1/
+ folder2/
+ folder3/
+ EOF
+ ) &&
+
+ (
+ cd sparse-checkout &&
+ test_completion "git sparse-checkout set folder1/" <<-\EOF
+ folder1/0/
+ EOF
+ ) &&
+
+ (
+ cd sparse-checkout &&
+ test_completion "git sparse-checkout set folder1/0/" <<-\EOF
+ folder1/0/1/
EOF
) &&
(
cd sparse-checkout/folder1 &&
- test_completion "git sparse-checkout add " <<-\EOF
- ./ Z
- 0 Z
- 0/1 Z
+ test_completion "git sparse-checkout add 0" <<-\EOF
+ 0/
EOF
)
'
@@ -1520,12 +1529,9 @@ test_expect_success 'git sparse-checkout set --cone completes directory names' '
(
cd sparse-checkout &&
test_completion "git sparse-checkout set --cone f" <<-\EOF
- folder1 Z
- folder1/0 Z
- folder1/0/1 Z
- folder2 Z
- folder2/0 Z
- folder3 Z
+ folder1/
+ folder2/
+ folder3/
EOF
)
'