{"thread":{"id":"18852","subject":"[PATCH RFC3 INTRO] I hope this will do it!","startedAt":"2009-04-13T18:23:44Z","lastAt":"2009-04-14T18:50:43Z","messageCount":39,"participants":["Michael Witten","Junio C Hamano","Stephen Boyd","Andreas Ericsson","Björn Steinbrink"],"isPatch":true,"patchVersion":1,"patchTotal":null},"messages":[{"id":"111210","messageId":"1239647037-15381-1-git-send-email-mfwitten@gmail.com","threadId":"18852","inReplyTo":null,"subject":"[PATCH RFC3 INTRO] I hope this will do it!","fromName":"Michael Witten","fromEmail":"mfwitten@gmail.com","sentAt":"2009-04-13T18:23:44Z","receivedAt":"2009-04-13T18:23:44Z","isPatch":true,"sender":{"key":"mfwitten@gmail.com","avatar":"https://avatars.githubusercontent.com/u/597101?v=4"},"body":"Here is the list of notable improvements:\n\n  send-email: --compose takes optional argument to existing file\n    * Update docs about what editor is chosen.\n    * Better variable name for --compose paths and filehandles.\n    * Abort on empty summary.\n    * Note (in commit message) that editing the final version no longer is used.\n\n  send-email: Minor cleanup of $smtp_server usage and send_message()\n    * Back to localhost.\n    * Add note about empty string if it's not already there.\n\n  send-email: Add --sleep for email throttling\n    * Put docs in alphabetical order.\n\n  send-email: Remove horrible mix of tabs and spaces\n    * Less verbose whitespace comment.\n\n  send-email: References: should only reference what is actually sent\n    * s/of/if/ (comment above send_message()).\n\n  send-email: Handle \"GIT:\" rather than \"GIT: \" during --compose\n    * Undo refactoring of get_patch_subject().\n\n  send-email: --smtp-server-port should take an integer\n    * Update documents to suggest that symbolic ports can be used.\n    * Put this commit with the docs.\n\n  send-email: Cleanup the usage text and docs a bit\n    * Add note about symbolic ports\n\n  Docs: send-email: Remove superfluous information in CONFIGURATION\n    * Remove comment block?\n\n  Docs: send-email: Put options back into alphabetical order\n    * Remove comment block?\n\nThe overall diffstat:\n\n  Documentation/git-send-email.txt |  129 ++++++---\n  git-send-email.perl              |  641 +++++++++++++++++++++++++-------------\n  2 files changed, 511 insertions(+), 259 deletions(-)\n\nThe overall patch series:\n\n    [PATCH RFC3 01/13] Docs: send-email: Put options back into alphabetical order\nnew [PATCH RFC3 02/13] Docs: send-email: Refer to CONFIGURATION section for sendemail.multiedit\n    [PATCH RFC3 03/13] Docs: send-email: Remove superfluous information in CONFIGURATION\n    [PATCH RFC3 04/13] Docs: send-email: --smtp-server-port can take symbolic ports\n    [PATCH RFC3 05/13] send-email: Cleanup the usage text and docs a bit\n    [PATCH RFC3 06/13] send-email: Handle \"GIT:\" rather than \"GIT: \" during --compose\n    [PATCH RFC3 07/13] send-email: 'References:' should only reference what is sent\nnew [PATCH RFC3 08/13] send-email: Remove superfluous `my $editor = ...'\n    [PATCH RFC3 09/13] send-email: Remove horrible mix of tabs and spaces\n    [PATCH RFC3 10/13] send-email: Add --sleep for email throttling\n    [PATCH RFC3 11/13] send-email: Minor cleanup of $smtp_server usage and send_message()\n    [PATCH RFC3 12/13] send-email: --compose takes optional argument to existing file\nnew [PATCH RFC3 13/13] send-email: --compose always includes a 'GIT: ' prefixed list of patch subjects\n\nSincerely,\nMichael Witten\n"},{"id":"111211","messageId":"1239647037-15381-2-git-send-email-mfwitten@gmail.com","threadId":"18852","inReplyTo":"1239647037-15381-1-git-send-email-mfwitten@gmail.com","subject":"[PATCH RFC3 01/13] Docs: send-email: Put options back into alphabetical order","fromName":"Michael Witten","fromEmail":"mfwitten@gmail.com","sentAt":"2009-04-13T18:23:45Z","receivedAt":"2009-04-13T18:23:45Z","isPatch":true,"sender":{"key":"mfwitten@gmail.com","avatar":"https://avatars.githubusercontent.com/u/597101?v=4"},"body":"Signed-off-by: Michael Witten <mfwitten@gmail.com>\n---\n Documentation/git-send-email.txt |   22 +++++++++++-----------\n 1 files changed, 11 insertions(+), 11 deletions(-)\n\ndiff --git a/Documentation/git-send-email.txt b/Documentation/git-send-email.txt\nindex 0b1f183..4db5a09 100644\n--- a/Documentation/git-send-email.txt\n+++ b/Documentation/git-send-email.txt\n@@ -39,6 +39,11 @@ OPTIONS\n Composing\n ~~~~~~~~~\n \n+--annotate::\n+\tReview each patch you're about to send in an editor. The setting\n+\t'sendemail.multiedit' defines if this will spawn one editor per patch\n+\tor one for all of them at once.\n+\n --bcc=<address>::\n \tSpecify a \"Bcc:\" value for each email. Default is the value of\n \t'sendemail.bcc'.\n@@ -51,11 +56,6 @@ The --bcc option must be repeated for each user you want on the bcc list.\n +\n The --cc option must be repeated for each user you want on the cc list.\n \n---annotate::\n-\tReview each patch you're about to send in an editor. The setting\n-\t'sendemail.multiedit' defines if this will spawn one editor per patch\n-\tor one for all of them at once.\n-\n --compose::\n \tUse $GIT_EDITOR, core.editor, $VISUAL, or $EDITOR to edit an\n \tintroductory message for the patch series.\n@@ -230,6 +230,12 @@ have been specified, in which case default to 'compose'.\n --dry-run::\n \tDo everything except actually send the emails.\n \n+--[no-]format-patch::\n+\tWhen an argument may be understood either as a reference or as a file name,\n+\tchoose to understand it as a format-patch argument ('--format-patch')\n+\tor as a file name ('--no-format-patch'). By default, when such a conflict\n+\toccurs, git send-email will fail.\n+\n --quiet::\n \tMake git-send-email less verbose.  One line per email should be\n \tall that is output.\n@@ -246,12 +252,6 @@ have been specified, in which case default to 'compose'.\n Default is the value of 'sendemail.validate'; if this is not set,\n default to '--validate'.\n \n---[no-]format-patch::\n-\tWhen an argument may be understood either as a reference or as a file name,\n-\tchoose to understand it as a format-patch argument ('--format-patch')\n-\tor as a file name ('--no-format-patch'). By default, when such a conflict\n-\toccurs, git send-email will fail.\n-\n \n CONFIGURATION\n -------------\n-- \n1.6.2.2.479.g2aec\n"},{"id":"111212","messageId":"1239647037-15381-3-git-send-email-mfwitten@gmail.com","threadId":"18852","inReplyTo":"1239647037-15381-2-git-send-email-mfwitten@gmail.com","subject":"[PATCH RFC3 02/13] Docs: send-email: Refer to CONFIGURATION section for sendemail.multiedit","fromName":"Michael Witten","fromEmail":"mfwitten@gmail.com","sentAt":"2009-04-13T18:23:46Z","receivedAt":"2009-04-13T18:23:46Z","isPatch":true,"sender":{"key":"mfwitten@gmail.com","avatar":"https://avatars.githubusercontent.com/u/597101?v=4"},"body":"Replace description of sendemail.multiedit in --annotate docs\nwith a reference to the CONFIGURATION section.\n\nAdd such a reference to the --compose documentation.\n\nSigned-off-by: Michael Witten <mfwitten@gmail.com>\n---\n Documentation/git-send-email.txt |    7 ++++---\n 1 files changed, 4 insertions(+), 3 deletions(-)\n\ndiff --git a/Documentation/git-send-email.txt b/Documentation/git-send-email.txt\nindex 4db5a09..7b87d6e 100644\n--- a/Documentation/git-send-email.txt\n+++ b/Documentation/git-send-email.txt\n@@ -40,9 +40,8 @@ Composing\n ~~~~~~~~~\n \n --annotate::\n-\tReview each patch you're about to send in an editor. The setting\n-\t'sendemail.multiedit' defines if this will spawn one editor per patch\n-\tor one for all of them at once.\n+\tReview and edit each patch you're about to send. See the\n+\tCONFIGURATION section for 'sendemail.multiedit'.\n \n --bcc=<address>::\n \tSpecify a \"Bcc:\" value for each email. Default is the value of\n@@ -67,6 +66,8 @@ In-Reply-To headers specified in the message. If the body of the message\n and In-Reply-To headers will be used unless they are removed.\n +\n Missing From or In-Reply-To headers will be prompted for.\n++\n+See the CONFIGURATION section for 'sendemail.multiedit'.\n \n --from=<address>::\n \tSpecify the sender of the emails.  This will default to\n-- \n1.6.2.2.479.g2aec\n"},{"id":"111213","messageId":"1239647037-15381-4-git-send-email-mfwitten@gmail.com","threadId":"18852","inReplyTo":"1239647037-15381-3-git-send-email-mfwitten@gmail.com","subject":"[PATCH RFC3 03/13] Docs: send-email: Remove superfluous information in CONFIGURATION","fromName":"Michael Witten","fromEmail":"mfwitten@gmail.com","sentAt":"2009-04-13T18:23:47Z","receivedAt":"2009-04-13T18:23:47Z","isPatch":true,"sender":{"key":"mfwitten@gmail.com","avatar":"https://avatars.githubusercontent.com/u/597101?v=4"},"body":"In particular, sendemail.confirm was removed, because it's already\ndescribed along with its corresponding option.\n\nSigned-off-by: Michael Witten <mfwitten@gmail.com>\n---\n Documentation/git-send-email.txt |    6 ------\n 1 files changed, 0 insertions(+), 6 deletions(-)\n\ndiff --git a/Documentation/git-send-email.txt b/Documentation/git-send-email.txt\nindex 7b87d6e..b58b433 100644\n--- a/Documentation/git-send-email.txt\n+++ b/Documentation/git-send-email.txt\n@@ -271,12 +271,6 @@ sendemail.multiedit::\n \tsummary when '--compose' is used). If false, files will be edited one\n \tafter the other, spawning a new editor each time.\n \n-sendemail.confirm::\n-\tSets the default for whether to confirm before sending. Must be\n-\tone of 'always', 'never', 'cc', 'compose', or 'auto'. See '--confirm'\n-\tin the previous section for the meaning of these values.\n-\n-\n Author\n ------\n Written by Ryan Anderson <ryan@michonline.com>\n-- \n1.6.2.2.479.g2aec\n"},{"id":"111214","messageId":"1239647037-15381-5-git-send-email-mfwitten@gmail.com","threadId":"18852","inReplyTo":"1239647037-15381-4-git-send-email-mfwitten@gmail.com","subject":"[PATCH RFC3 04/13] Docs: send-email: --smtp-server-port can take symbolic ports","fromName":"Michael Witten","fromEmail":"mfwitten@gmail.com","sentAt":"2009-04-13T18:23:48Z","receivedAt":"2009-04-13T18:23:48Z","isPatch":true,"sender":{"key":"mfwitten@gmail.com","avatar":"https://avatars.githubusercontent.com/u/597101?v=4"},"body":"Signed-off-by: Michael Witten <mfwitten@gmail.com>\n---\n Documentation/git-send-email.txt |    4 +++-\n 1 files changed, 3 insertions(+), 1 deletions(-)\n\ndiff --git a/Documentation/git-send-email.txt b/Documentation/git-send-email.txt\nindex b58b433..e8a385b 100644\n--- a/Documentation/git-send-email.txt\n+++ b/Documentation/git-send-email.txt\n@@ -136,7 +136,9 @@ user is prompted for a password while the input is masked for privacy.\n --smtp-server-port=<port>::\n \tSpecifies a port different from the default port (SMTP\n \tservers typically listen to smtp port 25 and ssmtp port\n-\t465). This can be set with 'sendemail.smtpserverport'.\n+\t465); symbolic port names are allowed. The port can also\n+\tbe set with the 'sendemail.smtpserverport' configuration\n+\tvariable.\n \n --smtp-ssl::\n \tLegacy alias for '--smtp-encryption ssl'.\n-- \n1.6.2.2.479.g2aec\n"},{"id":"111215","messageId":"1239647037-15381-6-git-send-email-mfwitten@gmail.com","threadId":"18852","inReplyTo":"1239647037-15381-5-git-send-email-mfwitten@gmail.com","subject":"[PATCH RFC3 05/13] send-email: Cleanup the usage text and docs a bit","fromName":"Michael Witten","fromEmail":"mfwitten@gmail.com","sentAt":"2009-04-13T18:23:49Z","receivedAt":"2009-04-13T18:23:49Z","isPatch":true,"sender":{"key":"mfwitten@gmail.com","avatar":"https://avatars.githubusercontent.com/u/597101?v=4"},"body":"All usage text lines should be < 80 characters.\n\nA port number in --smtp-server is no longer handled,\nso the suggestion has been removed.\n\n--chain-reply-to doesn't take an argument.\n\nThe here-document quotation that defines the usage\ntext is now a single-quote form, so that no interpolation\ntakes place.\n\nSigned-off-by: Michael Witten <mfwitten@gmail.com>\n---\n Documentation/git-send-email.txt |   17 +++++++------\n git-send-email.perl              |   49 +++++++++++++++++++++-----------------\n 2 files changed, 36 insertions(+), 30 deletions(-)\n\ndiff --git a/Documentation/git-send-email.txt b/Documentation/git-send-email.txt\nindex e8a385b..5f7d640 100644\n--- a/Documentation/git-send-email.txt\n+++ b/Documentation/git-send-email.txt\n@@ -74,8 +74,9 @@ See the CONFIGURATION section for 'sendemail.multiedit'.\n \tthe value GIT_COMMITTER_IDENT, as returned by \"git var -l\".\n \tThe user will still be prompted to confirm this entry.\n \n---in-reply-to=<identifier>::\n-\tSpecify the contents of the first In-Reply-To header.\n+--in-reply-to=<message-id>::\n+\tSpecify the contents of the first In-Reply-To header;\n+\tinclude the angle brackets '<' and '>'.\n \tSubsequent emails will refer to the previous email\n \tinstead of this if --chain-reply-to is set (the default)\n \tOnly necessary if --compose is also set.  If --compose\n@@ -106,7 +107,7 @@ Sending\n \tthe 'sendemail.envelopesender' configuration variable; if that is\n \tunspecified, choosing the envelope sender is left to your MTA.\n \n---smtp-encryption=<encryption>::\n+--smtp-encryption=<type>::\n \tSpecify the encryption to use, either 'ssl' or 'tls'.  Any other\n \tvalue reverts to plain SMTP.  Default is the value of\n \t'sendemail.smtpencryption'.\n@@ -158,7 +159,7 @@ Automating\n \tOutput of this command must be single email address per line.\n \tDefault is the value of 'sendemail.cccmd' configuration value.\n \n---[no-]chain-reply-to=<identifier>::\n+--[no-]chain-reply-to::\n \tIf this is set, each email will be sent as a reply to the previous\n \temail sent.  If disabled with \"--no-chain-reply-to\", all emails after\n \tthe first will be sent as replies to the first email sent.  When using\n@@ -166,11 +167,11 @@ Automating\n \tentire patch series. Default is the value of the 'sendemail.chainreplyto'\n \tconfiguration value; if that is unspecified, default to --chain-reply-to.\n \n---identity=<identity>::\n+--identity=<id>::\n \tA configuration identity. When given, causes values in the\n-\t'sendemail.<identity>' subsection to take precedence over\n+\t'sendemail.<id>' subsection to take precedence over\n \tvalues in the 'sendemail' section. The default identity is\n-\tthe value of 'sendemail.identity'.\n+\tthe value of the 'sendemail.identity' configuration variable.\n \n --[no-]signed-off-by-cc::\n \tIf this is set, add emails found in Signed-off-by: or Cc: lines to the\n@@ -214,7 +215,7 @@ specified, as well as 'body' if --no-signed-off-cc is specified.\n Administering\n ~~~~~~~~~~~~~\n \n---confirm=<mode>::\n+--confirm=<when>::\n \tConfirm just before sending:\n +\n --\ndiff --git a/git-send-email.perl b/git-send-email.perl\nindex 172b53c..5f01ad2 100755\n--- a/git-send-email.perl\n+++ b/git-send-email.perl\n@@ -42,46 +42,51 @@ package main;\n \n \n sub usage {\n-\tprint <<EOT;\n+\n+\t# All printed lines should be less than 80 characters.\n+\n+\tprint <<'EOT';\n git send-email [options] <file | directory | rev-list options >\n \n   Composing:\n-    --from                  <str>  * Email From:\n-    --to                    <str>  * Email To:\n-    --cc                    <str>  * Email Cc:\n-    --bcc                   <str>  * Email Bcc:\n-    --subject               <str>  * Email \"Subject:\"\n-    --in-reply-to           <str>  * Email \"In-Reply-To:\"\n-    --annotate                     * Review each patch that will be sent in an editor.\n+    --from              <address>  * Email From:\n+    --to                <address>  * Email To:\n+    --cc                <address>  * Email Cc:\n+    --bcc               <address>  * Email Bcc:\n+    --subject            <string>  * Email \"Subject:\"\n+    --in-reply-to    <message-id>  * Email \"In-Reply-To:\"; include '<' and '>'.\n+    --annotate                     * Review each patch that will be sent in\n+                                     an editor.\n     --compose                      * Open an editor for introduction.\n \n   Sending:\n-    --envelope-sender       <str>  * Email envelope sender.\n-    --smtp-server       <str:int>  * Outgoing SMTP server to use. The port\n-                                     is optional. Default 'localhost'.\n-    --smtp-server-port      <int>  * Outgoing SMTP server port.\n-    --smtp-user             <str>  * Username for SMTP-AUTH.\n-    --smtp-pass             <str>  * Password for SMTP-AUTH; not necessary.\n-    --smtp-encryption       <str>  * tls or ssl; anything else disables.\n+    --envelope-sender   <address>  * Email envelope sender.\n+    --smtp-server          <host>  * Outgoing SMTP server.\n+    --smtp-server-port     <port>  * Outgoing SMTP server port; symbolic too.\n+    --smtp-user        <username>  * Username for SMTP-AUTH.\n+    --smtp-pass       [<password>] * Password for SMTP-AUTH; not necessary.\n+    --smtp-encryption      <type>  * tls or ssl; anything else disables.\n     --smtp-ssl                     * Deprecated. Use '--smtp-encryption ssl'.\n \n   Automating:\n-    --identity              <str>  * Use the sendemail.<id> options.\n-    --cc-cmd                <str>  * Email Cc: via `<str> \\$patch_path`\n-    --suppress-cc           <str>  * author, self, sob, cc, cccmd, body, bodycc, all.\n-    --[no-]signed-off-by-cc        * Send to Signed-off-by: addresses. Default on.\n+    --identity               <id>  * Use the sendemail.<id> options.\n+    --cc-cmd            <command>  * Email Cc: via `<command> $patch_path`\n+    --suppress-cc      <category>  * author, self, sob, cc, cccmd, body,\n+                                     bodycc, all.\n+    --[no-]signed-off-by-cc        * Send to Signed-off-by: addresses.\n+                                     Default on.\n     --[no-]suppress-from           * Send to self. Default off.\n     --[no-]chain-reply-to          * Chain In-Reply-To: fields. Default on.\n     --[no-]thread                  * Use In-Reply-To: field. Default on.\n \n   Administering:\n-    --confirm               <str>  * Confirm recipients before sending;\n+    --confirm              <when>  * Confirm recipients before sending;\n                                      auto, cc, compose, always, or never.\n     --quiet                        * Output one line of info per email.\n     --dry-run                      * Don't actually send the emails.\n     --[no-]validate                * Perform patch sanity checks. Default on.\n-    --[no-]format-patch            * understand any non optional arguments as\n-                                     `git format-patch` ones.\n+    --[no-]format-patch            * Understand any non-optional arguments as\n+                                     `git format-patch' arguments.\n \n EOT\n \texit(1);\n-- \n1.6.2.2.479.g2aec\n"},{"id":"111216","messageId":"1239647037-15381-7-git-send-email-mfwitten@gmail.com","threadId":"18852","inReplyTo":"1239647037-15381-6-git-send-email-mfwitten@gmail.com","subject":"[PATCH RFC3 06/13] send-email: Handle \"GIT:\" rather than \"GIT: \" during --compose","fromName":"Michael Witten","fromEmail":"mfwitten@gmail.com","sentAt":"2009-04-13T18:23:50Z","receivedAt":"2009-04-13T18:23:50Z","isPatch":true,"sender":{"key":"mfwitten@gmail.com","avatar":"https://avatars.githubusercontent.com/u/597101?v=4"},"body":"This should make things a little more robust in terms of user input;\nbefore, even the program got it wrong by outputting a line with only\n\"GIT:\", which was left in place as a header, because there would be\nno following space character.\n\nSigned-off-by: Michael Witten <mfwitten@gmail.com>\n---\n git-send-email.perl |    4 ++--\n 1 files changed, 2 insertions(+), 2 deletions(-)\n\ndiff --git a/git-send-email.perl b/git-send-email.perl\nindex 5f01ad2..5bd818e 100755\n--- a/git-send-email.perl\n+++ b/git-send-email.perl\n@@ -534,7 +534,7 @@ if ($compose) {\n \n \tprint C <<EOT;\n From $tpl_sender # This line is ignored.\n-GIT: Lines beginning in \"GIT: \" will be removed.\n+GIT: Lines beginning in \"GIT:\" will be removed.\n GIT: Consider including an overall diffstat or table of contents\n GIT: for the patch you are writing.\n GIT:\n@@ -567,7 +567,7 @@ EOT\n \tmy $in_body = 0;\n \tmy $summary_empty = 1;\n \twhile(<C>) {\n-\t\tnext if m/^GIT: /;\n+\t\tnext if m/^GIT:/;\n \t\tif ($in_body) {\n \t\t\t$summary_empty = 0 unless (/^\\n$/);\n \t\t} elsif (/^\\n$/) {\n-- \n1.6.2.2.479.g2aec\n"},{"id":"111217","messageId":"1239647037-15381-8-git-send-email-mfwitten@gmail.com","threadId":"18852","inReplyTo":"1239647037-15381-7-git-send-email-mfwitten@gmail.com","subject":"[PATCH RFC3 07/13] send-email: 'References:' should only reference what is sent","fromName":"Michael Witten","fromEmail":"mfwitten@gmail.com","sentAt":"2009-04-13T18:23:51Z","receivedAt":"2009-04-13T18:23:51Z","isPatch":true,"sender":{"key":"mfwitten@gmail.com","avatar":"https://avatars.githubusercontent.com/u/597101?v=4"},"body":"If someone responded with a negative (n|no) to the confirmation,\nthen the Message-ID of the discarded email is no longer used\nin the References: header of subsequent emails.\n\nConsequently, send_message() now returns 1 if the message was\nsent and 0 otherwise.\n\nSigned-off-by: Michael Witten <mfwitten@gmail.com>\n---\n git-send-email.perl |   14 ++++++++++----\n 1 files changed, 10 insertions(+), 4 deletions(-)\n\ndiff --git a/git-send-email.perl b/git-send-email.perl\nindex 5bd818e..2b0ff80 100755\n--- a/git-send-email.perl\n+++ b/git-send-email.perl\n@@ -801,6 +801,10 @@ sub sanitize_address\n \n }\n \n+# Returns 1 if the message was sent, and 0 otherwise.\n+# In actuality, the whole program dies when a there\n+# is an error sending a message.\n+\n sub send_message\n {\n \tmy @recipients = unique_email_list(@to);\n@@ -869,7 +873,7 @@ X-Mailer: git-send-email $gitversion\n \t\t         default => $ask_default);\n \t\tdie \"Send this email reply required\" unless defined $_;\n \t\tif (/^n/i) {\n-\t\t\treturn;\n+\t\t\treturn 0;\n \t\t} elsif (/^q/i) {\n \t\t\tcleanup_compose_files();\n \t\t\texit(0);\n@@ -950,7 +954,7 @@ X-Mailer: git-send-email $gitversion\n \t\t$smtp->data or die $smtp->message;\n \t\t$smtp->datasend(\"$header\\n$message\") or die $smtp->message;\n \t\t$smtp->dataend() or die $smtp->message;\n-\t\t$smtp->ok or die \"Failed to send $subject\\n\".$smtp->message;\n+\t\t$smtp->code =~ /250|200/ or die \"Failed to send $subject\\n\".$smtp->message;\n \t}\n \tif ($quiet) {\n \t\tprintf (($dry_run ? \"Dry-\" : \"\").\"Sent %s\\n\", $subject);\n@@ -971,6 +975,8 @@ X-Mailer: git-send-email $gitversion\n \t\t\tprint \"Result: OK\\n\";\n \t\t}\n \t}\n+\n+\treturn 1;\n }\n \n $reply_to = $initial_reply_to;\n@@ -1131,10 +1137,10 @@ foreach my $t (@files) {\n \n \t@cc = (@initial_cc, @cc);\n \n-\tsend_message();\n+\tmy $message_was_sent = send_message();\n \n \t# set up for the next message\n-\tif ($chain_reply_to || !defined $reply_to || length($reply_to) == 0) {\n+\tif ($message_was_sent and $chain_reply_to || not defined $reply_to || length($reply_to) == 0) {\n \t\t$reply_to = $message_id;\n \t\tif (length $references > 0) {\n \t\t\t$references .= \"\\n $message_id\";\n-- \n1.6.2.2.479.g2aec\n"},{"id":"111218","messageId":"1239647037-15381-9-git-send-email-mfwitten@gmail.com","threadId":"18852","inReplyTo":"1239647037-15381-8-git-send-email-mfwitten@gmail.com","subject":"[PATCH RFC3 08/13] send-email: Remove superfluous `my $editor = ...'","fromName":"Michael Witten","fromEmail":"mfwitten@gmail.com","sentAt":"2009-04-13T18:23:52Z","receivedAt":"2009-04-13T18:23:52Z","isPatch":true,"sender":{"key":"mfwitten@gmail.com","avatar":"https://avatars.githubusercontent.com/u/597101?v=4"},"body":"Not only was it a repeat, but it also had no effect.\n\nSigned-off-by: Michael Witten <mfwitten@gmail.com>\n---\n git-send-email.perl |    2 --\n 1 files changed, 0 insertions(+), 2 deletions(-)\n\ndiff --git a/git-send-email.perl b/git-send-email.perl\nindex 2b0ff80..6b4b257 100755\n--- a/git-send-email.perl\n+++ b/git-send-email.perl\n@@ -549,8 +549,6 @@ EOT\n \t}\n \tclose(C);\n \n-\tmy $editor = $ENV{GIT_EDITOR} || Git::config(@repo, \"core.editor\") || $ENV{VISUAL} || $ENV{EDITOR} || \"vi\";\n-\n \tif ($annotate) {\n \t\tdo_edit($compose_filename, @files);\n \t} else {\n-- \n1.6.2.2.479.g2aec\n"},{"id":"111219","messageId":"1239647037-15381-10-git-send-email-mfwitten@gmail.com","threadId":"18852","inReplyTo":"1239647037-15381-9-git-send-email-mfwitten@gmail.com","subject":"[PATCH RFC3 09/13] send-email: Remove horrible mix of tabs and spaces","fromName":"Michael Witten","fromEmail":"mfwitten@gmail.com","sentAt":"2009-04-13T18:23:53Z","receivedAt":"2009-04-13T18:23:53Z","isPatch":true,"sender":{"key":"mfwitten@gmail.com","avatar":"https://avatars.githubusercontent.com/u/597101?v=4"},"body":"For the most part, I ran a search for all the lines\nthat match:\n\n    ^[\\t]*[ ]+\n\nand then I manually replaced the offending text with\nan appropriate number of tabs.\n\nWhile scanning through the file, I also tried to format\nsome of the code so as to obviate future mixing; I also\nfixed one horrendously egregious section of code, where\nsomeone was trying to be unnecessarily compact.\n\nCurrently, no lines match the following:\n\n    [\\t]+[ ]+\n    [ ]+[\\t]+\n\nSo, it should be reasonably clean.\n\nThe whole file is still horrendous.\n\nSigned-off-by: Michael Witten <mfwitten@gmail.com>\n---\n git-send-email.perl |  273 ++++++++++++++++++++++++++++++---------------------\n 1 files changed, 163 insertions(+), 110 deletions(-)\n\ndiff --git a/git-send-email.perl b/git-send-email.perl\nindex 6b4b257..0ff72f6 100755\n--- a/git-send-email.perl\n+++ b/git-send-email.perl\n@@ -16,6 +16,9 @@\n #    and second line is the subject of the message.\n #\n \n+# Please do not mix tabs spaces across lines that share a relationship\n+# in terms of layout. Currently, all indentation is expected to use tabs.\n+\n use strict;\n use warnings;\n use Term::ReadLine;\n@@ -116,19 +119,20 @@ sub format_2822_time {\n \t\tdie (\"local time offset greater than or equal to 24 hours\\n\");\n \t}\n \n-\treturn sprintf(\"%s, %2d %s %d %02d:%02d:%02d %s%02d%02d\",\n-\t\t       qw(Sun Mon Tue Wed Thu Fri Sat)[$localtm[6]],\n-\t\t       $localtm[3],\n-\t\t       qw(Jan Feb Mar Apr May Jun\n-\t\t\t  Jul Aug Sep Oct Nov Dec)[$localtm[4]],\n-\t\t       $localtm[5]+1900,\n-\t\t       $localtm[2],\n-\t\t       $localtm[1],\n-\t\t       $localtm[0],\n-\t\t       ($offset >= 0) ? '+' : '-',\n-\t\t       abs($offhour),\n-\t\t       $offmin,\n-\t\t       );\n+\treturn sprintf(\n+\t\t\"%s, %2d %s %d %02d:%02d:%02d %s%02d%02d\",\n+\t\tqw(Sun Mon Tue Wed Thu Fri Sat)[$localtm[6]],\n+\t\t$localtm[3],\n+\t\tqw(Jan Feb Mar Apr May Jun\n+\t\tJul Aug Sep Oct Nov Dec)[$localtm[4]],\n+\t\t$localtm[5]+1900,\n+\t\t$localtm[2],\n+\t\t$localtm[1],\n+\t\t$localtm[0],\n+\t\t($offset >= 0) ? '+' : '-',\n+\t\tabs($offhour),\n+\t\t$offmin,\n+\t);\n }\n \n my $have_email_valid = eval { require Email::Valid; 1 };\n@@ -192,29 +196,29 @@ my ($validate, $confirm);\n my (@suppress_cc);\n \n my %config_bool_settings = (\n-    \"thread\" => [\\$thread, 1],\n-    \"chainreplyto\" => [\\$chain_reply_to, 1],\n-    \"suppressfrom\" => [\\$suppress_from, undef],\n-    \"signedoffbycc\" => [\\$signed_off_by_cc, undef],\n-    \"signedoffcc\" => [\\$signed_off_by_cc, undef],      # Deprecated\n-    \"validate\" => [\\$validate, 1],\n+\t\"thread\" => [\\$thread, 1],\n+\t\"chainreplyto\" => [\\$chain_reply_to, 1],\n+\t\"suppressfrom\" => [\\$suppress_from, undef],\n+\t\"signedoffbycc\" => [\\$signed_off_by_cc, undef],\n+\t\"signedoffcc\" => [\\$signed_off_by_cc, undef],      # Deprecated\n+\t\"validate\" => [\\$validate, 1],\n );\n \n my %config_settings = (\n-    \"smtpserver\" => \\$smtp_server,\n-    \"smtpserverport\" => \\$smtp_server_port,\n-    \"smtpuser\" => \\$smtp_authuser,\n-    \"smtppass\" => \\$smtp_authpass,\n-    \"to\" => \\@to,\n-    \"cc\" => \\@initial_cc,\n-    \"cccmd\" => \\$cc_cmd,\n-    \"aliasfiletype\" => \\$aliasfiletype,\n-    \"bcc\" => \\@bcclist,\n-    \"aliasesfile\" => \\@alias_files,\n-    \"suppresscc\" => \\@suppress_cc,\n-    \"envelopesender\" => \\$envelope_sender,\n-    \"multiedit\" => \\$multiedit,\n-    \"confirm\"   => \\$confirm,\n+\t\"smtpserver\" => \\$smtp_server,\n+\t\"smtpserverport\" => \\$smtp_server_port,\n+\t\"smtpuser\" => \\$smtp_authuser,\n+\t\"smtppass\" => \\$smtp_authpass,\n+\t\"to\" => \\@to,\n+\t\"cc\" => \\@initial_cc,\n+\t\"cccmd\" => \\$cc_cmd,\n+\t\"aliasfiletype\" => \\$aliasfiletype,\n+\t\"bcc\" => \\@bcclist,\n+\t\"aliasesfile\" => \\@alias_files,\n+\t\"suppresscc\" => \\@suppress_cc,\n+\t\"envelopesender\" => \\$envelope_sender,\n+\t\"multiedit\" => \\$multiedit,\n+\t\"confirm\"   => \\$confirm,\n );\n \n # Handle Uncouth Termination\n@@ -245,37 +249,38 @@ $SIG{INT}  = \\&signal_handler;\n # Begin by accumulating all the variables (defined above), that we will end up\n # needing, first, from the command line:\n \n-my $rc = GetOptions(\"sender|from=s\" => \\$sender,\n-                    \"in-reply-to=s\" => \\$initial_reply_to,\n-\t\t    \"subject=s\" => \\$initial_subject,\n-\t\t    \"to=s\" => \\@to,\n-\t\t    \"cc=s\" => \\@initial_cc,\n-\t\t    \"bcc=s\" => \\@bcclist,\n-\t\t    \"chain-reply-to!\" => \\$chain_reply_to,\n-\t\t    \"smtp-server=s\" => \\$smtp_server,\n-\t\t    \"smtp-server-port=s\" => \\$smtp_server_port,\n-\t\t    \"smtp-user=s\" => \\$smtp_authuser,\n-\t\t    \"smtp-pass:s\" => \\$smtp_authpass,\n-\t\t    \"smtp-ssl\" => sub { $smtp_encryption = 'ssl' },\n-\t\t    \"smtp-encryption=s\" => \\$smtp_encryption,\n-\t\t    \"identity=s\" => \\$identity,\n-\t\t    \"annotate\" => \\$annotate,\n-\t\t    \"compose\" => \\$compose,\n-\t\t    \"quiet\" => \\$quiet,\n-\t\t    \"cc-cmd=s\" => \\$cc_cmd,\n-\t\t    \"suppress-from!\" => \\$suppress_from,\n-\t\t    \"suppress-cc=s\" => \\@suppress_cc,\n-\t\t    \"signed-off-cc|signed-off-by-cc!\" => \\$signed_off_by_cc,\n-\t\t    \"confirm=s\" => \\$confirm,\n-\t\t    \"dry-run\" => \\$dry_run,\n-\t\t    \"envelope-sender=s\" => \\$envelope_sender,\n-\t\t    \"thread!\" => \\$thread,\n-\t\t    \"validate!\" => \\$validate,\n-\t\t    \"format-patch!\" => \\$format_patch,\n-\t );\n+my $rc = GetOptions(\n+\t\"sender|from=s\" => \\$sender,\n+\t\"in-reply-to=s\" => \\$initial_reply_to,\n+\t\"subject=s\" => \\$initial_subject,\n+\t\"to=s\" => \\@to,\n+\t\"cc=s\" => \\@initial_cc,\n+\t\"bcc=s\" => \\@bcclist,\n+\t\"chain-reply-to!\" => \\$chain_reply_to,\n+\t\"smtp-server=s\" => \\$smtp_server,\n+\t\"smtp-server-port=s\" => \\$smtp_server_port,\n+\t\"smtp-user=s\" => \\$smtp_authuser,\n+\t\"smtp-pass:s\" => \\$smtp_authpass,\n+\t\"smtp-ssl\" => sub { $smtp_encryption = 'ssl' },\n+\t\"smtp-encryption=s\" => \\$smtp_encryption,\n+\t\"identity=s\" => \\$identity,\n+\t\"annotate\" => \\$annotate,\n+\t\"compose\" => \\$compose,\n+\t\"quiet\" => \\$quiet,\n+\t\"cc-cmd=s\" => \\$cc_cmd,\n+\t\"suppress-from!\" => \\$suppress_from,\n+\t\"suppress-cc=s\" => \\@suppress_cc,\n+\t\"signed-off-cc|signed-off-by-cc!\" => \\$signed_off_by_cc,\n+\t\"confirm=s\" => \\$confirm,\n+\t\"dry-run\" => \\$dry_run,\n+\t\"envelope-sender=s\" => \\$envelope_sender,\n+\t\"thread!\" => \\$thread,\n+\t\"validate!\" => \\$validate,\n+\t\"format-patch!\" => \\$format_patch,\n+);\n \n unless ($rc) {\n-    usage();\n+\tusage();\n }\n \n die \"Cannot run git format-patch from outside a repository\\n\"\n@@ -404,29 +409,55 @@ sub split_addrs {\n my %aliases;\n my %parse_alias = (\n \t# multiline formats can be supported in the future\n-\tmutt => sub { my $fh = shift; while (<$fh>) {\n-\t\tif (/^\\s*alias\\s+(\\S+)\\s+(.*)$/) {\n-\t\t\tmy ($alias, $addr) = ($1, $2);\n-\t\t\t$addr =~ s/#.*$//; # mutt allows # comments\n-\t\t\t # commas delimit multiple addresses\n-\t\t\t$aliases{$alias} = [ split_addrs($addr) ];\n-\t\t}}},\n-\tmailrc => sub { my $fh = shift; while (<$fh>) {\n-\t\tif (/^alias\\s+(\\S+)\\s+(.*)$/) {\n-\t\t\t# spaces delimit multiple addresses\n-\t\t\t$aliases{$1} = [ split(/\\s+/, $2) ];\n-\t\t}}},\n-\tpine => sub { my $fh = shift; my $f='\\t[^\\t]*';\n-\t        for (my $x = ''; defined($x); $x = $_) {\n+\tmutt => sub {\n+\n+\t\tmy $fh = shift;\n+\n+\t\twhile (<$fh>) {\n+\t\t\tif (/^\\s*alias\\s+(\\S+)\\s+(.*)$/) {\n+\t\t\t\tmy ($alias, $addr) = ($1, $2);\n+\t\t\t\t$addr =~ s/#.*$//; # mutt allows # comments\n+\t\t\t\t# commas delimit multiple addresses\n+\t\t\t\t$aliases{$alias} = [ split_addrs($addr) ];\n+\t\t\t}\n+\t\t}\n+\t},\n+\n+\tmailrc => sub {\n+\n+\t\tmy $fh = shift;\n+\n+\t\twhile (<$fh>) {\n+\t\t\tif (/^alias\\s+(\\S+)\\s+(.*)$/) {\n+\t\t\t\t# spaces delimit multiple addresses\n+\t\t\t\t$aliases{$1} = [ split(/\\s+/, $2) ];\n+\t\t\t}\n+\t\t}\n+\t},\n+\n+\tpine => sub {\n+\n+\t\tmy $fh = shift;\n+\t\tmy $f='\\t[^\\t]*';\n+\n+\t\tfor (my $x = ''; defined($x); $x = $_) {\n \t\t\tchomp $x;\n-\t\t        $x .= $1 while(defined($_ = <$fh>) && /^ +(.*)$/);\n+\t\t\t$x .= $1 while(defined($_ = <$fh>) && /^ +(.*)$/);\n \t\t\t$x =~ /^(\\S+)$f\\t\\(?([^\\t]+?)\\)?(:?$f){0,2}$/ or next;\n \t\t\t$aliases{$1} = [ split_addrs($2) ];\n-\t\t}},\n-\tgnus => sub { my $fh = shift; while (<$fh>) {\n-\t\tif (/\\(define-mail-alias\\s+\"(\\S+?)\"\\s+\"(\\S+?)\"\\)/) {\n-\t\t\t$aliases{$1} = [ $2 ];\n-\t\t}}}\n+\t\t}\n+\t},\n+\n+\tgnus => sub {\n+\n+\t\tmy $fh = shift;\n+\n+\t\twhile (<$fh>) {\n+\t\t\tif (/\\(define-mail-alias\\s+\"(\\S+?)\"\\s+\"(\\S+?)\"\\)/) {\n+\t\t\t\t$aliases{$1} = [ $2 ];\n+\t\t\t}\n+\t\t}\n+\t}\n );\n \n if (@alias_files and $aliasfiletype and defined $parse_alias{$aliasfiletype}) {\n@@ -571,10 +602,11 @@ EOT\n \t\t} elsif (/^\\n$/) {\n \t\t\t$in_body = 1;\n \t\t\tif ($need_8bit_cte) {\n-\t\t\t\tprint C2 \"MIME-Version: 1.0\\n\",\n-\t\t\t\t\t \"Content-Type: text/plain; \",\n-\t\t\t\t\t   \"charset=utf-8\\n\",\n-\t\t\t\t\t \"Content-Transfer-Encoding: 8bit\\n\";\n+\t\t\t\tprint C2\n+\t\t\t\t\t\"MIME-Version: 1.0\\n\",\n+\t\t\t\t\t\"Content-Type: text/plain; \",\n+\t\t\t\t\t\"charset=utf-8\\n\",\n+\t\t\t\t\t\"Content-Transfer-Encoding: 8bit\\n\";\n \t\t\t}\n \t\t} elsif (/^MIME-Version:/i) {\n \t\t\t$need_8bit_cte = 0;\n@@ -583,8 +615,8 @@ EOT\n \t\t\tmy $subject = $initial_subject;\n \t\t\t$_ = \"Subject: \" .\n \t\t\t\t($subject =~ /[^[:ascii:]]/ ?\n-\t\t\t\t quote_rfc2047($subject) :\n-\t\t\t\t $subject) .\n+\t\t\t\tquote_rfc2047($subject) :\n+\t\t\t\t$subject) .\n \t\t\t\t\"\\n\";\n \t\t} elsif (/^In-Reply-To:\\s*(.+)\\s*$/i) {\n \t\t\t$initial_reply_to = $1;\n@@ -616,8 +648,10 @@ sub ask {\n \tmy $resp;\n \tmy $i = 0;\n \treturn defined $default ? $default : undef\n-\t\tunless defined $term->IN and defined fileno($term->IN) and\n-\t\t       defined $term->OUT and defined fileno($term->OUT);\n+\t\tunless defined $term->IN\n+\t\t\tand defined fileno($term->IN)\n+\t\t\tand defined $term->OUT\n+\t\t\tand defined fileno($term->OUT);\n \twhile ($i++ < 10) {\n \t\t$resp = $term->readline($prompt);\n \t\tif (!defined $resp) { # EOF\n@@ -637,8 +671,12 @@ sub ask {\n my $prompting = 0;\n if (!defined $sender) {\n \t$sender = $repoauthor || $repocommitter || '';\n-\t$sender = ask(\"Who should the emails appear to be from? [$sender] \",\n-\t              default => $sender);\n+\n+\t$sender = ask(\n+\t\t\"Who should the emails appear to be from? [$sender] \",\n+\t\tdefault => $sender\n+\t);\n+\n \tprint \"Emails will be sent from: \", $sender, \"\\n\";\n \t$prompting++;\n }\n@@ -666,7 +704,8 @@ sub expand_aliases {\n \n if ($thread && !defined $initial_reply_to && $prompting) {\n \t$initial_reply_to = ask(\n-\t\t\"Message-ID to be used as In-Reply-To for the first email? \");\n+\t\t\"Message-ID to be used as In-Reply-To for the first email? \"\n+\t);\n }\n if (defined $initial_reply_to) {\n \t$initial_reply_to =~ s/^\\s*<?//;\n@@ -806,18 +845,22 @@ sub sanitize_address\n sub send_message\n {\n \tmy @recipients = unique_email_list(@to);\n-\t@cc = (grep { my $cc = extract_valid_address($_);\n-\t\t      not grep { $cc eq $_ } @recipients\n-\t\t    }\n-\t       map { sanitize_address($_) }\n-\t       @cc);\n+\n+\t@cc = (grep\n+\t\t{\n+\t\t\tmy $cc = extract_valid_address($_);\n+\t\t\tnot grep { $cc eq $_ } @recipients\n+\t\t}\n+\t\tmap { sanitize_address($_) } @cc\n+\t);\n+\n \tmy $to = join (\",\\n\\t\", @recipients);\n \t@recipients = unique_email_list(@recipients,@cc,@bcclist);\n \t@recipients = (map { extract_valid_address($_) } @recipients);\n \tmy $date = format_2822_time($time++);\n \tmy $gitversion = '@@GIT_VERSION@@';\n \tif ($gitversion =~ m/..GIT_VERSION../) {\n-\t    $gitversion = Git::version();\n+\t\t$gitversion = Git::version();\n \t}\n \n \tmy $cc = join(\", \", unique_email_list(@cc));\n@@ -866,9 +909,13 @@ X-Mailer: git-send-email $gitversion\n \t\t\tprint \"    To retain the current behavior, but squelch this message,\\n\";\n \t\t\tprint \"    run 'git config --global sendemail.confirm auto'.\\n\\n\";\n \t\t}\n-\t\t$_ = ask(\"Send this email? ([y]es|[n]o|[q]uit|[a]ll): \",\n-\t\t         valid_re => qr/^(?:yes|y|no|n|quit|q|all|a)/i,\n-\t\t         default => $ask_default);\n+\n+\t\t$_ = ask(\n+\t\t\t\"Send this email? ([y]es|[n]o|[q]uit|[a]ll): \",\n+\t\t\tvalid_re => qr/^(?:yes|y|no|n|quit|q|all|a)/i,\n+\t\t\tdefault => $ask_default\n+\t\t);\n+\n \t\tdie \"Send this email reply required\" unless defined $_;\n \t\tif (/^n/i) {\n \t\t\treturn 0;\n@@ -903,9 +950,13 @@ X-Mailer: git-send-email $gitversion\n \t\t}\n \t\telse {\n \t\t\trequire Net::SMTP;\n-\t\t\t$smtp ||= Net::SMTP->new((defined $smtp_server_port)\n-\t\t\t\t\t\t ? \"$smtp_server:$smtp_server_port\"\n-\t\t\t\t\t\t : $smtp_server);\n+\n+\t\t\t$smtp ||= Net::SMTP->new(\n+\t\t\t\t(defined $smtp_server_port)\n+\t\t\t\t\t? \"$smtp_server:$smtp_server_port\"\n+\t\t\t\t\t: $smtp_server\n+\t\t\t);\n+\n \t\t\tif ($smtp_encryption eq 'tls') {\n \t\t\t\trequire Net::SMTP::SSL;\n \t\t\t\t$smtp->command('STARTTLS');\n@@ -1002,7 +1053,7 @@ foreach my $t (@files) {\n \t\t\tchomp($header[$#header]);\n \t\t\ts/^\\s+/ /;\n \t\t\t$header[$#header] .= $_;\n-\t    } else {\n+\t\t} else {\n \t\t\tpush(@header, $_);\n \t\t}\n \t}\n@@ -1120,9 +1171,9 @@ foreach my $t (@files) {\n \t\t\t}\n \t\t\telse {\n \t\t\t\tpush @xh,\n-\t\t\t\t  'MIME-Version: 1.0',\n-\t\t\t\t  \"Content-Type: text/plain; charset=$author_encoding\",\n-\t\t\t\t  'Content-Transfer-Encoding: 8bit';\n+\t\t\t\t\t'MIME-Version: 1.0',\n+\t\t\t\t\t\"Content-Type: text/plain; charset=$author_encoding\",\n+\t\t\t\t\t'Content-Transfer-Encoding: 8bit';\n \t\t\t}\n \t\t}\n \t}\n@@ -1130,7 +1181,9 @@ foreach my $t (@files) {\n \t$needs_confirm = (\n \t\t$confirm eq \"always\" or\n \t\t($confirm =~ /^(?:auto|cc)$/ && @cc) or\n-\t\t($confirm =~ /^(?:auto|compose)$/ && $compose && $message_num == 1));\n+\t\t($confirm =~ /^(?:auto|compose)$/ && $compose && $message_num == 1)\n+\t);\n+\n \t$needs_confirm = \"inform\" if ($needs_confirm && $confirm_unconfigured && @cc);\n \n \t@cc = (@initial_cc, @cc);\n-- \n1.6.2.2.479.g2aec\n"},{"id":"111220","messageId":"1239647037-15381-11-git-send-email-mfwitten@gmail.com","threadId":"18852","inReplyTo":"1239647037-15381-10-git-send-email-mfwitten@gmail.com","subject":"[PATCH RFC3 10/13] send-email: Add --sleep for email throttling","fromName":"Michael Witten","fromEmail":"mfwitten@gmail.com","sentAt":"2009-04-13T18:23:54Z","receivedAt":"2009-04-13T18:23:54Z","isPatch":true,"sender":{"key":"mfwitten@gmail.com","avatar":"https://avatars.githubusercontent.com/u/597101?v=4"},"body":"The --sleep option provides a means for specifying that there\nshould be a certain number of seconds of delay after sending\na certain number of emails; see Documentation/git-send-email.txt\n\nSigned-off-by: Michael Witten <mfwitten@gmail.com>\n---\n Documentation/git-send-email.txt |   30 +++++++++++++++\n git-send-email.perl              |   74 +++++++++++++++++++++++++++++++++++---\n 2 files changed, 99 insertions(+), 5 deletions(-)\n\ndiff --git a/Documentation/git-send-email.txt b/Documentation/git-send-email.txt\nindex 5f7d640..236e578 100644\n--- a/Documentation/git-send-email.txt\n+++ b/Documentation/git-send-email.txt\n@@ -178,6 +178,36 @@ Automating\n \tcc list. Default is the value of 'sendemail.signedoffbycc' configuration\n \tvalue; if that is unspecified, default to --signed-off-by-cc.\n \n+--sleep=<seconds>[,<burst>]::\n+\tThis option specfies that send-email should sleep for <seconds>\n+\tafter sending <burst> messages as quickly as possible; <seconds>\n+\tshould be an integer >= 0 and <burst> should be an integer >= 1.\n+\tThis mode of operation attacks 2 problems: email throttling and\n+\tarrival disorder. Default is the value of the 'sendemail.sleep'\n+\tconfiguration variable, or '0' if that does not exist.\n++\n+By default, send-email tries to send one patch per email as quickly as\n+possible. Unfortunately, some email services restrict a user by refusing\n+to send more than some maximum number of email messages, M, in a given\n+period of seconds, S. This can be troublesome if the patch series has\n+more than M patches, because the server will ultimately refuse to send\n+some of them. In this case, simply pass '--sleep=S,M' or '--sleep S,M'\n+or set sendemail.sleep to 'S,M'.\n++\n+Moreover, the emails often arrive at the final destination out of order;\n+though send-email manipulates the date fields and usually chains subsequent\n+emails via the In-Reply-To headers, some mail viewers nevertheless insist\n+on presenting them by order of arrival. This may be mitigated by using\n+something like '--sleep 60' (the equivalent of '--sleep 60,1'), so that\n+there is a 60 second delay between sending any two messages.\n++\n+*Note*: Because of varying routes and batching schemes, there is no delay\n+that can guarantee the correct arrival order. Obviously, one solution is to\n+choose an obscenely large number, so be prepared to run send-email in the\n+background. Of course, spreading emails across time makes it more likely\n+that unrelated email messages arrive between patches. Therefore, send-email\n+warns you if both --sleep and --no-chain-reply-to are used.\n+\n --suppress-cc=<category>::\n \tSpecify an additional category of recipients to suppress the\n \tauto-cc of:\ndiff --git a/git-send-email.perl b/git-send-email.perl\nindex 0ff72f6..a394663 100755\n--- a/git-send-email.perl\n+++ b/git-send-email.perl\n@@ -72,6 +72,7 @@ git send-email [options] <file | directory | rev-list options >\n     --smtp-ssl                     * Deprecated. Use '--smtp-encryption ssl'.\n \n   Automating:\n+    --sleep      <secs>[,<burst>]  * Delay <secs> every <burst> email(s).\n     --identity               <id>  * Use the sendemail.<id> options.\n     --cc-cmd            <command>  * Email Cc: via `<command> $patch_path`\n     --suppress-cc      <category>  * author, self, sob, cc, cccmd, body,\n@@ -189,7 +190,7 @@ sub do_edit {\n }\n \n # Variables with corresponding config settings\n-my ($thread, $chain_reply_to, $suppress_from, $signed_off_by_cc, $cc_cmd);\n+my ($sleep, $thread, $chain_reply_to, $suppress_from, $signed_off_by_cc, $cc_cmd);\n my ($smtp_server, $smtp_server_port, $smtp_authuser, $smtp_encryption);\n my ($identity, $aliasfiletype, @alias_files, @smtp_host_parts);\n my ($validate, $confirm);\n@@ -205,6 +206,7 @@ my %config_bool_settings = (\n );\n \n my %config_settings = (\n+\t\"sleep\" => \\$sleep,\n \t\"smtpserver\" => \\$smtp_server,\n \t\"smtpserverport\" => \\$smtp_server_port,\n \t\"smtpuser\" => \\$smtp_authuser,\n@@ -257,6 +259,7 @@ my $rc = GetOptions(\n \t\"cc=s\" => \\@initial_cc,\n \t\"bcc=s\" => \\@bcclist,\n \t\"chain-reply-to!\" => \\$chain_reply_to,\n+\t\"sleep=s\" => \\$sleep,\n \t\"smtp-server=s\" => \\$smtp_server,\n \t\"smtp-server-port=s\" => \\$smtp_server_port,\n \t\"smtp-user=s\" => \\$smtp_authuser,\n@@ -329,6 +332,43 @@ foreach my $setting (values %config_bool_settings) {\n \t${$setting->[0]} = $setting->[1] unless (defined (${$setting->[0]}));\n }\n \n+#### Parse input\n+\n+my ($sleep_seconds, $sleep_burst);\n+\n+if (defined $sleep) {{\n+\n+\tunless ($chain_reply_to) {\n+\n+\t\tprint \"Both --sleep and --no-chain-reply-to are in effect.\\n\";\n+\t\tprint \"Therefore, it is much more likely that unrelated\\n\";\n+\t\tprint \"email messages will appear between any 2 of your\\n\";\n+\t\tprint \"patches.\\n\\n\";\n+\n+\t\t$_ = ask(\n+\t\t\t\"How to proceed? ([q]uit | --[s]leep | --no-[c]hain | [n]either | [b]oth): \",\n+\t\t\tvalid_re => qr/^(?:b|s|c|n|q)/i,\n+\t\t\tdefault => 'b'\n+\t\t);\n+\n+\t\t/^b/                                               or\n+\t\t/^s/ and $chain_reply_to = 1                       or\n+\t\t/^c/ and $sleep = undef, last                      or\n+\t\t/^n/ and $chain_reply_to = 1, $sleep = undef, last or\n+\t\t/^q/ and exit;\n+\t}\n+\n+\t$sleep =~ /^(\\d+)(?:,(\\d+))?$/\n+\t\tor  print \"Should be '--sleep=<seconds>[,<burst>]', but got '--sleep=\\\"$sleep\\\"'\\n\"\n+\t\tand exit;\n+\n+\t# Explicitly convert to integers to avoid repeated conversion:\n+\t# (<burst> = 0 is not defined, but let's be nice and absorb it)\n+\n+\t$sleep_seconds = 0+$1;\n+\t$sleep_burst   = $2 ? 0+$2 : 1;\n+}}\n+\n # 'default' encryption is none -- this only prevents a warning\n $smtp_encryption = '' unless (defined $smtp_encryption);\n \n@@ -1033,8 +1073,12 @@ $references = $initial_reply_to || '';\n $subject = $initial_subject;\n $message_num = 0;\n \n-foreach my $t (@files) {\n-\topen(F,\"<\",$t) or die \"can't open file $t\";\n+my $burst_count = $sleep_burst;\n+my $time_of_last_message;\n+\n+for (my $index = 0; $index < @files; $index++) {\n+\tmy $file = $files[$index];\n+\topen(F,\"<\",$file) or die \"can't open file $file\";\n \n \tmy $author = undef;\n \tmy $author_encoding;\n@@ -1143,7 +1187,7 @@ foreach my $t (@files) {\n \tclose F;\n \n \tif (defined $cc_cmd && !$suppress_cc{'cccmd'}) {\n-\t\topen(F, \"$cc_cmd $t |\")\n+\t\topen(F, \"$cc_cmd $file |\")\n \t\t\tor die \"(cc-cmd) Could not execute '$cc_cmd'\";\n \t\twhile(<F>) {\n \t\t\tmy $c = $_;\n@@ -1190,7 +1234,27 @@ foreach my $t (@files) {\n \n \tmy $message_was_sent = send_message();\n \n-\t# set up for the next message\n+\t# Throttle the outgoing rate:\n+\n+\tif ($sleep_seconds && $message_was_sent) {\n+\n+\t\t$time_of_last_message = time;\n+\n+\t\tunless (--$burst_count) {  # unless we can send more\n+\n+\t\t\t$burst_count = $sleep_burst;\n+\n+\t\t\tmy $already_elapsed = time - $time_of_last_message;\n+\n+\t\t\tif ($already_elapsed < $sleep_seconds && $index < $#files) {\n+\t\t\t\tmy $this_long = $sleep_seconds - $already_elapsed;\n+\t\t\t\twhile (($this_long -= sleep $this_long) > 0) {}\n+\t\t\t}\n+\t\t}\n+\t}\n+\n+\t# set up for the next message:\n+\n \tif ($message_was_sent and $chain_reply_to || not defined $reply_to || length($reply_to) == 0) {\n \t\t$reply_to = $message_id;\n \t\tif (length $references > 0) {\n-- \n1.6.2.2.479.g2aec\n"},{"id":"111221","messageId":"1239647037-15381-12-git-send-email-mfwitten@gmail.com","threadId":"18852","inReplyTo":"1239647037-15381-11-git-send-email-mfwitten@gmail.com","subject":"[PATCH RFC3 11/13] send-email: Minor cleanup of $smtp_server usage and send_message()","fromName":"Michael Witten","fromEmail":"mfwitten@gmail.com","sentAt":"2009-04-13T18:23:55Z","receivedAt":"2009-04-13T18:23:55Z","isPatch":true,"sender":{"key":"mfwitten@gmail.com","avatar":"https://avatars.githubusercontent.com/u/597101?v=4"},"body":"Note that the output has been changed; the server return code\nnow appears after the `(Sendmail|Server):' line, rather than\nafter the headers.\n\nSigned-off-by: Michael Witten <mfwitten@gmail.com>\n---\n Documentation/git-send-email.txt |    8 ++++--\n git-send-email.perl              |   41 ++++++++++++++++++++++++-------------\n 2 files changed, 31 insertions(+), 18 deletions(-)\n\ndiff --git a/Documentation/git-send-email.txt b/Documentation/git-send-email.txt\nindex 236e578..93cfb34 100644\n--- a/Documentation/git-send-email.txt\n+++ b/Documentation/git-send-email.txt\n@@ -130,9 +130,11 @@ user is prompted for a password while the input is masked for privacy.\n \tspecify a full pathname of a sendmail-like program instead;\n \tthe program must support the `-i` option.  Default value can\n \tbe specified by the 'sendemail.smtpserver' configuration\n-\toption; the built-in default is `/usr/sbin/sendmail` or\n-\t`/usr/lib/sendmail` if such program is available, or\n-\t`localhost` otherwise.\n+\tvariable; the built-in default is `/usr/sbin/sendmail` or\n+\t`/usr/lib/sendmail` if such a program is available, or\n+\t`localhost` otherwise. Also, a built-in default is used if\n+\t<host> is the empty string (for example, if '--smtp-server \"\"'\n+\tis specified on the command line).\n \n --smtp-server-port=<port>::\n \tSpecifies a port different from the default port (SMTP\ndiff --git a/git-send-email.perl b/git-send-email.perl\nindex a394663..8ce9d3b 100755\n--- a/git-send-email.perl\n+++ b/git-send-email.perl\n@@ -191,7 +191,8 @@ sub do_edit {\n \n # Variables with corresponding config settings\n my ($sleep, $thread, $chain_reply_to, $suppress_from, $signed_off_by_cc, $cc_cmd);\n-my ($smtp_server, $smtp_server_port, $smtp_authuser, $smtp_encryption);\n+my ($smtp_server, $smtp_server_is_a_command);\n+my ($smtp_server_port, $smtp_authuser, $smtp_encryption);\n my ($identity, $aliasfiletype, @alias_files, @smtp_host_parts);\n my ($validate, $confirm);\n my (@suppress_cc);\n@@ -753,14 +754,20 @@ if (defined $initial_reply_to) {\n \t$initial_reply_to = \"<$initial_reply_to>\" if $initial_reply_to ne '';\n }\n \n-if (!defined $smtp_server) {\n+if (defined $smtp_server && $smtp_server ne '') {\n+\t$smtp_server_is_a_command = ($smtp_server =~ m{^/});\n+} else {\n+\n \tforeach (qw( /usr/sbin/sendmail /usr/lib/sendmail )) {\n \t\tif (-x $_) {\n \t\t\t$smtp_server = $_;\n+\t\t\t$smtp_server_is_a_command = 1;\n \t\t\tlast;\n \t\t}\n \t}\n-\t$smtp_server ||= 'localhost'; # could be 127.0.0.1, too... *shrug*\n+\n+\t$smtp_server = 'localhost'; # 127.0.0.1 is not compatible with IPv6\n+\t$smtp_server_is_a_command = 0;\n }\n \n if ($compose && $compose > 0) {\n@@ -969,7 +976,7 @@ X-Mailer: git-send-email $gitversion\n \n \tif ($dry_run) {\n \t\t# We don't want to send the email.\n-\t} elsif ($smtp_server =~ m#^/#) {\n+\t} elsif ($smtp_server_is_a_command) {\n \t\tmy $pid = open my $sm, '|-';\n \t\tdefined $pid or die $!;\n \t\tif (!$pid) {\n@@ -1045,24 +1052,28 @@ X-Mailer: git-send-email $gitversion\n \t\t$smtp->dataend() or die $smtp->message;\n \t\t$smtp->code =~ /250|200/ or die \"Failed to send $subject\\n\".$smtp->message;\n \t}\n+\n+\tprint 'Dry-' if $dry_run;\n+\n \tif ($quiet) {\n-\t\tprintf (($dry_run ? \"Dry-\" : \"\").\"Sent %s\\n\", $subject);\n+\t\tprint \"Sent $subject\\n\";\n \t} else {\n-\t\tprint (($dry_run ? \"Dry-\" : \"\").\"OK. Log says:\\n\");\n-\t\tif ($smtp_server !~ m#^/#) {\n+\t\tprint \"OK. Log says:\\n\";\n+\n+\t\tif ($smtp_server_is_a_command) {\n+\t\t\tprint \"Sendmail: $smtp_server \".join(' ',@sendmail_parameters).\"\\n\";\n+\t\t\tprint \"Result: OK\\n\";\n+\t\t} else {\n \t\t\tprint \"Server: $smtp_server\\n\";\n+\n+\t\t\t$dry_run and print \"Result: OK\\n\" or\n+\t\t\tprint \"Result: \", $smtp->code, ' ', ($smtp->message =~ /\\n([^\\n]+\\n)$/s), \"\\n\";\n+\n \t\t\tprint \"MAIL FROM:<$raw_from>\\n\";\n \t\t\tprint \"RCPT TO:\".join(',',(map { \"<$_>\" } @recipients)).\"\\n\";\n-\t\t} else {\n-\t\t\tprint \"Sendmail: $smtp_server \".join(' ',@sendmail_parameters).\"\\n\";\n \t\t}\n+\n \t\tprint $header, \"\\n\";\n-\t\tif ($smtp) {\n-\t\t\tprint \"Result: \", $smtp->code, ' ',\n-\t\t\t\t($smtp->message =~ /\\n([^\\n]+\\n)$/s), \"\\n\";\n-\t\t} else {\n-\t\t\tprint \"Result: OK\\n\";\n-\t\t}\n \t}\n \n \treturn 1;\n-- \n1.6.2.2.479.g2aec\n"},{"id":"111222","messageId":"1239647037-15381-13-git-send-email-mfwitten@gmail.com","threadId":"18852","inReplyTo":"1239647037-15381-12-git-send-email-mfwitten@gmail.com","subject":"[PATCH RFC3 12/13] send-email: --compose takes optional argument to existing file","fromName":"Michael Witten","fromEmail":"mfwitten@gmail.com","sentAt":"2009-04-13T18:23:56Z","receivedAt":"2009-04-13T18:23:56Z","isPatch":true,"sender":{"key":"mfwitten@gmail.com","avatar":"https://avatars.githubusercontent.com/u/597101?v=4"},"body":"Now, a user may specify an existing (in-progress) file to use as\nthe introductory/summary email.\n\nThe file is opened for any additional editing as usual, but it\nis not deleted upon normal termination.\n\nThere are also a number of fixes to how the internals and\ntemporaries are handled.\n\nAlso, it is no longer possible to pass --compose multiple times\nin order to edit the transformed version as well.\n\nAlso, send-email now aborts upon discovering an empty message.\n\nSigned-off-by: Michael Witten <mfwitten@gmail.com>\n---\n Documentation/git-send-email.txt |   40 +++++++--\n git-send-email.perl              |  182 ++++++++++++++++++++++++--------------\n 2 files changed, 145 insertions(+), 77 deletions(-)\n\ndiff --git a/Documentation/git-send-email.txt b/Documentation/git-send-email.txt\nindex 93cfb34..5ef8b12 100644\n--- a/Documentation/git-send-email.txt\n+++ b/Documentation/git-send-email.txt\n@@ -55,17 +55,39 @@ The --bcc option must be repeated for each user you want on the bcc list.\n +\n The --cc option must be repeated for each user you want on the cc list.\n \n---compose::\n-\tUse $GIT_EDITOR, core.editor, $VISUAL, or $EDITOR to edit an\n-\tintroductory message for the patch series.\n+--compose[=<path>]::\n+\tCreate an introductory message for the patch series; the\n+\tmessage is opened for editing with (in order of preference)\n+\t`$GIT_EDITOR`, 'core.editor', `$VISUAL`, `$EDITOR`, or `vi`.\n +\n-When '--compose' is used, git send-email will use the From, Subject, and\n-In-Reply-To headers specified in the message. If the body of the message\n-(what you type after the headers and a blank line) only contains blank\n-(or GIT: prefixed) lines the summary won't be sent, but From, Subject,\n-and In-Reply-To headers will be used unless they are removed.\n+A path for the composition may be given. If the path exists, then\n+the file at the path is opened for editing as-is. If the path\n+doesn't exist, a file with default content is created at the path\n+and opened for editing. If no path is specified, a new temporary\n+file with default content is created and opened for editing.\n +\n-Missing From or In-Reply-To headers will be prompted for.\n+Upon the successful completion of send-email, all temporary files\n+are automatically unlinked (deleted). However, if send-email is\n+terminated by a trappable signal, then this temporary file is not\n+unlinked, and the user is informed of its path.\n++\n+The user actually composes what will become a valid email message;\n+therefore, the message must have the following form (as described in\n+`RFC 822`):\n++\n+\t<headers>\n+\t<blank line>\n+\t<body>\n++\n+In particular, `<headers>` must contain the \"`Subject`\" header. Once\n+the user saves the message and quits the editor, this intermediate\n+message is transformed into the final email message by removing all\n+lines that begin with \"`GIT:`\". If the `<body>` of the final version\n+is empty, then send-email aborts without sending anything.\n++\n+The \"`From`\", \"`Subject`\", and \"`In-Reply-To`\" headers are taken\n+directly from the message; missing \"`From`\" or \"`In-Reply-To`\"\n+headers will be prompted for.\n +\n See the CONFIGURATION section for 'sendemail.multiedit'.\n \ndiff --git a/git-send-email.perl b/git-send-email.perl\nindex 8ce9d3b..2ab76c6 100755\n--- a/git-send-email.perl\n+++ b/git-send-email.perl\n@@ -58,10 +58,9 @@ git send-email [options] <file | directory | rev-list options >\n     --bcc               <address>  * Email Bcc:\n     --subject            <string>  * Email \"Subject:\"\n     --in-reply-to    <message-id>  * Email \"In-Reply-To:\"; include '<' and '>'.\n+    --compose             [<path>] * Open an editor for introduction.\n     --annotate                     * Review each patch that will be sent in\n                                      an editor.\n-    --compose                      * Open an editor for introduction.\n-\n   Sending:\n     --envelope-sender   <address>  * Email envelope sender.\n     --smtp-server          <host>  * Outgoing SMTP server.\n@@ -168,7 +167,7 @@ if ($@) {\n # Behavior modification variables\n my ($quiet, $dry_run) = (0, 0);\n my $format_patch;\n-my $compose_filename;\n+my ($compose_path, $compose_final_path);\n \n # Handle interactive edition of files.\n my $multiedit;\n@@ -234,16 +233,15 @@ sub signal_handler {\n \tsystem \"stty echo\";\n \n \t# tmp files from --compose\n-\tif (defined $compose_filename) {\n-\t\tif (-e $compose_filename) {\n-\t\t\tprint \"'$compose_filename' contains an intermediate version of the email you were composing.\\n\";\n-\t\t}\n-\t\tif (-e ($compose_filename . \".final\")) {\n-\t\t\tprint \"'$compose_filename.final' contains the composed email.\\n\"\n-\t\t}\n+\tif (defined $compose_path and -f $compose_path) {\n+\t\tprint \"'$compose_path' contains an intermediate version of the email you were composing.\\n\";\n+\t}\n+\n+\tif (defined $compose_final_path) {\n+\t\tunlink $compose_final_path if defined $compose_final_path;\n \t}\n \n-\texit;\n+\texit 1;\n };\n \n $SIG{TERM} = \\&signal_handler;\n@@ -268,8 +266,8 @@ my $rc = GetOptions(\n \t\"smtp-ssl\" => sub { $smtp_encryption = 'ssl' },\n \t\"smtp-encryption=s\" => \\$smtp_encryption,\n \t\"identity=s\" => \\$identity,\n+\t\"compose:s\" => \\$compose,\n \t\"annotate\" => \\$annotate,\n-\t\"compose\" => \\$compose,\n \t\"quiet\" => \\$quiet,\n \t\"cc-cmd=s\" => \\$cc_cmd,\n \t\"suppress-from!\" => \\$suppress_from,\n@@ -590,60 +588,108 @@ sub get_patch_subject($) {\n \tdie \"No subject line in $fn ?\";\n }\n \n-if ($compose) {\n-\t# Note that this does not need to be secure, but we will make a small\n-\t# effort to have it be unique\n-\t$compose_filename = ($repo ?\n-\t\ttempfile(\".gitsendemail.msg.XXXXXX\", DIR => $repo->repo_path()) :\n-\t\ttempfile(\".gitsendemail.msg.XXXXXX\", DIR => \".\"))[1];\n-\topen(C,\">\",$compose_filename)\n-\t\tor die \"Failed to open for writing $compose_filename: $!\";\n-\n-\n-\tmy $tpl_sender = $sender || $repoauthor || $repocommitter || '';\n-\tmy $tpl_subject = $initial_subject || '';\n-\tmy $tpl_reply_to = $initial_reply_to || '';\n-\n-\tprint C <<EOT;\n-From $tpl_sender # This line is ignored.\n-GIT: Lines beginning in \"GIT:\" will be removed.\n-GIT: Consider including an overall diffstat or table of contents\n-GIT: for the patch you are writing.\n-GIT:\n-GIT: Clear the body content if you don't wish to send a summary.\n-From: $tpl_sender\n-Subject: $tpl_subject\n-In-Reply-To: $tpl_reply_to\n+if (defined $compose) {\n \n-EOT\n-\tfor my $f (@files) {\n-\t\tprint C get_patch_subject($f);\n+\t# Some parameters for creating temporary files:\n+\n+\tmy $template = \".gitsendemail.msg.XXXXXX\";\n+\tmy @dir = (DIR => ($repo ? $repo->repo_path() : \".\"));\n+\tmy @suffix = (SUFFIX => \".final\");\n+\n+\t# Figure out the file that the user should be editing:\n+\n+\tmy $compose_path_filehandle;\n+\n+\tif ($compose eq '') { # if no path was given\n+\t\t($compose_path_filehandle, $compose_path) = tempfile($template, @dir)\n+\t\t\tor die \"--compose: Could not create temporary file for the user to edit: $!\\n\";\n+\t} else {\n+\t\t$compose_path = $compose;\n+\t\tunless (-f $compose_path) {\n+\t\t\topen $compose_path_filehandle, \">\", $compose_path\n+\t\t\t\tor die \"--compose: Could not open '$compose_path' for writing default content: $!\\n\";\n+\t\t}\n \t}\n-\tclose(C);\n+\n+\t# Fill in default content if necessary:\n+\n+\tif ($compose_path_filehandle) {\n+\n+\t\t# For convenience:\n+\n+\t\tlocal *STDOUT = $compose_path_filehandle;\n+\n+\t\t# Help the user out with some instruction and initial headers:\n+\n+\t\tmy $from = $sender || $repoauthor || $repocommitter || '';\n+\t\tmy $subject = $initial_subject || '';\n+\t\tmy $reply_to = $initial_reply_to || '';\n+\n+\t\tprint \"From $from # This line is ignored.\\n\";\n+\t\tprint \"GIT:\\n\";\n+\t\tprint \"GIT: Lines beginning in 'GIT:' will be removed.\\n\";\n+\t\tprint \"GIT:\\n\";\n+\t\tprint \"GIT: Consider including an overall diffstat\\n\";\n+\t\tprint \"GIT: (git diff --stat) or table of contents\\n\";\n+\t\tprint \"GIT: (as provide below).\\n\";\n+\t\tprint \"GIT:\\n\";\n+\t\tprint \"GIT: Clear the body content if you decide not\\n\";\n+\t\tprint \"GIT: to send this message.\\n\";\n+\t\tprint \"GIT:\\n\";\n+\t\tprint \"GIT: Here are the <headers>:\\n\";\n+\t\tprint \"From: $from\\n\";\n+\t\tprint \"Subject: $subject\\n\";\n+\t\tprint \"In-Reply-To: $reply_to\\n\";\n+\t\tprint \"\\n\";\n+\t\tprint \"GIT: This is the first line of the <body>:\\n\";\n+\t\tprint \"\\n\";\n+\n+\t\tfor my $f (@files) {\n+\t\t\tprint get_patch_subject($f);\n+\t\t}\n+\t}\n+\n+\t# Do the editing:\n \n \tif ($annotate) {\n-\t\tdo_edit($compose_filename, @files);\n+\t\tdo_edit($compose_path, @files);\n \t} else {\n-\t\tdo_edit($compose_filename);\n+\t\tdo_edit($compose_path);\n \t}\n \n-\topen(C2,\">\",$compose_filename . \".final\")\n-\t\tor die \"Failed to open $compose_filename.final : \" . $!;\n+\t# Now transform the user-edited introduction into something\n+\t# suitable for sending via email; the user's editor may have\n+\t# unlinked the original file and replaced it with an entirely\n+\t# new one. If this be the case, then it wouldn't do just to seek\n+\t# to the beginning and start reading, because then only the\n+\t# original content would be retrieved. Consequently, the file\n+\t# must be reopened to be safe (note, the original filehandle is\n+\t# closed automatically):\n+\n+\tunless (-f $compose_path) {\n+\t\tdie \"--compose: File '$compose_path' doesn't exist; aborting.\\n\";\n+\t}\n+\n+\topen $compose_path_filehandle, \"<\", $compose_path\n+\t\tor die \"--compose: Failed to open '$compose_path' for reading: $!\";\n \n-\topen(C,\"<\",$compose_filename)\n-\t\tor die \"Failed to open $compose_filename : \" . $!;\n+\t# Create the final version:\n \n-\tmy $need_8bit_cte = file_has_nonascii($compose_filename);\n+\t(my $compose_final_file, $compose_final_path) = tempfile($template, @dir, @suffix)\n+\t\tor die \"--compose: Could not create temporary file for final version: $!\\n\";\n+\n+\tmy ($subject, $reply_to, $from);\n+\tmy $need_8bit_cte = file_has_nonascii($compose_path);\n \tmy $in_body = 0;\n \tmy $summary_empty = 1;\n-\twhile(<C>) {\n+\twhile(<$compose_path_filehandle>) {\n \t\tnext if m/^GIT:/;\n \t\tif ($in_body) {\n \t\t\t$summary_empty = 0 unless (/^\\n$/);\n \t\t} elsif (/^\\n$/) {\n \t\t\t$in_body = 1;\n \t\t\tif ($need_8bit_cte) {\n-\t\t\t\tprint C2\n+\t\t\t\tprint $compose_final_file\n \t\t\t\t\t\"MIME-Version: 1.0\\n\",\n \t\t\t\t\t\"Content-Type: text/plain; \",\n \t\t\t\t\t\"charset=utf-8\\n\",\n@@ -653,12 +699,7 @@ EOT\n \t\t\t$need_8bit_cte = 0;\n \t\t} elsif (/^Subject:\\s*(.+)\\s*$/i) {\n \t\t\t$initial_subject = $1;\n-\t\t\tmy $subject = $initial_subject;\n-\t\t\t$_ = \"Subject: \" .\n-\t\t\t\t($subject =~ /[^[:ascii:]]/ ?\n-\t\t\t\tquote_rfc2047($subject) :\n-\t\t\t\t$subject) .\n-\t\t\t\t\"\\n\";\n+\t\t\tnext;\n \t\t} elsif (/^In-Reply-To:\\s*(.+)\\s*$/i) {\n \t\t\t$initial_reply_to = $1;\n \t\t\tnext;\n@@ -669,15 +710,14 @@ EOT\n \t\t\tprint \"To/Cc/Bcc fields are not interpreted yet, they have been ignored\\n\";\n \t\t\tnext;\n \t\t}\n-\t\tprint C2 $_;\n-\t}\n-\tclose(C);\n-\tclose(C2);\n \n-\tif ($summary_empty) {\n-\t\tprint \"Summary email is empty, skipping it\\n\";\n-\t\t$compose = -1;\n+\t\tprint $compose_final_file $_;\n \t}\n+\n+\t$summary_empty and die \"Introductory email is empty; aborting.\\n\";\n+\n+\tunshift(@files, $compose_final_path);\n+\n } elsif ($annotate) {\n \tdo_edit(@files);\n }\n@@ -770,10 +810,6 @@ if (defined $smtp_server && $smtp_server ne '') {\n \t$smtp_server_is_a_command = 0;\n }\n \n-if ($compose && $compose > 0) {\n-\t@files = ($compose_filename . \".final\", @files);\n-}\n-\n # Variables we set as part of the loop over files\n our ($message_id, %mail, $subject, $reply_to, $references, $message,\n \t$needs_confirm, $message_num, $ask_default);\n@@ -918,9 +954,12 @@ sub send_message\n \tmy $sanitized_sender = sanitize_address($sender);\n \tmake_message_id() unless defined($message_id);\n \n+\tmy $has_non_ascii = ($subject =~ /[^[:ascii:]]/);\n+\tmy $sanitized_subject = $has_non_ascii ? quote_rfc2047($subject) : $subject;\n+\n \tmy $header = \"From: $sanitized_sender\n To: $to${ccline}\n-Subject: $subject\n+Subject: $sanitized_subject\n Date: $date\n Message-Id: $message_id\n X-Mailer: git-send-email $gitversion\n@@ -1280,7 +1319,14 @@ for (my $index = 0; $index < @files; $index++) {\n cleanup_compose_files();\n \n sub cleanup_compose_files() {\n-\tunlink($compose_filename, $compose_filename . \".final\") if $compose;\n+\n+\tif (defined $compose_final_path) {\n+\t\tunlink $compose_final_path;\n+\t}\n+\n+\tif (defined $compose_path and not $compose) {\n+\t\tunlink $compose_path;\n+\t}\n }\n \n $smtp->quit if $smtp;\n-- \n1.6.2.2.479.g2aec\n"},{"id":"111223","messageId":"1239647037-15381-14-git-send-email-mfwitten@gmail.com","threadId":"18852","inReplyTo":"1239647037-15381-13-git-send-email-mfwitten@gmail.com","subject":"[PATCH RFC3 13/13] send-email: --compose always includes a 'GIT: ' prefixed list of patch subjects","fromName":"Michael Witten","fromEmail":"mfwitten@gmail.com","sentAt":"2009-04-13T18:23:57Z","receivedAt":"2009-04-13T18:23:57Z","isPatch":true,"sender":{"key":"mfwitten@gmail.com","avatar":"https://avatars.githubusercontent.com/u/597101?v=4"},"body":"I've found that having a list of the patch subjects appended to\nthe end of an existing --compose email is quite useful.\n\nI've tried to make appending smart enough not to alter existing\nlines beyond the addition of some kind of newline.\n\nSigned-off-by: Michael Witten <mfwitten@gmail.com>\n---\n Documentation/git-send-email.txt |    3 ++-\n git-send-email.perl              |   20 ++++++++++++++++++--\n 2 files changed, 20 insertions(+), 3 deletions(-)\n\ndiff --git a/Documentation/git-send-email.txt b/Documentation/git-send-email.txt\nindex 5ef8b12..6edef52 100644\n--- a/Documentation/git-send-email.txt\n+++ b/Documentation/git-send-email.txt\n@@ -61,7 +61,8 @@ The --cc option must be repeated for each user you want on the cc list.\n \t`$GIT_EDITOR`, 'core.editor', `$VISUAL`, `$EDITOR`, or `vi`.\n +\n A path for the composition may be given. If the path exists, then\n-the file at the path is opened for editing as-is. If the path\n+the file at the path is opened for editing with the list of patch\n+subjects (prefixed with 'GIT: ') appended to the end. If the path\n doesn't exist, a file with default content is created at the path\n and opened for editing. If no path is specified, a new temporary\n file with default content is created and opened for editing.\ndiff --git a/git-send-email.perl b/git-send-email.perl\nindex 2ab76c6..696b132 100755\n--- a/git-send-email.perl\n+++ b/git-send-email.perl\n@@ -644,9 +644,25 @@ if (defined $compose) {\n \t\tprint \"GIT: This is the first line of the <body>:\\n\";\n \t\tprint \"\\n\";\n \n-\t\tfor my $f (@files) {\n-\t\t\tprint get_patch_subject($f);\n+\t\tprint get_patch_subject($_) for (@files);\n+\n+\t} else {\n+\n+\t\t# Supply a listing of the patch subjects, in case\n+\t\t# it might be useful to the user:\n+\n+\t\topen $compose_path_filehandle, \"+<\", $compose_path\n+\t\t\tor die \"--compose: Could not open '$compose_path' for appending listing: $!\\n\";\n+\n+\t\t# Figure out whether we should begin a new line\n+\t\t# (we don't want to append to an existing line):\n+\n+\t\tif (seek $compose_path_filehandle, -1, 2) {\n+\t\t\tread $compose_path_filehandle, my $c, 1;\n+\t\t\t$c !~ /\\n|\\r/ and print $compose_path_filehandle \"\\n\";\n \t\t}\n+\n+\t\tprint $compose_path_filehandle get_patch_subject($_) for (@files);\n \t}\n \n \t# Do the editing:\n-- \n1.6.2.2.479.g2aec\n"},{"id":"111224","messageId":"b4087cc50904131145g4fa262e7g7ecdf8d7f8e86a9c@mail.gmail.com","threadId":"18852","inReplyTo":"1239647037-15381-1-git-send-email-mfwitten@gmail.com","subject":"Re: [PATCH RFC3 INTRO] I hope this will do it!","fromName":"Michael Witten","fromEmail":"mfwitten@gmail.com","sentAt":"2009-04-13T18:45:20Z","receivedAt":"2009-04-13T18:45:20Z","isPatch":true,"sender":{"key":"mfwitten@gmail.com","avatar":"https://avatars.githubusercontent.com/u/597101?v=4"},"body":"On Mon, Apr 13, 2009 at 13:23, Michael Witten <mfwitten@gmail.com> wrote:\n>  Docs: send-email: Remove superfluous information in CONFIGURATION\n>    * Remove comment block?\n>\n>  Docs: send-email: Put options back into alphabetical order\n>    * Remove comment block?\n\ns/?//\n\n>    [PATCH RFC3 12/13] send-email: --compose takes optional argument to existing file\n\nThis would be better: \"send-email: --compose takes optional path\"\n"},{"id":"111232","messageId":"7vljq4e10q.fsf@gitster.siamese.dyndns.org","threadId":"18852","inReplyTo":"1239647037-15381-4-git-send-email-mfwitten@gmail.com","subject":"Re: [PATCH RFC3 03/13] Docs: send-email: Remove superfluous information in CONFIGURATION","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2009-04-13T20:45:09Z","receivedAt":"2009-04-13T20:45:09Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"I\nMichael Witten <mfwitten@gmail.com> writes:\n\n> n particular, sendemail.confirm was removed, because it's already\n> described along with its corresponding option.\n>\n> Signed-off-by: Michael Witten <mfwitten@gmail.com>\n> ---\n>  Documentation/git-send-email.txt |    6 ------\n>  1 files changed, 0 insertions(+), 6 deletions(-)\n>\n> diff --git a/Documentation/git-send-email.txt b/Documentation/git-send-email.txt\n> index 7b87d6e..b58b433 100644\n> --- a/Documentation/git-send-email.txt\n> +++ b/Documentation/git-send-email.txt\n> @@ -271,12 +271,6 @@ sendemail.multiedit::\n>  \tsummary when '--compose' is used). If false, files will be edited one\n>  \tafter the other, spawning a new editor each time.\n>  \n> -sendemail.confirm::\n> -\tSets the default for whether to confirm before sending. Must be\n> -\tone of 'always', 'never', 'cc', 'compose', or 'auto'. See '--confirm'\n> -\tin the previous section for the meaning of these values.\n\nI am not sure if this is a good idea.  It may look \"superfluous\" for\npeople who read the manual cover-to-cover.  However, a new person whose\nmentor allowed her to peek into his configuration to learn tricks from may\nfind sendemail.confirm and would try to find an entry in the manual.  The\nchange in this patch will make it inconvenient to go from variable to\ndescription.\n"},{"id":"111233","messageId":"7vhc0se0pc.fsf@gitster.siamese.dyndns.org","threadId":"18852","inReplyTo":"1239647037-15381-6-git-send-email-mfwitten@gmail.com","subject":"Re: [PATCH RFC3 05/13] send-email: Cleanup the usage text and docs a bit","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2009-04-13T20:51:59Z","receivedAt":"2009-04-13T20:51:59Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Michael Witten <mfwitten@gmail.com> writes:\n\n> All usage text lines should be < 80 characters.\n>\n> A port number in --smtp-server is no longer handled,\n> so the suggestion has been removed.\n\nThat makes it sound like there is a regression.\n\n\trequire Net::SMTP;\n\t$smtp ||= Net::SMTP->new((defined $smtp_server_port)\n\t\t\t\t ? \"$smtp_server:$smtp_server_port\"\n\t\t\t\t : $smtp_server);\n\nand because Net::SMTP is a subclass of IO::Socket::INET, I'd assume that\nthis use will accept smtp_server=there:submission when $smtp_server_port\nis undef.\n\n> ---in-reply-to=<identifier>::\n> +--in-reply-to=<message-id>::\n\nChanges along this line in your patch looked sensible, except for the\n\"identity\" one which is a bit iffy.\n\nOther than that I think the patch is sane.\n"},{"id":"111234","messageId":"7vab6ke0ip.fsf@gitster.siamese.dyndns.org","threadId":"18852","inReplyTo":"1239647037-15381-10-git-send-email-mfwitten@gmail.com","subject":"Re: [PATCH RFC3 09/13] send-email: Remove horrible mix of tabs and spaces","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2009-04-13T20:55:58Z","receivedAt":"2009-04-13T20:55:58Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Michael Witten <mfwitten@gmail.com> writes:\n\n> Currently, no lines match the following:\n>\n>     [\\t]+[ ]+\n>     [ ]+[\\t]+\n\nI understand the latter but what's wrong with the former?  The width of a\nHT is by definition 8 columns throughout the git codebase.\n"},{"id":"111247","messageId":"b4087cc50904131530p75cdc59cu57b6c0d697409d86@mail.gmail.com","threadId":"18852","inReplyTo":"7vljq4e10q.fsf@gitster.siamese.dyndns.org","subject":"Re: [PATCH RFC3 03/13] Docs: send-email: Remove superfluous information in CONFIGURATION","fromName":"Michael Witten","fromEmail":"mfwitten@gmail.com","sentAt":"2009-04-13T22:30:59Z","receivedAt":"2009-04-13T22:30:59Z","isPatch":true,"sender":{"key":"mfwitten@gmail.com","avatar":"https://avatars.githubusercontent.com/u/597101?v=4"},"body":"On Mon, Apr 13, 2009 at 15:45, Junio C Hamano <gitster@pobox.com> wrote:\n> I am not sure if this is a good idea.  It may look \"superfluous\" for\n> people who read the manual cover-to-cover.\n\nPeople don't do this? How else are you supposed to know what's going on?\n\n> However, a new person whose\n> mentor allowed her to peek into his configuration to learn tricks from may\n> find sendemail.confirm and would try to find an entry in the manual.  The\n> change in this patch will make it inconvenient to go from variable to\n> description.\n\nWell, couldn't she search? I doubt she'd try to look in the CONFIGURATION\nsection anyway. I certainly wouldn't know about it without more experience.\n\nAnyway, it's actually how this man page has been organized for a while; you'll\nnotice that the CONFIGURATION section is pretty empty.\n\nPerhaps the CONFIGURATION section should at least reference the associated\ncommand line argument, where a description can be found.\n"},{"id":"111248","messageId":"b4087cc50904131542q7354fa05wb763f70e4baf9abb@mail.gmail.com","threadId":"18852","inReplyTo":"7vhc0se0pc.fsf@gitster.siamese.dyndns.org","subject":"Re: [PATCH RFC3 05/13] send-email: Cleanup the usage text and docs a bit","fromName":"Michael Witten","fromEmail":"mfwitten@gmail.com","sentAt":"2009-04-13T22:42:45Z","receivedAt":"2009-04-13T22:42:45Z","isPatch":true,"sender":{"key":"mfwitten@gmail.com","avatar":"https://avatars.githubusercontent.com/u/597101?v=4"},"body":"On Mon, Apr 13, 2009 at 15:51, Junio C Hamano <gitster@pobox.com> wrote:\n> Michael Witten <mfwitten@gmail.com> writes:\n>\n>> All usage text lines should be < 80 characters.\n>>\n>> A port number in --smtp-server is no longer handled,\n>> so the suggestion has been removed.\n>\n> That makes it sound like there is a regression.\n>\n>        require Net::SMTP;\n>        $smtp ||= Net::SMTP->new((defined $smtp_server_port)\n>                                 ? \"$smtp_server:$smtp_server_port\"\n>                                 : $smtp_server);\n>\n> and because Net::SMTP is a subclass of IO::Socket::INET, I'd assume that\n> this use will accept smtp_server=there:submission when $smtp_server_port\n> is undef.\n\nI may have been concerned that the SSL connection code doesn't support\na host:port specification, so I thought it would be easier not to\nadvertise it:\n\n>    if ($smtp_encryption eq 'ssl') {\n>        $smtp_server_port ||= 465; # ssmtp\n>        require Net::SMTP::SSL;\n>        $smtp ||= Net::SMTP::SSL->new($smtp_server, Port => $smtp_server_port);\n>    }\n\n\n>> ---in-reply-to=<identifier>::\n>> +--in-reply-to=<message-id>::\n>\n> Changes along this line in your patch looked sensible, except for the\n> \"identity\" one which is a bit iffy.\n\nThe change to <id> ? Well, I did so, because the usage text uses <id>\nfor compactness; I think everything else matches.\n"},{"id":"111249","messageId":"b4087cc50904131549sec5acc4m7201b1411245b95f@mail.gmail.com","threadId":"18852","inReplyTo":"7vab6ke0ip.fsf@gitster.siamese.dyndns.org","subject":"Re: [PATCH RFC3 09/13] send-email: Remove horrible mix of tabs and spaces","fromName":"Michael Witten","fromEmail":"mfwitten@gmail.com","sentAt":"2009-04-13T22:49:55Z","receivedAt":"2009-04-13T22:49:55Z","isPatch":true,"sender":{"key":"mfwitten@gmail.com","avatar":"https://avatars.githubusercontent.com/u/597101?v=4"},"body":"On Mon, Apr 13, 2009 at 15:55, Junio C Hamano <gitster@pobox.com> wrote:\n> Michael Witten <mfwitten@gmail.com> writes:\n>\n>> Currently, no lines match the following:\n>>\n>>     [\\t]+[ ]+\n>>     [ ]+[\\t]+\n>\n> I understand the latter but what's wrong with the former?  The width of a\n> HT is by definition 8 columns throughout the git codebase.\n\nAh, well, the width of a HT has been a free variable in my\ncalculations; I was operating under the assumption that whitespace\nused for indentation can float freely according to the user's\nsettings. A few of the lines were aligning function arguments via tabs\nand a few extra spaces, which is not reliable in my model.\n\nFrankly, I don't like tabs and spaces sharing the same contiguous\nblock. I don't like it all. ;-B\n"},{"id":"111253","messageId":"49E3CD48.1010809@gmail.com","threadId":"18852","inReplyTo":"1239647037-15381-9-git-send-email-mfwitten@gmail.com","subject":"Re: [PATCH RFC3 08/13] send-email: Remove superfluous `my $editor = ...'","fromName":"Stephen Boyd","fromEmail":"bebarino@gmail.com","sentAt":"2009-04-13T23:39:52Z","receivedAt":"2009-04-13T23:39:52Z","isPatch":true,"sender":{"key":"bebarino@gmail.com","avatar":"https://avatars.githubusercontent.com/u/38832?v=4"},"body":"Michael Witten wrote:\n> -\tmy $editor = $ENV{GIT_EDITOR} || Git::config(@repo, \"core.editor\") || $ENV{VISUAL} || $ENV{EDITOR} || \"vi\";\n\nI don't want to start an editor war, but why is 'vi' here? It seems that one of the previous four should be set at all times, correct?\n"},{"id":"111254","messageId":"b4087cc50904131741h70668a48ta52797722e9fdf38@mail.gmail.com","threadId":"18852","inReplyTo":"49E3CD48.1010809@gmail.com","subject":"Re: [PATCH RFC3 08/13] send-email: Remove superfluous `my $editor = ...'","fromName":"Michael Witten","fromEmail":"mfwitten@gmail.com","sentAt":"2009-04-14T00:41:31Z","receivedAt":"2009-04-14T00:41:31Z","isPatch":true,"sender":{"key":"mfwitten@gmail.com","avatar":"https://avatars.githubusercontent.com/u/597101?v=4"},"body":"On Mon, Apr 13, 2009 at 18:39, Stephen Boyd <bebarino@gmail.com> wrote:\n> I don't want to start an editor war, but why is 'vi' here?\n\nThe program vi is on every single Unix installation. Take that as an axiom.\n"},{"id":"111255","messageId":"b4087cc50904131743u304af7cctda582774e0d55059@mail.gmail.com","threadId":"18852","inReplyTo":"b4087cc50904131741h70668a48ta52797722e9fdf38@mail.gmail.com","subject":"Re: [PATCH RFC3 08/13] send-email: Remove superfluous `my $editor = ...'","fromName":"Michael Witten","fromEmail":"mfwitten@gmail.com","sentAt":"2009-04-14T00:43:08Z","receivedAt":"2009-04-14T00:43:08Z","isPatch":true,"sender":{"key":"mfwitten@gmail.com","avatar":"https://avatars.githubusercontent.com/u/597101?v=4"},"body":"On Mon, Apr 13, 2009 at 19:41, Michael Witten <mfwitten@gmail.com> wrote:\n> On Mon, Apr 13, 2009 at 18:39, Stephen Boyd <bebarino@gmail.com> wrote:\n>> I don't want to start an editor war, but why is 'vi' here?\n>\n> The program vi is on every single Unix installation. Take that as an axiom.\n\nHowever, I would be OK with confronting the user about setting one of\nthe variables.\n"},{"id":"111261","messageId":"49E41F99.6010409@op5.se","threadId":"18852","inReplyTo":"b4087cc50904131549sec5acc4m7201b1411245b95f@mail.gmail.com","subject":"Re: [PATCH RFC3 09/13] send-email: Remove horrible mix of tabs and spaces","fromName":"Andreas Ericsson","fromEmail":"ae@op5.se","sentAt":"2009-04-14T05:31:05Z","receivedAt":"2009-04-14T05:31:05Z","isPatch":true,"sender":{"key":"ae@op5.se","avatar":"https://gravatar.com/avatar/426e89595c75a8f5252dd0c989e5fabe5bcac616e68557427ad9aef6b0ca342a?d=mp&s=160"},"body":"Michael Witten wrote:\n> On Mon, Apr 13, 2009 at 15:55, Junio C Hamano <gitster@pobox.com> wrote:\n>> Michael Witten <mfwitten@gmail.com> writes:\n>>\n>>> Currently, no lines match the following:\n>>>\n>>>     [\\t]+[ ]+\n>>>     [ ]+[\\t]+\n>> I understand the latter but what's wrong with the former?  The width of a\n>> HT is by definition 8 columns throughout the git codebase.\n> \n> Ah, well, the width of a HT has been a free variable in my\n> calculations; I was operating under the assumption that whitespace\n> used for indentation can float freely according to the user's\n> settings. A few of the lines were aligning function arguments via tabs\n> and a few extra spaces, which is not reliable in my model.\n> \n> Frankly, I don't like tabs and spaces sharing the same contiguous\n> block. I don't like it all. ;-B\n\n\nUsing tabs to align stuff to indentation level and spaces to align\nline continuation is the only possible way to let users choose\nwhichever indentation depth they want while preserving the continuation\nalignment. What's not to like about that? Especially if you think a\nhorizontal tab can be any size at all, you should be all agog.\n\n-- \nAndreas Ericsson                   andreas.ericsson@op5.se\nOP5 AB                             www.op5.se\nTel: +46 8-230225                  Fax: +46 8-230231\n\nConsidering the successes of the wars on alcohol, poverty, drugs and\nterror, I think we should give some serious thought to declaring war\non peace.\n"},{"id":"111263","messageId":"7vfxgbaj5s.fsf@gitster.siamese.dyndns.org","threadId":"18852","inReplyTo":"b4087cc50904131542q7354fa05wb763f70e4baf9abb@mail.gmail.com","subject":"Re: [PATCH RFC3 05/13] send-email: Cleanup the usage text and docs a bit","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2009-04-14T05:39:11Z","receivedAt":"2009-04-14T05:39:11Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Michael Witten <mfwitten@gmail.com> writes:\n\n>>> A port number in --smtp-server is no longer handled,\n>>> so the suggestion has been removed.\n> ...\n> I may have been concerned that the SSL connection code doesn't support\n> a host:port specification, so I thought it would be easier not to\n> advertise it:\n\nThese two statements contradict with each other.  Please make up your mind\n;-).\n"},{"id":"111265","messageId":"b4087cc50904132300m391ac4ffn6a41ecc5cdcb6ed8@mail.gmail.com","threadId":"18852","inReplyTo":"7vfxgbaj5s.fsf@gitster.siamese.dyndns.org","subject":"Re: [PATCH RFC3 05/13] send-email: Cleanup the usage text and docs a bit","fromName":"Michael Witten","fromEmail":"mfwitten@gmail.com","sentAt":"2009-04-14T06:00:13Z","receivedAt":"2009-04-14T06:00:13Z","isPatch":true,"sender":{"key":"mfwitten@gmail.com","avatar":"https://avatars.githubusercontent.com/u/597101?v=4"},"body":"On Tue, Apr 14, 2009 at 00:39, Junio C Hamano <gitster@pobox.com> wrote:\n> Michael Witten <mfwitten@gmail.com> writes:\n>\n>>>> A port number in --smtp-server is no longer handled,\n>>>> so the suggestion has been removed.\n>> ...\n>> I may have been concerned that the SSL connection code doesn't support\n>> a host:port specification, so I thought it would be easier not to\n>> advertise it:\n>\n> These two statements contradict with each other.  Please make up your mind\n> ;-).\n\nI'm confused.\n\nThe usage text for --smtp-server currently has <host:port>, which\ndoesn't work when 'ssl' is used for the connection to the server.\nHowever, the other forms of connection DO work when a <host:port>\naddress is given.\n\nI set out to add <host:port> support for SSL, but then decided that\npeople should just use the --smtp-server-port input. It already works\nfor every connection method and why else have it? However, rather than\nremove ALL support for <host:port>, I just changed <host:port> to\n<host> in the usage text for --smtp-server.\n\nSo, effectively, I've deprecated <host:port> by changing the\ndocumentation, but the code hasn't changed. Would you rather support\n<host:port> for everything?\n"},{"id":"111267","messageId":"20090414061645.GB3948@atjola.homenet","threadId":"18852","inReplyTo":"49E3CD48.1010809@gmail.com","subject":"Re: [PATCH RFC3 08/13] send-email: Remove superfluous `my $editor = ...'","fromName":"Björn Steinbrink","fromEmail":"b.steinbrink@gmx.de","sentAt":"2009-04-14T06:16:45Z","receivedAt":"2009-04-14T06:16:45Z","isPatch":true,"sender":{"key":"b.steinbrink@gmx.de","avatar":"https://avatars.githubusercontent.com/u/230962?v=4"},"body":"On 2009.04.13 16:39:52 -0700, Stephen Boyd wrote:\n> Michael Witten wrote:\n>> -\tmy $editor = $ENV{GIT_EDITOR} || Git::config(@repo, \"core.editor\") || $ENV{VISUAL} || $ENV{EDITOR} || \"vi\";\n>\n> I don't want to start an editor war, but why is 'vi' here? It seems\n> that one of the previous four should be set at all times, correct?\n\nProbably because that's how the rest of git works, too. See core.editor\nin git-config(1) or launch_editor() in editor.c if you don't trust the\ndocs.\n\nOh, and I seem to rely on that behaviour :-)\n\nBjörn\n"},{"id":"111268","messageId":"7vws9n92q3.fsf@gitster.siamese.dyndns.org","threadId":"18852","inReplyTo":"49E41F99.6010409@op5.se","subject":"Re: [PATCH RFC3 09/13] send-email: Remove horrible mix of tabs and spaces","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2009-04-14T06:19:32Z","receivedAt":"2009-04-14T06:19:32Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Andreas Ericsson <ae@op5.se> writes:\n\n> Using tabs to align stuff to indentation level and spaces to align\n> line continuation is the only possible way to let users choose\n> whichever indentation depth they want while preserving the continuation\n> alignment.\n\nSure, it will look aligned with whatever width of HT \">\":\n\n\t>>if (this is a looong\n        >>....expression that is alighed) {\n        >>>statement1;\n        >>>statement2;\n        >>}\n\nbut it is *only true* if your SP \".\" and everything else is of the same\nwidth.\n\nPeople seem to repeat that without realizing what they are saying, but I\nfind the assumption the argument is based on quite bogus.  Why do people\nthink it is only sane to assume flexible HT width but still monospaced\nfont whose SP, l and w are all of the same width?\n\nYou either forget about the alignment (there is no such thing---suck it\nup), or use time honored HT=8 and monospace convention.\n\nAnd this project uses the latter.\n"},{"id":"111272","messageId":"7vfxgb91hc.fsf@gitster.siamese.dyndns.org","threadId":"18852","inReplyTo":"b4087cc50904132300m391ac4ffn6a41ecc5cdcb6ed8@mail.gmail.com","subject":"Re: [PATCH RFC3 05/13] send-email: Cleanup the usage text and docs a bit","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2009-04-14T06:46:23Z","receivedAt":"2009-04-14T06:46:23Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Michael Witten <mfwitten@gmail.com> writes:\n\n> The usage text for --smtp-server currently has <host:port>, which\n> doesn't work when 'ssl' is used for the connection to the server.\n\nAh, I see.  But it does work when ssl is not used, right?  A possible\nsolution would be one of:\n\n - support host:port in SSL codepath (shouldn't it be trivial?);\n\n - split the description in the documentation to clarify it does not work\n   for SSL; or\n\n - remove host:port support to make both consistent.\n\nTo me, the last one makes the least sense.  Is that the approach you are\ntaking?\n"},{"id":"111273","messageId":"27f7c25b-7bdc-40d1-a601-bd162ebbe2f2@gmail.com","threadId":"18852","inReplyTo":"49E41F99.6010409@op5.se","subject":"Re: [PATCH RFC3 09/13] send-email: Remove horrible mix of tabs and spaces","fromName":"Michael Witten","fromEmail":"mfwitten@gmail.com","sentAt":"2009-04-14T07:03:54Z","receivedAt":"2009-04-14T07:03:54Z","isPatch":true,"sender":{"key":"mfwitten@gmail.com","avatar":"https://avatars.githubusercontent.com/u/597101?v=4"},"body":"On Tue, Apr 14, 2009 at 00:31, Andreas Ericsson <ae@op5.se> wrote:\n> Michael Witten wrote:\n>>\n>> On Mon, Apr 13, 2009 at 15:55, Junio C Hamano <gitster@pobox.com> wrote:\n>>>\n>>> Michael Witten <mfwitten@gmail.com> writes:\n>>>\n>>>> Currently, no lines match the following:\n>>>>\n>>>>    [\\t]+[ ]+\n>>>>    [ ]+[\\t]+\n>>>\n>>> I understand the latter but what's wrong with the former?  The width of a\n>>> HT is by definition 8 columns throughout the git codebase.\n>>\n>> Ah, well, the width of a HT has been a free variable in my\n>> calculations; I was operating under the assumption that whitespace\n>> used for indentation can float freely according to the user's\n>> settings. A few of the lines were aligning function arguments via tabs\n>> and a few extra spaces, which is not reliable in my model.\n>>\n>> Frankly, I don't like tabs and spaces sharing the same contiguous\n>> block. I don't like it all. ;-B\n>\n> Using tabs to align stuff to indentation level and spaces to align\n> line continuation is the only possible way to let users choose\n> whichever indentation depth they want while preserving the continuation\n> alignment. What's not to like about that? Especially if you think a\n> horizontal tab can be any size at all, you should be all agog.\n\nHowever, nobody ever gets that right, because they don't understand\nwhat you mean by indentation level. For most code that people write,\nindentation whitespace overlaps with non-whitespace (from the\nprevious line). Therefore, the spaces used for continuation alignment\nwith the previous line are left 'sitting on shaky ground'. For\ninstance, consider this fine piece of code, given by lines 609-612 in\nbuiltin-log.c. If you're viewing this code with a monospace font and\nHT set to 8 columns, then the tab->spaces expansion should give the\nfollowing result (monospace font required to view this properly):\n\nstatic void make_cover_letter(struct rev_info *rev, int use_stdout,\n                              int numbered, int numbered_files,\n                              struct commit *origin,\n                              int nr, struct commit **list, struct commit *head)\n\nBeautiful, isn't it?\n\nIn this case, we're at indentation level ---> 0 <---, and this means\nthat to form the continuation alignment, 0 tabs should be used\nfollowed by however many spaces are needed to achieve the alignment.\nHowever, whoever wrote that code actually used indentation level 3:\n\n<HT><HT><HT><SP><SP><SP><SP><SP><SP>\n\nThe problem is that variable-width characters (HTs) are being aligned\nwith fixed-width characters. For shame!\n\nTo be explicit, if the HT width is set to 4, the result would be\n(after HT->spaces expansion):\n\nstatic void make_cover_letter(struct rev_info *rev, int use_stdout,\n                  int numbered, int numbered_files,\n                  struct commit *origin,\n                  int nr, struct commit **list, struct commit *head)\n\nClearly, this is never a problem if you declare HTs to be fixed-width\n(which, I believe, Linus did do: 8 columns per HT), or if you can\nremember that HTs should never be used to align against non-HTs.\n\nWhat I like to do is provide a more regular structure that removes the\njuxtaposition of indentation and alignment whitespace. Basically, HTs\nand spaces should never be contiguous, and the first use of a non-HT\nprohibits HTs from being used anywhere further down the line. Also,\nthe structure of the code should facilitate identation levels:\n\nstatic void make_cover_letter\n(\n\t/* These are all at indentation level 1 */\n\n\tstruct rev_info* rev            ,\n\tint              use_stdout     ,\n\tint              numbered       ,\n\tint              numbered_files ,\n\tstruct commit*   origin         ,\n\tint              nr             ,\n\tstruct commit**  list           ,\n\tstruct commit*   head\n)\n{\n\t/* Code at indentation level 1 */\n}\n\nYeah, yeah, I know it's crazy, but it makes code wildly readable---to me.\n\nSincerely,\nMichael Witten\n"},{"id":"111274","messageId":"b4087cc50904140015t459f0656te30dcb0dfc6a063@mail.gmail.com","threadId":"18852","inReplyTo":"7vfxgb91hc.fsf@gitster.siamese.dyndns.org","subject":"Re: [PATCH RFC3 05/13] send-email: Cleanup the usage text and docs a bit","fromName":"Michael Witten","fromEmail":"mfwitten@gmail.com","sentAt":"2009-04-14T07:15:51Z","receivedAt":"2009-04-14T07:15:51Z","isPatch":true,"sender":{"key":"mfwitten@gmail.com","avatar":"https://avatars.githubusercontent.com/u/597101?v=4"},"body":"On Tue, Apr 14, 2009 at 01:46, Junio C Hamano <gitster@pobox.com> wrote:\n> Michael Witten <mfwitten@gmail.com> writes:\n>\n>> The usage text for --smtp-server currently has <host:port>, which\n>> doesn't work when 'ssl' is used for the connection to the server.\n>\n> Ah, I see.  But it does work when ssl is not used, right?\n\nRight.\n\n> A possible solution would be one of:\n>\n>  - support host:port in SSL codepath (shouldn't it be trivial?);\n\nExtremely trivial.\n\n>  - split the description in the documentation to clarify it does not work\n>   for SSL; or\n>\n>  - remove host:port support to make both consistent.\n>\n> To me, the last one makes the least sense.  Is that the approach you are\n> taking?\n\nThat is SORT OF the approach I took. I got lazy and didn't care to\nmake <host:port> work for SSL, because there is already\n--smtp-server-port and by just replacing <host:port> with <host> in\nthe USAGE text, the whole <host:port> notation was effectively\ndeprecated but still usable as before. Genius, right? Grade *A*\nlaziness.\n"},{"id":"111275","messageId":"49E43899.7070804@op5.se","threadId":"18852","inReplyTo":"7vws9n92q3.fsf@gitster.siamese.dyndns.org","subject":"Re: [PATCH RFC3 09/13] send-email: Remove horrible mix of tabs and spaces","fromName":"Andreas Ericsson","fromEmail":"ae@op5.se","sentAt":"2009-04-14T07:17:45Z","receivedAt":"2009-04-14T07:17:45Z","isPatch":true,"sender":{"key":"ae@op5.se","avatar":"https://gravatar.com/avatar/426e89595c75a8f5252dd0c989e5fabe5bcac616e68557427ad9aef6b0ca342a?d=mp&s=160"},"body":"Junio C Hamano wrote:\n> Andreas Ericsson <ae@op5.se> writes:\n> \n>> Using tabs to align stuff to indentation level and spaces to align\n>> line continuation is the only possible way to let users choose\n>> whichever indentation depth they want while preserving the continuation\n>> alignment.\n> \n> Sure, it will look aligned with whatever width of HT \">\":\n> \n> \t>>if (this is a looong\n>         >>....expression that is alighed) {\n>         >>>statement1;\n>         >>>statement2;\n>         >>}\n> \n> but it is *only true* if your SP \".\" and everything else is of the same\n> width.\n> \n> People seem to repeat that without realizing what they are saying, but I\n> find the assumption the argument is based on quite bogus.  Why do people\n> think it is only sane to assume flexible HT width but still monospaced\n> font whose SP, l and w are all of the same width?\n> \n\nBecause 99% of all editors designed for programming use a fixed-width font\nby default for precisely that reason, and all others can be set to display\nfixed-width fonts without losing much (if any) readability, but indentation\ncomes in 2*$number_of_programmers variations.\n\n\n> You either forget about the alignment (there is no such thing---suck it\n> up), or use time honored HT=8 and monospace convention.\n> \n\nOr you use \"indent with tabs, align with spaces\" and let those who use a\nword processor for programming go hang. It's quite common actually. Or\nyou use some own homecooked style of indentation that's quite obvious\n*to you* Either way, a project's founding father always sets the style,\nand those who contribute get to either follow it or provide some pretty\nstrong argument to change it (a lot better than:\n\n\"A few of the lines were aligning function arguments via tabs\nand a few extra spaces, which is not reliable in my model.\n\nFrankly, I don't like tabs and spaces sharing the same contiguous\nblock. I don't like it all.\"\n\n-- \nAndreas Ericsson                   andreas.ericsson@op5.se\nOP5 AB                             www.op5.se\nTel: +46 8-230225                  Fax: +46 8-230231\n\nConsidering the successes of the wars on alcohol, poverty, drugs and\nterror, I think we should give some serious thought to declaring war\non peace.\n"},{"id":"111276","messageId":"49E43D89.50802@op5.se","threadId":"18852","inReplyTo":"27f7c25b-7bdc-40d1-a601-bd162ebbe2f2@gmail.com","subject":"Re: [PATCH RFC3 09/13] send-email: Remove horrible mix of tabs and spaces","fromName":"Andreas Ericsson","fromEmail":"ae@op5.se","sentAt":"2009-04-14T07:38:49Z","receivedAt":"2009-04-14T07:38:49Z","isPatch":true,"sender":{"key":"ae@op5.se","avatar":"https://gravatar.com/avatar/426e89595c75a8f5252dd0c989e5fabe5bcac616e68557427ad9aef6b0ca342a?d=mp&s=160"},"body":"Michael Witten wrote:\n> On Tue, Apr 14, 2009 at 00:31, Andreas Ericsson <ae@op5.se> wrote:\n>> Michael Witten wrote:\n>>> On Mon, Apr 13, 2009 at 15:55, Junio C Hamano <gitster@pobox.com> wrote:\n>>>> Michael Witten <mfwitten@gmail.com> writes:\n>>>>\n>>>>> Currently, no lines match the following:\n>>>>>\n>>>>>    [\\t]+[ ]+\n>>>>>    [ ]+[\\t]+\n>>>> I understand the latter but what's wrong with the former?  The width of a\n>>>> HT is by definition 8 columns throughout the git codebase.\n>>> Ah, well, the width of a HT has been a free variable in my\n>>> calculations; I was operating under the assumption that whitespace\n>>> used for indentation can float freely according to the user's\n>>> settings. A few of the lines were aligning function arguments via tabs\n>>> and a few extra spaces, which is not reliable in my model.\n>>>\n>>> Frankly, I don't like tabs and spaces sharing the same contiguous\n>>> block. I don't like it all. ;-B\n>> Using tabs to align stuff to indentation level and spaces to align\n>> line continuation is the only possible way to let users choose\n>> whichever indentation depth they want while preserving the continuation\n>> alignment. What's not to like about that? Especially if you think a\n>> horizontal tab can be any size at all, you should be all agog.\n> \n> However, nobody ever gets that right, because they don't understand\n> what you mean by indentation level. For most code that people write,\n> indentation whitespace overlaps with non-whitespace (from the\n> previous line). Therefore, the spaces used for continuation alignment\n> with the previous line are left 'sitting on shaky ground'. For\n> instance, consider this fine piece of code, given by lines 609-612 in\n> builtin-log.c. If you're viewing this code with a monospace font and\n> HT set to 8 columns, then the tab->spaces expansion should give the\n> following result (monospace font required to view this properly):\n> \n> static void make_cover_letter(struct rev_info *rev, int use_stdout,\n>                               int numbered, int numbered_files,\n>                               struct commit *origin,\n>                               int nr, struct commit **list, struct commit *head)\n> \n> Beautiful, isn't it?\n> \n> In this case, we're at indentation level ---> 0 <---, and this means\n> that to form the continuation alignment, 0 tabs should be used\n> followed by however many spaces are needed to achieve the alignment.\n> However, whoever wrote that code actually used indentation level 3:\n> \n> <HT><HT><HT><SP><SP><SP><SP><SP><SP>\n> \n\nWell, that would have been true if git had used \"indent with tabs align\nwith spaces\" (allowing variable width HT's), but HT is defined as 8\nspaces wide, so that's a non-issue for us.\n\n> The problem is that variable-width characters (HTs) are being aligned\n> with fixed-width characters. For shame!\n> \n> To be explicit, if the HT width is set to 4, the result would be\n> (after HT->spaces expansion):\n> \n> static void make_cover_letter(struct rev_info *rev, int use_stdout,\n>                   int numbered, int numbered_files,\n>                   struct commit *origin,\n>                   int nr, struct commit **list, struct commit *head)\n> \n> Clearly, this is never a problem if you declare HTs to be fixed-width\n> (which, I believe, Linus did do: 8 columns per HT), or if you can\n> remember that HTs should never be used to align against non-HTs.\n> \n\nThere you have it then; It's not a problem for git.git, and yet you\npropose to fix it.\n\n> What I like to do is provide a more regular structure that removes the\n> juxtaposition of indentation and alignment whitespace. Basically, HTs\n> and spaces should never be contiguous, and the first use of a non-HT\n> prohibits HTs from being used anywhere further down the line. Also,\n> the structure of the code should facilitate identation levels:\n> \n> static void make_cover_letter\n> (\n> \t/* These are all at indentation level 1 */\n> \n> \tstruct rev_info* rev            ,\n> \tint              use_stdout     ,\n> \tint              numbered       ,\n> \tint              numbered_files ,\n> \tstruct commit*   origin         ,\n> \tint              nr             ,\n> \tstruct commit**  list           ,\n> \tstruct commit*   head\n> )\n> {\n> \t/* Code at indentation level 1 */\n> }\n> \n> Yeah, yeah, I know it's crazy, but it makes code wildly readable---to me.\n> \n\nIt would still fail with a variable-width font though, which you seem\nkeen on reminding people about.\n\nSince you seem really, really keen on getting this done, here's the only\nway Junio would possibly even consider your new indentation style for\ngit.git:\n* Make patches for all the .c and .h files.\n* Make patches to all topics sent to the list that haven't been merged\n  or dropped yet so that merges can go on cleanly.\n* Create a public git repository somewhere which Junio can fetch from,\n  marking your topic-branches clearly.\n* Come up with a better argument than \"Hey, this is better for me\".\n  Since churning code just to make life a little bit easier for one guy\n  responsible for 0.07% of the committed codebase would be damn silly,\n  I'm reasonably certain Junio will just shake his head at your proposal.\n  Without the patches though, he'll probably not even look at it. \n\n\nThere's one pretty good reason *not* to change indentation though:\nOwnership tracking in case of relicensing. Currently, the \"owners\"\nof a file in git.git can be determined pretty accurately by issuing\n\n  git blame -C -C -M \"$f\" | \\\n  sed -e 's/[^(]*(\\([^0-9]*\\).*/\\1/' -e 's/[\\t ]*$//' \\\n        | sort | uniq -c | sort -nr\n\nwhich is immensely useful when asking permission to relicense code\nfor libgit2. With your proposed code churn, that goes out the window\nfor no benefit what so ever.\n\nHappy hacking. I'll drop this subject now, hoping you do the same.\n\n-- \nAndreas Ericsson                   andreas.ericsson@op5.se\nOP5 AB                             www.op5.se\nTel: +46 8-230225                  Fax: +46 8-230231\n\nConsidering the successes of the wars on alcohol, poverty, drugs and\nterror, I think we should give some serious thought to declaring war\non peace.\n"},{"id":"111277","messageId":"7v3acb7h48.fsf@gitster.siamese.dyndns.org","threadId":"18852","inReplyTo":"20090414061645.GB3948@atjola.homenet","subject":"Re: [PATCH RFC3 08/13] send-email: Remove superfluous `my $editor = ...'","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2009-04-14T08:51:35Z","receivedAt":"2009-04-14T08:51:35Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Björn Steinbrink <B.Steinbrink@gmx.de> writes:\n\n> On 2009.04.13 16:39:52 -0700, Stephen Boyd wrote:\n>> Michael Witten wrote:\n>>> -\tmy $editor = $ENV{GIT_EDITOR} || Git::config(@repo, \"core.editor\") || $ENV{VISUAL} || $ENV{EDITOR} || \"vi\";\n>>\n>> I don't want to start an editor war, but why is 'vi' here? It seems\n>> that one of the previous four should be set at all times, correct?\n>\n> Probably because that's how the rest of git works, too. See core.editor\n> in git-config(1) or launch_editor() in editor.c if you don't trust the\n> docs.\n>\n> Oh, and I seem to rely on that behaviour :-)\n\nThe git specific parts are obviously our invention, but $VISUAL then\n$EDITOR and finally as the last resort falling back on vi has been a\nlongstanding UNIXy tradition that is shared by many tools.\n"},{"id":"111278","messageId":"7vy6u36215.fsf@gitster.siamese.dyndns.org","threadId":"18852","inReplyTo":"1239647037-15381-1-git-send-email-mfwitten@gmail.com","subject":"Re: [PATCH RFC3 INTRO] I hope this will do it!","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2009-04-14T09:02:46Z","receivedAt":"2009-04-14T09:02:46Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Michael Witten <mfwitten@gmail.com> writes:\n\n> Here is the list of notable improvements:\n\nI've picked up pieces that I think cannot possibly be controversial to\nreduce the size of the remaining patch series still in flight.\n\nMichael Witten (6):\n      Docs: send-email: Put options back into alphabetical order\n      Docs: send-email: Refer to CONFIGURATION section for sendemail.multiedit\n      Docs: send-email: --smtp-server-port can take symbolic ports\n      send-email: Handle \"GIT:\" rather than \"GIT: \" during --compose\n      send-email: 'References:' should only reference what is sent\n      send-email: Remove superfluous `my $editor = ...'\n\nI've reworded the description in \"symbolic port names\" one a bit.\n\nIt is unfortunate that the interesting ones begin at 10th in the series,\nwhich are beind the 9th one that is a \"churn in the middle\".\n\nThanks.\n"},{"id":"111293","messageId":"b4087cc50904140926o4bb48c1bs66946078bb3cd2f9@mail.gmail.com","threadId":"18852","inReplyTo":"7vy6u36215.fsf@gitster.siamese.dyndns.org","subject":"Re: [PATCH RFC3 INTRO] I hope this will do it!","fromName":"Michael Witten","fromEmail":"mfwitten@gmail.com","sentAt":"2009-04-14T16:26:14Z","receivedAt":"2009-04-14T16:26:14Z","isPatch":true,"sender":{"key":"mfwitten@gmail.com","avatar":"https://avatars.githubusercontent.com/u/597101?v=4"},"body":"On Tue, Apr 14, 2009 at 04:02, Junio C Hamano <gitster@pobox.com> wrote:\n>\n> It is unfortunate that the interesting ones begin at 10th in the series,\n> which are beind the 9th one that is a \"churn in the middle\".\n\n(http://marc.info/?l=git&m=123959564630157&w=2):\n> The general rule of thumb is to do such a clean-up before you start to work on something of substance.\n\n(http://marc.info/?l=git&m=123914648915106&w=2):\n> a good rule of thumb when preparing a series is to have this kind of obvious clean-up first, leaving enhancement patches later in the series.\n\nI guess, then, this whitespace patch is something of substance---an\nenhancement ;-D\n\n... or unnecessary \"code churn\"... I suppose.\n"},{"id":"111302","messageId":"7vd4bf3weo.fsf@gitster.siamese.dyndns.org","threadId":"18852","inReplyTo":"b4087cc50904140926o4bb48c1bs66946078bb3cd2f9@mail.gmail.com","subject":"Re: [PATCH RFC3 INTRO] I hope this will do it!","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2009-04-14T18:47:11Z","receivedAt":"2009-04-14T18:47:11Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Michael Witten <mfwitten@gmail.com> writes:\n\n> On Tue, Apr 14, 2009 at 04:02, Junio C Hamano <gitster@pobox.com> wrote:\n>>\n>> It is unfortunate that the interesting ones begin at 10th in the series,\n>> which are beind the 9th one that is a \"churn in the middle\".\n>\n> (http://marc.info/?l=git&m=123959564630157&w=2):\n>> The general rule of thumb is to do such a clean-up before you start to work on something of substance.\n>\n> (http://marc.info/?l=git&m=123914648915106&w=2):\n>> a good rule of thumb when preparing a series is to have this kind of obvious clean-up first, leaving enhancement patches later in the series.\n>\n> I guess, then, this whitespace patch is something of substance---an\n> enhancement ;-D\n>\n> ... or unnecessary \"code churn\"... I suppose.\n\nAn obviously good and uncontroversial clean-up should come first, so that\nit can be applied and meat of the change can be discussed on the cleaned\nbase version.\n\nA clean-up that might be judged as a mere churn should come last, so that\nenhancements and fixes can go first without waiting for the controversy to\nsettle.\n"},{"id":"111304","messageId":"b4087cc50904141150y293d1696ude409ed6d0d7a0c3@mail.gmail.com","threadId":"18852","inReplyTo":"7vd4bf3weo.fsf@gitster.siamese.dyndns.org","subject":"Re: [PATCH RFC3 INTRO] I hope this will do it!","fromName":"Michael Witten","fromEmail":"mfwitten@gmail.com","sentAt":"2009-04-14T18:50:43Z","receivedAt":"2009-04-14T18:50:43Z","isPatch":true,"sender":{"key":"mfwitten@gmail.com","avatar":"https://avatars.githubusercontent.com/u/597101?v=4"},"body":"On Tue, Apr 14, 2009 at 13:47, Junio C Hamano <gitster@pobox.com> wrote:\n>>> It is unfortunate that the interesting ones begin at 10th in the series,\n>>> which are beind the 9th one that is a \"churn in the middle\".\n>>\n>> (http://marc.info/?l=git&m=123959564630157&w=2):\n>>> The general rule of thumb is to do such a clean-up before you start to work on something of substance.\n>>\n>> (http://marc.info/?l=git&m=123914648915106&w=2):\n>>> a good rule of thumb when preparing a series is to have this kind of obvious clean-up first, leaving enhancement patches later in the series.\n>>\n>> I guess, then, this whitespace patch is something of substance---an\n>> enhancement ;-D\n>>\n>> ... or unnecessary \"code churn\"... I suppose.\n>\n> An obviously good and uncontroversial clean-up should come first, so that\n> it can be applied and meat of the change can be discussed on the cleaned\n> base version.\n>\n> A clean-up that might be judged as a mere churn should come last, so that\n> enhancements and fixes can go first without waiting for the controversy to\n> settle.\n\nI'm was just being facetious. In fact, I have already moved that patch\nto the end on my side.\n"}]}