summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--contrib/completion/git-completion.bash32
-rwxr-xr-xt/t9902-completion.sh38
2 files changed, 53 insertions, 17 deletions
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index ebeffaa982..69ef33b56b 100644
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -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)" == "true" ] ||
[ -n "$(__git_find_on_cmdline --cone)" ]; then
- __gitcomp "$(git ls-tree -d -r HEAD --name-only)"
+ __gitcomp_directories
fi
esac
}
diff --git a/t/t9902-completion.sh b/t/t9902-completion.sh
index 3b287d72dc..f309c7532e 100755
--- a/t/t9902-completion.sh
+++ b/t/t9902-completion.sh
@@ -1477,21 +1477,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
)
'
@@ -1517,12 +1526,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
)
'