Re: [PATCH v2 3/3] completion: 'git checkout' completes untracked paths as a last resort
Elijah Newren <[email protected]>
| Newsgroups | org.kernel.vger.git |
|---|---|
| Message-ID | <CABPp-BFv4uf0F1PxVYRuQDbJQWw-YFDNbr1QRUVZxadsexbu5A@mail.gmail.com> |
On Wed, Aug 12, 2026 at 9:49 AM Junio C Hamano <[email protected]> wrote: > > We taught 'git checkout' to first try to complete revisions (unless > '--' is present on the command line) and, failing that, to complete > tracked paths. If this yields nothing, it lets the Bash default, > which offers paths in $PWD, kick in. > > Teach it to complete untracked paths before giving up and letting > the Bash default kick in. With this change, > > $ git -C another-directory checkout un<TAB> > > finds the 'untracked' file in another-directory and offers it as a > completion candidate. > > Signed-off-by: Junio C Hamano <[email protected]> > --- > contrib/completion/git-completion.bash | 4 ++++ > t/t9902-completion.sh | 21 +++++++++++++++++++-- > 2 files changed, 23 insertions(+), 2 deletions(-) > > diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash > index 0eecfcbf8b..22c53697ab 100644 > --- a/contrib/completion/git-completion.bash > +++ b/contrib/completion/git-completion.bash > @@ -1784,6 +1784,10 @@ _git_checkout () > if [ ${#COMPREPLY[@]} -eq 0 ]; then > __git_complete_index_file "" > fi > + > + if [ ${#COMPREPLY[@]} -eq 0 ]; then > + __git_complete_index_file "--others" > + fi In your completion series for `git diff`, you passed "--others --directory", but you omit --directory here. I think playing around with it for a while that it works either way, because without --directory __git_index_files splits on "/" and only keeps the leading component, but not passing --directory means it'll just have to parse through and then compress more options. It's probably not a big deal either way, but might be nice to include "--directory" here for consistency with your diff series, and because it'll be a bit more performant. > } > > __git_sequencer_inprogress_options="--continue --quit --abort --skip" > diff --git a/t/t9902-completion.sh b/t/t9902-completion.sh > index 13fa5c65c3..e8418f069b 100755 > --- a/t/t9902-completion.sh > +++ b/t/t9902-completion.sh > @@ -2727,9 +2727,19 @@ test_expect_success 'git checkout completes tracked paths when no refs match' ' > EOF > ' > > +test_expect_success 'git checkout completes untracked paths, too' ' > + # ufile is not tracked and there is no ref that begins with u > + test_completion "git checkout u" <<-\EOF && > + ufile > + EOF > + test_completion "git checkout -- u" <<-\EOF > + ufile > + EOF > +' > + > test_expect_success 'git -C <path> checkout completes paths in specified repo' ' > # otherfile is tracked, oops is not > - # lostfile is tracked but lost > + # lostfile is tracked but lost, ufile is untracked. > test_when_finished "rm -rf repo-for-checkout" && > git init repo-for-checkout && > echo content >repo-for-checkout/otherfile && > @@ -2738,6 +2748,7 @@ test_expect_success 'git -C <path> checkout completes paths in specified repo' ' > git -C repo-for-checkout add lostfile && > git -C repo-for-checkout commit -m otherfile && > echo untracked >repo-for-checkout/oops && > + echo untracked >repo-for-checkout/ufile && > rm -f repo-for-checkout/lostfile && > test_completion "git -C repo-for-checkout checkout o" <<-\EOF && > otherfile > @@ -2748,9 +2759,15 @@ test_expect_success 'git -C <path> checkout completes paths in specified repo' ' > test_completion "git -C repo-for-checkout checkout l" <<-\EOF && > lostfile > EOF > - test_completion "git -C repo-for-checkout checkout -- l" <<-\EOF > + test_completion "git -C repo-for-checkout checkout -- l" <<-\EOF && > lostfile > EOF > + test_completion "git -C repo-for-checkout checkout u" <<-\EOF && > + ufile > + EOF > + test_completion "git -C repo-for-checkout checkout -- u" <<-\EOF > + ufile > + EOF > ' > > test_expect_success 'git diff completes tracked paths when no refs match' ' > -- Looks fine otherwise (as do the first two patches).