X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=scripts%2Fprocess;h=75c487a1a05a534c5aa9d046e28709d4ab85b1e8;hb=907fa43dbb9e516daba3ceded78dbafab29d09e5;hp=40bc1fccc2edb0597672c09c9366be9a27872369;hpb=0f4e5e360aa0f61856d1bc0749c8dbb9ff4e5297;p=debbugs.git diff --git a/scripts/process b/scripts/process index 40bc1fc..75c487a 100755 --- a/scripts/process +++ b/scripts/process @@ -7,7 +7,9 @@ use warnings; use strict; -use POSIX qw(strftime); +use locale; +use POSIX qw(strftime locale_h); +setlocale(LC_TIME, "C"); use IO::File; @@ -18,10 +20,10 @@ use Debbugs::MIME qw(decode_rfc1522 create_mime_message getmailbody); 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 buglog package_maintainer overwritefile); +use Debbugs::Common qw(:lock get_hashname buglog package_maintainer overwritefile make_list); use Debbugs::Status qw(writebug isstrongseverity lockreadbugmerge lockreadbug new_bug read_bug splitpackages :versions); -use Debbugs::CGI qw(html_escape bug_url); +use Debbugs::CGI qw(html_escape bug_links); use Debbugs::Log qw(:misc :write); @@ -30,7 +32,9 @@ use Debbugs::Text qw(:templates); use Debbugs::Config qw(:globals :config); use Debbugs::Control qw(append_action_to_log); -use Encode qw(encode_utf8); +use Debbugs::Control::Service qw(valid_control control_line); +use Debbugs::Recipients qw(determine_recipients); +use Encode qw(encode_utf8 decode); =head1 NAME @@ -82,7 +86,7 @@ my %baddress = (B => 'submit', Q => 'quiet', F => 'forwarded', D => 'done', - S => 'submitter', + U => 'submitter', L => 'list', ); my $valid_codeletters = join('',keys %baddress); @@ -121,6 +125,7 @@ if ($baddress eq 'list') { bug_list_forward($nn) if $codeletter eq 'L'; } + my $baddressroot= $baddress; $baddress= "$tryref-$baddress" if defined $tryref; @@ -210,6 +215,7 @@ if (@bodylines and $bodylines[0] =~ /^-----BEGIN PGP SIGNED/) { #psuedoheaders my %pheader; +my @control_bits; # extract pseudo-headers for my $phline (@bodylines) { @@ -221,9 +227,13 @@ for my $phline (@bodylines) $fv =~ s/\s*$//; print {$debugfh} ">$fn|$fv|\n"; $fn = lc $fn; - # Don't lc owner or forwarded - $fv = lc $fv unless $fn =~ /^(?:owner|forwarded|usertags|version|source-version)$/; - $pheader{$fn} = $fv; + 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)$/; + $pheader{$fn} = $fv; + } print {$debugfh} ">$fn~$fv<\n"; } @@ -263,16 +273,22 @@ if (!defined($header{'subject'})) } my $ref=-1; -$subject =~ s/^Re:\s*//i; $_= $subject."\n"; +# remove Re: from the subject line +$subject =~ s/^Re:\s*//i; +# remove remaining mailing list name markers from the subject line +$subject =~ s/^\[.*\]\s*//i; +$_= $subject."\n"; if (not defined $tryref and m/^Bug ?\#(\d+)\D/i) { $tryref = $1 if $1 > 0; } +my $locks = 0; my $data; if (defined $tryref) { - my $bfound; - ($bfound, $data)= &lockreadbugmerge($tryref); - if ($bfound and not $data->{archived}) { - $ref= $tryref; + my $locks_recv; + ($locks_recv, $data)= &lockreadbugmerge($tryref); + $locks += $locks_recv; + if ($locks_recv and not $data->{archived}) { + $ref= $tryref; } else { &sendmessage(create_mime_message( [From => "$gMaintainerEmail ($gProject $gBug Tracking System)", @@ -400,8 +416,10 @@ if ($codeletter eq 'D' || $codeletter eq 'F') for $ref (@process) { if ($ref != $orgref) { &unfilelock; + $locks--; $data = &lockreadbug($ref) || die "huh ? $ref from $orgref out of ".join(' ',@process); + $locks++; } $data->{done}= $set_done if defined($set_done); $data->{forwarded}= $set_forwarded if defined($set_forwarded); @@ -431,8 +449,16 @@ if ($codeletter eq 'D' || $codeletter eq 'F') # 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"); + my @generalbcc = @generalcc; + my $generalbcc = $generalcc; + if (defined $config{subscription_domain} and length $config{subscription_domain}) { + my @generalbcc = (@generalbcc, @addsrcaddrs); + my $generalbcc = join(', ', $generalbcc, @addsrcaddrs); + } + if (defined $config{bug_subscription_domain} and length $config{bug_subscription_domain}) { + my @generalbcc = (@generalbcc, "bugs=$ref\@$config{bug_subscription_domain}"); + my $generalbcc = join(', ', $generalbcc, "bugs=$ref\@$config{bug_subscription_domain}"); + } $generalbcc =~ s/\s+\n\s+/ /g; $generalbcc =~ s/^\s+/ /; $generalbcc =~ s/\s+$//; if (length $generalbcc) {$generalbcc = "Bcc: $generalbcc\n"}; @@ -705,7 +731,9 @@ if (defined $gStrongList and isstrongseverity($data->{severity})) { } # Send mail to the per bug list subscription too -push @bccs, "bugs=$ref\@$gListDomain"; +if (defined $config{bug_subscription_domain} and length $config{bug_subscription_domain}) { + push @bccs, "bugs=$ref\@$config{bug_subscription_domain}"; +} if (defined $pheader{source}) { # Prefix source versions with the name of the source package. They @@ -948,6 +976,124 @@ if (not exists $header{'x-debbugs-no-ack'} and } appendlog($ref,$msg); +# unlock the locks we have received +while ($locks--) {unfilelock();} + +## handle control messages at this point, immediately before finishing +my %clonebugs = (-1 => $ref); +my %bug_affected; +if (@control_bits) { + my $transcript_scalar = ''; + open my $transcript, ">:scalar:utf8", \$transcript_scalar or + die "Unable to create transcript scalar: $!"; + print {$transcript} "Processing control commands:\n\n"; + my %affected_packages; + my %recipients; + # this is the hashref which is passed to all control calls + my %limit = (); + my $errors = 0; + my $unknowns = 0; + + my @common_control_options = + (transcript => $transcript, + requester => $header{from}, + request_addr => $baddress.'@'.$config{email_domain}, + request_msgid => $header{'message-id'}, + request_subject => $header{subject}, + request_nn => $nn, + request_replyto => $replyto, + message => $msg, + affected_bugs => \%bug_affected, + affected_packages => \%affected_packages, + recipients => \%recipients, + limit => \%limit, + ); + if (@gExcludeFromControl and grep {$replyto =~ m/\Q$_\E/} @gExcludeFromControl) { + print {$transcript} fill_template('mail/excluded_from_control'); + print {$transcript} "Stopping processing here.\n\n"; + } else { + for my $control_bit (@control_bits) { + $control_bit =~ s/\xef\xbb\xbf//g; + next unless $control_bit =~ m/\S/; + eval { + my $temp = decode("utf8",$control_bit,Encode::FB_CROAK); + $control_bit = $temp; + }; + print {$transcript} "> $control_bit\n"; + next if $control_bit =~ /^\s*\#/; + my $action = ''; + my $ok; + if (defined valid_control($control_bit)) { + my ($new_errors,$terminate_control) = + control_line(line => $control_bit, + clonebugs => \%clonebugs, + limit => \%limit, + common_control_options => \@common_control_options, + errors => \$errors, + transcript => $transcript, + debug => 0, + ok => \$ok, + replyto => $replyto, + ); + if ($terminate_control) { + last; + } + } + else { + $errors++; + if (++$unknowns >= 5) { + print {$transcript} "Too many unknown commands, stopping here.\n\n"; + last; + } + } + } + } + my $temp_transcript = $transcript_scalar; + eval{ + $temp_transcript = decode("utf8",$temp_transcript,Encode::FB_CROAK); + }; + my @maintccs = determine_recipients(recipients => \%recipients, + address_only => 1, + cc => 1, + ); + my $error_text = $errors > 0 ? " (with $errors errors)":''; + my $reply = + create_mime_message(['X-Loop' => $gMaintainerEmail, + From => "$gMaintainerEmail ($gProject $gBug Tracking System)", + To => $replyto, + @maintccs ? (Cc => join(', ',@maintccs)):(), + Subject => "Processed${error_text}: $header{subject}", + 'Message-ID' => "", + 'In-Reply-To' => $header{'message-id'}, + References => join(' ',grep {defined $_} $header{'message-id'},$data->{msgid}), + Precedence => 'bulk', + keys %affected_packages ?("X-${gProject}-PR-Package" => join(' ',keys %affected_packages)):(), + keys %affected_packages ?("X-${gProject}-PR-Source" => + join(' ', + map {defined $_ ?(ref($_)?@{$_}:$_):()} + binary_to_source(binary => [keys %affected_packages], + source_only => 1))):(), + "X-$gProject-PR-Message" => 'transcript', + @common_headers, + ], + fill_template('mail/message_body', + {body => $temp_transcript}, + )); + + utime(time,time,"db-h"); + + send_mail_message(message => $reply, + recipients => [exists $header{'x-debbugs-no-ack'}?():$replyto, + make_list(values %{{determine_recipients(recipients => \%recipients, + address_only => 1, + )}} + ), + ] + ); + +} + + finish(); sub appendlog { @@ -1096,6 +1242,7 @@ sub fill_template{ my $variables = {config => \%config, defined($ref)?(ref => $ref):(), defined($data)?(data => $data):(), + refs => [map {exists $clonebugs{$_}?$clonebugs{$_}:$_} keys %bug_affected], %{$extra_var}, }; my $hole_var = {'&bugurl' => @@ -1125,15 +1272,15 @@ sub checkmaintainers { $p =~ /((?:src:)?[a-z0-9.+-]+)/; $p = $1; next unless defined $p; - if (defined $gSubscriptionDomain) { + if (defined $config{subscription_domain} and length $config{subscription_domain}) { my @source = binary_to_source(binary => $p, source_only => 1, ); if (@source) { push @addsrcaddrs, - map {"$_\@$gSubscriptionDomain"} @source; + map {"$_\@$config{subscription_domain}"} @source; } else { - push @addsrcaddrs, "$p\@$gSubscriptionDomain"; + push @addsrcaddrs, "$p\@$config{subscription_domain}"; } } # this is utter hackery until we switch to Debbugs::Recipients