X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=Debbugs%2FStatus.pm;h=197b188a6d02c393b084631143c5307e44f589b3;hb=6617fa4e20357b7c2bb9f5990984b08d4f827089;hp=b28ff5355658e4a24dc17bc29bc06da172334e39;hpb=d4b9a1bfe03c6ec1451c8f9178bb5a7458e9ae3e;p=debbugs.git diff --git a/Debbugs/Status.pm b/Debbugs/Status.pm index b28ff53..197b188 100644 --- a/Debbugs/Status.pm +++ b/Debbugs/Status.pm @@ -34,7 +34,7 @@ use warnings; use strict; use vars qw($VERSION $DEBUG %EXPORT_TAGS @EXPORT_OK @EXPORT); -use base qw(Exporter); +use Exporter qw(import); use Params::Validate qw(validate_with :types); use Debbugs::Common qw(:util :lock :quit :misc); @@ -49,7 +49,7 @@ use File::Copy qw(copy); use Encode qw(decode encode is_utf8); use Storable qw(dclone); -use List::Util qw(min max); +use List::AllUtils qw(min max); use Carp qw(croak); @@ -270,7 +270,7 @@ sub read_bug{ # create the found/fixed hashes which indicate when a # particular version was marked found or marked fixed. @{$data{$field}}{@{$data{"${field}_versions"}}} = - (('') x (@{$data{"${field}_date"}} - @{$data{"${field}_versions"}}), + (('') x (@{$data{"${field}_versions"}} - @{$data{"${field}_date"}}), @{$data{"${field}_date"}}); } @@ -282,6 +282,17 @@ sub read_bug{ $data{archived} = (defined($location) and ($location eq 'archive'))?1:0; $data{bug_num} = $param{bug}; + # mergedwith occasionally is sorted badly. Fix it to always be sorted by <=> + # and not include this bug + if (defined $data{mergedwith} and + $data{mergedwith}) { + $data{mergedwith} = + join(' ', + grep { $_ != $data{bug_num}} + sort { $a <=> $b } + split / /, $data{mergedwith} + ); + } return \%data; } @@ -307,6 +318,9 @@ my $ditch_empty_space = sub {return &{$ditch_empty}(' ',@_)}; my %split_fields = (package => \&splitpackages, affects => \&splitpackages, + # Ideally we won't have to split source, but because some consumers of + # get_bug_status cannot handle arrayref, we will split it here. + source => \&splitpackages, blocks => $ditch_empty_space, blockedby => $ditch_empty_space, # this isn't strictly correct, but we'll split both of them for @@ -416,7 +430,6 @@ data. =cut sub lockreadbugmerge { - my ($bug_num,$location) = @_; my $data = lockreadbug(@_); if (not defined $data) { return (0,undef); @@ -514,7 +527,10 @@ sub lock_read_all_merged_bugs { # are all merged with eachother # We do a cmp sort instead of an <=> sort here, because that's # what merge does - my $expectmerge= join(' ',grep {$_ != $bug } sort @bugs); + my $expectmerge= + join(' ',grep {$_ != $bug } + sort { $a <=> $b } + @bugs); if ($newdata->{mergedwith} ne $expectmerge) { for (1..$locks) { unfilelock(exists $param{locks}?$param{locks}:()); @@ -732,9 +748,9 @@ sub addfoundversions { my $version = shift; my $isbinary = shift; return unless defined $version; - undef $package if $package =~ m[(?:\s|/)]; + undef $package if defined $package and $package =~ m[(?:\s|/)]; my $source = $package; - if ($package =~ s/^src://) { + if (defined $package and $package =~ s/^src://) { $isbinary = 0; $source = $package; } @@ -1204,6 +1220,9 @@ sub get_bug_status { indicatesource => {type => BOOLEAN, default => 1, }, + binary_to_source_cache => {type => HASHREF, + optional => 1, + }, }, ); my %status; @@ -1238,6 +1257,8 @@ sub get_bug_status { $status{source} = binary_to_source(binary=>[split /\s*,\s*/, $status{package}], source_only => 1, + exists $param{binary_to_source_cache}? + (cache =>$param{binary_to_source_cache}):(), ); $status{"package"} = 'unknown' if ($status{"package"} eq '');