On 12/31/21 2:03 PM, Elijah Newren wrote:
On Fri, Dec 31, 2021 at 2:32 AM Lessley Dennington via GitGitGadget
<gitgitgadget@xxxxxxxxx> wrote:
From: Lessley Dennington <lessleydennington@xxxxxxxxx>
Add tests for missing/incorrect components of custom tab completion for the
sparse-checkout command. These tests specifically highlight the following:
1. git sparse-checkout <TAB> results in an incomplete list of subcommands
(it is missing reapply and add).
2. git sparse-checkout --<TAB> does not complete the help option.
3. Options for subcommands are not tab-completable.
4. git sparse-checkout set <TAB> and git sparse-checkout add <TAB> show
both file names and directory names.
Two thoughts on this last item:
I completely agree that only directories should be completed in cone
mode, but completing on both might technically be considered correct
behavior for non-cone mode. However, even in non-cone mode, I kind of
like the idea of encouraging people to sparsify only on directories so
I'm totally fine with us only tab-completing directories. (I have a
bit of a disdain for non-cone mode, though, so my desire to deprecate
it might be showing through. At the very least, I'm still thinking we
should make cone mode the default in each of `sparse-checkout init`,
`sparse-checkout set`, and `clone --sparse`[1])
[1] https://lore.kernel.org/git/6e09ab19-7ffb-e58e-7b08-6e560b421c06@xxxxxxxxx/
I'm still supportive of this 😊. I'll chat with others who are heavily
involved with sparse-checkout to make sure I have buy-in. If so, I can
pick it up as my next work item.
Second, and this item is unrelated to your series but your comment
made me realize it....sparse-checkout unfortunately ignores prefix and
creates a bad .git/info/sparse-checkout file. For example:
$ git init -b main tmp
$ cd tmp
$ mkdir -p a/b/c
$ touch a/b/c/d a/b/c/e
$ git add a/
$ git commit -m "initial"
$ cd a/ # Not at the toplevel anymore
$ git sparse-checkout set --cone b/c # So we expect that a/b/c will
be the specified sparsity path
$ git -C .. sparse-checkout list
b/c
$ cat ../.git/info/sparse-checkout
/*
!/*/
/b/
!/b/*/
/b/c/
$ pwd -P
pwd: error retrieving current directory: getcwd: cannot access parent
directories: No such file or directory
I think the loss of the current working directory will be fixed by the
en/keep-cwd directory (currently in next and marked for merging to
master), but the fact that the wrong paths end up in the
sparse-checkout file is unfortunate. It basically means that the
`set` and `add` subcommands of `sparse-checkout` can only be safely
run from the toplevel directory.
Although these tests currently fail, they will succeed with the
sparse-checkout modifications in git-completion.bash in the next commit in
this series.
Signed-off-by: Lessley Dennington <lessleydennington@xxxxxxxxx>
---
t/t9902-completion.sh | 85 +++++++++++++++++++++++++++++++++++++++++++
1 file changed, 85 insertions(+)
diff --git a/t/t9902-completion.sh b/t/t9902-completion.sh
index 518203fbe07..51d0f2d93a1 100755
--- a/t/t9902-completion.sh
+++ b/t/t9902-completion.sh
@@ -1447,6 +1447,91 @@ test_expect_success 'git checkout - with --detach, complete only references' '
EOF
'
+test_expect_failure 'sparse-checkout completes subcommands' '
+ test_completion "git sparse-checkout " <<-\EOF
+ list Z
+ init Z
+ set Z
+ add Z
+ reapply Z
+ disable Z
+ EOF
+'
+
+test_expect_failure 'sparse-checkout completes options' '
+ test_completion "git sparse-checkout --" <<-\EOF
+ --help Z
+ EOF
+'
+
+test_expect_failure 'sparse-checkout completes subcommand options' '
+ test_completion "git sparse-checkout init --" <<-\EOF &&
+ --cone Z
+ --no-cone Z
+ --sparse-index Z
+ --no-sparse-index Z
+ EOF
+
+ test_completion "git sparse-checkout set --" <<-\EOF &&
+ --cone Z
+ --no-cone Z
+ --sparse-index Z
+ --no-sparse-index Z
+ --stdin Z
+ EOF
+
+ test_completion "git sparse-checkout reapply --" <<-\EOF &&
+ --cone Z
+ --no-cone Z
+ --sparse-index Z
+ --no-sparse-index Z
+ EOF
+
+ test_completion "git sparse-checkout add --" <<-\EOF
+ --stdin Z
+ EOF
+'
+
+test_expect_failure 'sparse-checkout completes directory names' '
+ # set up sparse-checkout repo
+ git init sparse-checkout &&
+ (
+ cd sparse-checkout &&
+ mkdir -p folder1/0/1 folder2/0 folder3 &&
+ touch folder1/0/1/t.txt &&
+ touch folder2/0/t.txt &&
+ touch folder3/t.txt &&
+ git add . &&
+ git commit -am "Initial commit"
+ ) &&
+
+ # initialize sparse-checkout definitions
+ git -C sparse-checkout sparse-checkout init --cone &&
+ git -C sparse-checkout sparse-checkout set folder1/0 folder3 &&
+
+ # test tab completion
+ (
+ 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
+ EOF
+ ) &&
+
+ (
+ cd sparse-checkout/folder1 &&
+ test_completion "git sparse-checkout add " <<-\EOF
+ ./ Z
+ 0 Z
+ 0/1 Z
+ EOF
+ )
+'
+
test_expect_success 'git switch - with -d, complete all references' '
test_completion "git switch -d " <<-\EOF
HEAD Z
--
gitgitgadget
Patch looks okay to me, but we might want to add some kind of wording
around the directories-only decision and cone vs. non-cone mode to the
commit message.
Can do! Stay tuned for v3.