Re: [PATCH v3 3/3] completion: 'git diff' completes untracked paths as a last resort

"D. Ben Knoble" <[email protected]> Thu, 6 Aug 2026 07:30:36 -0400
Newsgroups org.kernel.vger.git
Message-ID <CALnO6CA8sjivVfz45OEDWnvw516z9Nd9SnC+zfJ=FK=Y6Q7MJg@mail.gmail.com>
Hello Junio,

On Wed, Aug 5, 2026 at 3:45 PM Junio C Hamano <[email protected]> wrote:
>
> We taught 'git diff' 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 diff 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                  | 22 +++++++++++++++++++++-
>  2 files changed, 25 insertions(+), 1 deletion(-)
>
> diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
> index 845fd19f70..7741789e41 100644
> --- a/contrib/completion/git-completion.bash
> +++ b/contrib/completion/git-completion.bash
> @@ -1985,6 +1985,10 @@ _git_diff ()
>         if [ ${#COMPREPLY[@]} -eq 0 ]; then
>                 __git_complete_index_file
>         fi
> +
> +       if [ ${#COMPREPLY[@]} -eq 0 ]; then
> +               __git_complete_index_file "--others --directory"
> +       fi
>  }
>
>  __git_mergetools_common="diffuse diffmerge ecmerge emerge kdiff3 meld opendiff
> diff --git a/t/t9902-completion.sh b/t/t9902-completion.sh
> index 10ac690e21..53a2bfb2ac 100755
> --- a/t/t9902-completion.sh
> +++ b/t/t9902-completion.sh
> @@ -2663,6 +2663,7 @@ test_expect_success 'setup for integration tests' '
>         echo content >file1 &&
>         echo more >file2 &&
>         git add file1 file2 &&
> +       echo untracked >ufile &&
>         git commit -m one &&
>         git branch mybranch &&
>         git tag mytag
> @@ -2728,6 +2729,15 @@ test_expect_success 'git diff -- completes tracked paths' '
>         EOF
>  '
>
> +test_expect_success 'git diff [--] completes untracked paths, too' '
> +       test_completion "git diff u" <<-\EOF &&
> +       ufile
> +       EOF
> +       test_completion "git diff -- u" <<-\EOF
> +       ufile
> +       EOF
> +'
> +

LGTM up to here.

>  test_expect_success 'git -C <path> diff completes tracked paths in specified repo' '
>         test_when_finished "rm -rf repo-for-diff" &&
>         git init repo-for-diff &&
> @@ -2744,11 +2754,21 @@ test_expect_success 'git -C <path> diff -- completes pathspecs in specified repo
>         test_when_finished "rm -rf repo-for-diff" &&
>         git init repo-for-diff &&
>         echo content >repo-for-diff/otherfile &&
> +       echo untracked >repo-for-diff/untracked &&
>         git -C repo-for-diff add otherfile &&
>         git -C repo-for-diff commit -m otherfile &&
> -       test_completion "git -C repo-for-diff diff -- o" <<-\EOF
> +       test_completion "git -C repo-for-diff diff o" <<-\EOF &&
> +       otherfile
> +       EOF

Here, with more context (which I won't paste, because GMail…), it
looks like this test is redundant with the test just before?

> +       test_completion "git -C repo-for-diff diff -- o" <<-\EOF &&
>         otherfile
>         EOF
> +       test_completion "git -C repo-for-diff diff u" <<-\EOF &&
> +       untracked
> +       EOF
> +       test_completion "git -C repo-for-diff diff -- u" <<-\EOF
> +       untracked
> +       EOF
>  '

These tests intermingle with -- and without; the other tests separated them.

I don't think I have a strong preference, but perhaps consistency is a
good ideal?

-- 
D. Ben Knoble