threads / patch / 60698

patchcompletion: dir-type optargs for am, format-patch

Subject: [PATCH 1/1] completion: dir-type optargs for am, format-patch

## tl;dr

2 messages between Jan 7, 2024 and Jan 8, 2024. Diffs are folded; open one to read it.

replies: 1people: 2as markdown or json

Britton Leo Kerin· Jan 7, 2024, 21:42 UTC · lore
Signed-off-by: Britton Leo Kerin <britton.kerin@gmail.com>
---
 contrib/completion/git-completion.bash | 38 ++++++++++++++++++++++++++
 1 file changed, 38 insertions(+)
Show changes to contrib/completion/git-completion.bash +38 −0
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index 185b47d802..c3b0a3699c 100644
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -1356,6 +1356,30 @@ __git_count_arguments ()
 	printf "%d" $c
 }
 
+
+# Complete actual dir (not pathspec), respecting any -C options.
+#
+# Usage: __git_complete_refs [<option>]...
+# --cur=<word>: The current dir to be completed.  Defaults to the current word.
+__git_complete_dir ()
+{
+	local cur_="$cur"
+
+	while test $# != 0; do
+		case "$1" in
+		--cur=*)	cur_="${1##--cur=}" ;;
+		*)		return 1 ;;
+		esac
+		shift
+	done
+
+	local context_dir=$(__git rev-parse --show-toplevel --show-prefix 2>/dev/null | paste -s -d '/' 2>/dev/null)
+	[ -d "$context_dir" ] || return
+
+	COMPREPLY=$(cd $context_dir 2>/dev/null && compgen -d -- "$cur_")
+}
+
+
 __git_whitespacelist="nowarn warn error error-all fix"
 __git_patchformat="mbox stgit stgit-series hg mboxrd"
 __git_showcurrentpatch="diff raw"
@@ -1374,6 +1398,10 @@ _git_am ()
 		__gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
 		return
 		;;
+	--directory=*)
+		__git_complete_dir --cur="${cur##--directory=}"
+		return
+		;;
 	--patch-format=*)
 		__gitcomp "$__git_patchformat" "" "${cur##--patch-format=}"
 		return
@@ -1867,7 +1895,17 @@ __git_format_patch_extra_options="
 
 _git_format_patch ()
 {
+	case "$prev,$cur" in
+	-o,*)
+		__git_complete_dir
+		return
+		;;
+	esac
 	case "$cur" in
+	--output-directory=*)
+		__git_complete_dir --cur="${cur##--output-directory=}"
+		return
+		;;
 	--thread=*)
 		__gitcomp "
 			deep shallow
-- 
2.43.0
Junio C Hamano· Jan 8, 2024, 18:37 UTC · re: Britton Leo Kerin · lore

Re: [PATCH 1/1] completion: dir-type optargs for am, format-patch

"Britton Leo Kerin" <britton.kerin@gmail.com> writes:
> +	local context_dir=$(__git rev-parse --show-toplevel --show-prefix 2>/dev/null | paste -s -d '/' 2>/dev/null)
Is there a practical difference with the above with
	context_dir=$(pwd)
other than that it will give an empty string outside a git working tree?
If not, I suspect
	local inside
	inside=$(__git rev-parse --is-inside-work-tree) &&
	test "$inside" = true || return
	local context_dir=$(pwd)
might be clearer on the intent.
> +	[ -d "$context_dir" ] || return
> +
> +	COMPREPLY=$(cd $context_dir 2>/dev/null && compgen -d -- "$cur_")
Can $context_dir contain $IFS whitespaces here?
> +}

← back to recent threads