completion: improve sparse-checkout cone mode directory completion

Use new __gitcomp_directories method to complete directory names in cone
mode sparse-checkouts. This method addresses the caveat of poor
performance in monorepos from the previous commit (by completing only one
level of directories).

The unusual character caveat from the previous commit will be fixed by the
final commit in this series.

Co-authored-by: Elijah Newren <newren@gmail.com>
Co-authored-by: Lessley Dennington <lessleydennington@gmail.com>
Signed-off-by: Lessley Dennington <lessleydennington@gmail.com>
Reviewed-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Lessley Dennington 2022-02-07 17:31:44 +00:00 committed by Junio C Hamano
parent fd6d9bec14
commit c5f5c5082f
2 changed files with 53 additions and 17 deletions

View file

@ -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
}

View file

@ -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
)
'