From: Michael Witten <mfwitten@gmail.com>
To: git@vger.kernel.org
Subject: [PATCH RFC 4/6] send-email: --compose takes optional argument to existing file
Date: Tue, 7 Apr 2009 16:25:20 -0500 [thread overview]
Message-ID: <1239139522-24118-4-git-send-email-mfwitten@gmail.com> (raw)
In-Reply-To: <1239139522-24118-3-git-send-email-mfwitten@gmail.com>
Now, a user may specify an existing (in-progress) file to use as
the introductory/summary email.
The file is opened for any additional editing as usual.
Signed-off-by: Michael Witten <mfwitten@gmail.com>
---
Documentation/git-send-email.txt | 7 ++-
git-send-email.perl | 112 ++++++++++++++++++++++----------------
2 files changed, 71 insertions(+), 48 deletions(-)
diff --git a/Documentation/git-send-email.txt b/Documentation/git-send-email.txt
index 4b656ca..bc9ff13 100644
--- a/Documentation/git-send-email.txt
+++ b/Documentation/git-send-email.txt
@@ -57,8 +57,11 @@ The --cc option must be repeated for each user you want on the cc list.
or one for all of them at once.
--compose::
- Use $GIT_EDITOR, core.editor, $VISUAL, or $EDITOR to edit an
- introductory message for the patch series.
+ Use $GIT_EDITOR, core.editor, $VISUAL, or $EDITOR, or vi to edit an
+ introductory message for the patch series. An existing file may be
+ specified as the basis for the introductory email; it will be opened
+ for editing directly. Otherwise, a new temporary file is created with
+ some default contents.
+
When '--compose' is used, git send-email will use the From, Subject, and
In-Reply-To headers specified in the message. If the body of the message
diff --git a/git-send-email.perl b/git-send-email.perl
index 098c620..481bf36 100755
--- a/git-send-email.perl
+++ b/git-send-email.perl
@@ -53,7 +53,7 @@ git send-email [options] <file | directory | rev-list options >
--subject <str> * Email "Subject:"
--in-reply-to <str> * Email "In-Reply-To:"
--annotate * Review each patch that will be sent in an editor.
- --compose * Open an editor for introduction.
+ --compose opt <str> * Open an editor for introduction.
Sending:
--delay <int> * Delay (seconds) between sending emails.
@@ -62,7 +62,7 @@ git send-email [options] <file | directory | rev-list options >
is optional. Default 'localhost'.
--smtp-server-port <int> * Outgoing SMTP server port.
--smtp-user <str> * Username for SMTP-AUTH.
- --smtp-pass <str> * Password for SMTP-AUTH; not necessary.
+ --smtp-pass opt <str> * Password for SMTP-AUTH; not necessary.
--smtp-encryption <str> * tls or ssl; anything else disables.
--smtp-ssl * Deprecated. Use '--smtp-encryption ssl'.
@@ -159,7 +159,7 @@ if ($@) {
# Behavior modification variables
my ($quiet, $dry_run) = (0, 0);
my $format_patch;
-my $compose_filename;
+my ($compose_filename, $compose_final_filename, $compose_final_is_not_empty);
# Handle interactive edition of files.
my $multiedit;
@@ -224,13 +224,12 @@ sub signal_handler {
system "stty echo";
# tmp files from --compose
- if (defined $compose_filename) {
- if (-e $compose_filename) {
- print "'$compose_filename' contains an intermediate version of the email you were composing.\n";
- }
- if (-e ($compose_filename . ".final")) {
- print "'$compose_filename.final' contains the composed email.\n"
- }
+ if (defined $compose_filename and -f $compose_filename) {
+ print "'$compose_filename' contains an intermediate version of the email you were composing.\n";
+ }
+
+ if (defined $compose_final_filename and -f $compose_final_filename) {
+ print "'$compose_final_filename' contains the composed email.\n"
}
exit;
@@ -258,7 +257,7 @@ my $rc = GetOptions("sender|from=s" => \$sender,
"smtp-encryption=s" => \$smtp_encryption,
"identity=s" => \$identity,
"annotate" => \$annotate,
- "compose" => \$compose,
+ "compose:s" => \$compose,
"quiet" => \$quiet,
"cc-cmd=s" => \$cc_cmd,
"suppress-from!" => \$suppress_from,
@@ -517,21 +516,36 @@ sub get_patch_subject($) {
die "'Subject:' line expected in '$patch'";
}
-if ($compose) {
- # Note that this does not need to be secure, but we will make a small
- # effort to have it be unique
- $compose_filename = ($repo ?
- tempfile(".gitsendemail.msg.XXXXXX", DIR => $repo->repo_path()) :
- tempfile(".gitsendemail.msg.XXXXXX", DIR => "."))[1];
- open(C,">",$compose_filename)
- or die "Failed to open for writing $compose_filename: $!";
+if (defined $compose) {
+
+ my ($tmp_file, $tmp_filename) = tempfile(".gitsendemail.msg.XXXXXX", DIR => ($repo ? $repo->repo_path() : "."));
+ my $compose_file;
+ my $compose_final_file;
+
+ if ($compose ne '') {
+
+ $compose_filename = $compose;
+
+ $compose_final_filename = $tmp_filename;
+ $compose_final_file = $tmp_file
+
+ } else {
- my $tpl_sender = $sender || $repoauthor || $repocommitter || '';
- my $tpl_subject = $initial_subject || '';
- my $tpl_reply_to = $initial_reply_to || '';
+ $compose_filename = $tmp_filename;
+ $compose_file = $tmp_file;
- print C <<EOT;
+ $compose_final_filename = "$compose_filename.final";
+ open $compose_final_file, ">", $compose_final_filename
+ or die "Failed to open '$compose_final_filename' for writing: $!";
+
+ # Help the user out with some instruction and initial headers:
+
+ my $tpl_sender = $sender || $repoauthor || $repocommitter || '';
+ my $tpl_subject = $initial_subject || '';
+ my $tpl_reply_to = $initial_reply_to || '';
+
+ print $compose_file <<EOT;
From $tpl_sender # This line is ignored.
GIT: Lines beginning in "GIT:" will be removed.
GIT: Consider including an overall diffstat or table of contents
@@ -543,10 +557,10 @@ Subject: $tpl_subject
In-Reply-To: $tpl_reply_to
EOT
- for my $f (@files) {
- print C "GIT: ", get_patch_subject($f), "\n";
+ for my $f (@files) {
+ print $compose_file "GIT: ", get_patch_subject($f), "\n";
+ }
}
- close(C);
my $editor = $ENV{GIT_EDITOR} || Git::config(@repo, "core.editor") || $ENV{VISUAL} || $ENV{EDITOR} || "vi";
@@ -556,23 +570,28 @@ EOT
do_edit($compose_filename);
}
- open(C2,">",$compose_filename . ".final")
- or die "Failed to open $compose_filename.final : " . $!;
+ # Now transform the user-edited introduction into something
+ # suitable for sending via email; the user's editor may have
+ # unlinked the original file and replaced it with an entirely
+ # new one. If this be the case, then it wouldn't do just to
+ # seek to the beginning and start reading, because then only
+ # the original content would be retrieved. Consequently, the
+ # file must be reopened to be safe (note, the original
+ # filehandle is closed automatically).
- open(C,"<",$compose_filename)
- or die "Failed to open $compose_filename : " . $!;
+ open $compose_file, "<", $compose_filename
+ or die "Failed to open '$compose_filename' for reading: $!";
my $need_8bit_cte = file_has_nonascii($compose_filename);
my $in_body = 0;
- my $summary_empty = 1;
- while(<C>) {
+ while(<$compose_file>) {
next if m/^GIT:/;
- if ($in_body) {
- $summary_empty = 0 unless (/^\n$/);
+ if ($in_body && not /^\n$/) {
+ $compose_final_is_not_empty = 1;
} elsif (/^\n$/) {
$in_body = 1;
if ($need_8bit_cte) {
- print C2 "MIME-Version: 1.0\n",
+ print $compose_final_file "MIME-Version: 1.0\n",
"Content-Type: text/plain; ",
"charset=utf-8\n",
"Content-Transfer-Encoding: 8bit\n";
@@ -597,15 +616,12 @@ EOT
print "To/Cc/Bcc fields are not interpreted yet, they have been ignored\n";
next;
}
- print C2 $_;
- }
- close(C);
- close(C2);
- if ($summary_empty) {
- print "Summary email is empty, skipping it\n";
- $compose = -1;
+ print $compose_final_file $_;
}
+
+ print "Summary email is empty, skipping it\n" unless ($compose_final_is_not_empty);
+
} elsif ($annotate) {
do_edit(@files);
}
@@ -685,9 +701,7 @@ if (!defined $smtp_server) {
$smtp_server ||= 'localhost'; # could be 127.0.0.1, too... *shrug*
}
-if ($compose && $compose > 0) {
- @files = ($compose_filename . ".final", @files);
-}
+unshift(@files, $compose_final_filename) if ($compose_final_is_not_empty);
# Variables we set as part of the loop over files
our ($message_id, %mail, $subject, $reply_to, $references, $message,
@@ -1153,7 +1167,13 @@ for (my $index = 0; $index < @files; $index++) {
cleanup_compose_files();
sub cleanup_compose_files() {
- unlink($compose_filename, $compose_filename . ".final") if $compose;
+ if (defined $compose) {
+ unlink(
+ $compose_final_filename,
+ # Don't delete user-supplied file.
+ $compose ? () : $compose_filename
+ );
+ }
}
$smtp->quit if $smtp;
--
1.6.2.2.448.g61445.dirty
next prev parent reply other threads:[~2009-04-07 21:28 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-04-07 21:25 [PATCH RFC 1/6] send-email: Add --delay for separating emails Michael Witten
2009-04-07 21:25 ` [PATCH RFC 2/6] send-email: --smtp-server-port should take an integer Michael Witten
2009-04-07 21:25 ` [PATCH RFC 3/6] send-email: Handle "GIT:" rather than "GIT: " during --compose Michael Witten
2009-04-07 21:25 ` Michael Witten [this message]
2009-04-07 21:25 ` [PATCH RFC 5/6] send-email: Cleanup the usage text a bit Michael Witten
2009-04-07 21:25 ` [PATCH RFC 6/6] send-email: Remove horrible mix of tabs and spaces Michael Witten
2009-04-07 21:35 ` demerphq
2009-04-07 21:42 ` Michael Witten
2009-04-07 21:44 ` demerphq
2009-04-07 21:57 ` demerphq
2009-04-07 22:00 ` Jeff King
2009-04-07 22:10 ` Andreas Ericsson
2009-04-07 23:33 ` Tomas Carnecky
2009-04-08 2:02 ` Jeff King
2009-04-11 19:22 ` [PATCH RFC 5/6] send-email: Cleanup the usage text a bit Junio C Hamano
2009-04-11 19:22 ` [PATCH RFC 4/6] send-email: --compose takes optional argument to existing file Junio C Hamano
2009-04-11 19:22 ` [PATCH RFC 3/6] send-email: Handle "GIT:" rather than "GIT: " during --compose Junio C Hamano
2009-04-11 20:45 ` Michael Witten
2009-04-12 0:59 ` Junio C Hamano
2009-04-12 2:36 ` Michael Witten
2009-04-07 23:20 ` [PATCH RFC 2/6] send-email: --smtp-server-port should take an integer Junio C Hamano
2009-04-11 19:22 ` Junio C Hamano
2009-04-11 21:01 ` Wesley J. Landaker
2009-04-11 21:07 ` Michael Witten
2009-04-07 21:51 ` [PATCH RFC 1/6] send-email: Add --delay for separating emails Jeff King
2009-04-07 22:08 ` [PATCH RFC 1/6] " Nicolas Sebrecht
2009-04-07 22:17 ` Andreas Ericsson
2009-04-08 6:05 ` Jeff King
2009-04-08 6:03 ` Jeff King
2009-04-07 23:17 ` [PATCH RFC 1/6] " Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1239139522-24118-4-git-send-email-mfwitten@gmail.com \
--to=mfwitten@gmail.com \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).