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/ 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.