| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
 100
 101
 102
 103
 104
 105
 
 | #!/usr/bin/env perl
use strict;
use warnings;
use File::chdir;
use File::Temp ();
use Getopt::Long;
use Net::FTP;
my %opts = (
    download => 1,
    dir      => undef,
);
GetOptions(
    'download!' => \$opts{download},
    'dir:s'     => \$opts{dir},
);
my $olson_version;
my $dir = $opts{dir} ? $opts{dir} : File::Temp::tempdir( CLEANUP => 1 );
{
    local $CWD = $dir;
    if ( $opts{download} ) {
        my $host = 'ftp.iana.org';
        my $ftp = Net::FTP->new( $host, Passive => 1 )
            or die "Cannot connect to $host: $@";
        $ftp->login()
            or die 'Cannot login: ', $ftp->message;
        my $dir = '/tz/releases';
        $ftp->cwd($dir)
            or die "Cannot cwd to $dir: ", $ftp->message;
        my @code;
        my @data;
        for my $file ( $ftp->ls() ) {
            next unless $file =~ /tz(code|data)(\d+)(\w+)\.tar\.gz/;
            if ( $1 eq 'code' ) {
                push @code, [ $file, $2, $3 ];
            }
            else {
                push @data, [ $file, $2, $3 ];
            }
        }
        my $data
            = ( sort { $b->[1] <=> $a->[1] or $b->[2] cmp $a->[2] } @data )[0]
            ->[0];
        my $code
            = ( sort { $b->[1] <=> $a->[1] or $b->[2] cmp $a->[2] } @code )[0]
            ->[0];
        $ftp->binary();
        for my $file ( $code, $data ) {
            print "Getting $file\n";
            $ftp->get($file)
                or die "Cannot fetch $file: ", $ftp->message;
            system( 'tar', 'xzf', $file );
            ($olson_version) = $file =~ /(\d\d\d\d\w)/;
            die "Did not retrieve anything from elsie"
                unless $olson_version;
        }
    }
    else {
        $dir =~ s{/$}{};
        ($olson_version) = $dir =~ m{/([^/]+)$};
    }
    system('make')
        and die "Cannot run make: $!";
    for my $f (
        qw( africa antarctica asia australasia
        europe northamerica pacificnew
        southamerica backward
        )
        ) {
        system( 'sudo', './zic', '-d', '/usr/share/zoneinfo', $f )
            and die "Cannot run zic on $f";
    }
}
{
    system(
        './tools/parse_olson',
        '--clean',
        '--version', $olson_version,
        '--dir',     $dir,
    ) and die "Cannot run parse_olson: $!";
    print "Generating tests from zdump\n";
    system('./tools/tests_from_zdump')
        and die "Cannot run tests_from_zdump: $!";
}
 |