All of lore.kernel.org
 help / color / mirror / Atom feed
From: Thiago Perrotta <tbperrotta@gmail.com>
To: avarab@gmail.com, git@vger.kernel.org
Cc: tbperrotta@gmail.com
Subject: [DRAFT/WIP PATCH] send-email: programmatically generate bash completions
Date: Mon, 11 Oct 2021 13:12:22 -0400	[thread overview]
Message-ID: <20211011171221.70231-1-tbperrotta@gmail.com> (raw)
In-Reply-To: <87fst7lkjx.fsf@evledraar.gmail.com>

"git send-email --git-completion-helper" only prints "format-patch"
flags. Make it print "send-email" flags as well, extracting them
programmatically from its three existing "GetOptions".

Introduce a "uniq" subroutine, otherwise --cc-cover, --to-cover and
other flags would show up twice. In addition, deduplicate flags common
to both "send-email" and "format-patch", like --from.

Remove extraneous flags: --, --h and --git-completion-helper.

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

Signed-off-by: Thiago Perrotta <tbperrotta@gmail.com>
Based-on-patch-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
---

> ...I think that re-indentation is better left alone for the patch
> readability.

Reverted the `GetOptions` indentation. Noise is now gone :-)

> First, in your 1/3 you're adding a \n, but in 2/3 we end up with \n\n. I
> think you can just skip 1/3, maybe mention "how it also has a "\n" in
> the commit message.

I don't quite see how this would fit into the commit message. A comment in the
code seems to fit better to account for this detail. That's what I did, but if
you still disagree, please elaborate where in the commit message this sentence
should be added.

> You then strip out "--" arguments from the combined list, but isn't this
> something we do need to emit? I.e. it's used as syntax by the bash
> completion isn't it? (I just skimmed the relevant C code in
> parse-options.c).

I interpreted that standalone `--` as an extraneous / useless token. If it's
there intentionally, then I am reverting my stripping it. At the end of the day
whether to include it or not is a small detail, but FYI, when I do:

  git clone -<TAB>

in bash, nothing happens. I would have expected it to be expanded to "--"
because of the explicit "--", but it doesn't. Therefore my conclusion is that
"--" in the output of "--git-completion-helper" is useless. Am I missing
something?

Finally, as per your comments about "=": OK, I see what you mean. For the record
I had produced a quick-and-dirty version earlier (on top of V6), but didn't
include it in V7 because I didn't deem it polished enough, but I'll include it
here for reference. I'll take your new comments to see if I can produce a better
polished version before I send V8:

diff --git a/git-send-email.perl b/git-send-email.perl
index 465e9867b9..f0f83330d3 100755
--- a/git-send-email.perl
+++ b/git-send-email.perl
@@ -123,12 +123,13 @@ sub completion_helper {
     my @send_email_opts = map {
       "--$_"
     } map {
-      s/(?:[:=][si]|!)$//;
+      s/!$//;
+      s/[:=][si]$/=/;
       split /\|/, $_;
     } keys %$options;
-    my @format_patch_opts = Git::command('format-patch', '--git-completion-helper');
-    my @options = uniq @send_email_opts, @format_patch_opts;
-    @options = grep !/--git-completion-helper|--h/, @options;
+    my @format_patch_opts = split(/ /, Git::command('format-patch', '--git-completion-helper'));
+    my @options = (@send_email_opts, @format_patch_opts);
+    @options = uniq (grep !/^$|^--$|--git-completion-helper|--h/, @options);
     print "@options\n";
     exit(0);
 }

> That it's a map/map/keys is just some off-the-cuff Perl hacking on my

part, I think for validation etc. it's usually better to just turn it
into a plain old boring for-loop.

Oh, okay, I didn't find it hacky at all, the `map` seemed quite elegant and
functional to me, but then again I am a perl newbie :-P.

Differences from V7 (so far):

As per Ævar's comments:

- completely drop 1/3 since we'now using split instead of print to incorporate
  format-patch options. Side effect: then-extraneous '\n' is now gone.

