aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLessley Dennington <lessleydennington@gmail.com>2022-02-07 17:31:44 +0000
committerJunio C Hamano <gitster@pobox.com>2022-02-08 10:15:43 -0800
commitc5f5c5082f813a875c213445135a24c2507021dd (patch)
tree194f5e9d663b7f503124dc2e8987090ad8e593e7
parentfd6d9bec145924ba704b34f0788b239bff9d2898 (diff)
downloadgit-c5f5c5082f813a875c213445135a24c2507021dd.tar.gz
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>
-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
)
'