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
Родитель 0ae87432aa a2ce608244
Коммит 7c2abf1a83
4 изменённых файлов: 54 добавлений и 22 удалений

Просмотреть файл

@ -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

Просмотреть файл

@ -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

Просмотреть файл

@ -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,8 +114,37 @@ 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) = @_;
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); exit(0);
} }
@ -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,12 +475,15 @@ 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,
@ -509,6 +543,7 @@ $rc = GetOptions(
"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();
} }

Просмотреть файл

@ -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 "
' '