Re: [PATCH v3 3/3] completion: 'git diff' completes untracked paths as a last resort
From: D. Ben Knoble <hidden>
Date: 2026-08-06 11:30:48
Hello Junio, On Wed, Aug 5, 2026 at 3:45 PM Junio C Hamano [off-list ref] wrote:
quoted hunk ↗ jump to hunk
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 <redacted> --- 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 opendiffdiff --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.
quoted hunk ↗ jump to hunk
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