]> git.ipfire.org Git - thirdparty/git.git/commitdiff
Merge branch 'tz/send-email-negatable-options' into maint-2.43
authorJunio C Hamano <gitster@pobox.com>
Fri, 9 Feb 2024 00:22:00 +0000 (16:22 -0800)
committerJunio C Hamano <gitster@pobox.com>
Fri, 9 Feb 2024 00:22:01 +0000 (16:22 -0800)
Newer versions of Getopt::Long started giving warnings against our
(ab)use of it in "git send-email".  Bump the minimum version
requirement for Perl to 5.8.1 (from September 2002) to allow
simplifying our implementation.

* tz/send-email-negatable-options:
  send-email: avoid duplicate specification warnings
  perl: bump the required Perl version to 5.8.1 from 5.8.0

1  2 
Documentation/CodingGuidelines
git-send-email.perl
git-svn.perl

index 8d3a467c0135319162b71290810917cca5f8316f,aa0195d6ebab0b5f200d85f8dcbd5aebf33b7d4f..39b9b7260f4434467e300d6b2bf13183035cbd81
@@@ -1,5 -1,5 +1,5 @@@
 -Like other projects, we also have some guidelines to keep to the
 -code.  For Git in general, a few rough rules are:
 +Like other projects, we also have some guidelines for our code.  For
 +Git in general, a few rough rules are:
  
   - Most importantly, we never say "It's in POSIX; we'll happily
     ignore your needs should your system not conform to it."
@@@ -24,7 -24,7 +24,7 @@@
  
     "Once it _is_ in the tree, it's not really worth the patch noise to
     go and fix it up."
 -   Cf. http://lkml.iu.edu/hypermail/linux/kernel/1001.3/01069.html
 +   Cf. https://lore.kernel.org/all/20100126160632.3bdbe172.akpm@linux-foundation.org/
  
   - Log messages to explain your changes are as important as the
     changes themselves.  Clearly written code and in-code comments
