#!/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 warnings;

use File::Basename;
use File::Temp ();
use Getopt::Long;
use POSIX;
use IPC::Open2;

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

my $defaultReviewer = "NOBODY";

sub addReviewer(\%);
sub addReviewerToChangeLog($$$);
sub addReviewerToCommitMessage($$$);
sub changeLogsForCommit($);
sub checkout($);
sub cherryPick(\%);
sub commit(;$);
sub getConfigValue($);
sub fail(;$);
sub head();
sub interactive();
sub isAncestor($$);
sub nonInteractive();
sub rebaseOntoHead($$);
sub requireCleanWorkTree();
sub resetToCommit($);
sub toCommit($);
sub usage();
sub writeCommitMessageToFile($);


my $interactive = 0;
my $showHelp = 0;
my $rubberStamp = 0;

my $programName = basename($0);
my $usage = <<EOF;
Usage: $programName -i|--interactive upstream
       $programName commit-ish reviewer

Adds a reviewer to a git commit in a repository with WebKit-style commit logs
and ChangeLogs.

When run in interactive mode, `upstream` specifies the commit after which
reviewers should be added.

When run in non-interactive mode, `commit-ish` specifies the commit to which
the `reviewer` will be added.

Options:
  -h|--help          Display this message
  -i|--interactive   Interactive mode
  -s|--rubber-stamp  Change `Reviewed by` to `Rubber-stamped by`
EOF

my $getOptionsResult = GetOptions(
    'h|help' => \$showHelp,
    'i|interactive' => \$interactive,
    's|rubber-stamp' => \$rubberStamp,
);

my $gitDirectory = gitDirectory();

usage() if !$getOptionsResult || $showHelp;

requireCleanWorkTree();
$interactive ? interactive() : nonInteractive();
exit;

sub interactive()
{
    @ARGV == 1 or usage();

    my $upstream = toCommit($ARGV[0]);
    my $head = head();

    isAncestor($upstream, $head) or die "$ARGV[0] is not an ancestor of HEAD.";

    my @revlist = runCommandWithOutput('git', 'rev-list', '--reverse', '--pretty=oneline', "$upstream..");
    @revlist or die "Couldn't determine revisions";

    my $tempFile = new File::Temp(UNLINK => 1);
    foreach my $line (@revlist) {
        print $tempFile "$defaultReviewer : $line";
    }

    print $tempFile <<EOF;

# Change 'NOBODY' to the reviewer for each commit
#
# If any line starts with "rs" followed by one or more spaces, then the phrase
# "Reviewed by" is changed to "Rubber-stamped by" in the ChangeLog(s)/commit
# message for that commit.
#
# Commits may be reordered
# Omitted commits will be lost
EOF

    close $tempFile;

    my $editor = $ENV{GIT_EDITOR} || getConfigValue("core.editor") || $ENV{VISUAL} || $ENV{EDITOR} || "vi";
    my $result = system "$editor \"" . $tempFile->filename . "\"";
    !($result >> 8) or die "Error spawning editor.";

    my @todo = ();
    open TEMPFILE, '<', $tempFile->filename or die "Error opening temp file.";
    foreach my $line (<TEMPFILE>) {
        next if $line =~ /^#/;
        $line =~ /^(rs\s+)?(.*)\s+:\s+([0-9a-fA-F]+)/ or next;
        push @todo, {rubberstamp => defined $1 && length $1, reviewer => $2, commit => $3};
    }
    close TEMPFILE;
    @todo or die "No revisions specified.";

    foreach my $item (@todo) {
        $item->{changeLogs} = changeLogsForCommit($item->{commit});
    }

    $result = system "git", "checkout", $upstream;
    !($result >> 8) or die "Error checking out $ARGV[0].";

    my $success = 1;
    foreach my $item (@todo) {
        $success = cherryPick(%{$item});
        $success or last;
        $success = addReviewer(%{$item});
        $success or last;
        $success = commit();
        $success or last;
    }

    unless ($success) {
        resetToCommit($head);
        exit 1;
    }

    $result = system "git", "branch", "-f", $head;
    !($result >> 8) or die "Error updating $head.";
    $result = system "git", "checkout", $head;
    exit WEXITSTATUS($result >> 8);
}

sub nonInteractive()
{
    @ARGV == 2 or usage();

    my $commit = toCommit($ARGV[0]);
    my $reviewer = $ARGV[1];
    my $head = head();
    my $headCommit = toCommit($head);

    isAncestor($commit, $head) or die "$ARGV[0] is not an ancestor of HEAD.";
    chomp($reviewer);

    my %item = (
        reviewer => $reviewer,
        rubberstamp => $rubberStamp,
        commit => $commit,
    );

    $item{changeLogs} = changeLogsForCommit($commit);
    $item{changeLogs} or die;

    unless ((($commit eq $headCommit) or checkout($commit))
            && writeCommitMessageToFile("$gitDirectory/MERGE_MSG")
            && addReviewer(%item)
            && commit(1)
            && (($commit eq $headCommit) or rebaseOntoHead($commit, $head))) {
        resetToCommit($head);
        exit 1;
    }
}

sub usage()
{
    print STDERR $usage;
    exit 1;
}

