]> git.donarmstrong.com Git - debbugs.git/blobdiff - scripts/process
support -done being set in a psuedoheader
[debbugs.git] / scripts / process
index 17aa15be7b297939a66e8ea97e1eff656fbf4645..265bd5835b6fb2f96e671fef5895cd409b7401c4 100755 (executable)
@@ -7,7 +7,6 @@
 use warnings;
 use strict;
 
-use locale;
 use POSIX qw(strftime locale_h);
 setlocale(LC_TIME, "C");
 
@@ -35,6 +34,7 @@ use Debbugs::Control qw(append_action_to_log);
 use Debbugs::Control::Service qw(valid_control control_line);
 use Debbugs::Recipients qw(determine_recipients);
 use Encode qw(encode_utf8 decode);
+use List::AllUtils qw(first uniqnum);
 
 =head1 NAME
 
@@ -180,8 +180,10 @@ for my $hdr (@headerlines) {
     $_ = $hdr;
     s/\n\s/ /g;
     finish() if m/^x-loop: (\S+)$/i && $1 eq "$gMaintainerEmail";
-    my $ins = !m/^subject:/i && !m/^reply-to:/i && !m/^return-path:/i
-           && !m/^From / && !m/^X-Debbugs-/i;
+    my $ins = !m/^(?:(?:subject|reply-to|return-path|
+                        mail-followup-to|
+                        references):
+                |From\s|X-Debbugs-)/xi;
     $fwd .= encode_utf8($hdr)."\n" if $ins;
     # print {$debugfh} ">$_<\n";
     if (s/^(\S+):\s*//) {
@@ -224,16 +226,22 @@ for my $phline (@bodylines)
     # Remove BOM markers from UTF-8 strings
     # Fixes #488554
     $phline =~ s/\xef\xbb\xbf//g;
-    last if $phline !~ m/^([\w-]+):\s*(\S.*)/;
+    $phline =~ s/\N{U+FEFF}//g;
+    last if $phline !~ m/^([\w-]+): # psuedoheader
+                        (?:\s|\N{U+00A0})* # zero or more spaces, including
+                                            # non-breaking space
+                        (\S.*)/x; # pseudoheader value
     my ($fn, $fv) = ($1, $2);
     $fv =~ s/\s*$//;
+    # pluralize tag/usertag
+    $fn = $fn.'s' if $fn =~ /^(?:tag|usertag)$/;
     print {$debugfh} ">$fn|$fv|\n";
     $fn = lc $fn;
     if ($fn =~ /^control$/) {
        push @control_bits,$fv;
     } else {
        # Don't lc owner or forwarded
-       $fv = lc $fv unless $fn =~ /^(?:owner|forwarded|usertags|version|source-version)$/;
+       $fv = lc $fv unless $fn =~ /^(?:owner|forwarded|usertags|version|source-version|done)$/;
        $pheader{$fn} = $fv;
     }
     print {$debugfh} ">$fn~$fv<\n";
@@ -247,7 +255,7 @@ for my $key (grep /X-Debbugs-.*/i, keys %pheader) {
 # set $i to beginning of encoded body data, so we can dump it out
 # verbatim later
 my $i = 0;
-++$i while $msg[$i] =~ /./;
+++$i while $i <= $#msg and $msg[$i] =~ /./;
 $fwd .= join("\n",@msg[$i..$#msg]);
 
 binmode($debugfh,':raw');
@@ -305,7 +313,7 @@ if (defined $tryref) {
         $ref= $tryref;
     } else {
         &sendmessage(create_mime_message(
-          [From          => "$gMaintainerEmail ($gProject $gBug Tracking System)",
+          [From          =>  qq("$gProject $gBug Tracking System" <$gMaintainerEmail>),
           To            => $replyto,
           Subject       => "Unknown problem report $gBug#$tryref ($subject)",
           'Message-ID'  => "<handler.x.$nn.unknown\@$gEmailDomain>",
@@ -382,7 +390,7 @@ if ($codeletter eq 'D' || $codeletter eq 'F')
         }
         $receivedat= "done\@$gEmailDomain";
         $markaswhat= 'done';
-        $set_done= $header{'from'};
+        $set_done= $pheader{'done'} // $header{'from'};
        if ( length( $gListDomain ) > 0 && length( $gDoneList ) > 0 ) {
             $generalcc= "$gDoneList\@$gListDomain";
            push @generalcc, "$gDoneList\@$gListDomain";
@@ -396,7 +404,7 @@ if ($codeletter eq 'D' || $codeletter eq 'F')
     }
     if ($ref<0) {
        &sendmessage(create_mime_message(
-          [From          => "$gMaintainerEmail ($gProject $gBug Tracking System)",
+          [From          => qq("$gProject $gBug Tracking System" <$gMaintainerEmail>),
           To            => $replyto,
           Subject       => "Message with no $gBug number ignored by $receivedat ($subject)",
           'Message-ID'  => "<handler.x.$nn.warnignore\@$gEmailDomain>",
@@ -488,7 +496,7 @@ if ($codeletter eq 'D' || $codeletter eq 'F')
            &htmllog("Reply","sent",$replyto,"You have marked $gBug as forwarded.");
             &sendmessage(create_mime_message(
             [@common_headers,
-             From          => "$gMaintainerEmail ($gProject $gBug Tracking System)",
+             From          => qq("$gProject $gBug Tracking System" <$gMaintainerEmail>),
               To            => "$replyto",
               Subject       => "$gBug#$ref: marked as forwarded ($data->{subject})",
               "Message-ID"  => "<header.$ref.$nn.ackfwdd\@$gEmailDomain>",
@@ -500,6 +508,8 @@ if ($codeletter eq 'D' || $codeletter eq 'F')
               "X-$gProject-PR-Keywords" => $data->{keywords},
              # Only have a X-$gProject-PR-Source when we know the source package
              (defined($source_package) and length($source_package))?("X-$gProject-PR-Source" => $source_package):(),
+              "Reply-To"                => "$ref\@$gEmailDomain",
+              "Content-Type"            => 'text/plain; charset="utf-8"',
              ],message_body_template('mail/process_mark_as_forwarded',
                                     {date => $header{date},
                                      messageid => $header{'message-id'},
@@ -511,7 +521,7 @@ if ($codeletter eq 'D' || $codeletter eq 'F')
            &htmllog("Reply","sent",$replyto,"You have taken responsibility.");
             &sendmessage(create_mime_message(
             [@common_headers,
-             From          => "$gMaintainerEmail ($gProject $gBug Tracking System)",
+             From          => qq("$gProject $gBug Tracking System" <$gMaintainerEmail>),
               To            => $replyto,
               Subject       => "$gBug#$ref: marked as done ($data->{subject})",
               "Message-ID"  => "<handler.$ref.$nn.ackdone\@$gEmailDomain>",
@@ -523,6 +533,8 @@ if ($codeletter eq 'D' || $codeletter eq 'F')
               "X-$gProject-PR-Keywords" => $data->{keywords},
              # Only have a X-$gProject-PR-Source when we know the source package
              (defined($source_package) and length($source_package))?("X-$gProject-PR-Source" => $source_package):(),
+              "Reply-To"                => "$ref\@$gEmailDomain",
+              "Content-Type"            => 'text/plain; charset="utf-8"',
              ],message_body_template('mail/process_mark_as_done',
                                     {date => $header{date},
                                      messageid => $header{'message-id'},
@@ -535,15 +547,15 @@ if ($codeletter eq 'D' || $codeletter eq 'F')
                "$gBug acknowledged by developer.");
             &sendmessage(create_mime_message(
             [@common_headers,
-             From          => "$gMaintainerEmail ($gProject $gBug Tracking System)",
+             From          => qq("$gProject $gBug Tracking System" <$gMaintainerEmail>),
               To            => "$data->{originator}",
               Subject       => "$gBug#$ref closed by $markedby ($header{'subject'})",
               "Message-ID"  => "<handler.$ref.$nn.notifdone\@$gEmailDomain>",
               (defined $data->{msgid})?("In-Reply-To" => $data->{msgid}):(),
-              References    => join(' ',grep {defined $_} ($header{'message-id'},$data->{msgid})),
+              References    => join(' ',grep {defined $_} ($header{'message-id'},$data->{msgid},'')),
               "X-$gProject-PR-Message"  => "they-closed $ref",
-              "X-$gProject-PR-Package"  => "$data->{package}",
-              "X-$gProject-PR-Keywords" => "$data->{keywords}",
+              (defined $data->{package})?("X-$gProject-PR-Package"  => $data->{package}):(),
+              (defined $data->{keywords})?("X-$gProject-PR-Keywords" => $data->{keywords}):(),
              # Only have a X-$gProject-PR-Source when we know the source package
              (defined($source_package) and length($source_package))?("X-$gProject-PR-Source" => $source_package):(),
               "Reply-To"                => "$ref\@$gEmailDomain",
@@ -566,7 +578,7 @@ if ($ref<0) { # new bug report
     if ($codeletter eq 'U') { # -submitter
        &sendmessage(create_mime_message(
           [@common_headers,
-          From          => "$gMaintainerEmail ($gProject $gBug Tracking System)",
+          From          => qq("$gProject $gBug Tracking System" <$gMaintainerEmail>),
           To            => $replyto,
           Subject       => "Message with no $gBug number cannot be sent to submitter! ($subject)",
           'Message-ID'  => "<handler.x.$nn.nonumnosub\@$gEmailDomain>",
@@ -591,7 +603,8 @@ if ($ref<0) { # new bug report
 
     if (defined $pheader{source}) {
        # source packages are identified by the src: prefix
-        $data->{package} = 'src:'.$pheader{source};
+        $data->{package} = $pheader{source};
+        $data->{package} =~ s/(^|,\s*)/${1}src:/g;
     } elsif (defined $pheader{package}) {
         $data->{package} = $pheader{package};
        if ($data->{package} =~ /^src:(.+)/) {
@@ -605,7 +618,7 @@ if ($ref<0) { # new bug report
                                        );
         &sendmessage(create_mime_message(
                        [@common_headers,
-                       From          => "$gMaintainerEmail ($gProject $gBug Tracking System)",
+                       From          => qq("$gProject $gBug Tracking System" <$gMaintainerEmail>),
                         To            => $replyto,
                         Subject       => "Message with no Package: tag cannot be processed! ($subject)",
                         "Message-ID"  => "<handler.x.$nn.nonumnosub\@$gEmailDomain>",
@@ -801,6 +814,12 @@ if (length($resentccval)) {
     $resentcc= "Resent-CC: $resentccval\n"; 
 }
 
+my $referencesval = join(' ',grep {defined $_} $header{'references'},$data->{msgid});
+my $references = '';
+if (!$newref && length($referencesval)) {
+    $references = "References: $referencesval\n";
+}
+
 my $common_headers='';
 {
     my @tmp = @common_headers;
@@ -820,7 +839,7 @@ Resent-Sender: $gMaintainerEmail
 X-$gProject-PR-Message: report $ref
 X-$gProject-PR-Package: $data->{package}
 X-$gProject-PR-Keywords: $data->{keywords}
-${source_pr_header}
+${references}${source_pr_header}
 END
     chomp $enc_msg;
     $enc_msg = encode_utf8($enc_msg).$fwd."\n";
@@ -843,7 +862,7 @@ Resent-Sender: $gMaintainerEmail
 X-$gProject-PR-Message: $report_followup $ref
 X-$gProject-PR-Package: $data->{package}
 X-$gProject-PR-Keywords: $data->{keywords}
-${source_pr_header}
+${references}${source_pr_header}
 END
     chomp $enc_msg;
     $enc_msg = encode_utf8($enc_msg).$fwd."\n";
@@ -877,7 +896,7 @@ Resent-Sender: $gMaintainerEmail
 ${common_headers}X-$gProject-PR-Message: $report_followup $ref
 X-$gProject-PR-Package: $data->{package}
 X-$gProject-PR-Keywords: $data->{keywords}
-${source_pr_header}
+${references}${source_pr_header}
 END
     chomp $enc_msg;
     $enc_msg = encode_utf8($enc_msg).$fwd."\n";
@@ -971,7 +990,7 @@ if (not exists $header{'x-debbugs-no-ack'} and
                                     );
      &sendmessage(create_mime_message(
                       [@common_headers,
-                       From          => "$gMaintainerEmail ($gProject $gBug Tracking System)",
+                       From          => qq("$gProject $gBug Tracking System" <$gMaintainerEmail>),
                        To            => $replyto,
                        Subject       => $t_h{subject},
                        "Message-ID"  => $t_h{messageid},
@@ -1014,7 +1033,7 @@ if (@control_bits) {
         request_subject   => $header{subject},
         request_nn        => $nn,
         request_replyto   => $replyto,
-        message           => $msg,
+        message           => [$msg],
         affected_bugs     => \%bug_affected,
         affected_packages => \%affected_packages,
         recipients        => \%recipients,
@@ -1069,10 +1088,10 @@ if (@control_bits) {
                                        address_only => 1,
                                        cc => 1,
                                       );
-    my $error_text = $errors > 0 ? " (with $errors errors)":'';
+    my $error_text = $errors > 0 ? " (with $errors error" . ($errors > 1 ? "s" : "") . ")" : "";
     my $reply =
        create_mime_message(['X-Loop'      => $gMaintainerEmail,
-                            From          => "$gMaintainerEmail ($gProject $gBug Tracking System)",
+                            From          => qq("$gProject $gBug Tracking System" <$gMaintainerEmail>),
                             To            => $replyto,
                             @maintccs ? (Cc => join(', ',@maintccs)):(),
                             Subject       => "Processed${error_text}: $header{subject}",
@@ -1255,20 +1274,15 @@ sub fill_template{
      my $variables = {config => \%config,
                      defined($ref)?(ref    => $ref):(),
                      defined($data)?(data  => $data):(),
-                     refs => [map {exists $clonebugs{$_}?$clonebugs{$_}:$_} keys %bug_affected],
+                     refs => [sort
+                              uniqnum(defined($ref)?($ref):(),
+                                      map {exists $clonebugs{$_}?$clonebugs{$_}:$_}
+                                      keys %bug_affected)],
                      %{$extra_var},
                     };
-     my $hole_var = {'&bugurl' =>
-                    sub{"$_[0]: ".
-                             'http://'.$config{cgi_domain}.'/'.
-                                  Debbugs::CGI::bug_links(bug=>$_[0],
-                                                          links_only => 1,
-                                                         );
-                   }
-                   };
      return fill_in_template(template => $template,
                             variables => $variables,
-                            hole_var  => $hole_var,
+                            output_type => 'text',
                            );
 }