summaryrefslogtreecommitdiffstats
path: root/reporting/templates/maintainer.tmpl
diff options
context:
space:
mode:
Diffstat (limited to 'reporting/templates/maintainer.tmpl')
-rw-r--r--reporting/templates/maintainer.tmpl196
1 files changed, 196 insertions, 0 deletions
diff --git a/reporting/templates/maintainer.tmpl b/reporting/templates/maintainer.tmpl
new file mode 100644
index 0000000..e5e9353
--- /dev/null
+++ b/reporting/templates/maintainer.tmpl
@@ -0,0 +1,196 @@
+{ head("Lintian Report for $name") }
+ <h1>{$name}</h1>
+
+ <p>
+ At the time of the last Lintian run, the following possible problems
+ were found in packages maintained by {$maintainer}, listed by source
+ package.
+{
+ if ($errors) {
+ qq( See also the <a href="${path_prefix}full/$id">full report</a>, including)
+ . " info, experimental and overridden tags.";
+ } else {
+ qq( See also the <a href="${path_prefix}maintainer/$id">report showing)
+ . " only errors and warnings</a>.";
+ }
+}
+ Also see their
+ <a href="https://qa.debian.org/developer.php?login={$email}">QA
+ overview</a>.
+ </p>
+
+{
+ # Show the summary only if the number of packages is within a certain
+ # range.
+ my $num_packages = keys(%packages) + keys(%uploads);
+ if ($num_packages) {
+ $OUT .= qq( <nav id="summary">\n <ul>\n);
+ foreach my $source (sort(keys(%packages), keys(%uploads))) {
+ # Only display a link for the package if either we're
+ # displaying the full report, or the package has error
+ # or warning tags
+ my @interesting = ();
+ my $versions = $packages{$source} || $uploads{$source};
+
+ if (!$errors) {
+ # Full report, so include the package
+ @interesting = sort by_version keys %$versions;
+ @interesting = map {
+ [$_, $versions->{$_}[0]{pkg_info}{anchor}]
+ } @interesting;
+ } else {
+ for my $version (sort by_version keys %$versions) {
+ my $tags = $versions->{$version};
+ for my $tag (@$tags) {
+ if (($tag->{code} eq 'E') or ($tag->{code} eq 'W')) {
+ push(@interesting, [$version, $tag->{pkg_info}{anchor}]);
+ last;
+ }
+ }
+ }
+ }
+
+ if (@interesting) {
+ foreach my $vdata (@interesting) {
+ my ($version, $anchor) = @{$vdata};
+ $OUT .= q{ } .
+ qq(<li><a href="#${anchor}">$source ($version)</a></li>\n);
+ }
+ }
+ }
+ $OUT .= " </ul>\n </nav>\n";
+ }
+}
+ <div class="clear"></div>
+
+{
+ # We get a hash of package names to a hash of versions to a list of tags.
+ # Create a list with the package information as the title and the tags as
+ # the value.
+ for my $source (sort (keys (%packages), keys (%uploads))) {
+ my ($data, $upload);
+ my $first_version = 1;
+ if ($packages{$source}) {
+ $data = $packages{$source};
+ } else {
+ $data = $uploads{$source};
+ $upload = 1;
+ }
+ for my $version (sort by_version keys %$data) {
+ my @tags = @{$data->{$version}};
+ my @error_tags = grep { $_->{code} eq 'E' or $_->{code} eq 'W' } @tags;
+ my $first = 1;
+ my $binary = '';
+ my $tag = '';
+ my $firstcomponent = '';
+ # Tracks whether we have opened an "<ul>"-list for the tag "extra".
+ # We only do this if the tags have "extra" info to avoid an empty
+ # "<ul></ul>" (which is forbidden by XHTML 1.0 strict).
+ my $has_extra = 0;
+
+ if ($errors) {
+ @tags = @error_tags;
+ next if not @error_tags;
+ }
+
+ for my $info (@tags) {
+ my $pkg_info = $info->{pkg_info};
+ my $is_binary = ($pkg_info->{type} eq "binary" or $pkg_info->{type} eq "udeb");
+ my $new_binary = $pkg_info->{package} ne $binary if $is_binary;
+ my $tag_info = $info->{tag_info};
+ my $next_tag = $tag_info->name;
+
+ my $component = ($pkg_info->{component} eq 'main') ? '' : "; $pkg_info->{component}";
+ $firstcomponent = $pkg_info->{component} unless $firstcomponent;
+ if ($first) {
+ my $state = $pkg_info->{'state_data'};
+ my $anchor = $pkg_info->{'anchor'};
+ my $status = 'up-to-date';
+ my $last_processed_by = $state->{'last-processed-by'} // 'N/A';
+ $status = '<i>outdated</i>' if (exists($state->{'out-of-date'}));
+ $status = '<b class="processing-error">incomplete report; an error occurred during the last check</b>'
+ if exists($state->{'last-error-by'}) and $state->{'last-error-by'};
+ $OUT .= qq( <div class="source-header">\n);
+ $OUT .= qq( <h2 id="$pkg_info->{anchor}">);
+ $OUT .= "$source ($version$component)";
+ $OUT .= " [Uploader]" if $upload;
+ if ($first_version) {
+ # Unversioned #<pkg> references just go to the first version.
+ $first_version = 0;
+ $OUT .= qq( <a href="#${source}" id="${source}">&sect;</a>)
+ }
+ $OUT .= "</h2>\n";
+ $OUT .= qq( <p class="info-links">\n);
+ $OUT .= qq( <a href="https://packages.debian.org/src:$source">Info</a>\n);
+ $OUT .= qq( <a href="https://tracker.debian.org/$source">Package Tracker</a>\n);
+ $OUT .= qq( <a href="https://bugs.debian.org/src:$source">Bugs</a>\n);
+ $OUT .= qq( <a href="https://sources.debian.org/src/$source/$version">Source</a>\n);
+ if ($errors) {
+ $OUT .= qq( <a href="${path_prefix}full/$id#$anchor">Full report</a>\n);
+ } elsif (@error_tags) {
+ $OUT .= qq( <a href="${path_prefix}maintainer/$id#$anchor">Short report</a>\n);
+ }
+ $OUT .= qq[ (${status}, last processed by Lintian/$last_processed_by)];
+ $OUT .= qq( </p>\n </div>\n);
+ $OUT .= qq( <ul class="report">\n) unless $is_binary;
+ }
+
+ my $bin_version = '';
+ unless ($pkg_info->{version} eq $version
+ and $pkg_info->{component} eq $firstcomponent) {
+ $bin_version = " ($pkg_info->{version}; $pkg_info->{component})";
+ }
+
+ if ($tag ne $next_tag or $new_binary) {
+ # Close the '<ul class="extra">' HTML tag if it is open
+ $OUT .= "</ul>\n" if $has_extra;
+ # Reset has_extra; if the tag has an "extra", we will check
+ # for it later.
+ $has_extra = 0;
+ if ($new_binary) {
+ $OUT .= " </li>\n </ul>\n" unless $first;
+ $OUT .= qq( <h3>$pkg_info->{package}$bin_version</h3>\n);
+ $OUT .= qq( <ul class="report">\n);
+ }
+ }
+
+ my $class = '';
+ # No HTML quote needed; severity is from a fixed
+ # whitelist of known safe words.
+ my $severity = $tag_info->effective_severity;
+ $class = qq( title="$severity");
+
+ # Display tag name only once.
+ if ($tag ne $next_tag or $new_binary) {
+ my $q_next_tag = html_quote($next_tag);
+ $OUT .= " </li>\n" unless $first or $new_binary;
+ $OUT .= " <li$class>\n";
+ $OUT .= qq( <span class="type-$info->{code}">);
+ $OUT .= "$info->{code}</span> ";
+ $OUT .= qq(<a href="${path_prefix}tags/${q_next_tag}.html">);
+ $OUT .= "${q_next_tag}</a>\n";
+ }
+
+ if ($info->{extra}) {
+ if (not $has_extra) {
+ # Open a list for the "extra" info.
+ $has_extra = 1;
+ $OUT .= qq( <ul class="extra">);
+ }
+ $OUT .= "<li>$info->{extra}";
+ my @archs = sort keys %{ $info->{archs} };
+ $OUT .= " <tt>[" . join(', ', @archs) . "]</tt>" if @archs > 1;
+ $OUT .= "</li>";
+ }
+
+ $first = 0;
+ $binary = $pkg_info->{package} if $is_binary;
+ $tag = $next_tag;
+ }
+ # Close the "extra" info-list (if present) and the current setup
+ $OUT .= "</ul>\n" if $has_extra;
+ $OUT .= " </li>\n </ul>\n";
+ }
+ }
+}
+{ foot() }