@@@ -40,7 -40,7 +40,7 @@@ As for more concrete guidelines, just i
  contributing to). It is always preferable to match the _local_
  convention. New code added to Git suite is expected to match
  the overall style of existing code. Modifications to existing
 -code is expected to match the style the surrounding code already
 +code are expected to match the style the surrounding code already
  uses (even if it doesn't match the overall style of existing code).
  
  But if you must have a list of rules, here are some language
@@@ -490,7 -490,7 +490,7 @@@ For Perl programs
  
   - Most of the C guidelines above apply.
  
-  - We try to support Perl 5.8 and later ("use Perl 5.008").
+  - We try to support Perl 5.8.1 and later ("use Perl 5.008001").
  
   - use strict and use warnings are strongly preferred.
  
diff --combined git-send-email.perl
index d24e981d611116aa2fabac09697a4532c8081c00,60afafb375d8f49e8cfc075de2e2a3ebddffa541..821b2b3a135ab6f4ab0085ac6acbea1d4eb1c320
@@@ -16,7 -16,7 +16,7 @@@
  #    and second line is the subject of the message.
  #
  
- use 5.008;
+ use 5.008001;
  use strict;
  use warnings $ENV{GIT_PERL_FATAL_WARNINGS} ? qw(FATAL all) : ();
  use Getopt::Long;
@@@ -28,8 -28,8 +28,8 @@@ Getopt::Long::Configure qw/ pass_throug
  
  sub usage {
        print <<EOT;
 -git send-email' [<options>] <file|directory>
 -git send-email' [<options>] <format-patch options>
 +git send-email [<options>] <file|directory>
 +git send-email [<options>] <format-patch options>
  git send-email --dump-aliases
  
    Composing:
@@@ -119,13 -119,16 +119,16 @@@ sub completion_helper 
  
        foreach my $key (keys %$original_opts) {
                unless (exists $not_for_completion{$key}) {
-                       $key =~ s/!$//;
+                       my $negatable = ($key =~ s/!$//);
  
                        if ($key =~ /[:=][si]$/) {
                                $key =~ s/[:=][si]$//;
                                push (@send_email_opts, "--$_=") foreach (split (/\|/, $key));
                        } else {
                                push (@send_email_opts, "--$_") foreach (split (/\|/, $key));
+                               if ($negatable) {
+                                       push (@send_email_opts, "--no-$_") foreach (split (/\|/, $key));
+                               }
                        }
                }
        }
@@@ -228,7 -231,7 +231,7 @@@ sub system_or_msg 
        my @sprintf_args = ($cmd_name ? $cmd_name : $args->[0], $exit_code);
        if (defined $msg) {
                # Quiet the 'redundant' warning category, except we
-               # need to support down to Perl 5.8, so we can't do a
+               # need to support down to Perl 5.8.1, so we can't do a
                # "no warnings 'redundant'", since that category was
                # introduced in perl 5.22, and asking for it will die
                # on older perls.
@@@ -491,7 -494,6 +494,6 @@@ my %options = 
                    "bcc=s" => \@getopt_bcc,
                    "no-bcc" => \$no_bcc,
                    "chain-reply-to!" => \$chain_reply_to,
-                   "no-chain-reply-to" => sub {$chain_reply_to = 0},
                    "sendmail-cmd=s" => \$sendmail_cmd,
                    "smtp-server=s" => \$smtp_server,
                    "smtp-server-option=s" => \@smtp_server_options,
                    "smtp-auth=s" => \$smtp_auth,
                    "no-smtp-auth" => sub {$smtp_auth = 'none'},
                    "annotate!" => \$annotate,
-                   "no-annotate" => sub {$annotate = 0},
                    "compose" => \$compose,
                    "quiet" => \$quiet,
                    "cc-cmd=s" => \$cc_cmd,
                    "header-cmd=s" => \$header_cmd,
                    "no-header-cmd" => \$no_header_cmd,
                    "suppress-from!" => \$suppress_from,
-                   "no-suppress-from" => sub {$suppress_from = 0},
                    "suppress-cc=s" => \@suppress_cc,
                    "signed-off-cc|signed-off-by-cc!" => \$signed_off_by_cc,
-                   "no-signed-off-cc|no-signed-off-by-cc" => sub {$signed_off_by_cc = 0},
-                   "cc-cover|cc-cover!" => \$cover_cc,
-                   "no-cc-cover" => sub {$cover_cc = 0},
-                   "to-cover|to-cover!" => \$cover_to,
-                   "no-to-cover" => sub {$cover_to = 0},
+                   "cc-cover!" => \$cover_cc,
+                   "to-cover!" => \$cover_to,
                    "confirm=s" => \$confirm,
                    "dry-run" => \$dry_run,
                    "envelope-sender=s" => \$envelope_sender,
                    "thread!" => \$thread,
-                   "no-thread" => sub {$thread = 0},
                    "validate!" => \$validate,
-                   "no-validate" => sub {$validate = 0},
                    "transfer-encoding=s" => \$target_xfer_encoding,
                    "format-patch!" => \$format_patch,
-                   "no-format-patch" => sub {$format_patch = 0},
                    "8bit-encoding=s" => \$auto_8bit_encoding,
                    "compose-encoding=s" => \$compose_encoding,
                    "force" => \$force,
                    "xmailer!" => \$use_xmailer,
-                   "no-xmailer" => sub {$use_xmailer = 0},
                    "batch-size=i" => \$batch_size,
                    "relogin-delay=i" => \$relogin_delay,
                    "git-completion-helper" => \$git_completion_helper,
@@@ -799,6 -792,30 +792,6 @@@ $sender = sanitize_address($sender)
  
  $time = time - scalar $#files;
  
 -if ($validate) {
 -      # FIFOs can only be read once, exclude them from validation.
 -      my @real_files = ();
 -      foreach my $f (@files) {
 -              unless (-p $f) {
 -                      push(@real_files, $f);
 -              }
 -      }
 -
 -      # Run the loop once again to avoid gaps in the counter due to FIFO
 -      # arguments provided by the user.
 -      my $num = 1;
 -      my $num_files = scalar @real_files;
 -      $ENV{GIT_SENDEMAIL_FILE_TOTAL} = "$num_files";
 -      foreach my $r (@real_files) {
 -              $ENV{GIT_SENDEMAIL_FILE_COUNTER} = "$num";
 -              pre_process_file($r, 1);
 -              validate_patch($r, $target_xfer_encoding);
 -              $num += 1;
 -      }
 -      delete $ENV{GIT_SENDEMAIL_FILE_COUNTER};
 -      delete $ENV{GIT_SENDEMAIL_FILE_TOTAL};
 -}
 -
  @files = handle_backup_files(@files);
  
  if (@files) {
@@@ -837,9 -854,6 +830,9 @@@ if ($compose) 
        my $tpl_subject = $initial_subject || '';
        my $tpl_in_reply_to = $initial_in_reply_to || '';
        my $tpl_reply_to = $reply_to || '';
 +      my $tpl_to = join(',', @initial_to);
 +      my $tpl_cc = join(',', @initial_cc);
 +      my $tpl_bcc = join(', ', @initial_bcc);
  
        print $c <<EOT1, Git::prefix_lines("GIT: ", __(<<EOT2)), <<EOT3;
  From $tpl_sender # This line is ignored.
@@@ -851,9 -865,6 +844,9 @@@ for the patch you are writing
  Clear the body content if you don't wish to send a summary.
  EOT2
  From: $tpl_sender
 +To: $tpl_to
 +Cc: $tpl_cc
 +Bcc: $tpl_bcc
  Reply-To: $tpl_reply_to
  Subject: $tpl_subject
  In-Reply-To: $tpl_in_reply_to
@@@ -870,65 -881,73 +863,65 @@@ EOT
                do_edit($compose_filename);
        }
  
 +      open my $c2, ">", $compose_filename . ".final"
 +              or die sprintf(__("Failed to open %s.final: %s"), $compose_filename, $!);
 +
        open $c, "<", $compose_filename
                or die sprintf(__("Failed to open %s: %s"), $compose_filename, $!);
  
 +      my $need_8bit_cte = file_has_nonascii($compose_filename);
 +      my $in_body = 0;
 +      my $summary_empty = 1;
        if (!defined $compose_encoding) {
                $compose_encoding = "UTF-8";
        }
 -
 -      my %parsed_email;
 -      while (my $line = <$c>) {
 -              next if $line =~ m/^GIT:/;
 -              parse_header_line($line, \%parsed_email);
 -              if ($line =~ /^$/) {
 -                      $parsed_email{'body'} = filter_body($c);
 +      while(<$c>) {
 +              next if m/^GIT:/;
 +              if ($in_body) {
 +                      $summary_empty = 0 unless (/^\n$/);
 +              } elsif (/^\n$/) {
 +                      $in_body = 1;
 +                      if ($need_8bit_cte) {
 +                              print $c2 "MIME-Version: 1.0\n",
 +                                       "Content-Type: text/plain; ",
 +                                         "charset=$compose_encoding\n",
 +                                       "Content-Transfer-Encoding: 8bit\n";
 +                      }
 +              } elsif (/^MIME-Version:/i) {
 +                      $need_8bit_cte = 0;
 +              } elsif (/^Subject:\s*(.+)\s*$/i) {
 +                      $initial_subject = $1;
 +                      my $subject = $initial_subject;
 +                      $_ = "Subject: " .
 +                              quote_subject($subject, $compose_encoding) .
 +                              "\n";
 +              } elsif (/^In-Reply-To:\s*(.+)\s*$/i) {
 +                      $initial_in_reply_to = $1;
 +                      next;
 +              } elsif (/^Reply-To:\s*(.+)\s*$/i) {
 +                      $reply_to = $1;
 +              } elsif (/^From:\s*(.+)\s*$/i) {
 +                      $sender = $1;
 +                      next;
 +              } elsif (/^To:\s*(.+)\s*$/i) {
 +                      @initial_to = parse_address_line($1);
 +                      next;
 +              } elsif (/^Cc:\s*(.+)\s*$/i) {
 +                      @initial_cc = parse_address_line($1);
 +                      next;
 +              } elsif (/^Bcc:/i) {
 +                      @initial_bcc = parse_address_line($1);
 +                      next;
                }
 +              print $c2 $_;
        }
        close $c;
 +      close $c2;
  
 -      open my $c2, ">", $compose_filename . ".final"
 -      or die sprintf(__("Failed to open %s.final: %s"), $compose_filename, $!);
 -
 -
 -      if ($parsed_email{'From'}) {
 -              $sender = delete($parsed_email{'From'});
 -      }
 -      if ($parsed_email{'In-Reply-To'}) {
 -              $initial_in_reply_to = delete($parsed_email{'In-Reply-To'});
 -      }
 -      if ($parsed_email{'Reply-To'}) {
 -              $reply_to = delete($parsed_email{'Reply-To'});
 -      }
 -      if ($parsed_email{'Subject'}) {
 -              $initial_subject = delete($parsed_email{'Subject'});
 -              print $c2 "Subject: " .
 -                      quote_subject($initial_subject, $compose_encoding) .
 -                      "\n";
 -      }
 -
 -      if ($parsed_email{'MIME-Version'}) {
 -              print $c2 "MIME-Version: $parsed_email{'MIME-Version'}\n",
 -                              "Content-Type: $parsed_email{'Content-Type'};\n",
 -                              "Content-Transfer-Encoding: $parsed_email{'Content-Transfer-Encoding'}\n";
 -              delete($parsed_email{'MIME-Version'});
 -              delete($parsed_email{'Content-Type'});
 -              delete($parsed_email{'Content-Transfer-Encoding'});
 -      } elsif (file_has_nonascii($compose_filename)) {
 -              my $content_type = (delete($parsed_email{'Content-Type'}) or
 -                      "text/plain; charset=$compose_encoding");
 -              print $c2 "MIME-Version: 1.0\n",
 -                      "Content-Type: $content_type\n",
 -                      "Content-Transfer-Encoding: 8bit\n";
 -      }
 -      # Preserve unknown headers
 -      foreach my $key (keys %parsed_email) {
 -              next if $key eq 'body';
 -              print $c2 "$key: $parsed_email{$key}";
 -      }
 -
 -      if ($parsed_email{'body'}) {
 -              print $c2 "\n$parsed_email{'body'}\n";
 -              delete($parsed_email{'body'});
 -      } else {
 +      if ($summary_empty) {
                print __("Summary email is empty, skipping it\n");
                $compose = -1;
        }
 -
 -      close $c2;
 -
  } elsif ($annotate) {
        do_edit(@files);
  }
@@@ -983,6 -1002,32 +976,6 @@@ sub ask 
        return;
  }
  
 -sub parse_header_line {
 -      my $lines = shift;
 -      my $parsed_line = shift;
 -      my $addr_pat = join "|", qw(To Cc Bcc);
 -
 -      foreach (split(/\n/, $lines)) {
 -              if (/^($addr_pat):\s*(.+)$/i) {
 -                      $parsed_line->{$1} = [ parse_address_line($2) ];
 -              } elsif (/^([^:]*):\s*(.+)\s*$/i) {
 -                      $parsed_line->{$1} = $2;
 -              }
 -      }
 -}
 -
 -sub filter_body {
 -      my $c = shift;
 -      my $body = "";
 -      while (my $body_line = <$c>) {
 -              if ($body_line !~ m/^GIT:/) {
 -                      $body .= $body_line;
 -              }
 -      }
 -      return $body;
 -}
 -
 -
  my %broken_encoding;
  
  sub file_declares_8bit_cte {
@@@ -1114,10 -1159,10 +1107,10 @@@ sub extract_valid_address 
  
  sub extract_valid_address_or_die {
        my $address = shift;
 -      $address = extract_valid_address($address);
 +      my $valid_address = extract_valid_address($address);
        die sprintf(__("error: unable to extract a valid address from: %s\n"), $address)
 -              if !$address;
 -      return $address;
 +              if !$valid_address;
 +      return $valid_address;
  }
  
  sub validate_address {
        return 1;
  }
  
 -$in_reply_to = $initial_in_reply_to;
 -$references = $initial_in_reply_to || '';
 -$message_num = 0;
 -
  sub pre_process_file {
        my ($t, $quiet) = @_;
  
@@@ -1967,38 -2016,6 +1960,38 @@@ sub process_file 
        return 1;
  }
  
 +sub initialize_modified_loop_vars {
 +      $in_reply_to = $initial_in_reply_to;
 +      $references = $initial_in_reply_to || '';
 +      $message_num = 0;
 +}
 +
 +if ($validate) {
 +      # FIFOs can only be read once, exclude them from validation.
 +      my @real_files = ();
 +      foreach my $f (@files) {
 +              unless (-p $f) {
 +                      push(@real_files, $f);
 +              }
 +      }
 +
 +      # Run the loop once again to avoid gaps in the counter due to FIFO
 +      # arguments provided by the user.
 +      my $num = 1;
 +      my $num_files = scalar @real_files;
 +      $ENV{GIT_SENDEMAIL_FILE_TOTAL} = "$num_files";
 +      initialize_modified_loop_vars();
 +      foreach my $r (@real_files) {
 +              $ENV{GIT_SENDEMAIL_FILE_COUNTER} = "$num";
 +              pre_process_file($r, 1);
 +              validate_patch($r, $target_xfer_encoding);
 +              $num += 1;
 +      }
 +      delete $ENV{GIT_SENDEMAIL_FILE_COUNTER};
 +      delete $ENV{GIT_SENDEMAIL_FILE_TOTAL};
 +}
 +
 +initialize_modified_loop_vars();
  foreach my $t (@files) {
        while (!process_file($t)) {
                # user edited the file
diff --combined git-svn.perl
index 4e8878f0357ce0d98ae0675b0cabf5c6efb098b2,1d1c52f42468b1f3a5ff44ae611f0926dfbb9c54..b0d0a50984bcea740f9486deda974aa3e53cbe1c
@@@ -1,7 -1,7 +1,7 @@@
  #!/usr/bin/perl
  # Copyright (C) 2006, Eric Wong <normalperson@yhbt.net>
  # License: GPL v2 or later
- use 5.008;
+ use 5.008001;
  use warnings $ENV{GIT_PERL_FATAL_WARNINGS} ? qw(FATAL all) : ();
  use strict;
  use vars qw/  $AUTHOR $VERSION
@@@ -297,12 -297,28 +297,12 @@@ my %cmd = 
                {} ],
  );
  
 -package FakeTerm;
 -sub new {
 -      my ($class, $reason) = @_;
 -      return bless \$reason, shift;
 -}
 -sub readline {
 -      my $self = shift;
 -      die "Cannot use readline on FakeTerm: $$self";
 -}
 -package main;
 -
  my $term;
  sub term_init {
 -      $term = eval {
 -              require Term::ReadLine;
 -              $ENV{"GIT_SVN_NOTTY"}
 +      require Term::ReadLine;
 +      $term = $ENV{"GIT_SVN_NOTTY"}
                        ? new Term::ReadLine 'git-svn', \*STDIN, \*STDOUT
                        : new Term::ReadLine 'git-svn';
 -      };
 -      if ($@) {
 -              $term = new FakeTerm "$@: going non-interactive";
 -      }
  }
  
  my $cmd;