Merge branch 'maint'
authorJunio C Hamano <gitster@pobox.com>
Tue, 18 Sep 2007 07:41:43 +0000 (00:41 -0700)
committerJunio C Hamano <gitster@pobox.com>
Tue, 18 Sep 2007 07:41:43 +0000 (00:41 -0700)
* maint:
Document ls-files --with-tree=<tree-ish>
git-commit: partial commit of paths only removed from the index
git-commit: Allow partial commit of file removal.
send-email: make message-id generation a bit more robust
git-gui: Disable native platform text selection in "lists"
git-gui: Paper bag fix "Commit->Revert" format arguments
git-gui: Provide 'uninstall' Makefile target to undo an installation
git-gui: Font chooser to handle a large number of font families
git-gui: Make backporting changes from i18n version easier
git-gui: Don't delete send on Windows as it doesn't exist
git-gui: Trim trailing slashes from untracked submodule names
git-gui: Assume untracked directories are Git submodules
git-gui: handle "deleted symlink" diff marker
git-gui: show unstaged symlinks in diff viewer
git-gui: Avoid use of libdir in Makefile
git-gui: Disable Tk send in all git-gui sessions
git-gui: lib/index.tcl: handle files with % in the filename properly
git-gui: Properly set the state of "Stage/Unstage Hunk" action
git-gui: Fix detaching current branch during checkout
git-gui: Correct starting of git-remote to handle -w option

1  2 
git-send-email.perl
diff --combined git-send-email.perl
index d8319d45fb275c783511232c7b0047a517973e03,9547cc37a1c4fd326876e26b081bc6d6a5141ce6..4031e86b8688e62cc3a547ffd52dfc1b8234f0f4
@@@ -73,18 -73,9 +73,18 @@@ Options
     --signed-off-cc Automatically add email addresses that appear in
                   Signed-off-by: or Cc: lines to the cc: list. Defaults to on.
  
 +   --identity     The configuration identity, a subsection to prioritise over
 +                  the default section.
 +
     --smtp-server  If set, specifies the outgoing SMTP server to use.
                    Defaults to localhost.
  
 +   --smtp-user    The username for SMTP-AUTH.
 +
 +   --smtp-pass    The password for SMTP-AUTH.
 +
 +   --smtp-ssl     If set, connects to the SMTP server using SSL.
 +
     --suppress-from Suppress sending emails to yourself if your address
                    appears in a From: line. Defaults to off.
  
@@@ -154,6 -145,7 +154,6 @@@ my $compose_filename = ".msg.$$"
  my (@to,@cc,@initial_cc,@bcclist,@xh,
        $initial_reply_to,$initial_subject,@files,$author,$sender,$compose,$time);
  
 -my $smtp_server;
  my $envelope_sender;
  
  # Example reply to:
