git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH] completion: complete paths for git send-email

From
YNYury Norov (NVIDIA) <yury.norov@gmail.com>
Date
Jul 19, 2026, 13:44 UTC
Message-ID
<20260719134447.381835-1-yury.norov@gmail.com>
From: Yury Norov <ynorov@nvidia.com>

git send-email accepts either revisions or paths to patch files, but its Bash completion only offers revisions. This prevents patch files from being completed. It can also make a prefix such as "0" expand to an unrelated hexadecimal ref even when matching 0001-*.patch files exist.

In my Linux tree, an attempt to autocomplete the standard-named patch brings a random hashtag:

 $ ls 0*
 0001-bitmap-drop-bitmap_next_set_region.patch
 $ git send-email 0<Tab>
 $ git send-email 05c69d298c96703741cac9a5cbbf6c53bd55a6e2

Introduce an append variant of __gitcomp_file() and use it to add filesystem candidates after the existing revision candidates. Keep the latter because revisions remain valid send-email arguments.

Add a regression test covering patch files alongside a 40-hex ref.
Assisted-by: Codex <codex@openai.com>
Signed-off-by: Yury Norov <ynorov@nvidia.com>
---
 contrib/completion/git-completion.bash | 29 +++++++++++++++++++-------
 t/t9902-completion.sh                  | 12 ++++++++++-
 2 files changed, 33 insertions(+), 8 deletions(-)
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index e87578771..b7017488d 100644
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -579,21 +579,18 @@ __gitcomp_file_direct ()
 }
 
 # Generates completion reply with compgen from newline-separated possible
-# completion filenames.
+# completion filenames by appending them to the existing list of completion
+# candidates, COMPREPLY.
 # It accepts 1 to 3 arguments:
 # 1: List of possible completion filenames, separated by a single newline.
 # 2: A directory prefix to be added to each possible completion filename
 #    (optional).
 # 3: Generate possible completion matches for this word (optional).
-__gitcomp_file ()
+__gitcomp_file_append ()
 {
 	local IFS=$'\n'
 
-	# XXX does not work when the directory prefix contains a tilde,
-	# since tilde expansion is not applied.
-	# This means that COMPREPLY will be empty and Bash default
-	# completion will be used.
-	__gitcompadd "$1" "${2-}" "${3-$cur}" ""
+	__gitcompappend "$1" "${2-}" "${3-$cur}" ""
 
 	# use a hack to enable file mode in bash < 4
 	compopt -o filenames +o nospace 2>/dev/null ||
@@ -601,6 +598,23 @@ __gitcomp_file ()
 	true
 }
 
+# Generates completion reply with compgen from newline-separated possible
+# completion filenames.
+# It accepts 1 to 3 arguments:
+# 1: List of possible completion filenames, separated by a single newline.
+# 2: A directory prefix to be added to each possible completion filename
+#    (optional).
+# 3: Generate possible completion matches for this word (optional).
+__gitcomp_file ()
+{
+	# XXX does not work when the directory prefix contains a tilde,
+	# since tilde expansion is not applied.
+	# This means that COMPREPLY will be empty and Bash default
+	# completion will be used.
+	COMPREPLY=()
+	__gitcomp_file_append "$@"
+}
+
 # Find the current subcommand for commands that follow the syntax:
 #
 #    git <command> <subcommand>
@@ -2634,6 +2648,7 @@ _git_send_email ()
 		;;
 	esac
 	__git_complete_revlist
+	__gitcomp_file_append "$(compgen -f -- "$cur")"
 }
 
 _git_stage ()
diff --git a/t/t9902-completion.sh b/t/t9902-completion.sh
index 55dc9eabf..e87827f21 100755
--- a/t/t9902-completion.sh
+++ b/t/t9902-completion.sh
@@ -2777,7 +2777,17 @@ test_expect_success PERL 'send-email' '
 	test_completion "git send-email --val" <<-\EOF &&
 	--validate Z
 	EOF
-	test_completion "git send-email ma" "main "
+	test_completion "git send-email ma" "main " &&
+
+	git tag 05c69d298c96703741cac9a5cbbf6c53bd55a6e2 &&
+	test_when_finished "git tag -d 05c69d298c96703741cac9a5cbbf6c53bd55a6e2 &&
+		rm -f 0001-example.patch 0002-example.patch" &&
+	touch 0001-example.patch 0002-example.patch &&
+	test_completion "git send-email 0" <<-\EOF
+	0001-example.patch
+	0002-example.patch
+	05c69d298c96703741cac9a5cbbf6c53bd55a6e2 Z
+	EOF
 '
 
 test_expect_success 'complete files' '
-- 
2.53.0
Next: Junio C Hamano
Message 1 of 9 in “completion: complete paths for git send-email”
  1. completion: complete paths for git send-emailYury Norov (NVIDIA), Jul 19, 2026
  2. Junio C HamanoJul 19, 2026
  3. D. Ben KnobleJul 21, 2026
  4. Junio C HamanoJul 21, 2026
  5. Yury NorovJul 21, 2026
  6. Junio C HamanoJul 21, 2026
  7. Ben KnobleJul 22, 2026
  8. Junio C HamanoJul 22, 2026
  9. SZEDER GáborJul 21, 2026

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.