X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=Debbugs%2FStatus.pm;h=be296fd428ba86b5317e0e16dcc93b4f6c9ac621;hb=9ac1097c2f923efb2fce85c67cc692793993b305;hp=b8ed82b719265655221c3cd12c039d9b45d697aa;hpb=a6c428bc8b655a9de967a2794f6fd860e235bc10;p=debbugs.git diff --git a/Debbugs/Status.pm b/Debbugs/Status.pm index b8ed82b..be296fd 100644 --- a/Debbugs/Status.pm +++ b/Debbugs/Status.pm @@ -56,15 +56,18 @@ BEGIN{ %EXPORT_TAGS = (status => [qw(splitpackages get_bug_status buggy bug_archiveable), qw(isstrongseverity bug_presence), ], - read => [qw(readbug read_bug lockreadbug lockreadbugmerge)], + read => [qw(readbug read_bug lockreadbug lockreadbugmerge), + qw(lock_read_all_merged_bugs), + ], write => [qw(writebug makestatus unlockwritebug)], versions => [qw(addfoundversions addfixedversions), qw(removefoundversions removefixedversions) ], hook => [qw(bughook bughook_archive)], + fields => [qw(%fields)], ); @EXPORT_OK = (); - Exporter::export_ok_tags(qw(status read write versions hook)); + Exporter::export_ok_tags(qw(status read write versions hook fields)); $EXPORT_TAGS{all} = [@EXPORT_OK]; } @@ -79,8 +82,9 @@ location. Valid locations are those understood by L =cut - -my %fields = (originator => 'submitter', +# these probably shouldn't be imported by most people, but +# Debbugs::Control needs them, so they're now exportable +our %fields = (originator => 'submitter', date => 'date', subject => 'subject', msgid => 'message-id', @@ -98,6 +102,8 @@ my %fields = (originator => 'submitter', blocks => 'blocks', blockedby => 'blocked-by', unarchived => 'unarchived', + summary => 'summary', + affects => 'affects', ); # Fields which need to be RFC1522-decoded in format versions earlier than 3. @@ -179,6 +185,7 @@ sub read_bug{ $status = getbugcomponent($lref, 'summary', $location); $log = getbugcomponent($lref, 'log' , $location); return undef unless defined $status; + return undef if not -e $status; } else { $status = $param{summary}; @@ -249,6 +256,7 @@ sub read_bug{ # Add log last modified time $data{log_modified} = (stat($log))[9]; $data{location} = $location; + $data{archived} = (defined($location) and ($location eq 'archive'))?1:0; $data{bug_num} = $param{bug}; return \%data; @@ -316,20 +324,24 @@ even if all of the others were read properly. sub lock_read_all_merged_bugs { my ($bug_num,$location) = @_; + my $locks = 0; my @data = (lockreadbug(@_)); - if (not @data and not defined $data[0]) { - return (0,undef); + if (not @data or not defined $data[0]) { + return ($locks,undef); } + $locks++; if (not length $data[0]->{mergedwith}) { - return (1,@data); + return ($locks,@data); } unfilelock(); + $locks--; filelock("$config{spool_dir}/lock/merge"); - my $locks = 0; + $locks++; @data = (lockreadbug(@_)); - if (not @data and not defined $data[0]) { + if (not @data or not defined $data[0]) { unfilelock(); #for merge lock above - return (0,undef); + $locks--; + return ($locks,undef); } $locks++; my @bugs = split / /, $data[0]->{mergedwith}; @@ -350,15 +362,15 @@ sub lock_read_all_merged_bugs { } # perform a sanity check to make sure that the merged bugs are # all merged with eachother - my $expectmerge= join(' ',grep($_ != $bug, sort { $a <=> $b } @bugs)); + my $expectmerge= join(' ',grep {$_ != $bug } sort { $a <=> $b } (@bugs,$bug_num)); if ($newdata->{mergedwith} ne $expectmerge) { for (1..$locks) { unfilelock(); } - die "Bug $bug_num differs from bug $bug: ($newdata->{mergedwith}) vs. ($expectmerge) (".join(' ',@bugs).")"; + die "Bug $bug_num differs from bug $bug: ($newdata->{bug_num}: $newdata->{mergedwith}) vs. ($expectmerge) (".join(' ',@bugs).")"; } } - return (2,@data); + return ($locks,@data); } @@ -869,9 +881,8 @@ dist, arch, and version. [The entries in this array must be in the "source/version" format.] Eventually this can be used to for caching. =item indicatesource -- if true, indicate which source packages this -bug could belong to. Defaults to false. [Note that eventually we will -properly allow bugs that only affect a source package, and this will -become always on.] +bug could belong to (or does belong to in the case of bugs assigned to +a source package). Defaults to true. =back @@ -910,7 +921,7 @@ sub get_bug_status { optional => 1, }, indicatesource => {type => BOOLEAN, - default => 0, + default => 1, }, }, ); @@ -941,15 +952,30 @@ sub get_bug_status { $status{tags} = $status{keywords}; my %tags = map { $_ => 1 } split ' ', $status{tags}; + $status{package} = '' if not defined $status{package}; $status{"package"} =~ s/\s*$//; - if ($param{indicatesource} and $status{package} ne '') { - $status{source} = join(', ',binarytosource($status{package})); - } - else { - $status{source} = 'unknown'; + # if we aren't supposed to indicate the source, we'll return + # unknown here. + $status{source} = 'unknown'; + if ($param{indicatesource}) { + my @packages = split /\s*,\s*/, $status{package}; + my @source; + for my $package (@packages) { + next if $package eq ''; + if ($package =~ /^src\:$/) { + push @source,$1; + } + else { + push @source, binarytosource($package); + } + } + if (@source) { + $status{source} = join(', ',@source); + } } + $status{"package"} = 'unknown' if ($status{"package"} eq ''); - $status{"severity"} = 'normal' if ($status{"severity"} eq ''); + $status{"severity"} = 'normal' if (not defined $status{severity} or $status{"severity"} eq ''); $status{"pending"} = 'pending'; $status{"pending"} = 'forwarded' if (length($status{"forwarded"})); @@ -1060,12 +1086,38 @@ sub bug_presence { } } } elsif (defined $param{dist}) { + my %affects_distribution_tags; + @affects_distribution_tags{@{$config{affects_distribution_tags}}} = + (1) x @{$config{affects_distribution_tags}}; + my $some_distributions_disallowed = 0; + my %allowed_distributions; + for my $tag (split ' ', ($status{tags}||'')) { + if (exists $config{distribution_aliases}{$tag} and + exists $affects_distribution_tags{$config{distribution_aliases}{$tag}}) { + $some_distributions_disallowed = 1; + $allowed_distributions{$config{distribution_aliases}{$tag}} = 1; + } + elsif (exists $affects_distribution_tags{$tag}) { + $some_distributions_disallowed = 1; + $allowed_distributions{$tag} = 1; + } + } foreach my $arch (make_list($param{arch})) { - my @versions; for my $package (split /\s*,\s*/, $status{package}) { + my @versions; foreach my $dist (make_list($param{dist})) { + # if some distributions are disallowed, + # and this isn't an allowed + # distribution, then we ignore this + # distribution for the purposees of + # finding versions + if ($some_distributions_disallowed and + not exists $allowed_distributions{$dist}) { + next; + } push @versions, getversions($package, $dist, $arch); } + next unless @versions; my @temp = makesourceversions($package, $arch, @versions @@ -1086,12 +1138,12 @@ sub bug_presence { my $maxbuggy = 'undef'; if (@sourceversions) { $maxbuggy = max_buggy(bug => $param{bug}, - sourceversions => \@sourceversions, - found => $status{found_versions}, - fixed => $status{fixed_versions}, - package => $status{package}, - version_cache => $version_cache, - ); + sourceversions => \@sourceversions, + found => $status{found_versions}, + fixed => $status{fixed_versions}, + package => $status{package}, + version_cache => $version_cache, + ); } elsif (defined $param{dist} and not exists $pseudo_desc->{$status{package}}) {