diff mbox series

[v5,2/3] send-email: programmatically generate bash completions

Message ID 20210924024606.20542-3-tbperrotta@gmail.com (mailing list archive)
State Superseded
Headers show
Series send-email: shell completion improvements | expand

Commit Message

Thiago Perrotta Sept. 24, 2021, 2:46 a.m. UTC
"git send-email --git-completion-helper" only prints "format-patch"
flags. Make it print "send-email" flags as well, generating them
programmatically from the usage.

Introduce a uniq subroutine, otherwise --dump-aliases would show
up twice in the flags.

Add a completion test for "send-email --validate", a send-email option.

Signed-off-by: Thiago Perrotta <tbperrotta@gmail.com>
---
 contrib/completion/git-completion.bash | 11 +----------
 git-send-email.perl                    | 21 +++++++++++++++++----
 t/t9902-completion.sh                  |  3 +++
 3 files changed, 21 insertions(+), 14 deletions(-)
diff mbox series

Patch

diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index 4bdd27ddc8..1b73a4dcc0 100644
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -2359,16 +2359,7 @@  _git_send_email ()
 		return
 		;;
 	--*)
-		__gitcomp_builtin send-email "--annotate --bcc --cc --cc-cmd --chain-reply-to
-			--compose --confirm= --dry-run --envelope-sender
-			--from --identity
-			--in-reply-to --no-chain-reply-to --no-signed-off-by-cc
-			--no-suppress-from --no-thread --quiet --reply-to
-			--signed-off-by-cc --smtp-pass --smtp-server
-			--smtp-server-port --smtp-encryption= --smtp-user
-			--subject --suppress-cc= --suppress-from --thread --to
-			--validate --no-validate
-			$__git_format_patch_extra_options"
+		__gitcomp_builtin send-email "$__git_format_patch_extra_options"
 		return
 		;;
 	esac
diff --git a/git-send-email.perl b/git-send-email.perl
index d1731c1755..3d4836aa48 100755
--- a/git-send-email.perl
+++ b/git-send-email.perl
@@ -38,9 +38,8 @@  sub readline {
 package main;
 
 
-sub usage {
-	print <<EOT;
-git send-email [options] <file | directory | rev-list options >
+my $USAGE = <<EOT
+git send-email [options] <file | directory | rev-list options>
 git send-email --dump-aliases
 
   Composing:
@@ -110,11 +109,25 @@  sub usage {
     --dump-aliases                 * Dump configured aliases and exit.
 
 EOT
+;
+
+sub usage {
+	print $USAGE;
 	exit(1);
 }
 
+sub uniq {
+    my %seen;
+    grep !$seen{$_}++, @_;
+}
+
 sub completion_helper {
-    print Git::command('format-patch', '--git-completion-helper'), "\n";
+    my @no_only_flags;
+    push @no_only_flags, "--$1", "--no-$1" while ($USAGE =~ /--\[no-](\w+(?:-\w+)*)/g);
+
+    my @all_flags = uniq($USAGE =~ /--\w+(?:-\w+)*/g, @no_only_flags);
+
+    print "@all_flags", Git::command('format-patch', '--git-completion-helper'), "\n";
     exit(0);
 }
 
diff --git a/t/t9902-completion.sh b/t/t9902-completion.sh
index 11573936d5..a4faf64184 100755
--- a/t/t9902-completion.sh
+++ b/t/t9902-completion.sh
@@ -2139,6 +2139,9 @@  test_expect_success PERL 'send-email' '
 	--cover-from-description=Z
 	--cover-letter Z
 	EOF
+	test_completion "git send-email --val" <<-\EOF &&
+	--validate Z
+	EOF
 	test_completion "git send-email ma" "main "
 '