Merge branch 'tp/send-email-completion'

The command line complation for "git send-email" options have been
tweaked to make it easier to keep it in sync with the command itself.

* tp/send-email-completion:
  send-email docs: add format-patch options
  send-email: programmatically generate bash completions
This commit is contained in:
Junio C Hamano 2021-11-29 15:41:49 -08:00
commit 7c2abf1a83
4 changed files with 54 additions and 22 deletions

View File

@ -9,7 +9,8 @@ git-send-email - Send a collection of patches as emails
SYNOPSIS SYNOPSIS
-------- --------
[verse] [verse]
'git send-email' [<options>] <file|directory|rev-list options>... 'git send-email' [<options>] <file|directory>...
'git send-email' [<options>] <format-patch options>
'git send-email' --dump-aliases 'git send-email' --dump-aliases
@ -19,7 +20,8 @@ Takes the patches given on the command line and emails them out.
Patches can be specified as files, directories (which will send all Patches can be specified as files, directories (which will send all
files in the directory), or directly as a revision list. In the files in the directory), or directly as a revision list. In the
last case, any format accepted by linkgit:git-format-patch[1] can last case, any format accepted by linkgit:git-format-patch[1] can
be passed to git send-email. be passed to git send-email, as well as options understood by
linkgit:git-format-patch[1].
The header of the email is configurable via command-line options. If not The header of the email is configurable via command-line options. If not
specified on the command line, the user will be prompted with a ReadLine specified on the command line, the user will be prompted with a ReadLine

View File

@ -2359,16 +2359,7 @@ _git_send_email ()
return return
;; ;;
--*) --*)
__gitcomp_builtin send-email "--annotate --bcc --cc --cc-cmd --chain-reply-to __gitcomp_builtin send-email "$__git_format_patch_extra_options"
--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"
return return
;; ;;
esac esac

View File

@ -40,7 +40,8 @@ package main;
sub usage { sub usage {
print <<EOT; print <<EOT;
git send-email [options] <file | directory | rev-list options > git send-email' [<options>] <file|directory>
git send-email' [<options>] <format-patch options>
git send-email --dump-aliases git send-email --dump-aliases
Composing: Composing:
@ -113,9 +114,38 @@ EOT
exit(1); exit(1);
} }
sub uniq {
my %seen;
grep !$seen{$_}++, @_;
}
sub completion_helper { sub completion_helper {
print Git::command('format-patch', '--git-completion-helper'); my ($original_opts) = @_;
exit(0); my %not_for_completion = (
"git-completion-helper" => undef,
"h" => undef,
);
my @send_email_opts = ();
foreach my $key (keys %$original_opts) {
unless (exists $not_for_completion{$key}) {
$key =~ s/!$//;
if ($key =~ /[:=][si]$/) {
$key =~ s/[:=][si]$//;
push (@send_email_opts, "--$_=") foreach (split (/\|/, $key));
} else {
push (@send_email_opts, "--$_") foreach (split (/\|/, $key));
}
}
}
my @format_patch_opts = split(/ /, Git::command('format-patch', '--git-completion-helper'));
my @opts = (@send_email_opts, @format_patch_opts);
@opts = uniq (grep !/^$/, @opts);
# There's an implicit '\n' here already, no need to add an explicit one.
print "@opts";
exit(0);
} }
# most mail servers generate the Date: header, but not all... # most mail servers generate the Date: header, but not all...
@ -425,10 +455,11 @@ my %known_config_keys;
my $key = "sendemail.identity"; my $key = "sendemail.identity";
$identity = Git::config(@repo, $key) if exists $known_config_keys{$key}; $identity = Git::config(@repo, $key) if exists $known_config_keys{$key};
} }
my $rc = GetOptions( my %identity_options = (
"identity=s" => \$identity, "identity=s" => \$identity,
"no-identity" => \$no_identity, "no-identity" => \$no_identity,
); );
my $rc = GetOptions(%identity_options);
usage() unless $rc; usage() unless $rc;
undef $identity if $no_identity; undef $identity if $no_identity;
@ -444,14 +475,17 @@ undef $identity if $no_identity;
my $help; my $help;
my $git_completion_helper; my $git_completion_helper;
$rc = GetOptions("h" => \$help, my %dump_aliases_options = (
"dump-aliases" => \$dump_aliases); "h" => \$help,
"dump-aliases" => \$dump_aliases,
);
$rc = GetOptions(%dump_aliases_options);
usage() unless $rc; usage() unless $rc;
die __("--dump-aliases incompatible with other options\n") die __("--dump-aliases incompatible with other options\n")
if !$help and $dump_aliases and @ARGV; if !$help and $dump_aliases and @ARGV;
$rc = GetOptions( my %options = (
"sender|from=s" => \$sender, "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, "reply-to=s" => \$reply_to,
"subject=s" => \$initial_subject, "subject=s" => \$initial_subject,
"to=s" => \@getopt_to, "to=s" => \@getopt_to,
@ -508,7 +542,8 @@ $rc = GetOptions(
"batch-size=i" => \$batch_size, "batch-size=i" => \$batch_size,
"relogin-delay=i" => \$relogin_delay, "relogin-delay=i" => \$relogin_delay,
"git-completion-helper" => \$git_completion_helper, "git-completion-helper" => \$git_completion_helper,
); );
$rc = GetOptions(%options);
# Munge any "either config or getopt, not both" variables # Munge any "either config or getopt, not both" variables
my @initial_to = @getopt_to ? @getopt_to : ($no_to ? () : @config_to); my @initial_to = @getopt_to ? @getopt_to : ($no_to ? () : @config_to);
@ -516,7 +551,8 @@ my @initial_cc = @getopt_cc ? @getopt_cc : ($no_cc ? () : @config_cc);
my @initial_bcc = @getopt_bcc ? @getopt_bcc : ($no_bcc ? () : @config_bcc); my @initial_bcc = @getopt_bcc ? @getopt_bcc : ($no_bcc ? () : @config_bcc);
usage() if $help; 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) { unless ($rc) {
usage(); usage();
} }

View File

@ -2148,6 +2148,9 @@ test_expect_success PERL 'send-email' '
--cover-from-description=Z --cover-from-description=Z
--cover-letter Z --cover-letter Z
EOF EOF
test_completion "git send-email --val" <<-\EOF &&
--validate Z
EOF
test_completion "git send-email ma" "main " test_completion "git send-email ma" "main "
' '