#!/usr/bin/perl -w

# Copyright (C) 2005, 2006, 2007 Apple Inc.  All rights reserved.
# Copyright (C) Research In Motion Limited 2010. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# 1.  Redistributions of source code must retain the above copyright
#     notice, this list of conditions and the following disclaimer. 
# 2.  Redistributions in binary form must reproduce the above copyright
#     notice, this list of conditions and the following disclaimer in the
#     documentation and/or other materials provided with the distribution. 
# 3.  Neither the name of Apple Inc. ("Apple") nor the names of
#     its contributors may be used to endorse or promote products derived
#     from this software without specific prior written permission. 
#
# THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

# Updates a development environment to the new WebKitSupportLibrary

use strict;
use warnings;

use Archive::Zip qw( :ERROR_CODES );
use File::Copy;
use File::Find;
use File::Temp ();
use File::Spec;
use FindBin;
use lib $FindBin::Bin;
use LWP::Simple;
use webkitdirs;

use constant NOTAVERSION => "-1";

my $sourceDir = sourceDir();
my $file = "WebKitSupportLibrary";
my $zipFile = "$file.zip"; 
my $zipDirectory = $ENV{'WEBKITSUPPORTLIBRARIESZIPDIR'} || $sourceDir;
my $pathToZip = File::Spec->catfile($zipDirectory, $zipFile);
my $webkitLibrariesDir = $ENV{'WEBKIT_LIBRARIES'} || File::Spec->catdir($sourceDir, "WebKitLibraries", "win");
my $versionFile = $file . "Version";
my $pathToVersionFile = File::Spec->catfile($webkitLibrariesDir, $versionFile);
my $tmpRelativeDir = File::Temp::tempdir("webkitlibsXXXXXXX", TMPDIR => 1, CLEANUP => 1);
my $tmpAbsDir = File::Spec->rel2abs($tmpRelativeDir);
my $versionFileURL = "https://developer.apple.com/opensource/internet/$versionFile";

my $extractedVersion = extractedVersion();

# Check whether the extracted library is up-to-date. If it is, we don't have anything to do.
my $expectedVersion = downloadExpectedVersionNumber();
if ($extractedVersion ne NOTAVERSION && $extractedVersion eq $expectedVersion) {
    print "$file is up-to-date.\n";
    exit;
}

# Check whether the downloaded library is up-to-date. If it isn't, the user needs to download it.
my $zipFileVersion = zipFileVersion();
dieAndInstructToDownload("$zipFile could not be found in $zipDirectory.") if $zipFileVersion eq NOTAVERSION;
dieAndInstructToDownload("$zipFile is out-of-date.") if $expectedVersion ne NOTAVERSION && $zipFileVersion ne $expectedVersion;
if ($zipFileVersion eq $extractedVersion) {
    print "Falling back to existing version of $file.\n";
    exit;
}

my $zip = Archive::Zip->new($pathToZip);
my $result = $zip->extractTree("", $tmpAbsDir);
die "Couldn't unzip $zipFile." if $result != AZ_OK;

print "\nInstalling $file...\n";

sub wanted
{
    my $relativeName = File::Spec->abs2rel($File::Find::name, File::Spec->catdir($tmpAbsDir, "$file", "win"));
    my $destination = File::Spec->catfile($webkitLibrariesDir, $relativeName);

    if (-d $_) {
        mkdir $destination;
        return;
    }

    copy($_, $destination);
}

File::Find::find(\&wanted, File::Spec->catfile($tmpAbsDir, $file));

print "The $file has been sucessfully installed in\n $webkitLibrariesDir\n";
exit;

sub extractedVersion
{
    if (open VERSION, "<", $pathToVersionFile) {
        chomp(my $extractedVersion = <VERSION>);
        close VERSION;
        return $extractedVersion;
    }
    return NOTAVERSION;
}

sub downloadExpectedVersionNumber
{
    chomp(my $expectedVersion = get($versionFileURL));
    return defined $expectedVersion ? $expectedVersion : NOTAVERSION;
}

sub zipFileVersion
{
    return NOTAVERSION unless -f $pathToZip;
    my $zip = Archive::Zip->new($pathToZip);
    chomp(my $zipFileVersion = $zip->contents("$file/win/$versionFile"));
    return $zipFileVersion;
}

sub dieAndInstructToDownload
{
    my $message = shift;

    die <<EOF;

===============================================================================
$message
Please download $zipFile from:

    https://developer.apple.com/opensource/internet/webkit_sptlib_agree.html

and place it in:

    $sourceDir

Then run build-webkit again.
===============================================================================

EOF

}
