# 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 lib "$ENV{'LINTIAN_ROOT'}/checks/";
use common_data;

use Tags;
use Util;
use File::Basename qw(fileparse);

sub run {

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

my %missing_section;
my $has_info_file;

# Read package contents...
foreach my $file (sort keys %{$info->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 %newenv = (LANG => 'C', PATH => $ENV{PATH});
	    undef %ENV;
	    %ENV = %newenv;
	    exec "zcat \Qunpacked/$file\E 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;
    }
}

# 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: t
# cperl-indent-level: 4
# End:
# vim: syntax=perl sw=4 ts=8
