#!/usr/bin/perl

# Copyright (C) 2007 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 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.

# This script updates WebKitTools/iExploder/htdocs/cssproperties.in based on
# WebCore/css/CSSPropertyNames.in.

use warnings;
use strict;

use FindBin;
use lib $FindBin::Bin;
use webkitdirs;

use File::Spec;

sub generateSectionFromCSSPropertyNamesFile();
sub readiExploderFile();
sub svnRevision($);
sub writeiExploderFile();

my $iExploderFile = File::Spec->catfile(sourceDir(), split("/", "WebKitTools/iExploder/htdocs/cssproperties.in"));
my $cssPropertyNamesFile = File::Spec->catfile(sourceDir(), split("/", "WebCore/css/CSSPropertyNames.in"));

my @sections = readiExploderFile();
$sections[0] = generateSectionFromCSSPropertyNamesFile();
writeiExploderFile();

print `svn stat $iExploderFile`;
print "Successfully updated!\n";

exit 0;

sub generateSectionFromCSSPropertyNamesFile()
{
    my $revision = svnRevision($cssPropertyNamesFile);
    my $path = File::Spec->abs2rel($cssPropertyNamesFile, sourceDir());
    my $result = "# From WebKit svn r" . $revision . " (" . $path . ")\n";

    my @properties = ();

    open(IN, $cssPropertyNamesFile) || die "$!";
    while (my $l = <IN>) {
        chomp $l;
        next if $l =~ m/^\s*#/ || $l =~ m/^\s*$/;
        push(@properties, $l);
    }
    close(IN);

    $result .= join("\n", sort { $a cmp $b } @properties) . "\n\n";

    return $result;
}

sub readiExploderFile()
{
    my @sections = ();
    local $/ = "\n\n";

    open(IN, $iExploderFile) || die "$!";
    @sections = <IN>;
    close(IN);

    return @sections;
}

sub svnRevision($)
{
    my ($file) = @_;
    my $revision = "";

    open INFO, "svn info '$file' |" or die;
    while (<INFO>) {
        if (/^Revision: (.+)/) {
            $revision = $1;
        }
    }
    close INFO;

    return $revision ? $revision : "UNKNOWN";
}

sub writeiExploderFile()
{
    open(OUT, "> $iExploderFile") || die "$!";
    print OUT join("", @sections);
    close(OUT);
}
