#!/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: $!";
}