#!/usr/bin/perl use v5.10; use strict; use warnings; use experimental 'smartmatch'; use Tie::File; use Template; use LWP::UserAgent; use HTML::TreeBuilder; use List::Util qw(maxstr); use constant { ROOT => 'http://ftp.mozilla.org/pub/thunderbird/nightly/', }; sub _find_max { my ($tree, $filter) = @_; my @values = map { $_->as_text } $tree->find('a'); @values = grep { $_ ~~ $filter } @values if defined $filter; unless(@values) { say "No values can be extracted."; exit 1; } return maxstr @values; } sub _get_tree { my ($ua, $url) = @_; my $req = HTTP::Request->new(GET => $url); my $res = $ua->request($req); if ( $res->is_success ) { my $tree = HTML::TreeBuilder->new_from_content($res->content); return $tree; } else { say "Request $url is failed"; exit 2; } } sub _get_part { my ($ua, $uri, $filter) = @_; return _find_max(_get_tree($ua, $uri), $filter); } sub _get_data { my ($ua, $lang) = @_; $lang //= 'en-US'; my $uri = ROOT; my $is_num = qr/^\d+/; my $data = {}; my $year = _get_part($ua,$uri, $is_num); $uri .= $year; $year =~ s:/::; $data->{year} = $year; my $month = _get_part($ua, $uri, $is_num); $uri .= $month; $month =~ s:/::; $data->{month} = $month; say "RELEASE: $uri"; my $release = _get_part($ua, $uri, qr(comm-central/$)); $uri .= $release; $release =~ /^\d{4}-\d{2}-(?\d+)-(?\d+)-(?\d+)-(?\d+)/; $data = { %$data, %+ }; my $package_i686 = _get_part($ua, $uri, qr($lang.linux-i686.tar.bz2$)); my $package_i686_sums = _get_part($ua, $uri, qr($lang.linux-i686.checksums$)); $data->{sha512sums_i686} = _get_hashsum($ua, $uri . $package_i686_sums, $package_i686); my $package_x86_64 = _get_part($ua, $uri, qr($lang.linux-x86_64.tar.bz2$)); my $package_x86_64_sums = _get_part($ua, $uri, qr($lang.linux-x86_64.checksums$)); $data->{sha512sums_x86_64} = _get_hashsum($ua, $uri . $package_x86_64_sums, $package_x86_64); if ($package_x86_64 =~ /thunderbird-(\d+).(\d+\w+\d+)./) { $data->{version} = $1; $data->{alpha} = $2; } return $data; } sub _get_hashsum { my ($ua, $uri, $file) = @_; my $req = HTTP::Request->new(GET => $uri); my $res = $ua->request($req); if ( $res->is_success ) { $res->content =~ /(?[0-9a-f]+) sha512 [\d]+ $file/m; return $+{sum}; } } my $ua = LWP::UserAgent->new; my $data = _get_data($ua); my $t = Template->new(RELATIVE => 1); say "Generate PKGBUILD for version $data->{version}..."; $t->process('PKGBUILD.template', $data, 'PKGBUILD') || die $t->error();