Home | History | Annotate | Download | only in Scripts
      1 #!/usr/bin/perl -w
      2 
      3 # Copyright (C) 2005, 2006, 2007 Apple Computer, Inc.  All rights reserved.
      4 #
      5 # Redistribution and use in source and binary forms, with or without
      6 # modification, are permitted provided that the following conditions
      7 # are met:
      8 #
      9 # 1.  Redistributions of source code must retain the above copyright
     10 #     notice, this list of conditions and the following disclaimer. 
     11 # 2.  Redistributions in binary form must reproduce the above copyright
     12 #     notice, this list of conditions and the following disclaimer in the
     13 #     documentation and/or other materials provided with the distribution. 
     14 # 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
     15 #     its contributors may be used to endorse or promote products derived
     16 #     from this software without specific prior written permission. 
     17 #
     18 # THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
     19 # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     20 # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     21 # DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
     22 # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     23 # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     24 # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
     25 # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     26 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     27 # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     28 
     29 # Updates a development environment to the new WebKitAuxiliaryLibrary
     30 
     31 use strict;
     32 use warnings;
     33 
     34 use HTTP::Date qw(str2time);
     35 use File::Find;
     36 use File::Temp ();
     37 use File::Spec;
     38 use FindBin;
     39 use lib $FindBin::Bin;
     40 use webkitdirs;
     41 
     42 sub lastModifiedToUnixTime($);
     43 
     44 # Time in seconds that the new zip file must be newer than the old for us to
     45 # consider them to be different. If the difference in modification time is less
     46 # than this threshold, we assume that the files are the same. We need this
     47 # because the zip file is served from a set of mirrors with slightly different
     48 # Last-Modified times.
     49 my $newnessThreshold = 30;
     50 
     51 my $sourceDir = sourceDir();
     52 my $file = "WebKitAuxiliaryLibrary";
     53 my $zipFile = "$file.zip"; 
     54 my $auxiliaryLibsURL = "http://developer.apple.com/opensource/internet/$zipFile";
     55 my $webkitLibrariesDir = toUnixPath($ENV{'WEBKITLIBRARIESDIR'}) || "$sourceDir/WebKitLibraries/win";
     56 my $tmpDir = File::Spec->rel2abs(File::Temp::tempdir("webkitlibsXXXXXXX", TMPDIR => 1, CLEANUP => 1));
     57 
     58 print "Checking Last-Modified date of $zipFile...\n";
     59 
     60 my $result = system "curl -s -I $auxiliaryLibsURL | grep Last-Modified > \"$tmpDir/$file.headers\"";
     61 print STDERR "Couldn't check Last-Modified date of new $zipFile.\n" if $result;
     62 
     63 if (!$result && open NEW, "$tmpDir/$file.headers") {
     64     my $new = lastModifiedToUnixTime(<NEW>);
     65     close NEW;
     66 
     67     if (defined $new && open OLD, "$webkitLibrariesDir/$file.headers") {
     68         my $old = lastModifiedToUnixTime(<OLD>);
     69         close OLD;
     70         if (defined $old && abs($new - $old) < $newnessThreshold) {
     71             print "Current $file is up to date\n";
     72             exit 0;
     73         }
     74     }
     75 }
     76 
     77 print "Downloading $zipFile...\n\n";
     78 $result = system "curl -o \"$tmpDir/$zipFile\" $auxiliaryLibsURL";
     79 die "Couldn't download $zipFile!" if $result;
     80 
     81 $result = system "unzip", "-q", "-d", $tmpDir, "$tmpDir/$zipFile";
     82 die "Couldn't unzip $zipFile." if $result;
     83 
     84 print "\nInstalling $file...\n";
     85 
     86 sub wanted
     87 {
     88     my $relativeName = File::Spec->abs2rel($File::Find::name, "$tmpDir/$file/win");
     89     my $destination = "$webkitLibrariesDir/$relativeName";
     90 
     91     if (-d $_) {
     92         mkdir $destination;
     93         return;
     94     }
     95 
     96     system "cp", $_, $destination;
     97 }
     98 
     99 File::Find::find(\&wanted, "$tmpDir/$file");
    100 
    101 $result = system "mv", "$tmpDir/$file.headers", $webkitLibrariesDir;
    102 print STDERR "Couldn't move $file.headers to $webkitLibrariesDir" . ".\n" if $result;
    103 
    104 print "The $file has been sucessfully installed in\n $webkitLibrariesDir\n";
    105 exit;
    106 
    107 sub toUnixPath
    108 {
    109     my $path = shift;
    110     return unless $path;
    111     chomp($path = `cygpath -u '$path'`);
    112     return $path;
    113 }
    114 
    115 sub lastModifiedToUnixTime($)
    116 {
    117     my ($str) = @_;
    118 
    119     $str =~ /^Last-Modified: (.*)$/ or return;
    120     return str2time($1);
    121 }
    122