X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=scripts%2Fprocess;h=8dfd5fb04f9bb673dc2759f6d147efe54d2c511c;hb=2ca3d4b399934b4ee936f9a3f511b22fbcd48281;hp=1bcc940f98a5117e386ecce7f78a4070d58efcf3;hpb=2046fad8a19036f6d3433cb9083a4c45581e34db;p=debbugs.git diff --git a/scripts/process b/scripts/process index 1bcc940..8dfd5fb 100755 --- a/scripts/process +++ b/scripts/process @@ -13,22 +13,22 @@ use IO::File; use MIME::Parser; use Debbugs::MIME qw(decode_rfc1522 create_mime_message getmailbody); -use Debbugs::Mail qw(send_mail_message encode_headers); -use Debbugs::Packages qw(getpkgsrc); +use Debbugs::Mail qw(send_mail_message encode_headers get_addresses); +use Debbugs::Packages qw(getpkgsrc binary_to_source); use Debbugs::User qw(read_usertags write_usertags); -use Debbugs::Common qw(:lock get_hashname); -use Debbugs::Status qw(writebug isstrongseverity lockreadbugmerge lockreadbug); +use Debbugs::Common qw(:lock get_hashname package_maintainer overwritefile); +use Debbugs::Status qw(writebug isstrongseverity lockreadbugmerge lockreadbug new_bug read_bug splitpackages :versions); use Debbugs::CGI qw(html_escape bug_url); -use Debbugs::Log qw(:misc); +use Debbugs::Log qw(:misc :write); use Debbugs::Text qw(:templates); -use Debbugs::Status qw(:versions); use Debbugs::Config qw(:globals :config); use Debbugs::Control qw(append_action_to_log); +use Encode qw(encode_utf8); chdir( "$gSpoolDir" ) || die "chdir spool: $!\n"; @@ -50,16 +50,24 @@ if (!rename("incoming/G$nn","incoming/P$nn")) die "renaming to lock: $!"; } -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'; -$baddress= 'done' if $codeletter eq 'D'; -$baddress= 'submitter' if $codeletter eq 'U'; -bug_list_forward($nn) if $codeletter eq 'L'; -$baddress || die "bad codeletter $codeletter"; +my %baddress = (B => 'submit', + M => 'maintonly', + Q => 'quiet', + F => 'forwarded', + D => 'done', + S => 'submitter', + L => 'list', + ); +if (not exists $baddress{$codeletter}) { + die "bad codeletter $codeletter"; +} +my $baddress = $baddress{$codeletter}; +if ($baddress eq 'list') { + bug_list_forward($nn) if $codeletter eq 'L'; +} + my $baddressroot= $baddress; -$baddress= "$tryref-$baddress" if $tryref>=0; +$baddress= "$tryref-$baddress" if $tryref >= 0; open(M,"incoming/P$nn"); my @log=; @@ -95,7 +103,7 @@ our $newref = 0; our $brokenness = ''; -my $parser = new MIME::Parser; +my $parser = MIME::Parser->new(); mkdir "$gSpoolDir/mime.tmp", 0777; $parser->output_under("$gSpoolDir/mime.tmp"); my $entity = eval { $parser->parse_data(join('',@log)) }; @@ -130,6 +138,7 @@ if ($entity and $entity->head->tags) { my %header; +my @common_headers; for my $hdr (@headerlines) { $hdr = decode_rfc1522($hdr); $_ = $hdr; @@ -141,6 +150,9 @@ for my $hdr (@headerlines) { # print DEBUG ">$_<\n"; if (s/^(\S+):\s*//) { my $v = lc $1; + if ($v eq 'x-loop') { + push @common_headers, 'X-Loop',$_; + } print DEBUG ">$v=$_<\n"; $header{$v} = $_; } else { @@ -149,6 +161,8 @@ for my $hdr (@headerlines) { } $header{'message-id'} = '' if not defined $header{'message-id'}; +push @common_headers, 'X-Loop',$gMaintainerEmail; + # remove blank lines shift @bodylines while @bodylines and $bodylines[0] !~ /\S/; @@ -225,7 +239,7 @@ if ($tryref >= 0) { my $bfound; ($bfound, $data)= &lockreadbugmerge($tryref); - if ($bfound) { + if ($bfound and not $data->{archived}) { $ref= $tryref; } else { &sendmessage(create_mime_message( @@ -237,7 +251,8 @@ if ($tryref >= 0) References => join(' ',grep {defined $_} $header{'message-id'},$data->{msgid}), Precedence => 'bulk', "X-$gProject-PR-Message" => 'error', - ],message_body_template('process_unknown_bug_number', + @common_headers, + ],message_body_template('mail/process_unknown_bug_number', {subject => $subject, date => $header{date}, baddress => $baddress, @@ -259,8 +274,7 @@ if (defined $pheader{source}) { $source_package = $pheader{source}; } elsif (defined $data->{package} or defined $pheader{package}) { - my $pkg_src = getpkgsrc(); - $source_package = $pkg_src->{defined $data->{package}?$data->{package}:$pheader{package}}; + $source_package = binary_to_source(binary => $data->{package} // $pheader{package}); } $source_pr_header = "X-$gProject-PR-Source: $source_package\n" if defined $source_package and length $source_package; @@ -295,7 +309,7 @@ if ($codeletter eq 'D' || $codeletter eq 'F') push @generalcc, "$gForwardList\@$gListDomain"; $generalcc= "$gForwardList\@$gListDomain"; } else { - $generalcc=''; + $generalcc=''; } } else { # Done if (defined $data->{done} and length($data->{done}) and @@ -328,6 +342,7 @@ if ($codeletter eq 'D' || $codeletter eq 'F') References => join(' ',grep {defined $_} $header{'message-id'},$data->{msgid}), Precedence => 'bulk', "X-$gProject-PR-Message" => 'error', + @common_headers, ],message_body_template('mail/process_no_bug_number', {subject => $subject, date => $header{date}, @@ -398,7 +413,7 @@ if ($codeletter eq 'D' || $codeletter eq 'F') if ($codeletter eq 'F') { &htmllog("Reply","sent",$replyto,"You have marked $gBug as forwarded."); &sendmessage(create_mime_message( - ["X-Loop" => "$gMaintainerEmail", + [@common_headers, From => "$gMaintainerEmail ($gProject $gBug Tracking System)", To => "$replyto", Subject => "$gBug#$ref: marked as forwarded ($data->{subject})", @@ -421,7 +436,7 @@ if ($codeletter eq 'D' || $codeletter eq 'F') } else { &htmllog("Reply","sent",$replyto,"You have taken responsibility."); &sendmessage(create_mime_message( - ["X-Loop" => "$gMaintainerEmail", + [@common_headers, From => "$gMaintainerEmail ($gProject $gBug Tracking System)", To => $replyto, Subject => "$gBug#$ref: marked as done ($data->{subject})", @@ -445,13 +460,13 @@ if ($codeletter eq 'D' || $codeletter eq 'F') &htmllog("Notification","sent",$data->{originator}, "$gBug acknowledged by developer."); &sendmessage(create_mime_message( - ["X-Loop" => "$gMaintainerEmail", + [@common_headers, 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 => join(' ',grep {defined $_} $header{'message-id'},$data->{msgid}), + (defined $data->{msgid})?("In-Reply-To" => $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}", @@ -476,7 +491,8 @@ if ($codeletter eq 'D' || $codeletter eq 'F') if ($ref<0) { # new bug report if ($codeletter eq 'U') { # -submitter &sendmessage(create_mime_message( - [From => "$gMaintainerEmail ($gProject $gBug Tracking System)", + [@common_headers, + From => "$gMaintainerEmail ($gProject $gBug Tracking System)", To => $replyto, Subject => "Message with no $gBug number cannot be sent to submitter! ($subject)", 'Message-ID' => "", @@ -500,9 +516,13 @@ if ($ref<0) { # new bug report $data->{fixed_versions} = []; if (defined $pheader{source}) { - $data->{package} = $pheader{source}; + # source packages are identified by the src: prefix + $data->{package} = 'src:'.$pheader{source}; } elsif (defined $pheader{package}) { $data->{package} = $pheader{package}; + if ($data->{package} =~ /^src:(.+)/) { + $pheader{source} = $1; + } } elsif (defined $config{default_package}) { $data->{package} = $config{default_package}, } @@ -510,7 +530,7 @@ if ($ref<0) { # new bug report my $body = message_body_template('mail/process_no_package', ); &sendmessage(create_mime_message( - ["X-Loop" => "$gMaintainerEmail", + [@common_headers, From => "$gMaintainerEmail ($gProject $gBug Tracking System)", To => $replyto, Subject => "Message with no Package: tag cannot be processed! ($subject)", @@ -578,16 +598,11 @@ if ($ref<0) { # new bug report $data->{owner}= $pheader{owner}; } if (defined($pheader{forwarded})) { - $data->{'forwarded-to'} = $pheader{forwarded}; + $data->{forwarded} = $pheader{forwarded}; } - &filelock("nextnumber.lock"); - open(N,"nextnumber") || die "nextnumber: read: $!"; - my $nextnumber=; $nextnumber =~ s/\n$// || die "nextnumber bad format"; - $ref= $nextnumber+0; $nextnumber += 1; $newref=1; - &overwrite('nextnumber', "$nextnumber\n"); - &unfilelock; + $ref = new_bug(); + $newref = $ref; my $hash = get_hashname($ref); - &overwrite("db-h/$hash/$ref.log",''); $data->{originator} = $replyto; $data->{date} = $intdate; $data->{subject} = $subject; @@ -621,8 +636,8 @@ if ($ref<0) { # new bug report ); } } - &overwrite("db-h/$hash/$ref.report", - join("\n",@msg)."\n"); + overwritefile("db-h/$hash/$ref.report", + map {"$_\n"} @msg); } &checkmaintainers; @@ -634,7 +649,7 @@ my $newsubject= $subject; $newsubject =~ s/^$gBug#$ref:*\s*//; my $xcchdr= $header{ 'x-debbugs-cc' } || ''; if ($xcchdr =~ m/\S/) { - push(@resentccs,$xcchdr); + push(@resentccs,get_addresses($xcchdr)); $resentccexplain.= fill_template('mail/xdebbugscc', {xcchdr => $xcchdr}, ); @@ -710,20 +725,30 @@ if (length($resentccval)) { $resentcc= "Resent-CC: $resentccval\n"; } +my $common_headers=''; +{ + my @tmp = @common_headers; + while (my ($key,$value) = splice(@tmp, 0,2)) { + $common_headers .= qq($key: $value\n); + } +} if ($codeletter eq 'U') { # sent to -submitter &htmllog("Message", "sent on", $data->{originator}, "$gBug#$ref."); - &sendmessage(<{originator},@resentccs],[@bccs]); + my $enc_msg=<{originator} -${resentcc}Resent-Date: $tdate +${resentcc}${common_headers}Resent-Date: $tdate Resent-Message-ID: Resent-Sender: $gMaintainerEmail X-$gProject-PR-Message: report $ref X-$gProject-PR-Package: $data->{package} X-$gProject-PR-Keywords: $data->{keywords} -${source_pr_header}$fwd +${source_pr_header} END + chomp $enc_msg; + $enc_msg = encode_utf8($enc_msg).$fwd."\n"; + &sendmessage($enc_msg,[$data->{originator},@resentccs],[@bccs]); } elsif ($codeletter eq 'B') { # Sent to submit my $report_followup = $newref ? 'report' : 'followup'; &htmllog($newref ? "Report" : "Information", "forwarded", @@ -731,19 +756,22 @@ END "$gBug#$ref". (length($data->{package})? "; Package ".html_escape($data->{package})."" : ''). "."); - &sendmessage(< 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}$fwd +${source_pr_header} END + chomp $enc_msg; + $enc_msg = encode_utf8($enc_msg).$fwd."\n"; + &sendmessage($enc_msg,["$gSubmitList\@$gListDomain",@resentccs],[@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 @@ -762,7 +790,7 @@ END (length($data->{package}) ? "; Package ".html_escape($data->{package})."" : ''). "."); } - &sendmessage(< Resent-Sender: $gMaintainerEmail -X-$gProject-PR-Message: $report_followup $ref +${common_headers}X-$gProject-PR-Message: $report_followup $ref X-$gProject-PR-Package: $data->{package} X-$gProject-PR-Keywords: $data->{keywords} -${source_pr_header}$fwd +${source_pr_header} END + chomp $enc_msg; + $enc_msg = encode_utf8($enc_msg).$fwd."\n"; + &sendmessage($enc_msg,[@resentccs],[@bccs]); } my $htmlbreak= length($brokenness) ? "

