X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=git-send-email-script;h=1dbdbaf391180975248780a0609f8d3d4bbcc24d;hb=f2db68eda89f2fbe7e4c1a69a3c10b25ea43667c;hp=9061ecdf5be77a09cd89d285c1057d4a1ec7dd38;hpb=83b24437c2c6262eeb1e4b36cd9cbb28331c141a;p=git.git diff --git a/git-send-email-script b/git-send-email-script index 9061ecdf..1dbdbaf3 100755 --- a/git-send-email-script +++ b/git-send-email-script @@ -1,47 +1,39 @@ #!/usr/bin/perl -w -# horrible hack of a script to send off a large number of email messages, one after -# each other, all chained together. This is useful for large numbers of patches. # -# Use at your own risk!!!! -# -# greg kroah-hartman Jan 8, 2002 -# +# Copyright 2002,2005 Greg Kroah-Hartman +# Copyright 2005 Ryan Anderson # # GPL v2 (See COPYING) -# +# # Ported to support git "mbox" format files by Ryan Anderson # -# Sends emails to the email listed on the command line. -# -# updated to give a valid subject and CC the owner of the patch - Jan 2005 -# first line of the message is who to CC, -# and second line is the subject of the message. -# +# Sends a collection of emails to the given email addresses, disturbingly fast. +# +# Supports two formats: +# 1. mbox format files (ignoring most headers and MIME formatting - this is designed for sending patches) +# 2. The original format support by Greg's script: +# first line of the message is who to CC, +# and second line is the subject of the message. +# use strict; use warnings; use Term::ReadLine; -use Mail::Sendmail; +use Mail::Sendmail qw(sendmail %mailcfg); use Getopt::Long; use Data::Dumper; use Email::Valid; +sub unique_email_list(@); + # Variables we fill in automatically, or via prompting: my (@to,@cc,$initial_reply_to,$initial_subject,@files,$from); -# Example of them -# modify these options each time you run the script -#$to = 'torvalds@osdl.org,git@vger.kernel.org'; -#$initial_reply_to = ''; #<20050203173208.GA23964@foobar.com>'; -#$initial_subject = "[PATCH] Deb package build fixes"; -#@files = (qw( -#0001-Make-debian-rules-executable-and-correct-the-spelling-of-rsync-in.txt -#0002-Debian-packages-should-include-the-binaries.txt -#0003-The-deb-package-building-needs-these-two-new-files-to-work-correctly.txt -#)); +# Behavior modification variables +my ($chain_reply_to, $smtp_server) = (1, "localhost"); -# change this to your email address. -#$from = "Ryan Anderson "; +# Example reply to: +#$initial_reply_to = ''; #<20050203173208.GA23964@foobar.com>'; my $term = new Term::ReadLine 'git-send-email'; @@ -52,6 +44,8 @@ my $rc = GetOptions("from=s" => \$from, "in-reply-to=s" => \$initial_reply_to, "subject=s" => \$initial_subject, "to=s" => \@to, + "chain-reply-to!" => \$chain_reply_to, + "smtp-server=s" => \$smtp_server, ); # Now, let's fill any that aren't set in with defaults: @@ -78,31 +72,44 @@ close(GITVAR); if (!defined $from) { $from = $author || $committer; - 1 while (!defined ($_ = $term->readline("Who should the emails appear to be from? ", - $from))); + do { + $_ = $term->readline("Who should the emails appear to be from? ", + $from); + } while (!defined $_); + $from = $_; print "Emails will be sent from: ", $from, "\n"; } if (!@to) { - 1 while (!defined ($_ = $term->readline("Who should the emails be sent to? ", - ""))); + do { + $_ = $term->readline("Who should the emails be sent to? ", + ""); + } while (!defined $_); my $to = $_; push @to, split /,/, $to; } if (!defined $initial_subject) { - 1 while (!defined ($_ = - $term->readline("What subject should the emails start with? ", - $initial_subject))); + do { + $_ = $term->readline("What subject should the emails start with? ", + $initial_subject); + } while (!defined $_); $initial_subject = $_; } if (!defined $initial_reply_to) { - 1 while (!defined ($_ = - $term->readline("Message-ID to be used as In-Reply-To? ", - $initial_reply_to))); + do { + $_= $term->readline("Message-ID to be used as In-Reply-To? ", + $initial_reply_to); + } while (!defined $_); + $initial_reply_to = $_; + $initial_reply_to =~ s/(^\s+|\s+$)//g; +} + +if (!defined $smtp_server) { + $smtp_server = "localhost"; } # Now that all the defaults are set, process the rest of the command line @@ -112,8 +119,9 @@ for my $f (@ARGV) { opendir(DH,$f) or die "Failed to opendir $f: $!"; - push @files, map { +$f . "/" . $_ } grep !/^\.{1,2}$/, - sort readdir(DH); + push @files, grep { -f $_ } map { +$f . "/" . $_ } + sort readdir(DH); + } elsif (-f $f) { push @files, $f; @@ -129,9 +137,14 @@ if (@files) { git-send-email-script [options] [... file | directory ] Options: --from Specify the "From:" line of the email to be sent. - --to Specify the primary "To:" line of the email. + --to Specify the primary "To:" line of the email. --subject Specify the initial "Subject:" line. --in-reply-to Specify the first "In-Reply-To:" header line. + --chain-reply-to If set, the replies will all be to the previous + email sent, rather than to the first email sent. + Defaults to on. + --smtp-server If set, specifies the outgoing SMTP server to use. + Defaults to localhost. Error: Please specify a file or a directory on the command line. EOT @@ -148,13 +161,18 @@ our ($message_id, $cc, %mail, $subject, $reply_to, $message); # of seconds since the beginning of Unix time and tacking on # a random number to the end, in case we are called quicker than # 1 second since the last time we were called. + +# We'll setup a template for the message id, using the "from" address: +my $message_id_from = Email::Valid->address($from); +my $message_id_template = "<%s-git-send-email-$message_id_from>"; + sub make_message_id { my $date = `date "+\%s"`; chomp($date); my $pseudo_rand = int (rand(4200)); - $message_id = "<$date$pseudo_rand\@foobar.com>"; - print "new message id = $message_id\n"; + $message_id = sprintf $message_id_template, "$date$pseudo_rand"; + #print "new message id = $message_id\n"; # Was useful for debugging } @@ -163,10 +181,7 @@ $cc = ""; sub send_message { - my %to; - $to{lc(Email::Valid->address($_))}++ for (@to); - - my $to = join(",", keys %to); + my $to = join (", ", unique_email_list(@to)); %mail = ( To => $to, From => $from, @@ -179,7 +194,8 @@ sub send_message 'X-Mailer' => "git-send-email-script", ); - $mail{smtp} = 'localhost'; + $mail{smtp} = $smtp_server; + $mailcfg{mime} = 0; #print Data::Dumper->Dump([\%mail],[qw(*mail)]); @@ -233,7 +249,7 @@ foreach my $t (@files) { $subject = $_; } } - + # A whitespace line will terminate the headers if (m/^\s*$/) { $header_done = 1; @@ -251,15 +267,26 @@ foreach my $t (@files) { } close F; - my %clean_ccs; - $clean_ccs{lc(Email::Valid->address($_))}++ for @cc; - - $cc = join(",", keys %clean_ccs); + $cc = join(", ", unique_email_list(@cc)); send_message(); # set up for the next message - $reply_to = $message_id; + if ($chain_reply_to || length($reply_to) == 0) { + $reply_to = $message_id; + } make_message_id(); -# $subject = "Re: ".$initial_subject; +} + + +sub unique_email_list(@) { + my %seen; + my @emails; + + foreach my $entry (@_) { + my $clean = Email::Valid->address($entry); + next if $seen{$clean}++; + push @emails, $entry; + } + return @emails; }