Package: lintian
Version: 2.3.3
Severity: wishlist
Tags: patch

As announced in [1], I prepared a patch implementing a new tag called
empty-binary-package, which tries to catch empty binary packages which
are not meta-packages or transitional packages.

I also provided a patch for devref [2] asking to document transitional
or meta-package status in long description.

[1] http://lists.debian.org/debian-lint-maint/2010/02/msg00026.html
[2] http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=569219


-- System Information:
Debian Release: squeeze/sid
  APT prefers unstable
  APT policy: (500, 'unstable'), (1, 'experimental')
Architecture: i386 (i686)

Kernel: Linux 2.6.32-trunk-486
Locale: LANG=it_IT.UTF-8, LC_CTYPE=it_IT.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash

Versions of packages lintian depends on:
ii  binutils               2.20-6            The GNU assembler, linker and bina
ii  diffstat               1.47-1            produces graph of changes introduc
ii  dpkg-dev               1.15.5.6          Debian package development tools
ii  file                   5.04-1            Determines file type using "magic"
ii  gettext                0.17-8            GNU Internationalization utilities
ii  intltool-debian        0.35.0+20060710.1 Help i18n of RFC822 compliant conf
ii  libapt-pkg-perl        0.1.24            Perl interface to libapt-pkg
ii  libclass-accessor-perl 0.34-1            Perl module that automatically gen
ii  libipc-run-perl        0.84-1            Perl module for running processes
ii  libparse-debianchangel 1.1.1-2           parse Debian changelogs and output
ii  libtimedate-perl       1.2000-1          collection of modules to manipulat
ii  liburi-perl            1.52-1            module to manipulate and access UR
ii  locales                2.10.2-5          Embedded GNU C Library: National L
ii  man-db                 2.5.6-5           on-line manual pager
ii  perl [libdigest-sha-pe 5.10.1-11         Larry Wall's Practical Extraction 

lintian recommends no packages.

Versions of packages lintian suggests:
pn  binutils-multiarch            <none>     (no description available)
pn  libtext-template-perl         <none>     (no description available)
ii  man-db                        2.5.6-5    on-line manual pager

-- no debconf information
diff --git a/checks/files b/checks/files
index cb1171b..106a243 100644
--- a/checks/files
+++ b/checks/files
@@ -21,6 +21,7 @@
 package Lintian::files;
 use strict;
 use Util;
+use File::Basename;
 use Lintian::Data;
 use Lintian::Tags qw(tag);
 
@@ -117,6 +118,30 @@ our @flash_nonfree = (
 #    qr,(?i)xspf_jukebox\.swf$,
 );
 
+# List of entries to identify metapackages
+our @metapkg_match = (
+    "metapackage",
+    "meta package",
+    "meta-package",
+    "dummy",
+    "dependency package",
+    "empty package",
+    "virtual package"
+);
+
+# List of common files stored in /usr/share/doc/$pkg
+our @doc_files = (
+    "AUTHORS.gz",
+    "NEWS.gz",
+    "README.gz",
+    "COPYING.gz",
+    "HACKING.gz",
+    "TODO.gz",
+    "copyright.gz",
+    "changelog.gz",
+    "changelog.Debian.gz"
+);
+
 sub run {
 
 my $pkg = shift;
@@ -168,6 +193,43 @@ my @devhelp_links;
 # seen files.
 my %x11_font_dirs;
 
+# Check if package is empty
+my $valid_empty = 0;
+foreach (@metapkg_match) {
+    if ($info->field('description') =~ m,($_),) {
+        $valid_empty = 1;
+        last;
+    }
+}
+if ($valid_empty == 0) {
+    foreach my $file (sort keys %{$info->index}) {
+        # Ignore directories
+        unless ($file =~ m,/$,) {
+            # Skip if $file is an empty string
+            next if not $file;
+            # Skip if $file is outside /usr/share/doc/$pkg directory
+            if ($file !~ m,usr/share/doc/($pkg),) {
+                $valid_empty = 0;
+                last;
+            }
+            # Skip if /usr/share/doc/$pkg has files in a subdirectory
+            if ($file =~ m,usr/share/doc/($pkg)/.*/,) {
+                $valid_empty = 0;
+                last;
+            }
+            # Check if files is one of those usually stored in /usr/share/doc/$pkg
+            my $bfile = basename($file);
+            unless (grep (/($bfile)/i, @doc_files)) {
+                $valid_empty = 0;
+                last;
+            }
+            # If everything fails, mark package as candidate to be empty
+            $valid_empty = 1;
+        }
+    }
+    tag 'empty-binary-package' if ($valid_empty);
+}
+
 # Read package contents...
 foreach my $file (sort keys %{$info->index}) {
     next if $file eq "";
diff --git a/checks/files.desc b/checks/files.desc
index 634268f..ad65645 100644
--- a/checks/files.desc
+++ b/checks/files.desc
@@ -1132,3 +1132,12 @@ Info: This package contains a directory under <tt>/lib</tt> or
  binary package's architecture.  This is very likely to be a mistake
  when indicating the underlying build system where the files should be
  installed.
+
+Tag: empty-binary-package
+Severity: serious
+Certainty: wild-guess
+Info: This binary package appears to be empty, and its description
+ does not mention it is neither meta package or transitional package.
+ .
+ You should check if package is deliberately empty, and then state
+ so in package description, or fix it to provide missing files.

Reply via email to