Merge branch 'maint'
authorJunio C Hamano <gitster@pobox.com>
Wed, 21 Nov 2007 07:00:07 +0000 (23:00 -0800)
committerJunio C Hamano <gitster@pobox.com>
Wed, 21 Nov 2007 07:00:07 +0000 (23:00 -0800)
* maint:
  send-email: add transfer encoding header with content-type
  Doc fix for git-reflog: mention @{...} syntax, and <ref> in synopsys.
  config: clarify compression defaults
  config: correct core.loosecompression documentation

1  2 
Documentation/config.txt
git-send-email.perl

diff --combined Documentation/config.txt
@@@ -188,7 -188,7 +188,7 @@@ core.worktree:
        Set the path to the working tree.  The value will not be
        used in combination with repositories found automatically in
        a .git directory (i.e. $GIT_DIR is not set).
 -      This can be overriden by the GIT_WORK_TREE environment
 +      This can be overridden by the GIT_WORK_TREE environment
        variable and the '--work-tree' command line option.
  
  core.logAllRefUpdates::
@@@ -226,13 -226,15 +226,15 @@@ core.compression:
        An integer -1..9, indicating a default compression level.
        -1 is the zlib default. 0 means no compression,
        and 1..9 are various speed/size tradeoffs, 9 being slowest.
+       If set, this provides a default to other compression variables,
+       such as 'core.loosecompression' and 'pack.compression'.
  
  core.loosecompression::
        An integer -1..9, indicating the compression level for objects that
        are not in a pack file. -1 is the zlib default. 0 means no
        compression, and 1..9 are various speed/size tradeoffs, 9 being
        slowest.  If not set,  defaults to core.compression.  If that is
-       not set,  defaults to 0 (best speed).
+       not set,  defaults to 1 (best speed).
  
  core.packedGitWindowSize::
        Number of bytes of a pack file to map into memory in a
@@@ -324,11 -326,10 +326,11 @@@ branch.<name>.remote:
        If this option is not given, `git fetch` defaults to remote "origin".
  
  branch.<name>.merge::
 -      When in branch <name>, it tells `git fetch` the default refspec to
 -      be marked for merging in FETCH_HEAD. The value has exactly to match
 -      a remote part of one of the refspecs which are fetched from the remote
 -      given by "branch.<name>.remote".
 +      When in branch <name>, it tells `git fetch` the default
 +      refspec to be marked for merging in FETCH_HEAD. The value is
 +      handled like the remote part of a refspec, and must match a
 +      ref which is fetched from the remote given by
 +      "branch.<name>.remote".
        The merge information is used by `git pull` (which at first calls
        `git fetch`) to lookup the default branch for merging. Without
        this option, `git pull` defaults to merge the first refspec fetched.
        branch.<name>.merge to the desired branch, and use the special setting
        `.` (a period) for branch.<name>.remote.
  
 +branch.<name>.mergeoptions::
 +      Sets default options for merging into branch <name>. The syntax and
 +      supported options are equal to that of gitlink:git-merge[1], but
 +      option values containing whitespace characters are currently not
 +      supported.
 +
  clean.requireForce::
 -      A boolean to make git-clean do nothing unless given -f or -n.  Defaults
 -      to false.
 +      A boolean to make git-clean do nothing unless given -f
 +      or -n.   Defaults to true.
  
  color.branch::
        A boolean to enable/disable color in the output of
@@@ -432,12 -427,6 +434,12 @@@ fetch.unpackLimit:
        pack from a push can make the push operation complete faster,
        especially on slow filesystems.
  
 +format.numbered::
 +      A boolean which can enable sequence numbers in patch subjects.
 +      Seting this option to "auto" will enable it only if there is
 +      more than one patch.  See --numbered option in
 +      gitlink:git-format-patch[1].
 +
  format.headers::
        Additional email headers to include in a patch to be submitted
        by mail.  See gitlink:git-format-patch[1].
