[lintian] 07/14: Rewrite html_reports to use harness state cache
This is an automated email from the git hooks/post-receive script.
nthykier pushed a commit to branch master
in repository lintian.
commit 38644da424a8c49b865f76ff3c4d9dd99644d019
Author: Niels Thykier <niels@thykier.net>
Date: Sat Jan 31 18:26:26 2015 +0100
Rewrite html_reports to use harness state cache
Signed-off-by: Niels Thykier <niels@thykier.net>
---
reporting/html_reports | 102 +++++++++++++++++--------------------------------
1 file changed, 34 insertions(+), 68 deletions(-)
diff --git a/reporting/html_reports b/reporting/html_reports
index 97a3bf1..fd9003c 100755
--- a/reporting/html_reports
+++ b/reporting/html_reports
@@ -28,6 +28,7 @@ use autodie;
use POSIX qw(strftime);
use File::Copy qw(copy);
use Fcntl qw(SEEK_SET);
+use List::Util qw(first);
use List::MoreUtils qw(uniq);
use URI::Escape;
use Text::Template ();
@@ -125,11 +126,6 @@ $templates{'lintian.css'} = Text::Template->new(
# ------------------------------
# Main routine
-my $LAB = Lintian::Lab->new($LINTIAN_LAB);
-my $source_info;
-$LAB->open;
-$source_info = $LAB->_get_lab_index('source');
-
# Create output directories.
mkdir($HTML_TMP_DIR, 0777);
mkdir("$HTML_TMP_DIR/full", 0777);
@@ -239,7 +235,7 @@ my (%by_maint, %by_uploader, %by_tag);
#
# The "last_*" are optimizations to avoid computing the same things
# over and over again when a package have multiple tags.
-my (%seen, $last_info, $last_maintainer);
+my (%seen, $last_info, $last_maintainer, %unknown_member_id);
my %expanded_code = (
E => 'errors',
W => 'warnings',
@@ -254,7 +250,7 @@ while (<>) {
chomp;
@parts = split_tag($_);
next unless @parts;
- my ($code, $package, $type, $pver, $parch, $tag, $extra) = @parts;
+ my ($code, $package, $type, $version, $arch, $tag, $extra) = @parts;
$type = 'binary' unless (defined $type);
next unless ($type eq 'source' || $type eq 'binary' || $type eq 'udeb');
# Ignore unknown tags - happens if we removed a tag that is still present
@@ -275,57 +271,33 @@ while (<>) {
# version, and archive area. Work around a missing source package by
# pulling information from a binary package or udeb of the same name if
# there is any.
- my ($source, $version, $area, $source_version, $maintainer, $uploaders);
- my $pkg_data= $LAB->_get_lab_manifest_data($package, $type, $pver, $parch);
- my $state_data = {};
+ my ($source, $area, $source_version, $maintainer, $uploaders);
+ my $member_id
+ = "${type}:${package}/${version}" . ($type ne 'source' ? "/$arch" : q{});
+ my $state_data = $STATE_CACHE->{'members-to-groups'}{$member_id};
+ next if exists($unknown_member_id{$member_id});
if ($type eq 'source') {
$source = $package;
- if (defined $pkg_data) {
- $source_version = $version = $pkg_data->{version};
- $area = $pkg_data->{area};
- $maintainer = $pkg_data->{maintainer};
- $uploaders = $pkg_data->{uploaders};
- } else {
- $source_version = $version = $pver;
- $pver//='N/A';
- warn "source package $package/$pver not found!\n";
+ $source_version = $version;
+ if (not defined($state_data)) {
+ warn "Source package ${member_id} not found in state cache!\n";
+ $unknown_member_id{$member_id} = 1;
}
- } else {
- my $src_data;
- if (defined $pkg_data) {
- $version = $pkg_data->{version};
- $area = $pkg_data->{area};
- $source = $pkg_data->{source}//$package;
- $source_version = $pkg_data->{'source-version'}//$version;
- $src_data = $LAB->_get_lab_manifest_data($source, 'source',
- $source_version);
- } else {
- $version = $pver;
- }
- if (defined $src_data) {
- $maintainer = $src_data->{maintainer};
- $uploaders = $src_data->{uploaders};
- } else {
- $pver//='N/A';
- $parch//='N/A';
- if (defined $pkg_data) {
- warn "source for package $package/$pver/$parch"
- . " ($source/$source_version) not found!\n";
- } else {
- warn "data for package $package/$pver/$parch not found!\n";
- }
- $maintainer = undef;
- $uploaders = undef;
+ } elsif (defined($state_data)) {
+ my $src_member
+ = first { s/^source:// } keys(%{$state_data->{'members'}});
+ if ($src_member) {
+ ($source, $source_version) = split(m{/}, $src_member, 2);
}
+ } elsif (not defined($state_data)) {
+ warn "Package ${member_id} not found in state-cache!\n";
+ $unknown_member_id{$member_id} = 1;
}
- if ($source and ($version//'') ne '') {
- my $group_id = "$source/$version";
- if (exists($STATE_CACHE->{$group_id})) {
- $state_data = $STATE_CACHE->{$group_id};
- }
- }
- $maintainer ||= '(unknown)';
- $area ||= 'main';
+ $state_data //= {};
+ $area = $state_data->{'mirror-metadata'}{'area'} ||= 'main';
+ $maintainer = $state_data->{'mirror-metadata'}{'maintainer'}
+ ||= '(unknown)';
+ $uploaders = $state_data->{'mirror-metadata'}{'uploaders'};
$source ||= '';
$version = 'unknown'
unless (defined($version) and length($version) > 0);
@@ -428,9 +400,7 @@ while (<>) {
# information to %by_uploaders (still sharing the data
# between hashes).
if ($uploaders) {
- my @uploaders
- = map { map_maintainer($_) } split(/>\K\s*,\s*/, $uploaders);
- for my $uploader (@uploaders) {
+ for my $uploader (@{$uploaders}) {
next if $uploader eq $maintainer;
$by_uploader{$uploader}{$source}{$source_version}
= $list_ref;
@@ -449,18 +419,14 @@ while (<>) {
# this later to generate stub pages for maintainers whose packages are all
# Lintian-clean.
my %clean;
-$source_info->visit_all(
- sub {
- my ($srcdata) = @_;
- my $maintainer = $srcdata->{maintainer};
- my $id = maintainer_url($maintainer);
- $clean{$id} = $maintainer;
- });
-
-# Done with the lab and its metadata
-$LAB->close;
-undef $LAB;
-undef $source_info;
+for my $group_id (sort(keys(%{$STATE_CACHE->{'groups'}}))) {
+ my $maintainer
+ = $STATE_CACHE->{'groups'}{$group_id}{'mirror-metadata'}{'maintainer'};
+ my $id;
+ next if not $maintainer;
+ $id = maintainer_url($maintainer);
+ $clean{$id} = $maintainer;
+}
# Now, walk through the tags by source package (sorted by maintainer). Output
# a summary page of errors and warnings for each maintainer, output a full
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/lintian/lintian.git
Reply to: