X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=scripts%2Fprocess.in;h=5cd9f1358f35bc95599685dfdd6962e1ba002bea;hb=69211a7468249d41bff8efb9d8c2375242f4e5e7;hp=1373aa3dd463ae7a5dc6f35f6a12fbbccbec5303;hpb=b3c9deaaab461952096cafa9cf28ef346217035a;p=debbugs.git diff --git a/scripts/process.in b/scripts/process.in index 1373aa3..5cd9f13 100755 --- a/scripts/process.in +++ b/scripts/process.in @@ -1,5 +1,5 @@ #!/usr/bin/perl -# $Id: process.in,v 1.107 2005/10/19 01:22:14 don Exp $ +# $Id: process.in,v 1.109 2006/02/09 22:02:04 don Exp $ # # Usage: process nn # Temps: incoming/Pnn @@ -9,11 +9,16 @@ $ENV{"TZ"} = 'UTC'; tzset(); use MIME::Parser; -use Debbugs::MIME qw(decode_rfc1522); +use Debbugs::MIME qw(decode_rfc1522 create_mime_message); use Debbugs::Mail qw(send_mail_message encode_headers); +use Debbugs::Packages qw(getpkgsrc); -$config_path = '/etc/debbugs'; -$lib_path = '/usr/lib/debbugs'; +my $config_path = '/etc/debbugs'; +my $lib_path = '/usr/lib/debbugs'; + +# TODO DLA; needs config reworking and errorlib reworking +# use warnings; +# use strict; require "$config_path/config"; require "$lib_path/errorlib"; @@ -25,13 +30,13 @@ chdir( "$gSpoolDir" ) || die "chdir spool: $!\n"; umask(002); open DEBUG, ">/dev/null"; -defined( $intdate= time ) || &quit( "failed to get time: $!" ); +my $intdate = time or quit("failed to get time: $!"); $_=shift; -m/^([BMQFDUL])(\d*)\.\d+$/ || &quit("bad argument"); -$codeletter= $1; -$tryref= length($2) ? $2+0 : -1; -$nn= $_; +m/^([BMQFDUL])(\d*)\.\d+$/ or quit("bad argument: $_"); +my $codeletter= $1; +my $tryref= length($2) ? $2 : -1; +my $nn= $_; if (!rename("incoming/G$nn","incoming/P$nn")) { @@ -39,7 +44,7 @@ if (!rename("incoming/G$nn","incoming/P$nn")) &quit("renaming to lock: $!"); } -$baddress= 'submit' if $codeletter eq 'B'; +my $baddress= 'submit' if $codeletter eq 'B'; $baddress= 'maintonly' if $codeletter eq 'M'; $baddress= 'quiet' if $codeletter eq 'Q'; $baddress= 'forwarded' if $codeletter eq 'F'; @@ -47,20 +52,20 @@ $baddress= 'done' if $codeletter eq 'D'; $baddress= 'submitter' if $codeletter eq 'U'; bug_list_forward($nn) if $codeletter eq 'L'; $baddress || &quit("bad codeletter $codeletter"); -$baddressroot= $baddress; +my $baddressroot= $baddress; $baddress= "$tryref-$baddress" if $tryref>=0; open(M,"incoming/P$nn"); -@log=; +my @log=; close(M); -@msg=@log; +my @msg = @log; chomp @msg; print DEBUG "###\n",join("##\n",@msg),"\n###\n"; -$tdate = strftime "%a, %d %h %Y %T UTC", localtime; -$fwd= <output_under("$gSpoolDir/mime.tmp"); my $entity = eval { $parser->parse_data(join('',@log)) }; +my $i; if ($entity and $entity->head->tags) { @headerlines = @{$entity->head->header}; chomp @headerlines; @@ -100,6 +106,8 @@ if ($entity and $entity->head->tags) { @bodylines = @msg[$i..$#msg]; } +my %header; + for my $hdr (@headerlines) { $hdr = decode_rfc1522($hdr); $_ = $hdr; @@ -142,7 +150,8 @@ for my $phline (@bodylines) $fv =~ s/\s*$//; print DEBUG ">$fn|$fv|\n"; $fn = lc $fn; - $fv = lc $fv; + # Don't lc owner or forwarded + $fv = lc $fv unless $fh =~ /^(?:owner|forwarded)$/; $pheader{$fn} = $fv; print DEBUG ">$fn~$fv<\n"; } @@ -161,7 +170,7 @@ if (defined $header{'resent-from'} && !defined $header{'from'}) { } defined($header{'from'}) || &quit("no From header"); -$replyto = $header{'reply-to'}; +my $replyto = $header{'reply-to'}; $replyto = '' unless defined $replyto; $replyto =~ s/^ +//; $replyto =~ s/ +$//; @@ -169,11 +178,7 @@ unless (length $replyto) { $replyto = $header{'from'}; } -$_= $replyto; -$_= "$2 <$1>" if m/^([^\<\> \t\n\(\)]+) \(([^\(\)\<\>]+)\)$/; -$replytocompare= $_; -print DEBUG "replytocompare >$replytocompare<\n"; - +my $subject = '(no subject)'; if (!defined($header{'subject'})) { $brokenness.= <{package} or defined $pheader{package}) { + my $pkg_src = getpkgsrc(); + $source_package = $pkg_src->{defined $data->{package}?$data->{package}:$pheader{package}}; +} +$source_pr_header = "X-$gProject-PR-Source: $source_package\n" + if defined $source_package and length $source_package; + +# Done and Forwarded Bugs if ($codeletter eq 'D' || $codeletter eq 'F') { if ($replyto =~ m/$gBounceFroms/o || @@ -260,17 +276,19 @@ if ($codeletter eq 'D' || $codeletter eq 'F') } $markedby= $header{'from'} eq $replyto ? $replyto : "$header{'from'} (reply to $replyto)"; - if ($codeletter eq 'F') { + my @generalcc; + if ($codeletter eq 'F') { # Forwarded (&appendlog,&finish) if length($data->{forwarded}); $receivedat= "forwarded\@$gEmailDomain"; $markaswhat= 'forwarded'; $set_forwarded= $header{'to'}; if ( length( $gListDomain ) > 0 && length( $gForwardList ) > 0 ) { + push @generalcc, "$gForwardList\@$gListDomain"; $generalcc= "$gForwardList\@$gListDomain"; } else { $generalcc=''; } - } else { + } else { # Done if (length($data->{done}) and not defined $pheader{'source-version'} and not defined $pheader{'version'}) { @@ -282,12 +300,14 @@ if ($codeletter eq 'D' || $codeletter eq 'F') $set_done= $header{'from'}; if ( length( $gListDomain ) > 0 && length( $gDoneList ) > 0 ) { $generalcc= "$gDoneList\@$gListDomain"; + push @generalcc, "$gDoneList\@$gListDomain"; } else { $generalcc=''; } } if (defined $gStrongList and isstrongseverity($data->{severity})) { $generalcc = join ', ', $generalcc, "$gStrongList\@$gListDomain"; + push @generalcc,"$gStrongList\@$gListDomain"; } if ($ref<0) { &htmllog("Warning","sent",$replyto,"Message ignored."); @@ -336,10 +356,10 @@ END &checkmaintainers; + my @noticecc = grep($_ ne $replyto,@maintaddrs); $noticeccval.= join(', ', grep($_ ne $replyto,@maintaddrs)); $noticeccval =~ s/\s+\n\s+/ /g; $noticeccval =~ s/^\s+/ /; $noticeccval =~ s/\s+$//; - if (length($noticeccval)) { $noticecc= "Cc: $noticeccval\n"; } @process= ($ref,split(/ /,$data->{mergedwith})); $orgref= $ref; @@ -363,6 +383,8 @@ END } # Add bug mailing list to $generalbcc as appropriate + # This array is used to specify bcc in the cases where we're using create_mime_message. + my @generalbcc = (@generalcc,@addsrcaddrs,"bugs=$ref\@$gListDomain"); my $generalbcc = join(', ', $generalcc, @addsrcaddrs,"bugs=$ref\@$gListDomain"); $generalbcc =~ s/\s+\n\s+/ /g; $generalbcc =~ s/^\s+/ /; $generalbcc =~ s/\s+$//; @@ -375,18 +397,21 @@ END $x= join('',); close(O); if ($codeletter eq 'F') { &htmllog("Reply","sent",$replyto,"You have marked $gBug as forwarded."); - &sendmessage(<{subject}) -Message-ID: -In-Reply-To: $header{'message-id'} -References: $header{'message-id'} $data->{msgid} -Precedence: bulk -X-$gProject-PR-Message: forwarded $ref -X-$gProject-PR-Package: $data->{package} -X-$gProject-PR-Keywords: $data->{keywords} - + &sendmessage(create_mime_message( + ["X-Loop" => "$gMaintainerEmail", + From => "$gMaintainerEmail ($gProject $gBug Tracking System)", + To => "$replyto", + Subject => "$gBug#$ref: marked as forwarded ($data->{subject})", + "Message-ID" => "", + "In-Reply-To" => $header{'message-id'}, + References => "$header{'message-id'} $data->{msgid}", + Precedence => 'bulk', + "X-$gProject-PR-Message" => "forwarded $ref", + "X-$gProject-PR-Package" => $data->{package}, + "X-$gProject-PR-Keywords" => $data->{keywords}, + # Only have a X-$gProject-PR-Source when we know the source package + length($source_package)?("X-$gProject-PR-Source" => $source_package):(), + ],<{subject}) -Message-ID: -In-Reply-To: $header{'message-id'} -References: $header{'message-id'} $data->{msgid} -Precedence: bulk -X-$gProject-PR-Message: closed $ref -X-$gProject-PR-Package: $data->{package} -X-$gProject-PR-Keywords: $data->{keywords} - + &sendmessage(create_mime_message( + ["X-Loop" => "$gMaintainerEmail", + From => "$gMaintainerEmail ($gProject $gBug Tracking System)", + To => $replyto, + Subject => "$gBug#$ref: marked as done ($data->{subject})", + "Message-ID" => "", + "In-Reply-To" => $header{'message-id'}, + References => "$header{'message-id'} $data->{msgid}", + Precedence => 'bulk', + "X-$gProject-PR-Message" => "closed $ref", + "X-$gProject-PR-Package" => $data->{package}, + "X-$gProject-PR-Keywords" => $data->{keywords}, + # Only have a X-$gProject-PR-Source when we know the source package + length($source_package)?("X-$gProject-PR-Source" => $source_package):(), + ],<{originator}, "$gBug acknowledged by developer."); - &sendmessage(<{originator} -Subject: $gBug#$ref acknowledged by developer - ($header{'subject'}) -Message-ID: -In-Reply-To: $data->{msgid} -References: $header{'message-id'} $data->{msgid} -X-$gProject-PR-Message: they-closed $ref -X-$gProject-PR-Package: $data->{package} -X-$gProject-PR-Keywords: $data->{keywords} -Reply-To: $ref\@$gEmailDomain - + &sendmessage(create_mime_message( + ["X-Loop" => "$gMaintainerEmail", + From => "$gMaintainerEmail ($gProject $gBug Tracking System)", + To => "$data->{originator}", + Subject => "$gBug#$ref closed by $markedby ($header{'subject'})", + "Message-ID" => "", + "In-Reply-To" => "$data->{msgid}", + References => "$header{'message-id'} $data->{msgid}", + "X-$gProject-PR-Message" => "they-closed $ref", + "X-$gProject-PR-Package" => "$data->{package}", + "X-$gProject-PR-Keywords" => "$data->{keywords}", + # Only have a X-$gProject-PR-Source when we know the source package + length($source_package)?("X-$gProject-PR-Source" => $source_package):(), + "Reply-To" => "$ref\@$gEmailDomain", + "Content-Type" => 'text/plain; charset="utf-8"', + ],<{subject}, which was filed against the $data->{package} package. -It has been closed by one of the developers, namely -$markedby. +It has been closed by $markedby. Their explanation is attached below. If this explanation is unsatisfactory and you have not received a better one in a separate -message then please contact the developer, by replying to this email. +message then please contact $markedby by replying +to this email. $gMaintainer (administrator, $gProject $gBugs database) @@ -526,16 +557,17 @@ END $data->{package} = $pheader{package}; } else { &htmllog("Warning","sent",$replyto,"Message not forwarded."); - &sendmessage(< -In-Reply-To: $header{'message-id'} -References: $header{'message-id'} $data->{msgid} -Precedence: bulk -X-$gProject-PR-Message: error + &sendmessage(create_mime_message( + ["X-Loop" => "$gMaintainerEmail", + From => "$gMaintainerEmail ($gProject $gBug Tracking System)", + To => $replyto, + Subject => "Message with no Package: tag cannot be processed! ($subject)", + "Message-ID" => "", + "In-Reply-To" => $header{'message-id'}, + References => "$header{'message-id'} $data->{msgid}", + Precedence => 'bulk', + "X-$gProject-PR-Message" => 'error' + ],<{package} X-$gProject-PR-Keywords: $data->{keywords} -$fwd +${source_pr_header}$fwd END -} elsif ($codeletter eq 'B') { +} elsif ($codeletter eq 'B') { # Sent to submit &htmllog($newref ? "Report" : "Information", "forwarded", join(', ',"$gSubmitList\@$gListDomain",@resentccs), "$gBug#$ref". @@ -722,9 +754,9 @@ Resent-Sender: $gMaintainerEmail X-$gProject-PR-Message: report $ref X-$gProject-PR-Package: $data->{package} X-$gProject-PR-Keywords: $data->{keywords} -$fwd +${source_pr_header}$fwd END -} elsif (@resentccs or @bccs) { +} elsif (@resentccs or @bccs) { # Quiet or Maintainer # D and F done far earlier; B just done - so this must be M or Q # We preserve whichever it was in the Reply-To (possibly adding # the $gBug#). @@ -752,7 +784,7 @@ Resent-Sender: $gMaintainerEmail X-$gProject-PR-Message: report $ref X-$gProject-PR-Package: $data->{package} X-$gProject-PR-Keywords: $data->{keywords} -$fwd +${source_pr_header}$fwd END } @@ -768,20 +800,23 @@ unless (exists $header{'x-debbugs-no-ack'}) { ($veryquiet ? "New $gBug report received and filed, but not forwarded." : "New $gBug report received and forwarded."). $htmlbreak); - &sendmessage($veryquiet ? < -In-Reply-To: $header{'message-id'} -References: $header{'message-id'} -Precedence: bulk -X-$gProject-PR-Message: ack-quiet $ref -X-$gProject-PR-Package: $data->{package} -X-$gProject-PR-Keywords: $data->{keywords} -Reply-To: $ref-quiet\@$gEmailDomain - + if ($veryquiet) { + &sendmessage(create_mime_message( + ["X-Loop" => "$gMaintainerEmail", + From => "$gMaintainerEmail ($gProject $gBug Tracking System)", + To => $replyto, + Subject => "$gBug#$ref: Acknowledgement of QUIET report ($subject)", + "Message-ID" => "", + "In-Reply-To" => $header{'message-id'}, + References => $header{'message-id'}, + Precedence => 'bulk', + "X-$gProject-PR-Message" => "ack-quiet $ref", + "X-$gProject-PR-Package" => $data->{package}, + "X-$gProject-PR-Keywords" => $data->{keywords}, + # Only have a X-$gProject-PR-Source when we know the source package + length($source_package)?("X-$gProject-PR-Source" => $source_package):(), + "Reply-To" => "$ref-quiet\@$gEmailDomain", + ],< -In-Reply-To: $header{'message-id'} -References: $header{'message-id'} -Precedence: bulk -X-$gProject-PR-Message: ack-maintonly $ref -X-$gProject-PR-Package: $data->{package} -X-$gProject-PR-Keywords: $data->{keywords} -Reply-To: $ref-maintonly\@$gEmailDomain - + } + elsif ($codeletter eq 'M') { # Maintonly + &sendmessage(create_mime_message( + ["X-Loop" => "$gMaintainerEmail", + From => "$gMaintainerEmail ($gProject $gBug Tracking System)", + To => $replyto, + Subject => "$gBug#$ref: Acknowledgement of maintainer-only report ($subject)", + "Message-ID" => "", + "In-Reply-To" => $header{'message-id'}, + References => $header{'message-id'}, + Precedence => 'bulk', + "X-$gProject-PR-Message" => "ack-maintonly $ref", + "X-$gProject-PR-Package" => $data->{package}, + "X-$gProject-PR-Keywords" => $data->{keywords}, + # Only have a X-$gProject-PR-Source when we know the source package + length($source_package)?("X-$gProject-PR-Source" => $source_package):(), + "Reply-To" => "$ref-maintonly\@$gEmailDomain", + ],< -In-Reply-To: $header{'message-id'} -References: $header{'message-id'} -Precedence: bulk -X-$gProject-PR-Message: ack $ref -X-$gProject-PR-Package: $data->{package} -X-$gProject-PR-Keywords: $data->{keywords} -Reply-To: $ref\@$gEmailDomain - + } + else { + &sendmessage(create_mime_message( + ["X-Loop" => "$gMaintainerEmail", + From => "$gMaintainerEmail ($gProject $gBug Tracking System)", + To => $replyto, + Subject => "$gBug#$ref: Acknowledgement ($subject)", + "Message-ID" => "", + "In-Reply-To" => $header{'message-id'}, + References => $header{'message-id'}, + Precedence => 'bulk', + "X-$gProject-PR-Message" => "ack $ref", + "X-$gProject-PR-Package" => $data->{package}, + "X-$gProject-PR-Keywords" => $data->{keywords}, + # Only have a X-$gProject-PR-Source when we know the source package + length($source_package)?("X-$gProject-PR-Source" => $source_package):(), + "Reply-To" => "$ref\@$gEmailDomain", + ],< -In-Reply-To: $header{'message-id'} -References: $header{'message-id'} -Precedence: bulk -X-$gProject-PR-Message: ack-info-quiet $ref -X-$gProject-PR-Package: $data->{package} -X-$gProject-PR-Keywords: $data->{keywords} -Reply-To: $ref-quiet\@$gEmailDomain - + if ($veryquiet) { + &sendmessage(create_mime_message( + ["X-Loop" => "$gMaintainerEmail", + From => "$gMaintainerEmail ($gProject $gBug Tracking System)", + To => $replyto, + Subject => "$gBug#$ref: Info received and FILED only (was $subject)", + "Message-ID" => "", + "In-Reply-To" => $header{'message-id'}, + References => $header{'message-id'}, + Precedence => 'bulk', + "X-$gProject-PR-Message" => "ack-info-quiet $ref", + "X-$gProject-PR-Package" => $data->{package}, + "X-$gProject-PR-Keywords" => $data->{keywords}, + # Only have a X-$gProject-PR-Source when we know the source package + length($source_package)?("X-$gProject-PR-Source" => $source_package):(), + "Reply-To" => "$ref-maintonly\@$gEmailDomain", + ],< -In-Reply-To: $header{'message-id'} -References: $header{'message-id'} -Precedence: bulk -X-$gProject-PR-Message: ack-info-maintonly $ref -X-$gProject-PR-Package: $data->{package} -X-$gProject-PR-Keywords: $data->{keywords} -Reply-To: $ref-maintonly\@$gEmailDomain - + } + elsif ($codeletter eq 'M') { + &sendmessage(create_mime_message( + ["X-Loop" => "$gMaintainerEmail", + From => "$gMaintainerEmail ($gProject $gBug Tracking System)", + To => $replyto, + Subject => "$gBug#$ref: Info received for maintainer only (was $subject)", + "Message-ID" => "", + "In-Reply-To" => $header{'message-id'}, + References => "$header{'message-id'} $data->{msgid}", + Precedence => 'bulk', + "X-$gProject-PR-Message" => "ack-info-maintonly $ref", + "X-$gProject-PR-Package" => $data->{package}, + "X-$gProject-PR-Keywords" => $data->{keywords}, + "Reply-To" => "$ref-maintonly\@$gEmailDomain", + ],< -In-Reply-To: $header{'message-id'} -References: $header{'message-id'} -Precedence: bulk -X-$gProject-PR-Message: ack-info $ref -X-$gProject-PR-Package: $data->{package} -X-$gProject-PR-Keywords: $data->{keywords} - + } + else { + &sendmessage(create_mime_message( + ["X-Loop" => "$gMaintainerEmail", + From => "$gMaintainerEmail ($gProject $gBug Tracking System)", + To => $replyto, + Subject => "$gBug#$ref: Info received ($subject)", + "Message-ID" => "", + "In-Reply-To" => $header{'message-id'}, + References => "$header{'message-id'} $data->{msgid}", + Precedence => 'bulk', + "X-$gProject-PR-Message" => "ack-info $ref", + "X-$gProject-PR-Package" => $data->{package}, + "X-$gProject-PR-Keywords" => $data->{keywords}, + # Only have a X-$gProject-PR-Source when we know the source package + length($source_package)?("X-$gProject-PR-Source" => $source_package):(), + "Reply-To" => "$ref\@$gEmailDomain", + ],< $recips); } +my $maintainerschecked = 0; sub checkmaintainers { return if $maintainerschecked++; return if !length($data->{package}); @@ -1056,7 +1144,8 @@ sub checkmaintainers { m/^\s*$/ && next; m/^(\S+)\s+(\S.*\S)\s*\n$/ || &quit("maintainers bogus \`$_'"); $a= $1; $b= $2; $a =~ y/A-Z/a-z/; - $maintainerof{$1}= $2; + # use the package which is normalized to lower case; we do this because we lc the pseudo headers. + $maintainerof{$a}= $2; } close(MAINT); open(MAINT,"$gMaintainerFileOverride") || die &quit("maintainers.override open: $!"); @@ -1065,7 +1154,8 @@ sub checkmaintainers { m/^\s*$/ && next; m/^(\S+)\s+(\S.*\S)\s*\n$/ || &quit("maintainers.override bogus \`$_'"); $a= $1; $b= $2; $a =~ y/A-Z/a-z/; - $maintainerof{$1}= $2; + # use the package which is normalized to lower case; we do this because we lc the pseudo headers. + $maintainerof{$a}= $2; } close(MAINT); open(SOURCES,"$gPackageSource") || &quit("pkgsrc open: $!");