#!/usr/bin/env perl

# 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

}
