#!/usr/bin/perl -w

# Copyright (C) 2005, 2006, 2007, 2008 Apple Inc. 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 Computer, 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.

# Update script for Web Kit Open Source Project.

use strict;
use FindBin;
use lib $FindBin::Bin;
use File::Basename;
use File::Spec;
use Getopt::Long;
use webkitdirs;

sub runSvnUpdate();

# Handle options
my $quiet = '';
my $showHelp;

my $getOptionsResult = GetOptions(
    'h|help'  => \$showHelp,
    'q|quiet' => \$quiet,
); 

if (!$getOptionsResult || $showHelp) {
    print STDERR <<__END__;
Usage: @{[ basename($0) ]} [options]
  -h|--help   show the help message
  -q|--quiet  pass -q to svn update for quiet updates
__END__
    exit 1;
}

my @svnOptions = ();
push @svnOptions, '-q' if $quiet;

chdirWebKit();
print "Updating OpenSource\n" unless $quiet;
runSvnUpdate();

if (-d "../Internal") {
    chdir("../Internal");
    print "Updating Internal\n" unless $quiet;
    runSvnUpdate();
} elsif (isCygwin()) {
    system("perl", "WebKitTools/Scripts/update-webkit-auxiliary-libs") == 0 or die;
}

exit 0;

sub runSvnUpdate()
{
    open UPDATE, "-|", "svn", "update", @svnOptions or die;
    my @conflictedChangeLogs;
    while (my $line = <UPDATE>) {
        print $line;
        push @conflictedChangeLogs, $1 if $line =~ m/^C\s+(.+)\s*$/ && basename($1) eq "ChangeLog";
    }
    close UPDATE;

    if (@conflictedChangeLogs) {
        print "Attempting to merge conflicted ChangeLogs.\n";
        my $resolveChangeLogsPath = File::Spec->catfile(dirname($0), "resolve-ChangeLogs");
        (system($resolveChangeLogsPath, "--no-warnings", @conflictedChangeLogs) == 0)
            or die "Could not open resolve-ChangeLogs script: $!.\n";
    }
}
