X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=Debbugs%2FStatus.pm;h=f539781495c297c64a54239823411da2a0c328b1;hb=9947e01ea9e792bf12c77405e06ed69ad8751988;hp=666c31bbac02204035a17259f0444099ac158256;hpb=d6f1aad95d291e7d6b1f79bc20949f98dbe60e75;p=debbugs.git diff --git a/Debbugs/Status.pm b/Debbugs/Status.pm index 666c31b..f539781 100644 --- a/Debbugs/Status.pm +++ b/Debbugs/Status.pm @@ -965,20 +965,24 @@ Returns undef on failure. # This will eventually need to be fixed before we start using mod_perl our $version_cache = {}; sub bug_archiveable{ + state $spec = {bug => {type => SCALAR, + regex => qr/^\d+$/, + }, + status => {type => HASHREF, + optional => 1, + }, + days_until => {type => BOOLEAN, + default => 0, + }, + ignore_time => {type => BOOLEAN, + default => 0, + }, + schema => {type => OBJECT, + optional => 1, + }, + }; my %param = validate_with(params => \@_, - spec => {bug => {type => SCALAR, - regex => qr/^\d+$/, - }, - status => {type => HASHREF, - optional => 1, - }, - days_until => {type => BOOLEAN, - default => 0, - }, - ignore_time => {type => BOOLEAN, - default => 0, - }, - }, + spec => $spec, ); # This is what we return if the bug cannot be archived. my $cannot_archive = $param{days_until}?-1:0; @@ -1010,16 +1014,16 @@ sub bug_archiveable{ # If we just are checking if the bug can be archived, we'll not even bother # checking the versioning information if the bug has been -done for less than 28 days. my $log_file = getbugcomponent($param{bug},'log'); - if (not defined $log_file) { + if (not defined $log_file or not -e $log_file) { print STDERR "Cannot archive $param{bug} because the log doesn't exist\n" if $DEBUG; return $cannot_archive; } - my $max_log_age = max(map {$config{remove_age} - -M $_} - $log_file, map {my $log = getbugcomponent($_,'log'); + my @log_files = $log_file, (map {my $log = getbugcomponent($_,'log'); defined $log ? ($log) : (); } - split / /, $status->{mergedwith} - ); + split / /, $status->{mergedwith}); + my $max_log_age = max(map {-e $_?($config{remove_age} - -M _):0} + @log_files); if (not $param{days_until} and not $param{ignore_time} and $max_log_age > 0 ) { @@ -1063,6 +1067,7 @@ sub bug_archiveable{ my @sourceversions = get_versions(package => $status->{package}, dist => [keys %dists], source => 1, + hash_slice(%param,'schema'), ); @source_versions{@sourceversions} = (1) x @sourceversions; # If the bug has not been fixed in the versions actually @@ -1073,6 +1078,7 @@ sub bug_archiveable{ fixed => $status->{fixed_versions}, version_cache => $version_cache, package => $status->{package}, + hash_slice(%param,'schema'), )) { print STDERR "Cannot archive $param{bug} because it's found\n" if $DEBUG; return $cannot_archive; @@ -1093,6 +1099,7 @@ sub bug_archiveable{ dist => [keys %dists], source => 1, time => 1, + hash_slice(%param,'schema'), ); for my $version (sort {$time_versions{$b} <=> $time_versions{$a}} keys %time_versions) { my $buggy = buggy(bug => $param{bug}, @@ -1101,6 +1108,7 @@ sub bug_archiveable{ fixed => $status->{fixed_versions}, version_cache => $version_cache, package => $status->{package}, + hash_slice(%param,'schema'), ); last if $buggy eq 'found'; $min_fixed_time = min($time_versions{$version},$min_fixed_time); @@ -1321,6 +1329,10 @@ sub get_bug_statuses { my %param = validate_with(params => \@_, spec => $spec, ); + my $bin_to_src_cache = {}; + if (defined $param{binary_to_source_cache}) { + $bin_to_src_cache = $param{binary_to_source_cache}; + } my %status; my %statuses; if (defined $param{schema}) { @@ -1333,25 +1345,25 @@ sub get_bug_statuses { $statuses{$bug_status->{bug_num}} = $bug_status; for my $field (qw(blocks blockedby done), - qw(fixed_versions found_versions), - qw(tags) + qw(tags mergedwith affects) ) { $bug_status->{$field} //=''; } $bug_status->{keywords} = $bug_status->{tags}; - $bug_status->{log_modified} = - DateTime::Format::Pg-> - parse_datetime($bug_status->{log_modified})-> - epoch; - $bug_status->{date} = - DateTime::Format::Pg-> - parse_datetime($bug_status->{date})-> - epoch; - $bug_status->{last_modified} = - DateTime::Format::Pg-> - parse_datetime($bug_status->{last_modified})-> - epoch; + $bug_status->{location} = $bug_status->{archived}?'archive':'db-h'; + for my $field (qw(found_versions fixed_versions found_date fixed_date)) { + $bug_status->{$field} = [split ' ', $bug_status->{$field} // '']; + } + for my $field (qw(found fixed)) { + # create the found/fixed hashes which indicate when a + # particular version was marked found or marked fixed. + @{$bug_status->{$field}}{@{$bug_status->{"${field}_versions"}}} = + (('') x (@{$bug_status->{"${field}_versions"}} - + @{$bug_status->{"${field}_date"}}), + @{$bug_status->{"${field}_date"}}); + } + $bug_status->{id} = $bug_status->{bug_num}; } } else { for my $bug (make_list($param{bug})) { @@ -1359,24 +1371,24 @@ sub get_bug_statuses { exists $param{bug_index}{$bug}) { my %status = %{$param{bug_index}{$bug}}; $status{pending} = $status{status}; - $status{id} = $param{bug}; + $status{id} = $bug; $statuses{$bug} = \%status; } elsif (defined $param{status} and $param{status}{bug_num} == $bug ) { - $statuses{$bug} = {$param{status}}; + $statuses{$bug} = {%{$param{status}}}; } else { my $location = getbuglocation($bug, 'summary'); next if not defined $location or not length $location; my %status = %{ readbug( $bug, $location ) }; + $status{id} = $bug; $statuses{$bug} = \%status; } } } for my $bug (keys %statuses) { my $status = $statuses{$bug}; - $status->{id} = $bug; if (defined $param{bugusertags}{$param{bug}}) { $status->{keywords} = "" unless defined $status->{keywords}; @@ -1389,12 +1401,6 @@ sub get_bug_statuses { $status->{package} = '' if not defined $status->{package}; $status->{"package"} =~ s/\s*$//; - $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 ''); $status->{"severity"} = 'normal' if (not defined $status->{severity} or $status->{"severity"} eq ''); @@ -1639,6 +1645,9 @@ sub max_buggy{ version_cache => {type => HASHREF, default => {}, }, + schema => {type => OBJECT, + optional => 1, + }, }, ); # Resolve bugginess states (we might be looking at multiple @@ -1701,6 +1710,9 @@ sub buggy { }, version => {type => SCALAR, }, + schema => {type => OBJECT, + optional => 1, + }, }, ); my @found = @{$param{found}}; @@ -1735,8 +1747,10 @@ sub buggy { my $version_fh = IO::File->new("$config{version_packages_dir}/$srchash/$source", 'r'); if (not defined $version_fh) { # We only want to warn if it's a package which actually has a maintainer - my $maints = getmaintainers(); - next if not exists $maints->{$source}; + my @maint = package_maintainer(source => $source, + hash_slice(%param,'schema'), + ); + next unless @maint; warn "Bug $param{bug}: unable to open $config{version_packages_dir}/$srchash/$source: $!"; next; }