- revert indentation (tabs) on GetOptions to eliminate diff noise (as per Ævar's
  interpretation of original Carlos's comment)

- re-add "--" to the output of "git send-email --git-completion-helper"

 contrib/completion/git-completion.bash | 11 +------
 git-send-email.perl                    | 40 ++++++++++++++++++++------
 t/t9902-completion.sh                  |  3 ++
 3 files changed, 35 insertions(+), 19 deletions(-)

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 e65d969d0b..b632313192 100755
--- a/git-send-email.perl
+++ b/git-send-email.perl
@@ -113,9 +113,25 @@ sub usage {
 	exit(1);
 }
 
+sub uniq {
+	my %seen;
+	grep !$seen{$_}++, @_;
+}
+
 sub completion_helper {
-    print Git::command('format-patch', '--git-completion-helper');
-    exit(0);
+	my ($original_opts) = @_;
+	my @send_email_opts = map {
+		"--$_"
+	} map {
+		s/(?:[:=][si]|!)$//;
+		split /\|/;
+	} keys %$original_opts;
+	my @format_patch_opts = split(/ /, Git::command('format-patch', '--git-completion-helper'));
+	my @options = (@send_email_opts, @format_patch_opts);
+	@options = uniq (grep !/^$|--git-completion-helper|--h/, @options);
+	# There's an implicit '\n' here already, no need to add an explicit one.
+	print "@options";
+	exit(0);
 }
 
 # most mail servers generate the Date: header, but not all...
@@ -425,10 +441,11 @@ sub config_regexp {
 	my $key = "sendemail.identity";
 	$identity = Git::config(@repo, $key) if exists $known_config_keys{$key};
 }
-my $rc = GetOptions(
+my %identity_options = (
 	"identity=s" => \$identity,
 	"no-identity" => \$no_identity,
 );
+my $rc = GetOptions(%identity_options);
 usage() unless $rc;
 undef $identity if $no_identity;
 
@@ -444,14 +461,17 @@ sub config_regexp {
 
 my $help;
 my $git_completion_helper;
-$rc = GetOptions("h" => \$help,
-                 "dump-aliases" => \$dump_aliases);
+my %dump_aliases_options = (
+	"h" => \$help,
+	"dump-aliases" => \$dump_aliases,
+);
+$rc = GetOptions(%dump_aliases_options);
 usage() unless $rc;
 die __("--dump-aliases incompatible with other options\n")
     if !$help and $dump_aliases and @ARGV;
-$rc = GetOptions(
+my %options = (
 		    "sender|from=s" => \$sender,
-                    "in-reply-to=s" => \$initial_in_reply_to,
+		    "in-reply-to=s" => \$initial_in_reply_to,
 		    "reply-to=s" => \$reply_to,
 		    "subject=s" => \$initial_subject,
 		    "to=s" => \@getopt_to,
@@ -508,7 +528,8 @@ sub config_regexp {
 		    "batch-size=i" => \$batch_size,
 		    "relogin-delay=i" => \$relogin_delay,
 		    "git-completion-helper" => \$git_completion_helper,
-	 );
+);
+$rc = GetOptions(%options);
 
 # Munge any "either config or getopt, not both" variables
 my @initial_to = @getopt_to ? @getopt_to : ($no_to ? () : @config_to);
@@ -516,7 +537,8 @@ sub config_regexp {
 my @initial_bcc = @getopt_bcc ? @getopt_bcc : ($no_bcc ? () : @config_bcc);
 
 usage() if $help;
-completion_helper() if $git_completion_helper;
+my %all_options = (%options, %dump_aliases_options, %identity_options);
+completion_helper(\%all_options) if $git_completion_helper;
 unless ($rc) {
     usage();
 }
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 "
 '
 
-- 
2.33.0


  reply	other threads:[~2021-10-11 17:13 UTC|newest]

Thread overview: 58+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-08-20  0:46 [PATCH v2 0/3] send-email: shell completion improvements Thiago Perrotta
2021-08-20  0:46 ` [PATCH v2 1/3] send-email: print newline for --git-completion-helper Thiago Perrotta
2021-08-20 20:17   ` Junio C Hamano
2021-08-28  3:08     ` [PATCH v3 0/3] send-email: shell completion improvements Thiago Perrotta
2021-08-28  3:08     ` [PATCH v3 1/3] send-email: terminate --git-completion-helper with LF Thiago Perrotta
2021-08-28  3:08     ` [PATCH v3 2/3] send-email: move bash completions to core script Thiago Perrotta
2021-08-28  5:25       ` Carlo Arenas
2021-09-07  0:16         ` [PATCH] " Thiago Perrotta
2021-09-07  1:28           ` Carlo Arenas
2021-09-21 15:51             ` [PATCH v4 0/3] send-email: shell completion improvements Thiago Perrotta
2021-09-21 15:51               ` [PATCH v4 1/3] send-email: terminate --git-completion-helper with LF Thiago Perrotta
2021-09-21 15:51               ` [PATCH v4 2/3] send-email: move bash completions to core script Thiago Perrotta
2021-09-21 15:51               ` [PATCH v4 3/3] send-email docs: add format-patch options Thiago Perrotta
2021-09-23 14:02               ` [PATCH v4 0/3] send-email: shell completion improvements Ævar Arnfjörð Bjarmason
2021-09-24  2:46                 ` [PATCH v5 " Thiago Perrotta
2021-09-24 20:02                   ` Ævar Arnfjörð Bjarmason
2021-09-30  3:10                     ` Thiago Perrotta
2021-10-07  3:36                       ` [PATCH v6 " Thiago Perrotta
2021-10-07  3:36                       ` [PATCH v6 1/3] send-email: terminate --git-completion-helper with LF Thiago Perrotta
2021-10-07  3:36                       ` [PATCH v6 2/3] send-email: programmatically generate bash completions Thiago Perrotta
2021-10-09  6:38                         ` Carlo Marcelo Arenas Belón
2021-10-11  4:10                           ` [PATCH v7 0/3] send-email: shell completion improvements Thiago Perrotta
2021-10-11 13:46                             ` Ævar Arnfjörð Bjarmason
2021-10-11 17:12                               ` Thiago Perrotta [this message]
2021-10-25 21:27                               ` [PATCH v8 0/2] " Thiago Perrotta
2021-10-25 22:44                                 ` Ævar Arnfjörð Bjarmason
2021-10-26  0:48                                   ` Ævar Arnfjörð Bjarmason
2021-10-28 16:31                                     ` Junio C Hamano
2021-10-25 21:27                               ` [PATCH v8 1/2] send-email: programmatically generate bash completions Thiago Perrotta
2021-10-25 21:27                               ` [PATCH v8 2/2] send-email docs: add format-patch options Thiago Perrotta
2021-10-11  4:10                           ` [PATCH v7 1/3] send-email: terminate --git-completion-helper with LF Thiago Perrotta
2021-10-11  4:10                           ` [PATCH v7 2/3] send-email: programmatically generate bash completions Thiago Perrotta
2021-10-11  4:10                           ` [PATCH v7 3/3] send-email docs: add format-patch options Thiago Perrotta
2021-10-07  3:36                       ` [PATCH v6 " Thiago Perrotta
2021-10-09  8:31                         ` [RFC PATCH] Documentation: better document format-patch options in send-email Carlo Marcelo Arenas Belón
2021-10-09  8:57                           ` Bagas Sanjaya
2021-10-09  9:32                             ` Carlo Arenas
2021-10-09 11:04                               ` Bagas Sanjaya
2021-10-10 21:33                               ` Junio C Hamano
2021-09-24  2:46                 ` [PATCH v5 1/3] send-email: terminate --git-completion-helper with LF Thiago Perrotta
2021-09-24  2:46                 ` [PATCH v5 2/3] send-email: programmatically generate bash completions Thiago Perrotta
2021-09-24  2:46                 ` [PATCH v5 3/3] send-email docs: add format-patch options Thiago Perrotta
2021-09-24  4:36                   ` Bagas Sanjaya
2021-09-24  4:53                     ` Carlo Arenas
2021-09-24  6:19                       ` Bagas Sanjaya
2021-09-24  6:56                         ` Carlo Arenas
2021-09-24 15:33                       ` Junio C Hamano
2021-09-24 17:34                         ` Carlo Arenas
2021-09-24 20:03                           ` Junio C Hamano
2021-09-25  3:03                             ` Bagas Sanjaya
2021-09-25  4:07                               ` Junio C Hamano
2021-09-25  6:13                                 ` Carlo Marcelo Arenas Belón
2021-09-29 21:20                                   ` Junio C Hamano
2021-08-28  3:08     ` [PATCH v3 " Thiago Perrotta
2021-08-28  5:22       ` Bagas Sanjaya
2021-08-20  0:46 ` [PATCH v2 2/3] send-email: move bash completions to the perl script Thiago Perrotta
2021-08-20  0:46 ` [PATCH v2 3/3] send-email docs: mention format-patch options Thiago Perrotta
2021-08-20 20:32   ` Junio C Hamano

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20211011171221.70231-1-tbperrotta@gmail.com \
    --to=tbperrotta@gmail.com \
    --cc=avarab@gmail.com \
    --cc=git@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.