All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] completion: complete paths for git send-email
@ 2026-07-19 13:44 Yury Norov (NVIDIA)
  2026-07-19 17:04 ` Junio C Hamano
  0 siblings, 1 reply; 2+ messages in thread
From: Yury Norov (NVIDIA) @ 2026-07-19 13:44 UTC (permalink / raw)
  To: git, Thiago Perrotta, Philippe Blain, Junio C Hamano,
	Rubén Justo
  Cc: Yury Norov, linux-kernel, Yury Norov, Codex

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


^ permalink raw reply related	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2026-07-19 17:04 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-19 13:44 [PATCH] completion: complete paths for git send-email Yury Norov (NVIDIA)
2026-07-19 17:04 ` Junio C Hamano

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.