| 1 | #!/usr/bin/env perl |
|---|
| 2 | |
|---|
| 3 | exit; |
|---|
| 4 | use strict; |
|---|
| 5 | use warnings; |
|---|
| 6 | |
|---|
| 7 | use FindBin; |
|---|
| 8 | use File::Path; |
|---|
| 9 | |
|---|
| 10 | refresh_specs(); |
|---|
| 11 | |
|---|
| 12 | sub refresh_specs { |
|---|
| 13 | my $BaseURI = 'http://svn.perl.org/perl6/doc/trunk/design/syn'; |
|---|
| 14 | my %Spec = qw( |
|---|
| 15 | 01 Overview 02 Syntax 03 Operator 04 Block |
|---|
| 16 | 05 Rule 06 Subroutine 09 Structure 10 Package |
|---|
| 17 | 11 Module 12 Object 13 Overload |
|---|
| 18 | ); |
|---|
| 19 | my $naming_rule = sub { "S$_[0].pod" }; |
|---|
| 20 | my $logfile = "$FindBin::Bin/.spec-revision"; |
|---|
| 21 | refresh_specs_from_source($BaseURI, \%Spec, $naming_rule, $logfile); |
|---|
| 22 | |
|---|
| 23 | my $PugsBaseURI = 'http://svn.pugscode.org/pugs/docs/Perl6/Spec'; |
|---|
| 24 | my %SpecInPugs = qw( |
|---|
| 25 | 17 Concurrency 22 CPAN 26 Documentation 29 Functions |
|---|
| 26 | ); |
|---|
| 27 | $naming_rule = sub { "$SpecInPugs{$_[0]}.pod" }; |
|---|
| 28 | $logfile = "$FindBin::Bin/.pugs-spec-revision"; |
|---|
| 29 | refresh_specs_from_source($PugsBaseURI, \%SpecInPugs, $naming_rule, |
|---|
| 30 | $logfile); |
|---|
| 31 | } |
|---|
| 32 | |
|---|
| 33 | sub refresh_specs_from_source { |
|---|
| 34 | my ($BaseURI, $Spec, $naming_rule, $logfile) = @_; |
|---|
| 35 | my %Spec = %$Spec; |
|---|
| 36 | |
|---|
| 37 | # okay, we are at author side - refresh Synopses |
|---|
| 38 | if (!eval { require LWP; require LWP::Simple; 1 }) { |
|---|
| 39 | warn "LWP or LWP::Simple not installed: $@\n"; |
|---|
| 40 | return; |
|---|
| 41 | } |
|---|
| 42 | |
|---|
| 43 | our $ua; |
|---|
| 44 | LWP::Simple->import('$ua'); |
|---|
| 45 | |
|---|
| 46 | local $| = 1; |
|---|
| 47 | print "==> Refreshing specs from $BaseURI...\n"; |
|---|
| 48 | $ua->timeout(10); |
|---|
| 49 | |
|---|
| 50 | my $request = HTTP::Request->new(HEAD => $BaseURI); |
|---|
| 51 | my $response = $ua->request($request); |
|---|
| 52 | |
|---|
| 53 | $response->is_success or return; |
|---|
| 54 | |
|---|
| 55 | $ua->timeout(60); |
|---|
| 56 | |
|---|
| 57 | my $etags = $response->header('ETag') or return; |
|---|
| 58 | ($etags =~ /(\d+)/) or return; |
|---|
| 59 | |
|---|
| 60 | my $remote_revision = $1; |
|---|
| 61 | my $local_revision = -1; |
|---|
| 62 | |
|---|
| 63 | if ( defined($logfile) and open(my $in, $logfile) ) { |
|---|
| 64 | chomp($local_revision = <$in>); |
|---|
| 65 | close $in; |
|---|
| 66 | } |
|---|
| 67 | |
|---|
| 68 | if ($local_revision == $remote_revision) { |
|---|
| 69 | print "==> No changes at $BaseURI.\n"; |
|---|
| 70 | return; |
|---|
| 71 | } |
|---|
| 72 | |
|---|
| 73 | print "==> Synchronizing to revision $remote_revision of $BaseURI:\n"; |
|---|
| 74 | |
|---|
| 75 | for my $num (sort keys %Spec) { |
|---|
| 76 | my $file = $Spec{$num}; |
|---|
| 77 | print " $num --> Spec/$file\n"; |
|---|
| 78 | my $remote_file = $naming_rule->($num); |
|---|
| 79 | LWP::Simple::mirror( |
|---|
| 80 | "$BaseURI/$remote_file" => "$FindBin::Bin/$file.pod" |
|---|
| 81 | ); |
|---|
| 82 | } |
|---|
| 83 | |
|---|
| 84 | if(defined($logfile)) { |
|---|
| 85 | open my $out, "> $logfile" or return; |
|---|
| 86 | print $out $remote_revision, "\n"; |
|---|
| 87 | close $out; |
|---|
| 88 | } |
|---|
| 89 | } |
|---|