* [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 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 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 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 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 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
* 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 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 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 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: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
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 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.