# infofiles -- lintian check script -*- perl -*- # Copyright (C) 1998 Christian Schwarz # Copyright (C) 2001 Josip Rodin # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, you can find it on the World Wide # Web at http://www.gnu.org/copyleft/gpl.html, or write to the Free # Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, # MA 02110-1301, USA. package Lintian::infofiles; use strict; use warnings; use Lintian::Tags qw(tag); use Util; use File::Basename qw(fileparse); sub run { my $pkg = shift; my $type = shift; my $info = shift; my $has_info_file; # Read package contents... foreach my $file (@{$info->sorted_index}) { my $index_info = $info->index->{$file}; my $file_info = $info->file_info->{$file}; my $link = $index_info->{link} || ''; my ($fname, $path) = fileparse($file); next unless ($index_info->{type} =~ m,^[\-lh],o) and ($path =~ m,^usr/share/info/, or $path =~ m,^usr/info/,); # Ignore dir files. That's a different error which we already catch in # the files check. next if $fname =~ /^dir(?:\.old)?(?:\.gz)?/; # Note that this package contains at least one info file. $has_info_file = 1; # Analyze the file names making sure the documents are named properly. # Note that Emacs 22 added support for images in info files, so we have to # accept those and ignore them. Just ignore .png files for now. my @fname_pieces = split /\./, $fname; my $ext = pop @fname_pieces; if ($ext eq 'gz') { # ok! if ($index_info->{type} =~ m,^[-h],o) { # compressed with maximum compression rate? if ($file_info !~ m/gzip compressed data/o) { tag 'info-document-not-compressed-with-gzip', $file; } else { if ($file_info !~ m/max compression/o) { tag 'info-document-not-compressed-with-max-compression', $file; } } } } elsif ($ext eq 'png') { next; } else { push (@fname_pieces, $ext); tag 'info-document-not-compressed', $file; } my $infoext = pop @fname_pieces; unless ($infoext && $infoext =~ /^info(-\d+)?$/) { # it's not foo.info unless (!@fname_pieces) { # it's not foo{,-{1,2,3,...}} tag 'info-document-has-wrong-extension', $file; } } # If this is the main info file (no numeric extension). make sure it has # appropriate dir entry information. if ($fname !~ /-\d+\.gz/ && $file_info =~ /gzip compressed data/) { my $pid = open INFO, '-|'; if (not defined $pid) { fail("cannot fork: $!"); } elsif ($pid == 0) { my $f = quotemeta($info->unpacked($file)); clean_env(1); $ENV{LC_ALL} = 'C'; exec "zcat $f 2>&1" or fail("cannot run zcat: $!"); } local $_; my ($section, $start, $end); while () { $section = 1 if /^INFO-DIR-SECTION\s+\S/; $start = 1 if /^START-INFO-DIR-ENTRY\b/; $end = 1 if /^END-INFO-DIR-ENTRY\b/; } close INFO; tag 'info-document-missing-dir-section', $file unless $section; tag 'info-document-missing-dir-entry', $file unless $start && $end; } } # If there's at least one info file in the package, the package should depend # on dpkg (>= 1.15.4) | install-info to ensure the dir file is properly # handled on partial upgrades. if ($has_info_file) { my $depends = $info->relation('depends'); unless ($depends->implies('dpkg (>= 1.15.4) | install-info')) { tag 'missing-dependency-on-install-info'; } } } 1; # Local Variables: # indent-tabs-mode: nil # cperl-indent-level: 4 # End: # vim: syntax=perl sw=4 sts=4 sr et