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

[lintian] On supporting classification tags



Hi,

I took a stab at implementing classification tags (see attached patches
or [1]).  These tags are intended solely as a means to classify (an
aspect of) a package and are by no means an issue people need to fix.

 * The proposed implementation is basically a hack which abuses the
   "severity".

 * I am open to other suggestions (especially those with patches).

 * I have not given the colouring a lot of thought and welcome
   suggestions here as well.
   - Notably, part of the css is basically copy-waste of the "pedantic"
     tag, so they currently share the same colour for the description.

With the patch, I also implemented two classifications tags for the sake
of it:

 * classification-of-debian-build-system
   - always emitted
 * declared-source-format
   - omitted when the format is "implicit" (i.e. d/source/format is
     absent).

These can be tested by using "-L +classification" (or "-L
=classification").  Output of running on lintian itself:

"""
$ frontend/lintian  -L =classification lintian_2.5.42_source.changes
C: lintian source: classification-of-debian-build-system dh
C: lintian source: declared-source-format 3.0 (native)
N: 5 tags overridden (1 error, 3 warnings, 1 info)
"""

Thanks,
~Niels

[1]
https://anonscm.debian.org/git/users/nthykier/lintian.git/log/?h=support-classification-tags


From c5ebc60a6836d74977fb63782ac9a39045aaf75e Mon Sep 17 00:00:00 2001
From: Niels Thykier <niels@thykier.net>
Date: Sun, 6 Mar 2016 18:01:22 +0000
Subject: [PATCH 1/3] Add support for "classification" tags

Signed-off-by: Niels Thykier <niels@thykier.net>
---
 doc/lintian.xml                       |  9 ++++++---
 lib/Lintian/Internal/FrontendUtil.pm  |  2 +-
 lib/Lintian/Output.pm                 |  3 ++-
 lib/Lintian/Output/LetterQualifier.pm |  5 +++++
 lib/Lintian/Profile.pm                | 13 +++++++++++--
 lib/Lintian/Tag/Info.pm               |  7 +++++++
 lib/Lintian/Tags.pm                   |  5 ++++-
 7 files changed, 36 insertions(+), 8 deletions(-)

diff --git a/doc/lintian.xml b/doc/lintian.xml
index bfd0464..43601a9 100644
--- a/doc/lintian.xml
+++ b/doc/lintian.xml
@@ -929,9 +929,12 @@ foo [!any-i386] binary: some-tag-not-for-i386 optional-extra
               <term><emphasis>Severity</emphasis> (simple, optional)</term>
               <listitem>
                 <para>
-                  The value must be a valid tag severity; the severity
-                  of the affected tags is set to this value.  Note
-                  that <emphasis>experimental</emphasis> is not a
+                  The value must be a valid tag severity other than "classification".
+                  The severity of the affected tags is set to this value.  This
+                  cannot be used on any tag that is defined as a "classification" tag.
+                </para>
+                <para>
+                  Note that <emphasis>experimental</emphasis> is not a
                   severity.
                 </para>
               </listitem>
diff --git a/lib/Lintian/Internal/FrontendUtil.pm b/lib/Lintian/Internal/FrontendUtil.pm
index a14f523..d199c28 100644
--- a/lib/Lintian/Internal/FrontendUtil.pm
+++ b/lib/Lintian/Internal/FrontendUtil.pm
@@ -159,7 +159,7 @@ sub default_parallel {
     # Where the marked part(s) are optional values.  The numbers above
     # the example are the capture groups.
     my $TAG_REGEX
-      = qr/([EWIXOP]): (\S+)(?: (\S+)(?:$verarchre)?)?: (\S+)(?:\s+(.*))?/o;
+      = qr/([EWIXOPC]): (\S+)(?: (\S+)(?:$verarchre)?)?: (\S+)(?:\s+(.*))?/o;
 
     sub split_tag {
         my ($tag_input) = @_;
diff --git a/lib/Lintian/Output.pm b/lib/Lintian/Output.pm
index d026bd7..2884d37 100644
--- a/lib/Lintian/Output.pm
+++ b/lib/Lintian/Output.pm
@@ -144,7 +144,8 @@ my %default_colors = (
     'E' => 'red',
     'W' => 'yellow',
     'I' => 'cyan',
-    'P' => 'green'
+    'P' => 'green',
+    'C' => 'blue',
 );
 
 our $GLOBAL = Lintian::Output->new;
diff --git a/lib/Lintian/Output/LetterQualifier.pm b/lib/Lintian/Output/LetterQualifier.pm
index 8c26620..a1926f1 100644
--- a/lib/Lintian/Output/LetterQualifier.pm
+++ b/lib/Lintian/Output/LetterQualifier.pm
@@ -28,6 +28,11 @@ use Lintian::Output qw(:util);
 use parent qw(Lintian::Output);
 
 my %codes = (
+    'classification' => {
+        'wild-guess' => 'C?',
+        'possible' => 'C ',
+        'certain' => 'C!'
+    },
     'pedantic' => {
         'wild-guess' => 'P?',
         'possible' => 'P ',
diff --git a/lib/Lintian/Profile.pm b/lib/Lintian/Profile.pm
index 9a6d057..4c901a5 100644
--- a/lib/Lintian/Profile.pm
+++ b/lib/Lintian/Profile.pm
@@ -417,13 +417,22 @@ sub _read_profile_section {
             qq{Profile "$pname" contains invalid severity},
             qq{"$severity" in section $sno}))
 
-      if $severity && !$SEVERITIES{$severity};
+      if $severity
+      && (!$SEVERITIES{$severity} || $severity eq 'classification');
 
     foreach my $tag (@tags) {
         croak "Unknown check $tag in $pname (section $sno)"
           unless $self->{'known-tags'}{$tag};
         if ($severity) {
-            $self->{'known-tags'}{$tag}->set_severity($severity);
+            my $t = $self->{'known-tags'}{$tag};
+            if ($t->severity(1) eq 'classification') {
+                croak(
+                    join(q{ },
+                        qq{${tag} is a classification tag},
+                        q{and cannot not be assigned a severity},
+                        qq{(profile "$pname", section $sno)}));
+            }
+            $t->set_severity($severity);
         }
         if ($overridable != -1) {
             if ($overridable) {
diff --git a/lib/Lintian/Tag/Info.pm b/lib/Lintian/Tag/Info.pm
index 7f0844c..e84eb9f 100644
--- a/lib/Lintian/Tag/Info.pm
+++ b/lib/Lintian/Tag/Info.pm
@@ -43,6 +43,7 @@ our $MANUALS
 
 # Map severity/certainty levels to tag codes.
 our %CODES = (
+    classification => { 'wild-guess' => 'C', possible => 'C', certain => 'C' },
     pedantic  => { 'wild-guess' => 'P', possible => 'P', certain => 'P' },
     wishlist  => { 'wild-guess' => 'I', possible => 'I', certain => 'I' },
     minor     => { 'wild-guess' => 'I', possible => 'I', certain => 'W' },
@@ -278,6 +279,12 @@ sub description {
               . ' ignore experimental tags that do not seem to make sense,'
               . ' though of course bug reports are always welcome.');
     }
+    if ($severity eq 'classification') {
+        push(@text,
+            '',
+            'This tag intended as a classification'
+              . '  and is <i>not</i> an issue in the package.');
+    }
 
     # Format and return the output.
     if ($format eq 'text') {
diff --git a/lib/Lintian/Tags.pm b/lib/Lintian/Tags.pm
index b417556..bc24c5d 100644
--- a/lib/Lintian/Tags.pm
+++ b/lib/Lintian/Tags.pm
@@ -42,7 +42,8 @@ BEGIN {
 our $GLOBAL;
 
 # Ordered lists of severities and certainties, used for display level parsing.
-our @SEVERITIES  = qw(pedantic wishlist minor normal important serious);
+our @SEVERITIES
+  = qw(classification pedantic wishlist minor normal important serious);
 our @CERTAINTIES = qw(wild-guess possible certain);
 
 =head1 NAME
@@ -146,6 +147,8 @@ sub new {
     my $self = {
         current           => undef,
         display_level     => {
+            classification =>
+              { 'wild-guess' => 0, possible => 0, certain => 0 },
             wishlist  => { 'wild-guess' => 0, possible => 0, certain => 0 },
             minor     => { 'wild-guess' => 0, possible => 0, certain => 1 },
             normal    => { 'wild-guess' => 0, possible => 1, certain => 1 },
-- 
2.7.0

From 80640e970aee57c5f8a8f69e3387aa7f1bf20e87 Mon Sep 17 00:00:00 2001
From: Niels Thykier <niels@thykier.net>
Date: Sun, 6 Mar 2016 18:32:18 +0000
Subject: [PATCH 2/3] c/debhelper: Attempt to classify build system

Signed-off-by: Niels Thykier <niels@thykier.net>
---
 checks/debhelper.desc                |  6 ++++++
 checks/debhelper.pm                  | 18 ++++++++++++++++--
 reporting/templates/lintian.css.tmpl | 10 ++++++++++
 t/tests/debhelper-compat-old/desc    |  3 ++-
 t/tests/debhelper-compat-old/tags    |  1 +
 5 files changed, 35 insertions(+), 3 deletions(-)

diff --git a/checks/debhelper.desc b/checks/debhelper.desc
index 92d1d66..78711b5 100644
--- a/checks/debhelper.desc
+++ b/checks/debhelper.desc
@@ -371,3 +371,9 @@ Info: The package uses one (or more) of the obsolete dh parameters
  Please refer to the debhelper documentation for more information.
 Ref: https://lists.debian.org/debian-devel-changes/2011/08/msg00519.html,
  debhelper(7)
+
+Tag: classification-of-debian-build-system
+Severity: classification
+Certainty: certain
+Info: This is the build system that Lintian believes the package is
+ using.
diff --git a/checks/debhelper.pm b/checks/debhelper.pm
index d3fb3c5..3dcec3e 100644
--- a/checks/debhelper.pm
+++ b/checks/debhelper.pm
@@ -65,8 +65,7 @@ sub run {
     my $dhcompatvalue;
     my $inclcdbs = 0;
 
-    my $bdepends_noarch;
-    my $bdepends;
+    my ($bdepends_noarch, $bdepends, %build_systems);
     my $seen_dh = 0;
     my $seen_python_helper = 0;
     my $seen_python3_helper = 0;
@@ -89,6 +88,8 @@ sub run {
 
         if (m/^\s+-?(dh_\S+)/) {
             my $dhcommand = $1;
+            $build_systems{'debhelper'} = 1
+              if not exists($build_systems{'dh'});
 
             if ($dhcommand eq 'dh_undocumented') {
                 tag 'dh_undocumented-is-obsolete', "line $.";
@@ -138,6 +139,8 @@ sub run {
             $seencommand = 1;
             $needbuilddepends = 1;
         } elsif (m,^\s+dh\s+,) {
+            $build_systems{'dh'} = 1;
+            delete($build_systems{'debhelper'});
             $seen_dh = 1;
             $seencommand = 1;
             $needbuilddepends = 1;
@@ -170,6 +173,8 @@ sub run {
                 $seen_python_helper = -1; # maybe; we'll check that later
             }
         } elsif (m,^include\s+/usr/share/cdbs/1/rules/debhelper.mk,) {
+            $build_systems{'cdbs-with-debhelper.mk'} = 1;
+            delete($build_systems{'cdbs-without-debhelper.mk'});
             $seencommand = 1;
             $needbuilddepends = 1;
             $needtomodifyscripts = 1;
@@ -192,6 +197,8 @@ sub run {
         } elsif (m,^include\s+/usr/share/cdbs/,
             or m,^include\s+/usr/share/R/debian/r-cran.mk,o) {
             $inclcdbs = 1;
+            $build_systems{'cdbs-without-debhelper.mk'} = 1
+              if not exists($build_systems{'cdbs-with-debhelper.mk'});
         }
     }
     close($rules_fd);
@@ -202,6 +209,13 @@ sub run {
         tag 'unused-build-dependency-on-cdbs' if ($bdepends->implies('cdbs'));
     }
 
+    if (%build_systems) {
+        my @systems = sort(keys(%build_systems));
+        tag 'classification-of-debian-build-system', join(', ', @systems);
+    } else {
+        tag 'classification-of-debian-build-system', 'other';
+    }
+
     return unless $seencommand;
 
     my @pkgs = $info->binaries;
diff --git a/reporting/templates/lintian.css.tmpl b/reporting/templates/lintian.css.tmpl
index 8cd6af9..f6de64c 100644
--- a/reporting/templates/lintian.css.tmpl
+++ b/reporting/templates/lintian.css.tmpl
@@ -369,6 +369,11 @@ span.type-P {
     background-color: #C7EA3C;
 }
 
+span.type-C {
+    color: #111;
+    background-color: blue;
+}
+
 li.type-O {
     color: #444;
 }
@@ -404,6 +409,11 @@ blockquote.type-P {
     border: 1px solid #C7EA3C;
 }
 
+blockquote.type-C {
+    background-color: #DFA;
+    border: 1px solid #C7EA3C;
+}
+
 
 /*
  * 5. Footer
diff --git a/t/tests/debhelper-compat-old/desc b/t/tests/debhelper-compat-old/desc
index 562d890..0b47203 100644
--- a/t/tests/debhelper-compat-old/desc
+++ b/t/tests/debhelper-compat-old/desc
@@ -3,7 +3,8 @@ Sequence: 6000
 Version: 1.0
 Description: Test for old debian/compat file
 Skeleton: pedantic
-Options: --pedantic -I -E
+Options: --pedantic -I -E -L +classification
 Test-Depends: debhelper (>= 9),
 Test-For:
  package-uses-old-debhelper-compat-version
+ classification-of-debian-build-system
diff --git a/t/tests/debhelper-compat-old/tags b/t/tests/debhelper-compat-old/tags
index a1195ab..82a1f80 100644
--- a/t/tests/debhelper-compat-old/tags
+++ b/t/tests/debhelper-compat-old/tags
@@ -1 +1,2 @@
+C: debhelper-compat-old source: classification-of-debian-build-system dh
 P: debhelper-compat-old source: package-uses-old-debhelper-compat-version 8
-- 
2.7.0

From b7a92c5ad5a331a770d1a26b43216cea402951e4 Mon Sep 17 00:00:00 2001
From: Niels Thykier <niels@thykier.net>
Date: Sun, 6 Mar 2016 18:52:22 +0000
Subject: [PATCH 3/3] c/d-src-dir: Classify the declared source format

---
 checks/debian-source-dir.desc                  | 5 +++++
 checks/debian-source-dir.pm                    | 1 +
 t/tests/debian-source-dir-classifications/desc | 6 ++++++
 t/tests/debian-source-dir-classifications/tags | 1 +
 4 files changed, 13 insertions(+)
 create mode 100644 t/tests/debian-source-dir-classifications/desc
 create mode 100644 t/tests/debian-source-dir-classifications/tags

diff --git a/checks/debian-source-dir.desc b/checks/debian-source-dir.desc
index 0a94b2d..721a5a5 100644
--- a/checks/debian-source-dir.desc
+++ b/checks/debian-source-dir.desc
@@ -63,3 +63,8 @@ Info: The source package contains non-empty debian/source/git-patches,
  with a misconfigured gitpkg) and without manually exporting the patches.
  See the above mentioned hook file (in /usr/share/gitpkg/hooks) for
  information on how to manually export patches.
+
+Tag: declared-source-format
+Severity: classification
+Certainty: certain
+Info: This is the source format declared in the package.
diff --git a/checks/debian-source-dir.pm b/checks/debian-source-dir.pm
index c9518ce..6257914 100644
--- a/checks/debian-source-dir.pm
+++ b/checks/debian-source-dir.pm
@@ -46,6 +46,7 @@ sub run {
         chomp $format;
         close($fd);
         tag 'unknown-source-format', $format unless $KNOWN_FORMATS{$format};
+        tag 'declared-source-format', $format;
     } else {
         tag 'missing-debian-source-format';
     }
diff --git a/t/tests/debian-source-dir-classifications/desc b/t/tests/debian-source-dir-classifications/desc
new file mode 100644
index 0000000..a82336f
--- /dev/null
+++ b/t/tests/debian-source-dir-classifications/desc
@@ -0,0 +1,6 @@
+Testname: debian-source-dir-classifications
+Sequence: 6000
+Version: 1.0
+Options: -L +classification -C debian-source-dir
+Description: Test for d-s-d classifications tags
+Test-For: declared-source-format
diff --git a/t/tests/debian-source-dir-classifications/tags b/t/tests/debian-source-dir-classifications/tags
new file mode 100644
index 0000000..0008e30
--- /dev/null
+++ b/t/tests/debian-source-dir-classifications/tags
@@ -0,0 +1 @@
+C: debian-source-dir-classifications source: declared-source-format 1.0
-- 
2.7.0

Attachment: signature.asc
Description: OpenPGP digital signature


Reply to: