[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

[lintian] 11/13: html_reports: Collect stats earlier and reduce var scopes



This is an automated email from the git hooks/post-receive script.

nthykier pushed a commit to branch master
in repository lintian.

commit 302eb651fdc1790f5c348ad6d8c6d987629a1b4e
Author: Niels Thykier <niels@thykier.net>
Date:   Sat Feb 21 20:24:02 2015 +0100

    html_reports: Collect stats earlier and reduce var scopes
    
    Collect some stats earlier, allowing us to greatly reduce the scope of
    %qa and %sources.  It will eventually also allow us to generate graphs
    earlier as well.
    
    Signed-off-by: Niels Thykier <niels@thykier.net>
---
 reporting/html_reports | 107 ++++++++++++++++++++++++++++++-------------------
 1 file changed, 65 insertions(+), 42 deletions(-)

diff --git a/reporting/html_reports b/reporting/html_reports
index d18b0db..38e93ef 100755
--- a/reporting/html_reports
+++ b/reporting/html_reports
@@ -220,10 +220,27 @@ my (%statistics, %tag_statistics);
 #
 # %by_tag is a hash of tag names to an anonymous array of tag information
 # hashes just like the inside-most data structure above.
-my (%by_maint, %by_uploader, %by_tag);
+my (%by_maint, %by_uploader, %by_tag, @maintainers, %maintainer_table);
 
+print "Parsing lintian log...\n";
 parse_lintian_log();
 
+@maintainers = sort(uniq(keys(%by_maint), keys(%by_uploader)));
+
+{
+    # Scoped to allow memory to be re-purposed.  The %qa and %sources
+    # structures are only used for a very few isolated items.
+    my (%qa, %sources);
+    print "Collecting statistics...\n";
+    collect_statistics(\@maintainers, \%sources, \%qa);
+
+    generate_lookup_tables(\%sources);
+
+    write_qa_list(\%qa);
+
+    generate_package_index_packages(\%sources);
+}
+
 # Build a hash of all maintainers, not just those with Lintian tags.  We use
 # this later to generate stub pages for maintainers whose packages are all
 # Lintian-clean.
@@ -241,34 +258,11 @@ for my $group_id (sort(keys(%{$STATE_CACHE->{'groups'}}))) {
 # a summary page of errors and warnings for each maintainer, output a full
 # page that includes info, experimental, and overridden tags, and assemble the
 # maintainer index and the QA package list as we go.
-my (%qa, %maintainer_table, %sources);
-my @maintainers = sort(uniq(keys(%by_maint), keys(%by_uploader)));
 
 for my $maintainer (@maintainers) {
     my $id = maintainer_url($maintainer);
     delete $clean{$id};
 
-    # For each of this maintainer's packages, add statistical information
-    # about the number of each type of tag to the QA data and build the
-    # packages hash used for the package index.  We only do this for the
-    # maintainer packages, not the uploader packages, to avoid
-    # double-counting.
-    for my $source (keys %{ $by_maint{$maintainer} }) {
-        my %count;
-        for my $version (
-            sort versions_comparator keys %{ $by_maint{$maintainer}{$source} })
-        {
-            my $tags = $by_maint{$maintainer}{$source}{$version};
-            for my $tag (@$tags) {
-                $count{$tag->{code}}++;
-            }
-            if (@$tags) {
-                $sources{$source}{$version} = $tags->[0]->{xref};
-            }
-        }
-        $qa{$source} = \%count;
-    }
-
     # Determine if the maintainer's page is clean.  Check all packages for
     # which they're either maintainer or uploader and set $error_clean if
     # they have no errors or warnings.
@@ -331,10 +325,6 @@ for my $maintainer (@maintainers) {
 my %data = (maintainers => \%maintainer_table,);
 output_template('maintainers.html', $templates{maintainers}, \%data);
 
-generate_lookup_tables(\%sources);
-
-write_qa_list(\%qa);
-
 # Now, generate stub pages for every maintainer who has only clean packages.
 for my $id (keys %clean) {
     my $maintainer = $clean{$id};
@@ -358,21 +348,11 @@ for my $tag (sort $profile->tags(1)) {
     my $info = $profile->get_tag($tag, 1);
     my $description = $info->description('html', '    ');
     my ($count, $overrides) = (0, 0);
-    my %seen_tags;
     my $tmpl = 'tag-not-seen';
     if (exists $by_tag{$tag}) {
         $tmpl = 'tag';
-        foreach (@{$by_tag{$tag}}) {
-            if ($_->{code} ne 'O') {
-                $count++;
-                $seen_tags{$_->{xref}}++;
-            } else {
-                $overrides++;
-            }
-        }
-        $tag_statistics{$tag}{'count'} = $count;
-        $tag_statistics{$tag}{'overrides'} = $overrides;
-        $tag_statistics{$tag}{'packages'} = scalar keys %seen_tags;
+        $count = $tag_statistics{$tag}{'count'};
+        $overrides = $tag_statistics{$tag}{'overrides'};
     }
 
     my %maint_data = (
@@ -401,8 +381,6 @@ output_template('tags.html', $templates{tags}, \%data);
 output_template('tags-severity.html', $templates{'tags-severity'}, \%data);
 output_template('tags-all.html', $templates{'tags-all'}, \%data);
 
-generate_package_index_packages(\%sources);
-
 # Finally, we can start creating the index page.  First, read in the old
 # statistics file so that we can calculate deltas for all of our statistics.
 
@@ -456,6 +434,51 @@ exit 0;
 # ------------------------------
 # Utility functions
 
+sub collect_statistics {
+    my ($maintainers_ref, $sources_ref, $qa_list_ref) = @_;
+
+    # For each of this maintainer's packages, add statistical information
+    # about the number of each type of tag to the QA data and build the
+    # packages hash used for the package index.  We only do this for the
+    # maintainer packages, not the uploader packages, to avoid
+    # double-counting.
+    for my $maintainer (@{$maintainers_ref}) {
+        for my $source (keys %{ $by_maint{$maintainer} }) {
+            my %count;
+            for my $version (
+                sort versions_comparator
+                keys %{ $by_maint{$maintainer}{$source} }){
+                my $tags = $by_maint{$maintainer}{$source}{$version};
+                for my $tag (@{$tags}) {
+                    $count{$tag->{code}}++;
+                }
+                if (@$tags) {
+                    $sources_ref->{$source}{$version} = $tags->[0]->{xref};
+                }
+            }
+            $qa_list_ref->{$source} = \%count;
+        }
+    }
+
+    for my $tag ($profile->tags(1)) {
+        my ($count, $overrides) = (0, 0);
+        my %seen_tags;
+        next if (not exists($by_tag{$tag}));
+        foreach (@{$by_tag{$tag}}) {
+            if ($_->{code} ne 'O') {
+                $count++;
+                $seen_tags{$_->{xref}}++;
+            } else {
+                $overrides++;
+            }
+        }
+        $tag_statistics{$tag}{'count'} = $count;
+        $tag_statistics{$tag}{'overrides'} = $overrides;
+        $tag_statistics{$tag}{'packages'} = scalar(keys(%seen_tags));
+    }
+    return;
+}
+
 # Generate the package lists.  These are huge, so we break them into four
 # separate pages.
 #

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/lintian/lintian.git


Reply to: