#!/usr/bin/perl -w

# Copyright (C) 2011 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.
#
# THIS SOFTWARE IS PROVIDED BY APPLE INC. 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 INC. 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.

use strict;
use FindBin;
use File::Temp qw(tempfile);
use lib $FindBin::Bin;
use webkitdirs;

my $inputPath = "";
if ($ARGV[0]) {
    $inputPath = $ARGV[0]
} else {
    # Create a temporary file for STDIN.
    # FIXME: We can probably avoid putting this on the disk by directly piping
    # to prettify.rb via IPC::Open2.
    my $inputTempFileHandle;
    ($inputTempFileHandle, $inputPath) = tempfile(
        "inputtemp-XXXXXXXX",
        DIR => File::Spec->tmpdir(),
        SUFFIX => ".diff",
        UNLINK => 0,
    );

    while (<STDIN>) {
        print $inputTempFileHandle $_;
    }

    close($inputTempFileHandle);
}

# Create a temporary file for prettified patch.
my ($prettydiffFileHandle, $prettydiffPath) = tempfile(
    "prettydiff-XXXXXXXX",
    DIR => File::Spec->tmpdir(),
    SUFFIX => ".html",
    UNLINK => 0,
);
close($prettydiffFileHandle);

my $prettyPatchDir = sourceDir() . "/Tools/Scripts/webkitruby/PrettyPatch/";
my $prettyPatchTool = sourceDir() . "/Tools/Scripts/webkitruby/PrettyPatch/prettify.rb";

my $pathToPrettify = "ruby -I " . sourceDir() . "/Tools/Scripts/webkitruby/PrettyPatch/ " . sourceDir() . "/Tools/Scripts/webkitruby/PrettyPatch/prettify.rb";
system "$pathToPrettify " . quotemeta($inputPath) . " > $prettydiffPath";

if (isAppleMacWebKit()) {
    system "open", $prettydiffPath;
} elsif (isCygwin()) {
    system "cygstart",$prettydiffPath;
} elsif (isWindows()) {
    system "start", $prettydiffPath;
} elsif (isLinux() && `which xdg-open`) {
    system "xdg-open", $prettydiffPath;
} else {
    print "Created prettified diff at " . $prettydiffPath . ".";
}
