completion: 'git diff' completes untracked paths as a last resort

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 <gitster@pobox.com>
This commit is contained in:
Junio C Hamano
2026-08-05 12:42:50 -07:00
parent c3658d6ca2
commit ba5dc6f164
2 changed files with 25 additions and 1 deletions

View File

@@ -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

View File

@@ -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
'
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
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
'
test_expect_success 'show completes all refs' '