@@@ -452,19 -441,6 +454,19 @@@ gc.aggressiveWindow:
        algorithm used by 'git gc --aggressive'.  This defaults
        to 10.
  
 +gc.auto::
 +      When there are approximately more than this many loose
 +      objects in the repository, `git gc --auto` will pack them.
 +      Some Porcelain commands use this command to perform a
 +      light-weight garbage collection from time to time.  Setting
 +      this to 0 disables it.
 +
 +gc.autopacklimit::
 +      When there are more than this many packs that are not
 +      marked with `*.keep` file in the repository, `git gc
 +      --auto` consolidates them into one larger pack.  Setting
 +      this to 0 disables this.
 +
  gc.packrefs::
        `git gc` does not run `git pack-refs` in a bare repository by
        default so that older dumb-transport clients can still fetch
@@@ -614,7 -590,7 +616,7 @@@ merge.verbosity:
        message if conflicts were detected. Level 1 outputs only
        conflicts, 2 outputs conflicts and file changes.  Level 5 and
        above outputs debugging information.  The default is level 2.
 -      Can be overriden by 'GIT_MERGE_VERBOSITY' environment variable.
 +      Can be overridden by 'GIT_MERGE_VERBOSITY' environment variable.
  
  merge.<driver>.name::
        Defines a human readable name for a custom low-level
@@@ -648,7 -624,9 +650,9 @@@ pack.compression:
        in a pack file. -1 is the zlib default. 0 means no
        compression, and 1..9 are various speed/size tradeoffs, 9 being
        slowest.  If not set,  defaults to core.compression.  If that is
-       not set,  defaults to -1.
+       not set,  defaults to -1, the zlib default, which is "a default
+       compromise between speed and compression (currently equivalent
+       to level 6)."
  
  pack.deltaCacheSize::
        The maximum memory in bytes used for caching deltas in
        A value of 0 means no limit. Defaults to 0.
  
  pack.deltaCacheLimit::
 -      The maxium size of a delta, that is cached in
 +      The maximum size of a delta, that is cached in
        gitlink:git-pack-objects[1]. Defaults to 1000.
  
 +pack.threads::
 +      Specifies the number of threads to spawn when searching for best
 +      delta matches.  This requires that gitlink:git-pack-objects[1]
 +      be compiled with pthreads otherwise this option is ignored with a
 +      warning. This is meant to reduce packing time on multiprocessor
 +      machines. The required amount of memory for the delta search window
 +      is however multiplied by the number of threads.
 +
 +pack.indexVersion::
 +      Specify the default pack index version.  Valid values are 1 for
 +      legacy pack index used by Git versions prior to 1.5.2, and 2 for
 +      the new pack index with capabilities for packs larger than 4 GB
 +      as well as proper protection against the repacking of corrupted
 +      packs.  Version 2 is selected and this config option ignored
 +      whenever the corresponding pack is larger than 2 GB.  Otherwise
 +      the default is 1.
 +
  pull.octopus::
        The default merge strategy to use when pulling multiple branches
        at once.
diff --combined git-send-email.perl
@@@ -73,22 -73,11 +73,22 @@@ 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.
 +                  Defaults to localhost.  Port number can be specified here with
 +                  hostname:port format or by using --smtp-server-port option.
 +
 +   --smtp-server-port Specify a port on the outgoing SMTP server to connect to.
 +
 +   --smtp-user    The username for SMTP-AUTH.
  
 -   --suppress-from Suppress sending emails to yourself if your address
 -                  appears in a From: line. Defaults to off.
 +   --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. Defaults to off.
  
     --thread       Specify that the "In-Reply-To:" header should be set on all
                    emails. Defaults to on.
@@@ -156,6 -145,7 +156,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:
@@@ -174,28 -164,24 +174,28 @@@ 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_server_port, $smtp_authuser, $smtp_authpass, $smtp_ssl);
 +my ($identity, $aliasfiletype, @alias_files, @smtp_host_parts);
  
 -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,
 +    "smtpserverport" => \$smtp_server_port,
 +    "smtpuser" => \$smtp_authuser,
 +    "smtppass" => \$smtp_authpass,
 +    "to" => \@to,
 +    "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:
