#! /usr/bin/perl
use 5.14.0;
use strict;
use warnings;
use File::Find;
use List::Util qw(max);
use Pod::Usage;

pod2usage() if not @ARGV;

my @files = do {
    my @r;
    find(sub {
	-f and /^log\./ or return;
	push @r, $File::Find::name;
    }, @ARGV);
    @r;
};


my %fail;
foreach my $file (@files) {
    my ($name, $platform) = $file =~ /out-?(.*?)\/log\.(.*)/;
    my ($os) = $platform =~ /(^.*?)-/;
    $_ = do { local @ARGV = $file; local $/ = undef; <> };
    s/
/\n/g;
    my ($version) = /^Exim version (\S+)/mi;
    my ($ssl) =
        /^Support for: .*\bGnuTLS/mi    ? 'GnuTLS'
      : /^Support for: .*\bOpenSSL\b/mi ? 'OpenSSL'
      :                                   'No SSL';

    $fail{$os}{$ssl}{$version} = {};

    foreach (/^\*{2}.*\/(\d+)\s+failed.*?=+/mg) {
        $fail{$os}{$ssl}{$version}{_failed}{$_} = 1;
        $fail{$os}{$ssl}{_failed}{$_} = 1;
    }
}

my $os_len = max map { length } keys %fail;
my $ssl_len = max map { length } map { keys %$_ } values %fail;
my $version_len =
  max map { length } map { keys %$_ } map { values %$_ } values %fail;

foreach my $os (sort keys %fail) {
    foreach my $ssl (sort keys %{ $fail{$os} }) {
        foreach my $version (grep { !/^_/ } sort keys %{ $fail{$os}{$ssl} }) {
            printf "%*s %*s %*s: ",
              -$os_len      => $os,
              -$ssl_len     => $ssl,
              -$version_len => $version;

            foreach my $failed (sort { $a <=> $b }
                keys %{ $fail{$os}{$ssl}{_failed} })
            {
                printf "%4s ",
                  $fail{$os}{$ssl}{$version}{_failed}{$failed} ? $failed : '-';
            }

            print "\n";
        }
        print "\n";
    }
}

__END__

=head1 NAME

 report - report differences of two or more exim testsuite runs

=head1 SYNOPSIS

 report DIR...

=head1 DESCRIPTION

B<report> shows the differences between to Exim testsuite runs. That is,
it compares the list of failed tests.

=cut