@@@ -172,26 -164,24 +172,26 @@@ my ($quiet, $dry_run) = (0, 0)
  
  # Variables with corresponding config settings
  my ($thread, $chain_reply_to, $suppress_from, $signed_off_cc, $cc_cmd);
 +my ($smtp_server, $smtp_authuser, $smtp_authpass, $smtp_ssl);
 +my ($identity, $aliasfiletype, @alias_files);
  
 -my %config_settings = (
 +my %config_bool_settings = (
      "thread" => [\$thread, 1],
      "chainreplyto" => [\$chain_reply_to, 1],
      "suppressfrom" => [\$suppress_from, 0],
      "signedoffcc" => [\$signed_off_cc, 1],
 -    "cccmd" => [\$cc_cmd, ""],
 +    "smtpssl" => [\$smtp_ssl, 0],
  );
  
 -foreach my $setting (keys %config_settings) {
 -    my $config = $repo->config_bool("sendemail.$setting");
 -    ${$config_settings{$setting}->[0]} = (defined $config) ? $config : $config_settings{$setting}->[1];
 -}
 -
 -@bcclist = $repo->config('sendemail.bcc');
 -if (!@bcclist or !$bcclist[0]) {
 -    @bcclist = ();
 -}
 +my %config_settings = (
 +    "smtpserver" => \$smtp_server,
 +    "smtpuser" => \$smtp_authuser,
 +    "smtppass" => \$smtp_authpass,
 +    "cccmd" => \$cc_cmd,
 +    "aliasfiletype" => \$aliasfiletype,
 +    "bcc" => \@bcclist,
 +    "aliasesfile" => \@alias_files,
 +);
  
  # Begin by accumulating all the variables (defined above), that we will end up
  # needing, first, from the command line:
@@@ -204,10 -194,6 +204,10 @@@ my $rc = GetOptions("sender|from=s" => 
                    "bcc=s" => \@bcclist,
                    "chain-reply-to!" => \$chain_reply_to,
                    "smtp-server=s" => \$smtp_server,
 +                  "smtp-user=s" => \$smtp_authuser,
 +                  "smtp-pass=s" => \$smtp_authpass,
 +                  "smtp-ssl!" => \$smtp_ssl,
 +                  "identity=s" => \$identity,
                    "compose" => \$compose,
                    "quiet" => \$quiet,
                    "cc-cmd=s" => \$cc_cmd,
@@@ -222,43 -208,6 +222,43 @@@ unless ($rc) 
      usage();
  }
  
 +# Now, let's fill any that aren't set in with defaults:
 +
 +sub read_config {
 +      my ($prefix) = @_;
 +
 +      foreach my $setting (keys %config_bool_settings) {
 +              my $target = $config_bool_settings{$setting}->[0];
 +              $$target = $repo->config_bool("$prefix.$setting") unless (defined $$target);
 +      }
 +
 +      foreach my $setting (keys %config_settings) {
 +              my $target = $config_settings{$setting};
 +              if (ref($target) eq "ARRAY") {
 +                      unless (@$target) {
 +                              my @values = $repo->config("$prefix.$setting");
 +                              @$target = @values if (@values && defined $values[0]);
 +                      }
 +              }
 +              else {
 +                      $$target = $repo->config("$prefix.$setting") unless (defined $$target);
 +              }
 +      }
 +}
 +
 +# read configuration from [sendemail "$identity"], fall back on [sendemail]
 +$identity = $repo->config("sendemail.identity") unless (defined $identity);
 +read_config("sendemail.$identity") if (defined $identity);
 +read_config("sendemail");
 +
 +# fall back on builtin bool defaults
 +foreach my $setting (values %config_bool_settings) {
 +      ${$setting->[0]} = $setting->[1] unless (defined (${$setting->[0]}));
 +}
 +
 +my ($repoauthor) = $repo->ident_person('author');
 +my ($repocommitter) = $repo->ident_person('committer');
 +
  # Verify the user input
  
  foreach my $entry (@to) {
@@@ -273,7 -222,14 +273,7 @@@ foreach my $entry (@bcclist) 
        die "Comma in --bcclist entry: $entry'\n" unless $entry !~ m/,/;
  }
  
 -# Now, let's fill any that aren't set in with defaults:
 -
 -my ($repoauthor) = $repo->ident_person('author');
 -my ($repocommitter) = $repo->ident_person('committer');
 -
  my %aliases;
 -my @alias_files = $repo->config('sendemail.aliasesfile');
 -my $aliasfiletype = $repo->config('sendemail.aliasfiletype');
  my %parse_alias = (
        # multiline formats can be supported in the future
        mutt => sub { my $fh = shift; while (<$fh>) {
@@@ -365,7 -321,10 +365,7 @@@ if ($thread && !defined $initial_reply_
        $initial_reply_to =~ s/>?\s+$/>/;
  }
  
 -if (!$smtp_server) {
 -      $smtp_server = $repo->config('sendemail.smtpserver');
 -}
 -if (!$smtp_server) {
 +if (!defined $smtp_server) {
        foreach (qw( /usr/sbin/sendmail /usr/lib/sendmail )) {
                if (-x $_) {
                        $smtp_server = $_;
@@@ -478,10 -437,17 +478,17 @@@ sub extract_valid_address 
  
  # We'll setup a template for the message id, using the "from" address:
  
+ my ($message_id_stamp, $message_id_serial);
  sub make_message_id
  {
-       my $date = time;
-       my $pseudo_rand = int (rand(4200));
+       my $uniq;
+       if (!defined $message_id_stamp) {
+               $message_id_stamp = sprintf("%s-%s", time, $$);
+               $message_id_serial = 0;
+       }
+       $message_id_serial++;
+       $uniq = "$message_id_stamp-$message_id_serial";
        my $du_part;
        for ($sender, $repocommitter, $repoauthor) {
                $du_part = extract_valid_address(sanitize_address($_));
                use Sys::Hostname qw();
                $du_part = 'user@' . Sys::Hostname::hostname();
        }
-       my $message_id_template = "<%s-git-send-email-$du_part>";
-       $message_id = sprintf $message_id_template, "$date$pseudo_rand";
+       my $message_id_template = "<%s-git-send-email-%s>";
+       $message_id = sprintf($message_id_template, $uniq, $du_part);
        #print "new message id = $message_id\n"; # Was useful for debugging
  }
  
@@@ -595,16 -561,8 +602,16 @@@ X-Mailer: git-send-email $gitversio
                print $sm "$header\n$message";
                close $sm or die $?;
        } else {
 -              require Net::SMTP;
 -              $smtp ||= Net::SMTP->new( $smtp_server );
 +              if ($smtp_ssl) {
 +                      require Net::SMTP::SSL;
 +                      $smtp ||= Net::SMTP::SSL->new( $smtp_server, Port => 465 );
 +              }
 +              else {
 +                      require Net::SMTP;
 +                      $smtp ||= Net::SMTP->new( $smtp_server );
 +              }
 +              $smtp->auth( $smtp_authuser, $smtp_authpass )
 +                      or die $smtp->message if (defined $smtp_authuser);
                $smtp->mail( $raw_from ) or die $smtp->message;
                $smtp->to( @recipients ) or die $smtp->message;
                $smtp->data or die $smtp->message;
@@@ -711,7 -669,7 +718,7 @@@ foreach my $t (@files) 
        }
        close F;
  
 -      if ($cc_cmd ne "") {
 +      if (defined $cc_cmd) {
                open(F, "$cc_cmd $t |")
                        or die "(cc-cmd) Could not execute '$cc_cmd'";
                while(<F>) {