* [PATCH RFC 01/10] Docs: send-email: Put options back into alphabetical order @ 2009-04-11 19:08 Michael Witten 2009-04-11 19:08 ` [PATCH RFC 02/10] Docs: send-email: Remove superfluous information in CONFIGURATION Michael Witten 0 siblings, 1 reply; 23+ messages in thread From: Michael Witten @ 2009-04-11 19:08 UTC (permalink / raw) To: git I also wrote a comment block as a warning to trespassers. Signed-off-by: Michael Witten <mfwitten@gmail.com> --- Documentation/git-send-email.txt | 26 +++++++++++++++----------- 1 files changed, 15 insertions(+), 11 deletions(-) diff --git a/Documentation/git-send-email.txt b/Documentation/git-send-email.txt index 0b1f183..595c7ba 100644 --- a/Documentation/git-send-email.txt +++ b/Documentation/git-send-email.txt @@ -32,6 +32,10 @@ script This format expects the first line of the file to contain the "Cc:" value and the "Subject:" of the message as the second line. +///////////////////////////////////////////////////////////////////////////////////// +//// Within each category (Composing, Sending, Automating, and Administering), //// +//// options are to be given in alphabetical order. Please maintain this layout. //// +///////////////////////////////////////////////////////////////////////////////////// OPTIONS ------- @@ -39,6 +43,11 @@ OPTIONS Composing ~~~~~~~~~ +--annotate:: + Review each patch you're about to send in an editor. The setting + 'sendemail.multiedit' defines if this will spawn one editor per patch + or one for all of them at once. + --bcc=<address>:: Specify a "Bcc:" value for each email. Default is the value of 'sendemail.bcc'. @@ -51,11 +60,6 @@ The --bcc option must be repeated for each user you want on the bcc list. + The --cc option must be repeated for each user you want on the cc list. ---annotate:: - Review each patch you're about to send in an editor. The setting - 'sendemail.multiedit' defines if this will spawn one editor per patch - or one for all of them at once. - --compose:: Use $GIT_EDITOR, core.editor, $VISUAL, or $EDITOR to edit an introductory message for the patch series. @@ -230,6 +234,12 @@ have been specified, in which case default to 'compose'. --dry-run:: Do everything except actually send the emails. +--[no-]format-patch:: + When an argument may be understood either as a reference or as a file name, + choose to understand it as a format-patch argument ('--format-patch') + or as a file name ('--no-format-patch'). By default, when such a conflict + occurs, git send-email will fail. + --quiet:: Make git-send-email less verbose. One line per email should be all that is output. @@ -246,12 +256,6 @@ have been specified, in which case default to 'compose'. Default is the value of 'sendemail.validate'; if this is not set, default to '--validate'. ---[no-]format-patch:: - When an argument may be understood either as a reference or as a file name, - choose to understand it as a format-patch argument ('--format-patch') - or as a file name ('--no-format-patch'). By default, when such a conflict - occurs, git send-email will fail. - CONFIGURATION ------------- -- 1.6.2.2.479.g2aec ^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH RFC 02/10] Docs: send-email: Remove superfluous information in CONFIGURATION 2009-04-11 19:08 [PATCH RFC 01/10] Docs: send-email: Put options back into alphabetical order Michael Witten @ 2009-04-11 19:08 ` Michael Witten 2009-04-11 19:08 ` [PATCH RFC 03/10] send-email: Cleanup the usage text and docs a bit Michael Witten 2009-04-11 21:42 ` [PATCH RFC 02/10] Docs: send-email: Remove superfluous information in CONFIGURATION Stephen Boyd 0 siblings, 2 replies; 23+ messages in thread From: Michael Witten @ 2009-04-11 19:08 UTC (permalink / raw) To: git In particular, sendemail.confirm was removed, because it's already described along with its corresponding option. There is now a comment block warning trespassers. Signed-off-by: Michael Witten <mfwitten@gmail.com> --- Documentation/git-send-email.txt | 11 +++++------ 1 files changed, 5 insertions(+), 6 deletions(-) diff --git a/Documentation/git-send-email.txt b/Documentation/git-send-email.txt index 595c7ba..7cdbdd6 100644 --- a/Documentation/git-send-email.txt +++ b/Documentation/git-send-email.txt @@ -257,6 +257,11 @@ Default is the value of 'sendemail.validate'; if this is not set, default to '--validate'. +////////////////////////////////////////////////////////////////////////////// +//// Only list configuration variables that can't be listed and described //// +//// with a corresponding option above //// +////////////////////////////////////////////////////////////////////////////// + CONFIGURATION ------------- @@ -274,12 +279,6 @@ sendemail.multiedit:: summary when '--compose' is used). If false, files will be edited one after the other, spawning a new editor each time. -sendemail.confirm:: - Sets the default for whether to confirm before sending. Must be - one of 'always', 'never', 'cc', 'compose', or 'auto'. See '--confirm' - in the previous section for the meaning of these values. - - Author ------ Written by Ryan Anderson <ryan@michonline.com> -- 1.6.2.2.479.g2aec ^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH RFC 03/10] send-email: Cleanup the usage text and docs a bit 2009-04-11 19:08 ` [PATCH RFC 02/10] Docs: send-email: Remove superfluous information in CONFIGURATION Michael Witten @ 2009-04-11 19:08 ` Michael Witten 2009-04-11 19:08 ` [PATCH RFC 04/10] send-email: --smtp-server-port should take an integer Michael Witten 2009-04-11 21:42 ` [PATCH RFC 02/10] Docs: send-email: Remove superfluous information in CONFIGURATION Stephen Boyd 1 sibling, 1 reply; 23+ messages in thread From: Michael Witten @ 2009-04-11 19:08 UTC (permalink / raw) To: git All usage text lines should be < 80 characters. A port number in --smtp-server is no longer handled, so the suggestion has been removed. --chain-reply-to doesn't take an argument. Signed-off-by: Michael Witten <mfwitten@gmail.com> --- Documentation/git-send-email.txt | 17 +++++++------ git-send-email.perl | 47 +++++++++++++++++++++----------------- 2 files changed, 35 insertions(+), 29 deletions(-) diff --git a/Documentation/git-send-email.txt b/Documentation/git-send-email.txt index 7cdbdd6..12845d6 100644 --- a/Documentation/git-send-email.txt +++ b/Documentation/git-send-email.txt @@ -77,8 +77,9 @@ Missing From or In-Reply-To headers will be prompted for. the value GIT_COMMITTER_IDENT, as returned by "git var -l". The user will still be prompted to confirm this entry. ---in-reply-to=<identifier>:: - Specify the contents of the first In-Reply-To header. +--in-reply-to=<message-id>:: + Specify the contents of the first In-Reply-To header; + include the angle brackets '<' and '>'. Subsequent emails will refer to the previous email instead of this if --chain-reply-to is set (the default) Only necessary if --compose is also set. If --compose @@ -109,7 +110,7 @@ Sending the 'sendemail.envelopesender' configuration variable; if that is unspecified, choosing the envelope sender is left to your MTA. ---smtp-encryption=<encryption>:: +--smtp-encryption=<type>:: Specify the encryption to use, either 'ssl' or 'tls'. Any other value reverts to plain SMTP. Default is the value of 'sendemail.smtpencryption'. @@ -159,7 +160,7 @@ Automating Output of this command must be single email address per line. Default is the value of 'sendemail.cccmd' configuration value. ---[no-]chain-reply-to=<identifier>:: +--[no-]chain-reply-to:: If this is set, each email will be sent as a reply to the previous email sent. If disabled with "--no-chain-reply-to", all emails after the first will be sent as replies to the first email sent. When using @@ -167,11 +168,11 @@ Automating entire patch series. Default is the value of the 'sendemail.chainreplyto' configuration value; if that is unspecified, default to --chain-reply-to. ---identity=<identity>:: +--identity=<id>:: A configuration identity. When given, causes values in the - 'sendemail.<identity>' subsection to take precedence over + 'sendemail.<id>' subsection to take precedence over values in the 'sendemail' section. The default identity is - the value of 'sendemail.identity'. + the value of the 'sendemail.identity' configuration variable. --[no-]signed-off-by-cc:: If this is set, add emails found in Signed-off-by: or Cc: lines to the @@ -215,7 +216,7 @@ specified, as well as 'body' if --no-signed-off-cc is specified. Administering ~~~~~~~~~~~~~ ---confirm=<mode>:: +--confirm=<when>:: Confirm just before sending: + -- diff --git a/git-send-email.perl b/git-send-email.perl index 172b53c..fb3e712 100755 --- a/git-send-email.perl +++ b/git-send-email.perl @@ -42,46 +42,51 @@ package main; sub usage { + + # All printed lines should be less than 80 characters. + print <<EOT; git send-email [options] <file | directory | rev-list options > Composing: - --from <str> * Email From: - --to <str> * Email To: - --cc <str> * Email Cc: - --bcc <str> * Email Bcc: - --subject <str> * Email "Subject:" - --in-reply-to <str> * Email "In-Reply-To:" - --annotate * Review each patch that will be sent in an editor. + --from <address> * Email From: + --to <address> * Email To: + --cc <address> * Email Cc: + --bcc <address> * Email Bcc: + --subject <string> * Email "Subject:" + --in-reply-to <message-id> * Email "In-Reply-To:"; include '<' and '>'. + --annotate * Review each patch that will be sent in + an editor. --compose * Open an editor for introduction. Sending: - --envelope-sender <str> * Email envelope sender. - --smtp-server <str:int> * Outgoing SMTP server to use. The port - is optional. Default 'localhost'. - --smtp-server-port <int> * Outgoing SMTP server port. - --smtp-user <str> * Username for SMTP-AUTH. - --smtp-pass <str> * Password for SMTP-AUTH; not necessary. - --smtp-encryption <str> * tls or ssl; anything else disables. + --envelope-sender <address> * Email envelope sender. + --smtp-server <host> * Outgoing SMTP server to use. + --smtp-server-port <port> * Outgoing SMTP server port. + --smtp-user <username> * Username for SMTP-AUTH. + --smtp-pass [<password>] * Password for SMTP-AUTH; not necessary. + --smtp-encryption <type> * tls or ssl; anything else disables. --smtp-ssl * Deprecated. Use '--smtp-encryption ssl'. Automating: - --identity <str> * Use the sendemail.<id> options. - --cc-cmd <str> * Email Cc: via `<str> \$patch_path` - --suppress-cc <str> * author, self, sob, cc, cccmd, body, bodycc, all. - --[no-]signed-off-by-cc * Send to Signed-off-by: addresses. Default on. + --identity <id> * Use the sendemail.<id> options. + --cc-cmd <command> * Email Cc: via `<command> \$patch_path` + --suppress-cc <category> * author, self, sob, cc, cccmd, body, + bodycc, all. + --[no-]signed-off-by-cc * Send to Signed-off-by: addresses. + Default on. --[no-]suppress-from * Send to self. Default off. --[no-]chain-reply-to * Chain In-Reply-To: fields. Default on. --[no-]thread * Use In-Reply-To: field. Default on. Administering: - --confirm <str> * Confirm recipients before sending; + --confirm <when> * Confirm recipients before sending; auto, cc, compose, always, or never. --quiet * Output one line of info per email. --dry-run * Don't actually send the emails. --[no-]validate * Perform patch sanity checks. Default on. - --[no-]format-patch * understand any non optional arguments as - `git format-patch` ones. + --[no-]format-patch * Understand any non-optional arguments as + `git format-patch' arguments. EOT exit(1); -- 1.6.2.2.479.g2aec ^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH RFC 04/10] send-email: --smtp-server-port should take an integer 2009-04-11 19:08 ` [PATCH RFC 03/10] send-email: Cleanup the usage text and docs a bit Michael Witten @ 2009-04-11 19:08 ` Michael Witten 2009-04-11 19:08 ` [PATCH RFC 05/10] send-email: Handle "GIT:" rather than "GIT: " during --compose Michael Witten 0 siblings, 1 reply; 23+ messages in thread From: Michael Witten @ 2009-04-11 19:08 UTC (permalink / raw) To: git Signed-off-by: Michael Witten <mfwitten@gmail.com> --- git-send-email.perl | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/git-send-email.perl b/git-send-email.perl index fb3e712..b689cc7 100755 --- a/git-send-email.perl +++ b/git-send-email.perl @@ -253,7 +253,7 @@ my $rc = GetOptions("sender|from=s" => \$sender, "bcc=s" => \@bcclist, "chain-reply-to!" => \$chain_reply_to, "smtp-server=s" => \$smtp_server, - "smtp-server-port=s" => \$smtp_server_port, + "smtp-server-port=i" => \$smtp_server_port, "smtp-user=s" => \$smtp_authuser, "smtp-pass:s" => \$smtp_authpass, "smtp-ssl" => sub { $smtp_encryption = 'ssl' }, -- 1.6.2.2.479.g2aec ^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH RFC 05/10] send-email: Handle "GIT:" rather than "GIT: " during --compose 2009-04-11 19:08 ` [PATCH RFC 04/10] send-email: --smtp-server-port should take an integer Michael Witten @ 2009-04-11 19:08 ` Michael Witten 2009-04-11 19:08 ` [PATCH RFC 06/10] send-email: References: should only reference what is actually sent Michael Witten 0 siblings, 1 reply; 23+ messages in thread From: Michael Witten @ 2009-04-11 19:08 UTC (permalink / raw) To: git This should make things a little more robust in terms of user input; before, even the program got it wrong by outputting a line with only "GIT:", which was left in place as a header, because there would be no following space character. Also, I cleaned up get_patch_subject(). Signed-off-by: Michael Witten <mfwitten@gmail.com> --- git-send-email.perl | 23 ++++++++++++----------- 1 files changed, 12 insertions(+), 11 deletions(-) diff --git a/git-send-email.perl b/git-send-email.perl index b689cc7..502f5af 100755 --- a/git-send-email.perl +++ b/git-send-email.perl @@ -507,15 +507,16 @@ if (@files) { } sub get_patch_subject($) { - my $fn = shift; - open (my $fh, '<', $fn); - while (my $line = <$fh>) { - next unless ($line =~ /^Subject: (.*)$/); - close $fh; - return "GIT: $1\n"; + + my $patch = shift; + open (my $fh, '<', $patch); + + while (<$fh>) { + next unless (/^Subject: (.*)$/); + return $1; } - close $fh; - die "No subject line in $fn ?"; + + die "'Subject:' line expected in '$patch'"; } if ($compose) { @@ -534,7 +535,7 @@ if ($compose) { print C <<EOT; From $tpl_sender # This line is ignored. -GIT: Lines beginning in "GIT: " will be removed. +GIT: Lines beginning in "GIT:" will be removed. GIT: Consider including an overall diffstat or table of contents GIT: for the patch you are writing. GIT: @@ -545,7 +546,7 @@ In-Reply-To: $tpl_reply_to EOT for my $f (@files) { - print C get_patch_subject($f); + print C "GIT: ", get_patch_subject($f), "\n"; } close(C); @@ -567,7 +568,7 @@ EOT my $in_body = 0; my $summary_empty = 1; while(<C>) { - next if m/^GIT: /; + next if m/^GIT:/; if ($in_body) { $summary_empty = 0 unless (/^\n$/); } elsif (/^\n$/) { -- 1.6.2.2.479.g2aec ^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH RFC 06/10] send-email: References: should only reference what is actually sent 2009-04-11 19:08 ` [PATCH RFC 05/10] send-email: Handle "GIT:" rather than "GIT: " during --compose Michael Witten @ 2009-04-11 19:08 ` Michael Witten 2009-04-11 19:08 ` [PATCH RFC 07/10] send-email: Remove horrible mix of tabs and spaces Michael Witten 2009-04-11 21:52 ` [PATCH RFC 06/10] send-email: References: should only reference what is actually sent Stephen Boyd 0 siblings, 2 replies; 23+ messages in thread From: Michael Witten @ 2009-04-11 19:08 UTC (permalink / raw) To: git If someone responded with a negative (n|no) to the confirmation, then the Message-ID of the discarded email is no longer used in the References: header of subsequent emails. Consequently, send_message() now returns 1 if the message was sent and 0 otherwise. Signed-off-by: Michael Witten <mfwitten@gmail.com> --- git-send-email.perl | 14 ++++++++++---- 1 files changed, 10 insertions(+), 4 deletions(-) diff --git a/git-send-email.perl b/git-send-email.perl index 502f5af..d90c76e 100755 --- a/git-send-email.perl +++ b/git-send-email.perl @@ -802,6 +802,10 @@ sub sanitize_address } +# returns 1 of the message was sent, 0 otherwise. +# In actuality, the whole program dies when a there +# is an error sending a message. + sub send_message { my @recipients = unique_email_list(@to); @@ -870,7 +874,7 @@ X-Mailer: git-send-email $gitversion default => $ask_default); die "Send this email reply required" unless defined $_; if (/^n/i) { - return; + return 0; } elsif (/^q/i) { cleanup_compose_files(); exit(0); @@ -951,7 +955,7 @@ X-Mailer: git-send-email $gitversion $smtp->data or die $smtp->message; $smtp->datasend("$header\n$message") or die $smtp->message; $smtp->dataend() or die $smtp->message; - $smtp->ok or die "Failed to send $subject\n".$smtp->message; + $smtp->code =~ /250|200/ or die "Failed to send $subject\n".$smtp->message; } if ($quiet) { printf (($dry_run ? "Dry-" : "")."Sent %s\n", $subject); @@ -972,6 +976,8 @@ X-Mailer: git-send-email $gitversion print "Result: OK\n"; } } + + return 1; } $reply_to = $initial_reply_to; @@ -1132,10 +1138,10 @@ foreach my $t (@files) { @cc = (@initial_cc, @cc); - send_message(); + my $message_was_sent = send_message(); # set up for the next message - if ($chain_reply_to || !defined $reply_to || length($reply_to) == 0) { + if ($message_was_sent and $chain_reply_to || not defined $reply_to || length($reply_to) == 0) { $reply_to = $message_id; if (length $references > 0) { $references .= "\n $message_id"; -- 1.6.2.2.479.g2aec ^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH RFC 07/10] send-email: Remove horrible mix of tabs and spaces 2009-04-11 19:08 ` [PATCH RFC 06/10] send-email: References: should only reference what is actually sent Michael Witten @ 2009-04-11 19:08 ` Michael Witten 2009-04-11 19:08 ` [PATCH RFC 08/10] send-email: Add --sleep for email throttling Michael Witten 2009-04-11 19:17 ` [PATCH RFC 07/10] send-email: Remove horrible mix of tabs and spaces Sverre Rabbelier 2009-04-11 21:52 ` [PATCH RFC 06/10] send-email: References: should only reference what is actually sent Stephen Boyd 1 sibling, 2 replies; 23+ messages in thread From: Michael Witten @ 2009-04-11 19:08 UTC (permalink / raw) To: git For the most part, I ran a search for all the lines that match: ^[\t]*[ ]+ and then I manually replaced the offending text with an appropriate number of tabs. While scanning through the file, I also tried to format some of the code so as to obviate future mixing; I also fixed one horrendously egregious section of code, where someone was trying to be unnecessarily compact. Currently, no lines match the following: [\t]+[ ]+ [ ]+[\t]+ So, it should be reasonably clean. The whole file is still horrendous. Signed-off-by: Michael Witten <mfwitten@gmail.com> --- git-send-email.perl | 278 +++++++++++++++++++++++++++++++-------------------- 1 files changed, 168 insertions(+), 110 deletions(-) diff --git a/git-send-email.perl b/git-send-email.perl index d90c76e..4f0462f 100755 --- a/git-send-email.perl +++ b/git-send-email.perl @@ -16,6 +16,14 @@ # and second line is the subject of the message. # +## WARNING! ACHTUNG! ATTENTION! ADVERTENCIA! +## Currently, this file uses tabs (like the rest of git source) to +## delineate code structure. Do NOT under any circumstances mix tabs +## and spaces across lines that share a relationship in terms of layout. +## In fact, it would currently be best to use only tabs, so please set +## your editor(s) accordingly. This code is already trashy enough. Please +## don't make it worse. + use strict; use warnings; use Term::ReadLine; @@ -116,19 +124,20 @@ sub format_2822_time { die ("local time offset greater than or equal to 24 hours\n"); } - return sprintf("%s, %2d %s %d %02d:%02d:%02d %s%02d%02d", - qw(Sun Mon Tue Wed Thu Fri Sat)[$localtm[6]], - $localtm[3], - qw(Jan Feb Mar Apr May Jun - Jul Aug Sep Oct Nov Dec)[$localtm[4]], - $localtm[5]+1900, - $localtm[2], - $localtm[1], - $localtm[0], - ($offset >= 0) ? '+' : '-', - abs($offhour), - $offmin, - ); + return sprintf( + "%s, %2d %s %d %02d:%02d:%02d %s%02d%02d", + qw(Sun Mon Tue Wed Thu Fri Sat)[$localtm[6]], + $localtm[3], + qw(Jan Feb Mar Apr May Jun + Jul Aug Sep Oct Nov Dec)[$localtm[4]], + $localtm[5]+1900, + $localtm[2], + $localtm[1], + $localtm[0], + ($offset >= 0) ? '+' : '-', + abs($offhour), + $offmin, + ); } my $have_email_valid = eval { require Email::Valid; 1 }; @@ -192,29 +201,29 @@ my ($validate, $confirm); my (@suppress_cc); my %config_bool_settings = ( - "thread" => [\$thread, 1], - "chainreplyto" => [\$chain_reply_to, 1], - "suppressfrom" => [\$suppress_from, undef], - "signedoffbycc" => [\$signed_off_by_cc, undef], - "signedoffcc" => [\$signed_off_by_cc, undef], # Deprecated - "validate" => [\$validate, 1], + "thread" => [\$thread, 1], + "chainreplyto" => [\$chain_reply_to, 1], + "suppressfrom" => [\$suppress_from, undef], + "signedoffbycc" => [\$signed_off_by_cc, undef], + "signedoffcc" => [\$signed_off_by_cc, undef], # Deprecated + "validate" => [\$validate, 1], ); my %config_settings = ( - "smtpserver" => \$smtp_server, - "smtpserverport" => \$smtp_server_port, - "smtpuser" => \$smtp_authuser, - "smtppass" => \$smtp_authpass, - "to" => \@to, - "cc" => \@initial_cc, - "cccmd" => \$cc_cmd, - "aliasfiletype" => \$aliasfiletype, - "bcc" => \@bcclist, - "aliasesfile" => \@alias_files, - "suppresscc" => \@suppress_cc, - "envelopesender" => \$envelope_sender, - "multiedit" => \$multiedit, - "confirm" => \$confirm, + "smtpserver" => \$smtp_server, + "smtpserverport" => \$smtp_server_port, + "smtpuser" => \$smtp_authuser, + "smtppass" => \$smtp_authpass, + "to" => \@to, + "cc" => \@initial_cc, + "cccmd" => \$cc_cmd, + "aliasfiletype" => \$aliasfiletype, + "bcc" => \@bcclist, + "aliasesfile" => \@alias_files, + "suppresscc" => \@suppress_cc, + "envelopesender" => \$envelope_sender, + "multiedit" => \$multiedit, + "confirm" => \$confirm, ); # Handle Uncouth Termination @@ -245,37 +254,38 @@ $SIG{INT} = \&signal_handler; # Begin by accumulating all the variables (defined above), that we will end up # needing, first, from the command line: -my $rc = GetOptions("sender|from=s" => \$sender, - "in-reply-to=s" => \$initial_reply_to, - "subject=s" => \$initial_subject, - "to=s" => \@to, - "cc=s" => \@initial_cc, - "bcc=s" => \@bcclist, - "chain-reply-to!" => \$chain_reply_to, - "smtp-server=s" => \$smtp_server, - "smtp-server-port=i" => \$smtp_server_port, - "smtp-user=s" => \$smtp_authuser, - "smtp-pass:s" => \$smtp_authpass, - "smtp-ssl" => sub { $smtp_encryption = 'ssl' }, - "smtp-encryption=s" => \$smtp_encryption, - "identity=s" => \$identity, - "annotate" => \$annotate, - "compose" => \$compose, - "quiet" => \$quiet, - "cc-cmd=s" => \$cc_cmd, - "suppress-from!" => \$suppress_from, - "suppress-cc=s" => \@suppress_cc, - "signed-off-cc|signed-off-by-cc!" => \$signed_off_by_cc, - "confirm=s" => \$confirm, - "dry-run" => \$dry_run, - "envelope-sender=s" => \$envelope_sender, - "thread!" => \$thread, - "validate!" => \$validate, - "format-patch!" => \$format_patch, - ); +my $rc = GetOptions( + "sender|from=s" => \$sender, + "in-reply-to=s" => \$initial_reply_to, + "subject=s" => \$initial_subject, + "to=s" => \@to, + "cc=s" => \@initial_cc, + "bcc=s" => \@bcclist, + "chain-reply-to!" => \$chain_reply_to, + "smtp-server=s" => \$smtp_server, + "smtp-server-port=i" => \$smtp_server_port, + "smtp-user=s" => \$smtp_authuser, + "smtp-pass:s" => \$smtp_authpass, + "smtp-ssl" => sub { $smtp_encryption = 'ssl' }, + "smtp-encryption=s" => \$smtp_encryption, + "identity=s" => \$identity, + "annotate" => \$annotate, + "compose" => \$compose, + "quiet" => \$quiet, + "cc-cmd=s" => \$cc_cmd, + "suppress-from!" => \$suppress_from, + "suppress-cc=s" => \@suppress_cc, + "signed-off-cc|signed-off-by-cc!" => \$signed_off_by_cc, + "confirm=s" => \$confirm, + "dry-run" => \$dry_run, + "envelope-sender=s" => \$envelope_sender, + "thread!" => \$thread, + "validate!" => \$validate, + "format-patch!" => \$format_patch, +); unless ($rc) { - usage(); + usage(); } die "Cannot run git format-patch from outside a repository\n" @@ -404,29 +414,55 @@ sub split_addrs { my %aliases; my %parse_alias = ( # multiline formats can be supported in the future - mutt => sub { my $fh = shift; while (<$fh>) { - if (/^\s*alias\s+(\S+)\s+(.*)$/) { - my ($alias, $addr) = ($1, $2); - $addr =~ s/#.*$//; # mutt allows # comments - # commas delimit multiple addresses - $aliases{$alias} = [ split_addrs($addr) ]; - }}}, - mailrc => sub { my $fh = shift; while (<$fh>) { - if (/^alias\s+(\S+)\s+(.*)$/) { - # spaces delimit multiple addresses - $aliases{$1} = [ split(/\s+/, $2) ]; - }}}, - pine => sub { my $fh = shift; my $f='\t[^\t]*'; - for (my $x = ''; defined($x); $x = $_) { + mutt => sub { + + my $fh = shift; + + while (<$fh>) { + if (/^\s*alias\s+(\S+)\s+(.*)$/) { + my ($alias, $addr) = ($1, $2); + $addr =~ s/#.*$//; # mutt allows # comments + # commas delimit multiple addresses + $aliases{$alias} = [ split_addrs($addr) ]; + } + } + }, + + mailrc => sub { + + my $fh = shift; + + while (<$fh>) { + if (/^alias\s+(\S+)\s+(.*)$/) { + # spaces delimit multiple addresses + $aliases{$1} = [ split(/\s+/, $2) ]; + } + } + }, + + pine => sub { + + my $fh = shift; + my $f='\t[^\t]*'; + + for (my $x = ''; defined($x); $x = $_) { chomp $x; - $x .= $1 while(defined($_ = <$fh>) && /^ +(.*)$/); + $x .= $1 while(defined($_ = <$fh>) && /^ +(.*)$/); $x =~ /^(\S+)$f\t\(?([^\t]+?)\)?(:?$f){0,2}$/ or next; $aliases{$1} = [ split_addrs($2) ]; - }}, - gnus => sub { my $fh = shift; while (<$fh>) { - if (/\(define-mail-alias\s+"(\S+?)"\s+"(\S+?)"\)/) { - $aliases{$1} = [ $2 ]; - }}} + } + }, + + gnus => sub { + + my $fh = shift; + + while (<$fh>) { + if (/\(define-mail-alias\s+"(\S+?)"\s+"(\S+?)"\)/) { + $aliases{$1} = [ $2 ]; + } + } + } ); if (@alias_files and $aliasfiletype and defined $parse_alias{$aliasfiletype}) { @@ -574,10 +610,11 @@ EOT } elsif (/^\n$/) { $in_body = 1; if ($need_8bit_cte) { - print C2 "MIME-Version: 1.0\n", - "Content-Type: text/plain; ", - "charset=utf-8\n", - "Content-Transfer-Encoding: 8bit\n"; + print C2 + "MIME-Version: 1.0\n", + "Content-Type: text/plain; ", + "charset=utf-8\n", + "Content-Transfer-Encoding: 8bit\n"; } } elsif (/^MIME-Version:/i) { $need_8bit_cte = 0; @@ -586,8 +623,8 @@ EOT my $subject = $initial_subject; $_ = "Subject: " . ($subject =~ /[^[:ascii:]]/ ? - quote_rfc2047($subject) : - $subject) . + quote_rfc2047($subject) : + $subject) . "\n"; } elsif (/^In-Reply-To:\s*(.+)\s*$/i) { $initial_reply_to = $1; @@ -619,8 +656,10 @@ sub ask { my $resp; my $i = 0; return defined $default ? $default : undef - unless defined $term->IN and defined fileno($term->IN) and - defined $term->OUT and defined fileno($term->OUT); + unless defined $term->IN + and defined fileno($term->IN) + and defined $term->OUT + and defined fileno($term->OUT); while ($i++ < 10) { $resp = $term->readline($prompt); if (!defined $resp) { # EOF @@ -640,8 +679,12 @@ sub ask { my $prompting = 0; if (!defined $sender) { $sender = $repoauthor || $repocommitter || ''; - $sender = ask("Who should the emails appear to be from? [$sender] ", - default => $sender); + + $sender = ask( + "Who should the emails appear to be from? [$sender] ", + default => $sender + ); + print "Emails will be sent from: ", $sender, "\n"; $prompting++; } @@ -669,7 +712,8 @@ sub expand_aliases { if ($thread && !defined $initial_reply_to && $prompting) { $initial_reply_to = ask( - "Message-ID to be used as In-Reply-To for the first email? "); + "Message-ID to be used as In-Reply-To for the first email? " + ); } if (defined $initial_reply_to) { $initial_reply_to =~ s/^\s*<?//; @@ -809,18 +853,22 @@ sub sanitize_address sub send_message { my @recipients = unique_email_list(@to); - @cc = (grep { my $cc = extract_valid_address($_); - not grep { $cc eq $_ } @recipients - } - map { sanitize_address($_) } - @cc); + + @cc = (grep + { + my $cc = extract_valid_address($_); + not grep { $cc eq $_ } @recipients + } + map { sanitize_address($_) } @cc + ); + my $to = join (",\n\t", @recipients); @recipients = unique_email_list(@recipients,@cc,@bcclist); @recipients = (map { extract_valid_address($_) } @recipients); my $date = format_2822_time($time++); my $gitversion = '@@GIT_VERSION@@'; if ($gitversion =~ m/..GIT_VERSION../) { - $gitversion = Git::version(); + $gitversion = Git::version(); } my $cc = join(", ", unique_email_list(@cc)); @@ -869,9 +917,13 @@ X-Mailer: git-send-email $gitversion print " To retain the current behavior, but squelch this message,\n"; print " run 'git config --global sendemail.confirm auto'.\n\n"; } - $_ = ask("Send this email? ([y]es|[n]o|[q]uit|[a]ll): ", - valid_re => qr/^(?:yes|y|no|n|quit|q|all|a)/i, - default => $ask_default); + + $_ = ask( + "Send this email? ([y]es|[n]o|[q]uit|[a]ll): ", + valid_re => qr/^(?:yes|y|no|n|quit|q|all|a)/i, + default => $ask_default + ); + die "Send this email reply required" unless defined $_; if (/^n/i) { return 0; @@ -906,9 +958,13 @@ X-Mailer: git-send-email $gitversion } else { require Net::SMTP; - $smtp ||= Net::SMTP->new((defined $smtp_server_port) - ? "$smtp_server:$smtp_server_port" - : $smtp_server); + + $smtp ||= Net::SMTP->new( + (defined $smtp_server_port) + ? "$smtp_server:$smtp_server_port" + : $smtp_server + ); + if ($smtp_encryption eq 'tls') { require Net::SMTP::SSL; $smtp->command('STARTTLS'); @@ -1005,7 +1061,7 @@ foreach my $t (@files) { chomp($header[$#header]); s/^\s+/ /; $header[$#header] .= $_; - } else { + } else { push(@header, $_); } } @@ -1123,9 +1179,9 @@ foreach my $t (@files) { } else { push @xh, - 'MIME-Version: 1.0', - "Content-Type: text/plain; charset=$author_encoding", - 'Content-Transfer-Encoding: 8bit'; + 'MIME-Version: 1.0', + "Content-Type: text/plain; charset=$author_encoding", + 'Content-Transfer-Encoding: 8bit'; } } } @@ -1133,7 +1189,9 @@ foreach my $t (@files) { $needs_confirm = ( $confirm eq "always" or ($confirm =~ /^(?:auto|cc)$/ && @cc) or - ($confirm =~ /^(?:auto|compose)$/ && $compose && $message_num == 1)); + ($confirm =~ /^(?:auto|compose)$/ && $compose && $message_num == 1) + ); + $needs_confirm = "inform" if ($needs_confirm && $confirm_unconfigured && @cc); @cc = (@initial_cc, @cc); -- 1.6.2.2.479.g2aec ^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH RFC 08/10] send-email: Add --sleep for email throttling 2009-04-11 19:08 ` [PATCH RFC 07/10] send-email: Remove horrible mix of tabs and spaces Michael Witten @ 2009-04-11 19:08 ` Michael Witten 2009-04-11 19:08 ` [PATCH RFC 09/10] send-email: Minor cleanup of $smtp_server usage and send_message() Michael Witten ` (2 more replies) 2009-04-11 19:17 ` [PATCH RFC 07/10] send-email: Remove horrible mix of tabs and spaces Sverre Rabbelier 1 sibling, 3 replies; 23+ messages in thread From: Michael Witten @ 2009-04-11 19:08 UTC (permalink / raw) To: git The --sleep option provides a means for specifying that there should be a certain number of seconds of delay after sending a certain number of emails; see Documentation/git-send-email.txt Signed-off-by: Michael Witten <mfwitten@gmail.com> --- Documentation/git-send-email.txt | 30 +++++++++++++++ git-send-email.perl | 74 +++++++++++++++++++++++++++++++++++--- 2 files changed, 99 insertions(+), 5 deletions(-) diff --git a/Documentation/git-send-email.txt b/Documentation/git-send-email.txt index 12845d6..f0c2e7b 100644 --- a/Documentation/git-send-email.txt +++ b/Documentation/git-send-email.txt @@ -168,6 +168,36 @@ Automating entire patch series. Default is the value of the 'sendemail.chainreplyto' configuration value; if that is unspecified, default to --chain-reply-to. +--sleep=<seconds>[,<burst>]:: + This option specfies that send-email should sleep for <seconds> + after sending <burst> messages as quickly as possible; <seconds> + should be an integer >= 0 and <burst> should be an integer >= 1. + This mode of operation attacks 2 problems: email throttling and + arrival disorder. Default is the value of the 'sendemail.sleep' + configuration variable, or '0' if that does not exist. ++ +By default, send-email tries to send one patch per email as quickly as +possible. Unfortunately, some email services restrict a user by refusing +to send more than some maximum number of email messages, M, in a given +period of seconds, S. This can be troublesome if the patch series has +more than M patches, because the server will ultimately refuse to send +some of them. In this case, simply pass '--sleep=S,M' or '--sleep S,M' +or set sendemail.sleep to 'S,M'. ++ +Moreover, the emails often arrive at the final destination out of order; +though send-email manipulates the date fields and usually chains subsequent +emails via the In-Reply-To headers, some mail viewers nevertheless insist +on presenting them by order of arrival. This may be mitigated by using +something like '--sleep 60' (the equivalent of '--sleep 60,1'), so that +there is a 60 second delay between sending each patch. ++ +*Note*: Because of varying routes and batching schemes, there is no delay +that can guarantee the correct arrival order. Obviously, one solution is to +choose an obscenely large number, so be prepared to run send-email in the +background. Of course, spreading emails across time makes it more likely +that unrelated email messages arrive between patches. Therefore, send-email +warns you if both --sleep and --no-chain-reply-to are used. + --identity=<id>:: A configuration identity. When given, causes values in the 'sendemail.<id>' subsection to take precedence over diff --git a/git-send-email.perl b/git-send-email.perl index 4f0462f..c26a1b5 100755 --- a/git-send-email.perl +++ b/git-send-email.perl @@ -77,6 +77,7 @@ git send-email [options] <file | directory | rev-list options > --smtp-ssl * Deprecated. Use '--smtp-encryption ssl'. Automating: + --sleep <secs>[,<burst>] * Delay <secs> every <burst> email(s). --identity <id> * Use the sendemail.<id> options. --cc-cmd <command> * Email Cc: via `<command> \$patch_path` --suppress-cc <category> * author, self, sob, cc, cccmd, body, @@ -194,7 +195,7 @@ sub do_edit { } # Variables with corresponding config settings -my ($thread, $chain_reply_to, $suppress_from, $signed_off_by_cc, $cc_cmd); +my ($sleep, $thread, $chain_reply_to, $suppress_from, $signed_off_by_cc, $cc_cmd); my ($smtp_server, $smtp_server_port, $smtp_authuser, $smtp_encryption); my ($identity, $aliasfiletype, @alias_files, @smtp_host_parts); my ($validate, $confirm); @@ -210,6 +211,7 @@ my %config_bool_settings = ( ); my %config_settings = ( + "sleep" => \$sleep, "smtpserver" => \$smtp_server, "smtpserverport" => \$smtp_server_port, "smtpuser" => \$smtp_authuser, @@ -262,6 +264,7 @@ my $rc = GetOptions( "cc=s" => \@initial_cc, "bcc=s" => \@bcclist, "chain-reply-to!" => \$chain_reply_to, + "sleep=s" => \$sleep, "smtp-server=s" => \$smtp_server, "smtp-server-port=i" => \$smtp_server_port, "smtp-user=s" => \$smtp_authuser, @@ -334,6 +337,43 @@ foreach my $setting (values %config_bool_settings) { ${$setting->[0]} = $setting->[1] unless (defined (${$setting->[0]})); } +#### Parse input + +my ($sleep_seconds, $sleep_burst); + +if (defined $sleep) {{ + + unless ($chain_reply_to) { + + print "Both --sleep and --no-chain-reply-to are in effect.\n"; + print "Therefore, it is much more likely that unrelated\n"; + print "email messages will appear between any 2 of your\n"; + print "patches.\n\n"; + + $_ = ask( + "How to proceed? ([q]uit | --[s]leep | --no-[c]hain | [n]either | [b]oth): ", + valid_re => qr/^(?:b|s|c|n|q)/i, + default => 'b' + ); + + /^b/ or + /^s/ and $chain_reply_to = 1 or + /^c/ and $sleep = undef, last or + /^n/ and $chain_reply_to = 1, $sleep = undef, last or + /^q/ and exit; + } + + $sleep =~ /^(\d+)(?:,(\d+))?$/ + or print "Should be '--sleep=<seconds>[,<burst>]', but got '--sleep=\"$sleep\"'\n" + and exit; + + # Explicitly convert to integers to avoid repeated conversion: + # (<burst> = 0 is not defined, but let's be nice and absorb it) + + $sleep_seconds = 0+$1; + $sleep_burst = $2 ? 0+$2 : 1; +}} + # 'default' encryption is none -- this only prevents a warning $smtp_encryption = '' unless (defined $smtp_encryption); @@ -1041,8 +1081,12 @@ $references = $initial_reply_to || ''; $subject = $initial_subject; $message_num = 0; -foreach my $t (@files) { - open(F,"<",$t) or die "can't open file $t"; +my $burst_count = $sleep_burst; +my $time_of_last_message; + +for (my $index = 0; $index < @files; $index++) { + my $file = $files[$index]; + open(F,"<",$file) or die "can't open file $file"; my $author = undef; my $author_encoding; @@ -1151,7 +1195,7 @@ foreach my $t (@files) { close F; if (defined $cc_cmd && !$suppress_cc{'cccmd'}) { - open(F, "$cc_cmd $t |") + open(F, "$cc_cmd $file |") or die "(cc-cmd) Could not execute '$cc_cmd'"; while(<F>) { my $c = $_; @@ -1198,7 +1242,27 @@ foreach my $t (@files) { my $message_was_sent = send_message(); - # set up for the next message + # Throttle the outgoing rate: + + if ($sleep_seconds && $message_was_sent) { + + $time_of_last_message = time; + + unless (--$burst_count) { # unless we can send more + + $burst_count = $sleep_burst; + + my $already_elapsed = time - $time_of_last_message; + + if ($already_elapsed < $sleep_seconds && $index < $#files) { + my $this_long = $sleep_seconds - $already_elapsed; + while (($this_long -= sleep $this_long) > 0) {} + } + } + } + + # set up for the next message: + if ($message_was_sent and $chain_reply_to || not defined $reply_to || length($reply_to) == 0) { $reply_to = $message_id; if (length $references > 0) { -- 1.6.2.2.479.g2aec ^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH RFC 09/10] send-email: Minor cleanup of $smtp_server usage and send_message() 2009-04-11 19:08 ` [PATCH RFC 08/10] send-email: Add --sleep for email throttling Michael Witten @ 2009-04-11 19:08 ` Michael Witten 2009-04-11 19:08 ` [PATCH RFC 10/10] send-email: --compose takes optional argument to existing file Michael Witten 2009-04-11 21:58 ` [PATCH RFC 09/10] send-email: Minor cleanup of $smtp_server usage and send_message() Stephen Boyd 2009-04-12 2:27 ` [PATCH RFC 08/10] send-email: Add --sleep for email throttling Jay Soffian 2009-04-12 2:59 ` Michael Witten 2 siblings, 2 replies; 23+ messages in thread From: Michael Witten @ 2009-04-11 19:08 UTC (permalink / raw) To: git Note that the output has been changed; the server return code now appears after the `(Sendmail|Server):' line, rather than after the headers. Signed-off-by: Michael Witten <mfwitten@gmail.com> --- Documentation/git-send-email.txt | 3 +- git-send-email.perl | 39 +++++++++++++++++++++++-------------- 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/Documentation/git-send-email.txt b/Documentation/git-send-email.txt index f0c2e7b..07c831e 100644 --- a/Documentation/git-send-email.txt +++ b/Documentation/git-send-email.txt @@ -135,7 +135,8 @@ user is prompted for a password while the input is masked for privacy. be specified by the 'sendemail.smtpserver' configuration option; the built-in default is `/usr/sbin/sendmail` or `/usr/lib/sendmail` if such program is available, or - `localhost` otherwise. + `127.0.0.1` otherwise. Also, if <host> is the empty string, + then a built-in default is used. --smtp-server-port=<port>:: Specifies a port different from the default port (SMTP diff --git a/git-send-email.perl b/git-send-email.perl index c26a1b5..e771720 100755 --- a/git-send-email.perl +++ b/git-send-email.perl @@ -196,7 +196,8 @@ sub do_edit { # Variables with corresponding config settings my ($sleep, $thread, $chain_reply_to, $suppress_from, $signed_off_by_cc, $cc_cmd); -my ($smtp_server, $smtp_server_port, $smtp_authuser, $smtp_encryption); +my ($smtp_server, $smtp_server_is_a_command); +my ($smtp_server_port, $smtp_authuser, $smtp_encryption); my ($identity, $aliasfiletype, @alias_files, @smtp_host_parts); my ($validate, $confirm); my (@suppress_cc); @@ -761,14 +762,18 @@ if (defined $initial_reply_to) { $initial_reply_to = "<$initial_reply_to>" if $initial_reply_to ne ''; } -if (!defined $smtp_server) { +if (defined $smtp_server and $smtp_server ne '') { + $smtp_server_is_a_command = ($smtp_server =~ m{^/}); +} else { foreach (qw( /usr/sbin/sendmail /usr/lib/sendmail )) { if (-x $_) { $smtp_server = $_; + $smtp_server_is_a_command = 1; last; } } - $smtp_server ||= 'localhost'; # could be 127.0.0.1, too... *shrug* + $smtp_server_is_a_command = 0; + $smtp_server ||= '127.0.0.1'; } if ($compose && $compose > 0) { @@ -977,7 +982,7 @@ X-Mailer: git-send-email $gitversion if ($dry_run) { # We don't want to send the email. - } elsif ($smtp_server =~ m#^/#) { + } elsif ($smtp_server_is_a_command) { my $pid = open my $sm, '|-'; defined $pid or die $!; if (!$pid) { @@ -1053,24 +1058,28 @@ X-Mailer: git-send-email $gitversion $smtp->dataend() or die $smtp->message; $smtp->code =~ /250|200/ or die "Failed to send $subject\n".$smtp->message; } + + print 'Dry-' if $dry_run; + if ($quiet) { - printf (($dry_run ? "Dry-" : "")."Sent %s\n", $subject); + print "Sent $subject\n"; } else { - print (($dry_run ? "Dry-" : "")."OK. Log says:\n"); - if ($smtp_server !~ m#^/#) { + print "OK. Log says:\n"; + + if ($smtp_server_is_a_command) { + print "Sendmail: $smtp_server ".join(' ',@sendmail_parameters)."\n"; + print "Result: OK\n"; + } else { print "Server: $smtp_server\n"; + + $dry_run and print "Result: OK\n" or + print "Result: ", $smtp->code, ' ', ($smtp->message =~ /\n([^\n]+\n)$/s), "\n"; + print "MAIL FROM:<$raw_from>\n"; print "RCPT TO:".join(',',(map { "<$_>" } @recipients))."\n"; - } else { - print "Sendmail: $smtp_server ".join(' ',@sendmail_parameters)."\n"; } + print $header, "\n"; - if ($smtp) { - print "Result: ", $smtp->code, ' ', - ($smtp->message =~ /\n([^\n]+\n)$/s), "\n"; - } else { - print "Result: OK\n"; - } } return 1; -- 1.6.2.2.479.g2aec ^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH RFC 10/10] send-email: --compose takes optional argument to existing file 2009-04-11 19:08 ` [PATCH RFC 09/10] send-email: Minor cleanup of $smtp_server usage and send_message() Michael Witten @ 2009-04-11 19:08 ` Michael Witten 2009-04-11 19:25 ` Sverre Rabbelier 2009-04-11 21:58 ` [PATCH RFC 09/10] send-email: Minor cleanup of $smtp_server usage and send_message() Stephen Boyd 1 sibling, 1 reply; 23+ messages in thread From: Michael Witten @ 2009-04-11 19:08 UTC (permalink / raw) To: git Now, a user may specify an existing (in-progress) file to use as the introductory/summary email. The file is opened for any additional editing as usual, but it is not deleted upon normal termination. There are also a number of fixes to how the internals and temporaries are handled. Signed-off-by: Michael Witten <mfwitten@gmail.com> --- Documentation/git-send-email.txt | 39 ++++++-- git-send-email.perl | 190 ++++++++++++++++++++++++-------------- 2 files changed, 151 insertions(+), 78 deletions(-) diff --git a/Documentation/git-send-email.txt b/Documentation/git-send-email.txt index 07c831e..a2af3e5 100644 --- a/Documentation/git-send-email.txt +++ b/Documentation/git-send-email.txt @@ -60,17 +60,38 @@ The --bcc option must be repeated for each user you want on the bcc list. + The --cc option must be repeated for each user you want on the cc list. ---compose:: - Use $GIT_EDITOR, core.editor, $VISUAL, or $EDITOR to edit an - introductory message for the patch series. +--compose[=<path>]:: + Use `$GIT_EDITOR`, 'core.editor', `$VISUAL`, or `$EDITOR`, or + `vi` to edit an introductory message for the patch series. A + path for the intermediate composition may be given. If the path + doesn't exist, a file with default contents is created at the + path and opened for editing. If the path does exist, then the + file at that path is opened for editing as-is. If no path is + specified, a new temporary file is created with some default + contents. Upon the successful completion of send-email, all + temporary files are automatically unlinked (deleted). However, + if send-email is terminated by a trappable signal, then this + temporary file is not unlinked, and the user is informed of its + path. + -When '--compose' is used, git send-email will use the From, Subject, and -In-Reply-To headers specified in the message. If the body of the message -(what you type after the headers and a blank line) only contains blank -(or GIT: prefixed) lines the summary won't be sent, but From, Subject, -and In-Reply-To headers will be used unless they are removed. +The user actually composes what will become a valid email message; +therefore, the message must have the following form (as described in +`RFC 822`): + -Missing From or In-Reply-To headers will be prompted for. + <headers> + <blank line> + <body> ++ +In particular, `<headers>` must contain the "`Subject`" header. Once the +user saves the message and quits the editor, this intermediate message is +transformed into the final email message by removing all lines that begin +with "`GIT:`". If the `<body>` of the final version is empty, then the +email is not sent, and send-email proceeds as if '--compose' had never been +used. ++ +The "`From`", "`Subject`", and "`In-Reply-To`" headers are taken directly +from the message; missing "`From`" or "`In-Reply-To`" headers will be +prompted for. --from=<address>:: Specify the sender of the emails. This will default to diff --git a/git-send-email.perl b/git-send-email.perl index e771720..877732f 100755 --- a/git-send-email.perl +++ b/git-send-email.perl @@ -63,10 +63,9 @@ git send-email [options] <file | directory | rev-list options > --bcc <address> * Email Bcc: --subject <string> * Email "Subject:" --in-reply-to <message-id> * Email "In-Reply-To:"; include '<' and '>'. + --compose [<path>] * Open an editor for introduction. --annotate * Review each patch that will be sent in an editor. - --compose * Open an editor for introduction. - Sending: --envelope-sender <address> * Email envelope sender. --smtp-server <host> * Outgoing SMTP server to use. @@ -173,7 +172,7 @@ if ($@) { # Behavior modification variables my ($quiet, $dry_run) = (0, 0); my $format_patch; -my $compose_filename; +my ($compose_filename, $compose_final_filename); # Handle interactive edition of files. my $multiedit; @@ -239,16 +238,15 @@ sub signal_handler { system "stty echo"; # tmp files from --compose - if (defined $compose_filename) { - if (-e $compose_filename) { - print "'$compose_filename' contains an intermediate version of the email you were composing.\n"; - } - if (-e ($compose_filename . ".final")) { - print "'$compose_filename.final' contains the composed email.\n" - } + if (defined $compose_filename and -f $compose_filename) { + print "'$compose_filename' contains an intermediate version of the email you were composing.\n"; + } + + if (defined $compose_final_filename) { + unlink $compose_final_filename if defined $compose_final_filename; } - exit; + exit 1; }; $SIG{TERM} = \&signal_handler; @@ -273,8 +271,8 @@ my $rc = GetOptions( "smtp-ssl" => sub { $smtp_encryption = 'ssl' }, "smtp-encryption=s" => \$smtp_encryption, "identity=s" => \$identity, + "compose:s" => \$compose, "annotate" => \$annotate, - "compose" => \$compose, "quiet" => \$quiet, "cc-cmd=s" => \$cc_cmd, "suppress-from!" => \$suppress_from, @@ -596,36 +594,69 @@ sub get_patch_subject($) { die "'Subject:' line expected in '$patch'"; } -if ($compose) { - # Note that this does not need to be secure, but we will make a small - # effort to have it be unique - $compose_filename = ($repo ? - tempfile(".gitsendemail.msg.XXXXXX", DIR => $repo->repo_path()) : - tempfile(".gitsendemail.msg.XXXXXX", DIR => "."))[1]; - open(C,">",$compose_filename) - or die "Failed to open for writing $compose_filename: $!"; - - - my $tpl_sender = $sender || $repoauthor || $repocommitter || ''; - my $tpl_subject = $initial_subject || ''; - my $tpl_reply_to = $initial_reply_to || ''; - - print C <<EOT; -From $tpl_sender # This line is ignored. -GIT: Lines beginning in "GIT:" will be removed. -GIT: Consider including an overall diffstat or table of contents -GIT: for the patch you are writing. -GIT: -GIT: Clear the body content if you don't wish to send a summary. -From: $tpl_sender -Subject: $tpl_subject -In-Reply-To: $tpl_reply_to +if (defined $compose) {{ -EOT - for my $f (@files) { - print C "GIT: ", get_patch_subject($f), "\n"; + # Some parameters for creating temporary files: + + my $template = ".gitsendemail.msg.XXXXXX"; + my @dir = (DIR => ($repo ? $repo->repo_path() : ".")); + my @suffix = (SUFFIX => ".final"); + + # Figure out the file that the user should be editing: + + my $compose_file; + my $needs_default_contents; + + if ($compose eq '') { # if no path was given + $needs_default_contents = 1; + ($compose_file, $compose_filename) = tempfile($template, @dir) + or die "--compose: Could not create temporary file for the user to edit: $!\n"; + } else { + $compose_filename = $compose; + $needs_default_contents = not -f $compose_filename; } - close(C); + + # Fill in default contents if necessary: + + if ($needs_default_contents) { + + open $compose_file, ">", $compose_filename; + + # For convenience: + + local *STDOUT = $compose_file; + + # Help the user out with some instruction and initial headers: + + my $from = $sender || $repoauthor || $repocommitter || ''; + my $subject = $initial_subject || ''; + my $reply_to = $initial_reply_to || ''; + + print "From $from # This line is ignored.\n"; + print "GIT:\n"; + print "GIT: Lines beginning in 'GIT:' will be removed.\n"; + print "GIT:\n"; + print "GIT: Consider including an overall diffstat\n"; + print "GIT: (git diff --stat) or table of contents\n"; + print "GIT: (as provide below).\n"; + print "GIT:\n"; + print "GIT: Clear the body content if you decide not\n"; + print "GIT: to send this message.\n"; + print "GIT:\n"; + print "GIT: Here are the <headers>:\n"; + print "From: $from\n"; + print "Subject: $subject\n"; + print "In-Reply-To: $reply_to\n"; + print "\n"; + print "GIT: This is the first line of the <body>:\n"; + print "\n"; + + for my $f (@files) { + print "GIT: ", get_patch_subject($f), "\n"; + } + } + + # Do the editing: my $editor = $ENV{GIT_EDITOR} || Git::config(@repo, "core.editor") || $ENV{VISUAL} || $ENV{EDITOR} || "vi"; @@ -635,23 +666,40 @@ EOT do_edit($compose_filename); } - open(C2,">",$compose_filename . ".final") - or die "Failed to open $compose_filename.final : " . $!; + # Now transform the user-edited introduction into something + # suitable for sending via email; the user's editor may have + # unlinked the original file and replaced it with an entirely + # new one. If this be the case, then it wouldn't do just to seek + # to the beginning and start reading, because then only the + # original content would be retrieved. Consequently, the file + # must be reopened to be safe (note, the original filehandle is + # closed automatically): + + unless (-f $compose_filename) { + print "--compose: File '$compose_filename' doesn't exist; not sending.\n"; + last; + } + + open $compose_file, "<", $compose_filename + or die "--compose: Failed to open '$compose_filename' for reading: $!"; - open(C,"<",$compose_filename) - or die "Failed to open $compose_filename : " . $!; + # Create the final version: + (my $compose_final_file, $compose_final_filename) = tempfile($template, @dir, @suffix) + or die "--compose: Could not create temporary file for final version: $!\n"; + + my ($subject, $reply_to, $from); my $need_8bit_cte = file_has_nonascii($compose_filename); my $in_body = 0; my $summary_empty = 1; - while(<C>) { + while(<$compose_file>) { next if m/^GIT:/; if ($in_body) { $summary_empty = 0 unless (/^\n$/); } elsif (/^\n$/) { $in_body = 1; if ($need_8bit_cte) { - print C2 + print $compose_final_file "MIME-Version: 1.0\n", "Content-Type: text/plain; ", "charset=utf-8\n", @@ -660,33 +708,31 @@ EOT } elsif (/^MIME-Version:/i) { $need_8bit_cte = 0; } elsif (/^Subject:\s*(.+)\s*$/i) { - $initial_subject = $1; - my $subject = $initial_subject; - $_ = "Subject: " . - ($subject =~ /[^[:ascii:]]/ ? - quote_rfc2047($subject) : - $subject) . - "\n"; + $subject = $1; + next; } elsif (/^In-Reply-To:\s*(.+)\s*$/i) { - $initial_reply_to = $1; + $reply_to = $1; next; } elsif (/^From:\s*(.+)\s*$/i) { - $sender = $1; + $from = $1; next; } elsif (/^(?:To|Cc|Bcc):/i) { print "To/Cc/Bcc fields are not interpreted yet, they have been ignored\n"; next; } - print C2 $_; - } - close(C); - close(C2); - if ($summary_empty) { - print "Summary email is empty, skipping it\n"; - $compose = -1; + print $compose_final_file $_; } -} elsif ($annotate) { + + print("Summary email is empty, skipping it.\n"), last if ($summary_empty); + + $initial_subject = $subject; + $initial_reply_to = $reply_to; + $sender = $from; + + unshift(@files, $compose_final_filename); + +}} elsif ($annotate) { do_edit(@files); } @@ -776,10 +822,6 @@ if (defined $smtp_server and $smtp_server ne '') { $smtp_server ||= '127.0.0.1'; } -if ($compose && $compose > 0) { - @files = ($compose_filename . ".final", @files); -} - # Variables we set as part of the loop over files our ($message_id, %mail, $subject, $reply_to, $references, $message, $needs_confirm, $message_num, $ask_default); @@ -924,9 +966,12 @@ sub send_message my $sanitized_sender = sanitize_address($sender); make_message_id() unless defined($message_id); + my $has_non_ascii = ($subject =~ /[^[:ascii:]]/); + my $sanitized_subject = $has_non_ascii ? quote_rfc2047($subject) : $subject; + my $header = "From: $sanitized_sender To: $to${ccline} -Subject: $subject +Subject: $sanitized_subject Date: $date Message-Id: $message_id X-Mailer: git-send-email $gitversion @@ -1286,7 +1331,14 @@ for (my $index = 0; $index < @files; $index++) { cleanup_compose_files(); sub cleanup_compose_files() { - unlink($compose_filename, $compose_filename . ".final") if $compose; + + if (defined $compose_final_filename) { + unlink $compose_final_filename; + } + + if (defined $compose_filename and not $compose) { + unlink $compose_filename; + } } $smtp->quit if $smtp; -- 1.6.2.2.479.g2aec ^ permalink raw reply related [flat|nested] 23+ messages in thread
* Re: [PATCH RFC 10/10] send-email: --compose takes optional argument to existing file 2009-04-11 19:08 ` [PATCH RFC 10/10] send-email: --compose takes optional argument to existing file Michael Witten @ 2009-04-11 19:25 ` Sverre Rabbelier 2009-04-11 19:38 ` Michael Witten 0 siblings, 1 reply; 23+ messages in thread From: Sverre Rabbelier @ 2009-04-11 19:25 UTC (permalink / raw) To: Michael Witten; +Cc: git Heya, On Sat, Apr 11, 2009 at 21:08, Michael Witten <mfwitten@gmail.com> wrote: > Now, a user may specify an existing (in-progress) file to use as > +with "`GIT:`". If the `<body>` of the final version is empty, then the > +email is not sent, and send-email proceeds as if '--compose' had never been > +used. Ouch! Wouldn't it be better to abort instead? Allover git we abort on empty commit messages and the like, why not here? -- Cheers, Sverre Rabbelier ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH RFC 10/10] send-email: --compose takes optional argument to existing file 2009-04-11 19:25 ` Sverre Rabbelier @ 2009-04-11 19:38 ` Michael Witten 0 siblings, 0 replies; 23+ messages in thread From: Michael Witten @ 2009-04-11 19:38 UTC (permalink / raw) To: Sverre Rabbelier; +Cc: git On Sat, Apr 11, 2009 at 14:25, Sverre Rabbelier <srabbelier@gmail.com> wrote: > Ouch! Wouldn't it be better to abort instead? Allover git we abort on > empty commit messages and the like, why not here? I was just following the original behavior. I don't really mind either way. ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH RFC 09/10] send-email: Minor cleanup of $smtp_server usage and send_message() 2009-04-11 19:08 ` [PATCH RFC 09/10] send-email: Minor cleanup of $smtp_server usage and send_message() Michael Witten 2009-04-11 19:08 ` [PATCH RFC 10/10] send-email: --compose takes optional argument to existing file Michael Witten @ 2009-04-11 21:58 ` Stephen Boyd 2009-04-11 22:13 ` Michael Witten 1 sibling, 1 reply; 23+ messages in thread From: Stephen Boyd @ 2009-04-11 21:58 UTC (permalink / raw) To: git Michael Witten <mfwitten <at> gmail.com> writes: > > be specified by the 'sendemail.smtpserver' configuration > option; the built-in default is `/usr/sbin/sendmail` or > `/usr/lib/sendmail` if such program is available, or > - `localhost` otherwise. > + `127.0.0.1` otherwise. Also, if <host> is the empty string, > + then a built-in default is used. Does this help anyone? localhost at least doesn't change when/if ipv6 is used, whereas '127.0.0.1' is only for ipv4. ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH RFC 09/10] send-email: Minor cleanup of $smtp_server usage and send_message() 2009-04-11 21:58 ` [PATCH RFC 09/10] send-email: Minor cleanup of $smtp_server usage and send_message() Stephen Boyd @ 2009-04-11 22:13 ` Michael Witten 0 siblings, 0 replies; 23+ messages in thread From: Michael Witten @ 2009-04-11 22:13 UTC (permalink / raw) To: Stephen Boyd; +Cc: git On Sat, Apr 11, 2009 at 16:58, Stephen Boyd <bebarino@gmail.com> wrote: > Michael Witten <mfwitten <at> gmail.com> writes: > >> >> be specified by the 'sendemail.smtpserver' configuration >> option; the built-in default is `/usr/sbin/sendmail` or >> `/usr/lib/sendmail` if such program is available, or >> - `localhost` otherwise. >> + `127.0.0.1` otherwise. Also, if <host> is the empty string, >> + then a built-in default is used. > > Does this help anyone? localhost at least doesn't change when/if ipv6 is used, > whereas '127.0.0.1' is only for ipv4. Ah. Good point. I'll get rid of that change. ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH RFC 08/10] send-email: Add --sleep for email throttling 2009-04-11 19:08 ` [PATCH RFC 08/10] send-email: Add --sleep for email throttling Michael Witten 2009-04-11 19:08 ` [PATCH RFC 09/10] send-email: Minor cleanup of $smtp_server usage and send_message() Michael Witten @ 2009-04-12 2:27 ` Jay Soffian 2009-04-12 2:59 ` Michael Witten 2 siblings, 0 replies; 23+ messages in thread From: Jay Soffian @ 2009-04-12 2:27 UTC (permalink / raw) To: Michael Witten; +Cc: git On Sat, Apr 11, 2009 at 3:08 PM, Michael Witten <mfwitten@gmail.com> wrote: > +if (defined $sleep) {{ > +}} What's the double-brackets about? j. ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH RFC 08/10] send-email: Add --sleep for email throttling 2009-04-11 19:08 ` [PATCH RFC 08/10] send-email: Add --sleep for email throttling Michael Witten 2009-04-11 19:08 ` [PATCH RFC 09/10] send-email: Minor cleanup of $smtp_server usage and send_message() Michael Witten 2009-04-12 2:27 ` [PATCH RFC 08/10] send-email: Add --sleep for email throttling Jay Soffian @ 2009-04-12 2:59 ` Michael Witten 2 siblings, 0 replies; 23+ messages in thread From: Michael Witten @ 2009-04-12 2:59 UTC (permalink / raw) To: Jay Soffian; +Cc: git On Sat, Apr 11, 2009 at 21:27, Jay Soffian <jaysoffian@gmail.com> wrote: > On Sat, Apr 11, 2009 at 3:08 PM, Michael Witten <mfwitten@gmail.com> wrote: >> +if (defined $sleep) {{ >> +}} > > What's the double-brackets about? The {} that form the true-body of the if statement don't actually denote a block. The extra layer of {} is explicitly creating a block. This is done, because in Perl, blocks can be thought of as loops that execute one iteration, so you can use all of the loop flow-control operators 'redo', 'last', and 'next'. In this case, I wanted to use 'last' to jump out of --sleep setup should the user decide to do so, because I think it's cleaner than a goto or variable check or superfluous loop: if (defined $sleep) {{ unless ($chain_reply_to) { ... /^b/ or /^s/ and $chain_reply_to = 1 or /^c/ and $sleep = undef, last or # forget --sleep was ever used /^n/ and $chain_reply_to = 1, $sleep = undef, last or # forget --sleep was ever used /^q/ and exit; } ... }} # last jumps to here Anyway, this particular behavior was requested (and seems reasonable): http://marc.info/?l=git&m=123929919621279&w=2 Sincerely, Michael Witten ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH RFC 07/10] send-email: Remove horrible mix of tabs and spaces 2009-04-11 19:08 ` [PATCH RFC 07/10] send-email: Remove horrible mix of tabs and spaces Michael Witten 2009-04-11 19:08 ` [PATCH RFC 08/10] send-email: Add --sleep for email throttling Michael Witten @ 2009-04-11 19:17 ` Sverre Rabbelier 2009-04-11 19:31 ` Michael Witten 2009-04-13 1:49 ` Miles Bader 1 sibling, 2 replies; 23+ messages in thread From: Sverre Rabbelier @ 2009-04-11 19:17 UTC (permalink / raw) To: Michael Witten; +Cc: git Heya, On Sat, Apr 11, 2009 at 21:08, Michael Witten <mfwitten@gmail.com> wrote: > +## WARNING! ACHTUNG! ATTENTION! ADVERTENCIA! > +## Currently, this file uses tabs (like the rest of git source) to > +## delineate code structure. Do NOT under any circumstances mix tabs > +## and spaces across lines that share a relationship in terms of layout. > +## In fact, it would currently be best to use only tabs, so please set > +## your editor(s) accordingly. This code is already trashy enough. Please > +## don't make it worse. Isn't this a bit overkill? In fact, isn't it overkill a lot? -- Cheers, Sverre Rabbelier ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH RFC 07/10] send-email: Remove horrible mix of tabs and spaces 2009-04-11 19:17 ` [PATCH RFC 07/10] send-email: Remove horrible mix of tabs and spaces Sverre Rabbelier @ 2009-04-11 19:31 ` Michael Witten 2009-04-13 1:49 ` Miles Bader 1 sibling, 0 replies; 23+ messages in thread From: Michael Witten @ 2009-04-11 19:31 UTC (permalink / raw) To: Sverre Rabbelier; +Cc: git On Sat, Apr 11, 2009 at 14:17, Sverre Rabbelier <srabbelier@gmail.com> wrote: > Isn't this a bit overkill? In fact, isn't it overkill a lot? ;-D In my experience... NO. ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH RFC 07/10] send-email: Remove horrible mix of tabs and spaces 2009-04-11 19:17 ` [PATCH RFC 07/10] send-email: Remove horrible mix of tabs and spaces Sverre Rabbelier 2009-04-11 19:31 ` Michael Witten @ 2009-04-13 1:49 ` Miles Bader 2009-04-13 2:15 ` Michael Witten 1 sibling, 1 reply; 23+ messages in thread From: Miles Bader @ 2009-04-13 1:49 UTC (permalink / raw) To: Sverre Rabbelier; +Cc: Michael Witten, git Sverre Rabbelier <srabbelier@gmail.com> writes: >> +## WARNING! ACHTUNG! ATTENTION! ADVERTENCIA! >> +## Currently, this file uses tabs (like the rest of git source) to >> +## delineate code structure. Do NOT under any circumstances mix tabs >> +## and spaces across lines that share a relationship in terms of layout. >> +## In fact, it would currently be best to use only tabs, so please set >> +## your editor(s) accordingly. This code is already trashy enough. Please >> +## don't make it worse. > > Isn't this a bit overkill? In fact, isn't it overkill a lot? "Bizarre" is the word I'd use... [There are places to whine about whitespace conventions, but that place isn't giant screaming comments in individual source files...] -miles -- Admiration, n. Our polite recognition of another's resemblance to ourselves. ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH RFC 07/10] send-email: Remove horrible mix of tabs and spaces 2009-04-13 1:49 ` Miles Bader @ 2009-04-13 2:15 ` Michael Witten 0 siblings, 0 replies; 23+ messages in thread From: Michael Witten @ 2009-04-13 2:15 UTC (permalink / raw) To: Miles Bader; +Cc: git On Sun, Apr 12, 2009 at 20:49, Miles Bader <miles@gnu.org> wrote: > Sverre Rabbelier <srabbelier@gmail.com> writes: >>> +## WARNING! ACHTUNG! ATTENTION! ADVERTENCIA! >>> +## Currently, this file uses tabs (like the rest of git source) to >>> +## delineate code structure. Do NOT under any circumstances mix tabs >>> +## and spaces across lines that share a relationship in terms of layout. >>> +## In fact, it would currently be best to use only tabs, so please set >>> +## your editor(s) accordingly. This code is already trashy enough. Please >>> +## don't make it worse. >> >> Isn't this a bit overkill? In fact, isn't it overkill a lot? > > "Bizarre" is the word I'd use... Whatever you say, Master Bader. ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH RFC 06/10] send-email: References: should only reference what is actually sent 2009-04-11 19:08 ` [PATCH RFC 06/10] send-email: References: should only reference what is actually sent Michael Witten 2009-04-11 19:08 ` [PATCH RFC 07/10] send-email: Remove horrible mix of tabs and spaces Michael Witten @ 2009-04-11 21:52 ` Stephen Boyd 2009-04-11 22:42 ` Michael Witten 1 sibling, 1 reply; 23+ messages in thread From: Stephen Boyd @ 2009-04-11 21:52 UTC (permalink / raw) To: git Michael Witten <mfwitten <at> gmail.com> writes: > > +# returns 1 of the message was sent, 0 otherwise. s/of/if/ ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH RFC 06/10] send-email: References: should only reference what is actually sent 2009-04-11 21:52 ` [PATCH RFC 06/10] send-email: References: should only reference what is actually sent Stephen Boyd @ 2009-04-11 22:42 ` Michael Witten 0 siblings, 0 replies; 23+ messages in thread From: Michael Witten @ 2009-04-11 22:42 UTC (permalink / raw) To: Stephen Boyd; +Cc: git On Sat, Apr 11, 2009 at 16:52, Stephen Boyd <bebarino@gmail.com> wrote: > Michael Witten <mfwitten <at> gmail.com> writes: > >> >> +# returns 1 of the message was sent, 0 otherwise. > > s/of/if/ Woops! Thanks! ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH RFC 02/10] Docs: send-email: Remove superfluous information in CONFIGURATION 2009-04-11 19:08 ` [PATCH RFC 02/10] Docs: send-email: Remove superfluous information in CONFIGURATION Michael Witten 2009-04-11 19:08 ` [PATCH RFC 03/10] send-email: Cleanup the usage text and docs a bit Michael Witten @ 2009-04-11 21:42 ` Stephen Boyd 1 sibling, 0 replies; 23+ messages in thread From: Stephen Boyd @ 2009-04-11 21:42 UTC (permalink / raw) To: git Michael Witten <mfwitten <at> gmail.com> writes: > > There is now a comment block warning trespassers. This patch and the previous have these comment block warnings which look ugly to me. Maybe we should make a DocumentationGuidelines, in the same spirit as CodingGuidelines where we can place these policies. Also, the alphabetical ordering of patch 1 is nice, but if we want to do this we should probably change every git-<command>.txt to be consistent. ^ permalink raw reply [flat|nested] 23+ messages in thread
end of thread, other threads:[~2009-04-13 2:17 UTC | newest] Thread overview: 23+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2009-04-11 19:08 [PATCH RFC 01/10] Docs: send-email: Put options back into alphabetical order Michael Witten 2009-04-11 19:08 ` [PATCH RFC 02/10] Docs: send-email: Remove superfluous information in CONFIGURATION Michael Witten 2009-04-11 19:08 ` [PATCH RFC 03/10] send-email: Cleanup the usage text and docs a bit Michael Witten 2009-04-11 19:08 ` [PATCH RFC 04/10] send-email: --smtp-server-port should take an integer Michael Witten 2009-04-11 19:08 ` [PATCH RFC 05/10] send-email: Handle "GIT:" rather than "GIT: " during --compose Michael Witten 2009-04-11 19:08 ` [PATCH RFC 06/10] send-email: References: should only reference what is actually sent Michael Witten 2009-04-11 19:08 ` [PATCH RFC 07/10] send-email: Remove horrible mix of tabs and spaces Michael Witten 2009-04-11 19:08 ` [PATCH RFC 08/10] send-email: Add --sleep for email throttling Michael Witten 2009-04-11 19:08 ` [PATCH RFC 09/10] send-email: Minor cleanup of $smtp_server usage and send_message() Michael Witten 2009-04-11 19:08 ` [PATCH RFC 10/10] send-email: --compose takes optional argument to existing file Michael Witten 2009-04-11 19:25 ` Sverre Rabbelier 2009-04-11 19:38 ` Michael Witten 2009-04-11 21:58 ` [PATCH RFC 09/10] send-email: Minor cleanup of $smtp_server usage and send_message() Stephen Boyd 2009-04-11 22:13 ` Michael Witten 2009-04-12 2:27 ` [PATCH RFC 08/10] send-email: Add --sleep for email throttling Jay Soffian 2009-04-12 2:59 ` Michael Witten 2009-04-11 19:17 ` [PATCH RFC 07/10] send-email: Remove horrible mix of tabs and spaces Sverre Rabbelier 2009-04-11 19:31 ` Michael Witten 2009-04-13 1:49 ` Miles Bader 2009-04-13 2:15 ` Michael Witten 2009-04-11 21:52 ` [PATCH RFC 06/10] send-email: References: should only reference what is actually sent Stephen Boyd 2009-04-11 22:42 ` Michael Witten 2009-04-11 21:42 ` [PATCH RFC 02/10] Docs: send-email: Remove superfluous information in CONFIGURATION Stephen Boyd
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).