@@@ -208,11 -194,6 +208,11 @@@ my $rc = GetOptions("sender|from=s" => 
                    "bcc=s" => \@bcclist,
                    "chain-reply-to!" => \$chain_reply_to,
                    "smtp-server=s" => \$smtp_server,
 +                  "smtp-server-port=s" => \$smtp_server_port,
 +                  "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,
@@@ -227,43 -208,6 +227,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) {
@@@ -278,7 -222,14 +278,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>) {
@@@ -370,7 -321,10 +370,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 = $_;
@@@ -557,11 -511,7 +557,11 @@@ sub sanitize_addres
  sub send_message
  {
        my @recipients = unique_email_list(@to);
 -      @cc = (map { sanitize_address($_) } @cc);
 +      @cc = (grep { my $cc = extract_valid_address($_);
 +                    not grep { $cc eq $_ } @recipients
 +                  }
 +             map { sanitize_address($_) }
 +             @cc);
        my $to = join (",\n\t", @recipients);
        @recipients = unique_email_list(@recipients,@cc,@bcclist);
        @recipients = (map { extract_valid_address($_) } @recipients);
@@@ -613,30 -563,8 +613,30 @@@ 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 (!defined $smtp_server) {
 +                      die "The required SMTP server is not properly defined."
 +              }
 +
 +              if ($smtp_ssl) {
 +                      $smtp_server_port ||= 465; # ssmtp
 +                      require Net::SMTP::SSL;
 +                      $smtp ||= Net::SMTP::SSL->new($smtp_server, Port => $smtp_server_port);
 +              }
 +              else {
 +                      require Net::SMTP;
 +                      $smtp ||= Net::SMTP->new((defined $smtp_server_port)
 +                                               ? "$smtp_server:$smtp_server_port"
 +                                               : $smtp_server);
 +              }
 +
 +              if (!$smtp) {
 +                      die "Unable to initialize SMTP properly.  Is there something wrong with your config?";
 +              }
 +
 +              if ((defined $smtp_authuser) && (defined $smtp_authpass)) {
 +                      $smtp->auth( $smtp_authuser, $smtp_authpass ) or die $smtp->message;
 +              }
                $smtp->mail( $raw_from ) or die $smtp->message;
                $smtp->to( @recipients ) or die $smtp->message;
                $smtp->data or die $smtp->message;
        if ($quiet) {
                printf (($dry_run ? "Dry-" : "")."Sent %s\n", $subject);
        } else {
 -              print (($dry_run ? "Dry-" : "")."OK. Log says:\nDate: $date\n");
 +              print (($dry_run ? "Dry-" : "")."OK. Log says:\n");
                if ($smtp_server !~ m#^/#) {
                        print "Server: $smtp_server\n";
                        print "MAIL FROM:<$raw_from>\n";
                } else {
                        print "Sendmail: $smtp_server ".join(' ',@sendmail_parameters)."\n";
                }
 -              print "From: $sanitized_sender\nSubject: $subject\nCc: $cc\nTo: $to\n\n";
 +              print $header, "\n";
                if ($smtp) {
                        print "Result: ", $smtp->code, ' ',
                                ($smtp->message =~ /\n([^\n]+\n)$/s), "\n";
@@@ -746,7 -674,6 +746,7 @@@ foreach my $t (@files) 
                        if (/^(Signed-off-by|Cc): (.*)$/i && $signed_off_cc) {
                                my $c = $2;
                                chomp $c;
 +                              next if ($c eq $sender and $suppress_from);
                                push @cc, $c;
                                printf("(sob) Adding cc: %s from line '%s'\n",
                                        $c, $_) unless $quiet;
        }
        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>) {
                        my $c = $_;
                        $c =~ s/^\s*//g;
                        $c =~ s/\n$//g;
 +                      next if ($c eq $sender and $suppress_from);
                        push @cc, $c;
                        printf("(cc-cmd) Adding cc: %s from: '%s'\n",
                                $c, $cc_cmd) unless $quiet;
                        else {
                                push @xh,
                                  'MIME-Version: 1.0',
-                                 "Content-Type: text/plain; charset=$author_encoding";
+                                 "Content-Type: text/plain; charset=$author_encoding",
+                                 'Content-Transfer-Encoding: 8bit';
                        }
                }
        }