update-from-latest-olson   [plain text]


#!/usr/bin/perl -w

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 $ftp = Net::FTP->new( 'elsie.nci.nih.gov', Passive => 1 )
            or die "Cannot connect to elsie.nci.nih.gov: $@";
        $ftp->login()
            or die 'Cannot login: ', $ftp->message;
        $ftp->cwd('/pub')
            or die 'Cannot cwd to /pub: ', $ftp->message;

        for my $f ( $ftp->ls )
        {
            if ( $f =~ /^tz(?:code|data)/ )
            {
                print "Getting $f\n";
                $ftp->get($f);

                system( 'tar', 'xzf', $f );

                ($olson_version) = $f =~ /(\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: $!";
}