summaryrefslogtreecommitdiffstats
path: root/private/tag-stats
diff options
context:
space:
mode:
Diffstat (limited to 'private/tag-stats')
-rwxr-xr-xprivate/tag-stats109
1 files changed, 109 insertions, 0 deletions
diff --git a/private/tag-stats b/private/tag-stats
new file mode 100755
index 0000000..9aa6696
--- /dev/null
+++ b/private/tag-stats
@@ -0,0 +1,109 @@
+#!/usr/bin/perl
+
+# tag-stats - tag classification statistics
+#
+# This script displays statistics and data for tag classification based on
+# Severity fields and their mapping to a E/W/I code.
+#
+# The verbose options (-v, -vv, -vvv) can be used to display a detailed list
+# of which tags are assigned to each category.
+
+use v5.20;
+use warnings;
+use utf8;
+use autodie qw(opendir closedir);
+
+use Const::Fast;
+use Cwd qw(realpath);
+use File::Basename qw(dirname);
+use Unicode::UTF8 qw(encode_utf8);
+
+# neither Path::This nor lib::relative are in Debian
+use constant THISFILE => realpath __FILE__;
+use constant THISDIR => dirname realpath __FILE__;
+
+# use Lintian modules that belong to this program
+use lib THISDIR . '/../lib';
+
+use Lintian::Profile;
+use Lintian::Tag;
+
+const my $SPACE => q{ };
+const my $INDENT => $SPACE x 4;
+const my $EXTRA_VERBOSE => 3;
+
+$ENV{LINTIAN_BASE} = realpath(THISDIR . '/..')
+ // die encode_utf8('Cannot resolve LINTIAN_BASE');
+
+my @severities = reverse qw(pedantic info warning error);
+my @types = qw(E W I P);
+
+my %stats;
+my $num_tags = 0;
+my $num_ok = 0;
+my $percent = 0;
+
+my $verbose = $ARGV[0] ? ($ARGV[0] =~ s/v/v/g) : 0;
+
+my $profile = Lintian::Profile->new;
+$profile->load;
+
+for my $tag_name ($profile->known_tags) {
+
+ my $tag = $profile->get_tag($tag_name);
+
+ my $name = $tag->name;
+ my $severity = $tag->visibility;
+ my $code = $tag->code;
+
+ $severity = 'unclassified'
+ unless length $severity;
+
+ push(@{$stats{severity}{$severity}}, $name);
+ push(@{$stats{type}{severity}{$code}{$severity}}, $name);
+
+ $num_tags++;
+}
+
+print encode_utf8("Severity\n");
+
+foreach my $s (@severities) {
+ my $tags = $stats{severity}{$s} // [];
+ print encode_utf8(" $s: " . @{$tags} . "\n");
+ print encode_utf8($INDENT . join("\n ", sort @{$tags}) . "\n")
+ if $verbose >= $EXTRA_VERBOSE;
+}
+
+foreach my $t (@types) {
+ print encode_utf8("\nType $t Severity\n");
+ foreach my $s (@severities) {
+ if (my $tags = $stats{type}{severity}{$t}{$s}) {
+ print encode_utf8(" $s: " . @{$tags} . "\n");
+ print encode_utf8($INDENT . join("\n ", sort @{$tags}) . "\n")
+ if $verbose >= 2;
+ }
+ }
+}
+
+print encode_utf8("\nCollections\n");
+foreach my $s (@severities) {
+ if (my $needs = $stats{needs}{$s}) {
+ my $size = scalar keys %{$needs};
+ my @list = sort keys %{$needs};
+ print encode_utf8(" $s: $size\n");
+ print encode_utf8($INDENT . join("\n ", @list) . "\n")
+ if $verbose >= 2;
+ }
+}
+
+if ($verbose >= 1 and exists $stats{severity}{unclassified}) {
+ print encode_utf8("\nUnclassified tags\n");
+ print encode_utf8(
+ $SPACE x 2 . join("\n ", @{$stats{severity}{unclassified}}) . "\n");
+}
+
+# Local Variables:
+# indent-tabs-mode: nil
+# cperl-indent-level: 4
+# End:
+# vim: syntax=perl sw=4 sts=4 sr et