\n".html_escape($brokenness)."\n

\n" : ''; @@ -863,7 +894,7 @@ if (not exists $header{'x-debbugs-no-ack'} and } ); &sendmessage(create_mime_message( - ["X-Loop" => "$gMaintainerEmail", + [@common_headers, From => "$gMaintainerEmail ($gProject $gBug Tracking System)", To => $replyto, Subject => $t_h{subject}, @@ -883,14 +914,6 @@ if (not exists $header{'x-debbugs-no-ack'} and &appendlog; &finish; -sub overwrite { - my ($f,$v) = @_; - open(NEW,">$f.new") || die "$f.new: create: $!"; - print(NEW "$v") || die "$f.new: write: $!"; - close(NEW) || die "$f.new: close: $!"; - rename("$f.new","$f") || die "rename $f.new to $f: $!"; -} - sub appendlog { my $hash = get_hashname($ref); if (!open(AP,">>db-h/$hash/$ref.log")) { @@ -981,12 +1004,14 @@ sub sendmessage { my $hash = get_hashname($ref); #save email to the log - open(AP,">>db-h/$hash/$ref.log") || die "opening db-h/$hash/$ref.log (lo): $!"; - print(AP "\2\n",join("\4",@$recips),"\n\5\n", - escape_log(stripbccs($msg)),"\n\3\n") || - die "writing db-h/$hash/$ref.log (lo): $!"; - close(AP) || die "closing db-h/$hash/$ref.log (lo): $!"; - + my $logfh = IO::File->new(">>db-h/${hash}/${ref}.log") or + die "opening db-h/$hash/${ref}.log: $!"; + write_log_records(logfh => $logfh, + records => {text => stripbccs($msg), + type => 'recips', + recips => [@{$recips}], + }, + ); if (ref($bcc)) { shift @$recips if $recips->[0] eq '-t'; push @$recips, @$bcc; @@ -1049,57 +1074,38 @@ sub fill_template{ } +# this shole routine is *bad*; will be changed to use +# Debbugs::Recipients and stuff therin in short order. sub checkmaintainers { return if $maintainerschecked++; return if !length($data->{package}); - my %maintainerof; - open(MAINT,"$gMaintainerFile") || die die "maintainers open: $!"; - while () { - m/^\n$/ && next; - m/^\s*$/ && next; - m/^(\S+)\s+(\S.*\S)\s*\n$/ || die "maintainers bogus \`$_'"; - $a= $1; $b= $2; $a =~ y/A-Z/a-z/; - # 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 die "maintainers.override open: $!"; - while () { - m/^\n$/ && next; - m/^\s*$/ && next; - m/^(\S+)\s+(\S.*\S)\s*\n$/ || die "maintainers.override bogus \`$_'"; - $a= $1; $b= $2; $a =~ y/A-Z/a-z/; - # use the package which is normalized to lower case; we do this because we lc the pseudo headers. - $maintainerof{$a}= $2; - } - close(MAINT); - my %pkgsrc; - open(SOURCES,"$gPackageSource") || die "pkgsrc open: $!"; - while () { - next unless m/^(\S+)\s+\S+\s+(\S.*\S)\s*$/; - ($a,$b)=($1,$2); - $a =~ y/A-Z/a-z/; - $pkgsrc{$a} = $b; - } - close(SOURCES); + my $anymaintfound=0; my $anymaintnotfound=0; - for my $p (split(m/[ \t?,():]+/,$data->{package})) { + for my $p (splitpackages($data->{package})) { $p =~ y/A-Z/a-z/; - $p =~ /([a-z0-9.+-]+)/; + $p =~ /((?:src:)?[a-z0-9.+-]+)/; $p = $1; next unless defined $p; if (defined $gSubscriptionDomain) { - if (defined($pkgsrc{$p})) { - push @addsrcaddrs, "$pkgsrc{$p}\@$gSubscriptionDomain"; + my @source = binary_to_source(binary => $p, + source_only => 1, + ); + if (@source) { + push @addsrcaddrs, + map {"$_\@$gSubscriptionDomain"} @source; } else { push @addsrcaddrs, "$p\@$gSubscriptionDomain"; } } - if (defined($maintainerof{$p})) { - print DEBUG "maintainer add >$p|$maintainerof{$p}<\n"; - my $addmaint= $maintainerof{$p}; - push(@maintaddrs,$addmaint) unless - $addmaint eq $replyto || grep($_ eq $addmaint, @maintaddrs); + # this is utter hackery until we switch to Debbugs::Recipients + my @maints = package_maintainer(binary => $p); + if (@maints) { + print DEBUG "maintainer add >$p|".join(',',@maints)."<\n"; + my %temp; + @temp{@maintaddrs} = @maintaddrs; + push(@maintaddrs, + grep {$_ ne $replyto and + not exists $temp{$_}} @maints); $anymaintfound++; } else { print DEBUG "maintainer none >$p<\n";