# 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 Lintian::Util qw(clean_env fail);

use File::Basename qw(fileparse);

sub run {

my $pkg = shift;
my $type = shift;
my $info = shift;

# 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->is_symlink or $index_info->is_file)
            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)?/;

    # 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->is_file) { # 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 (<INFO>) {
            $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;
    }
}

}

1;

# Local Variables:
# indent-tabs-mode: nil
# cperl-indent-level: 4
# End:
# vim: syntax=perl sw=4 sts=4 sr et