sub requireCleanWorkTree()
{
    my $result = system("git rev-parse --verify HEAD > /dev/null") >> 8;
    $result ||= system(qw(git update-index --refresh)) >> 8;
    $result ||= system(qw(git diff-files --quiet)) >> 8;
    $result ||= system(qw(git diff-index --cached --quiet HEAD --)) >> 8;
    !$result or die "Working tree is dirty"
}

sub fail(;$)
{
    my ($message) = @_;
    print STDERR $message, "\n" if defined $message;
    return 0;
}

sub cherryPick(\%)
{
    my ($item) = @_;

    my $result = system "git cherry-pick -n $item->{commit} > /dev/null";
    !($result >> 8) or return fail("Failed to cherry-pick $item->{commit}");

    return 1;
}

sub addReviewer(\%)
{
    my ($item) = @_;

    return 1 if $item->{reviewer} eq $defaultReviewer;

    foreach my $log (@{$item->{changeLogs}}) {
        addReviewerToChangeLog($item->{reviewer}, $item->{rubberstamp}, $log) or return fail();
    }

    addReviewerToCommitMessage($item->{reviewer}, $item->{rubberstamp}, "$gitDirectory/MERGE_MSG") or return fail();

    return 1;
}

sub commit(;$)
{
    my ($amend) = @_;

    my @command = qw(git commit -F);
    push @command, "$gitDirectory/MERGE_MSG";
    push @command, "--amend" if $amend;
    my $result = system @command;
    !($result >> 8) or return fail("Failed to commit revision");

    return 1;
}

sub addReviewerToChangeLog($$$)
{
    my ($reviewer, $rubberstamp, $log) = @_;

    return addReviewerToFile($reviewer, $rubberstamp, $log, 0);
}

sub addReviewerToCommitMessage($$$)
{
    my ($reviewer, $rubberstamp, $log) = @_;

    return addReviewerToFile($reviewer, $rubberstamp, $log, 1);
}

sub addReviewerToFile
{
    my ($reviewer, $rubberstamp, $log, $isCommitMessage) = @_;

    my $tempFile = new File::Temp(UNLINK => 1);

    open LOG, "<", $log or return fail("Couldn't open $log.");

    my $finished = 0;
    foreach my $line (<LOG>) {
        if (!$finished && $line =~ /NOBODY \(OOPS!\)/) {
            $line =~ s/NOBODY \(OOPS!\)/$reviewer/;
            $line =~ s/Reviewed/Rubber-stamped/ if $rubberstamp;
            $finished = 1 unless $isCommitMessage;
        }

        print $tempFile $line;
    }

    close $tempFile;
    close LOG or return fail("Couldn't close $log");

    my $result = system "mv", $tempFile->filename, $log;
    !($result >> 8) or return fail("Failed to rename $tempFile to $log");

    unless ($isCommitMessage) {
        my $result = system "git", "add", $log;
        !($result >> 8) or return fail("Failed to git add");
    }

    return 1;
}

sub head()
{
    my $head = runCommandWithOutput('git', 'symbolic-ref', 'HEAD');
    $head =~ /^refs\/heads\/(.*)$/ or die "Couldn't determine current branch.";
    $head = $1;

    return $head;
}

sub isAncestor($$)
{
    my ($ancestor, $descendant) = @_;

    chomp(my $mergeBase = runCommandWithOutput('git', 'merge-base', $ancestor, $descendant));
    return $mergeBase eq $ancestor;
}

sub toCommit($)
{
    my ($arg) = @_;

    chomp(my $commit = runCommandWithOutput('git', 'rev-parse', $arg));
    return $commit;
}

sub changeLogsForCommit($)
{
    my ($commit) = @_;

    my @files = runCommandWithOutput('git', 'diff', '-r', '--name-status', "$commit^", "$commit");
    @files or return fail("Couldn't determine changed files for $commit.");

    my @changeLogs = map { /^[ACMR]\s*(.*)/; makeFilePathRelative($1) } grep { /^[ACMR].*[^-]ChangeLog/ } @files;
    return \@changeLogs;
}

sub resetToCommit($)
{
    my ($commit) = @_;

    my $result = system "git", "checkout", "-f", $commit;
    !($result >> 8) or return fail("Error checking out $commit.");

    return 1;
}

sub writeCommitMessageToFile($)
{
    my ($file) = @_;

    open FILE, ">", $file or return fail("Couldn't open $file.");
    open MESSAGE, "-|", qw(git rev-list --max-count=1 --pretty=format:%B HEAD) or return fail("Error running git rev-list.");
    my $commitLine = <MESSAGE>;
    foreach my $line (<MESSAGE>) {
        print FILE $line;
    }
    close MESSAGE;
    close FILE or return fail("Couldn't close $file.");

    return 1;
}

sub rebaseOntoHead($$)
{
    my ($upstream, $branch) = @_;

    my $result = system qw(git rebase --onto HEAD), $upstream, $branch;
    !$result or return fail("Couldn't rebase.");

    return 1;
}

sub checkout($)
{
    my ($commit) = @_;

    my $result = system "git", "checkout", $commit;
    !$result or return fail("Error checking out $commit.");

    return 1;
}

sub getConfigValue($)
{
    my ($variable) = @_;

    chomp(my $value = runCommandWithOutput('git', 'config', '--get', $variable));

    return $value;
}

sub runCommandWithOutput {
    my ($output, $input);

    my $pid = open2($output, $input, @_);

    waitpid($pid, 0);

    return <$output>;
}
