Thread (30 messages) flat view 30 messages, 4 authors, 1d ago

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 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.
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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help