#!/bin/sh
set -e
cd "$(dirname "$0")/../../Source/ThirdParty/ANGLE"
ANGLE_DIR="$PWD"

regenerate_changes_diff() {
    echo "Regenerating changes.diff."
    # Exclude WebKit-added build files from the diff.
    git diff "$1" --cached -b --ignore-cr-at-eol -- . \
        ':(exclude)ChangeLog' \
        ':(exclude)ANGLE.plist' \
        ':(exclude)ANGLE.xcodeproj' \
        ':(exclude)Configurations' \
        ':(exclude)**CMakeLists.txt' \
        ':(exclude)*.cmake' \
        ':(exclude)adjust-angle-include-paths*' \
        ':(exclude)changes.diff' \
        ':(exclude)gni-to-cmake.py' \
        ':(exclude)src/angle_commit.h' \
        ':(exclude)Makefile' \
        ':(exclude)src/empty.cpp' \
        ':(exclude)third_party/zlib/google/compression_utils_portable*' \
        ':(exclude)**.DS_Store' \
        ':(exclude)update-angle.sh' \
        ':(exclude)WebKitBuild' \
        > changes.diff
}

if [ ! -z "$1" ] ; then
    if [ "$1" = "--regenerate-changes-diff" ] ; then
        echo "Regenerating Source/ThirdParty/ANGLE/changes.diff"
        PREVIOUS_ANGLE_COMMIT_HASH=$(grep -m 1 -o -E "[a-z0-9]{40}" ANGLE.plist)
        rm -rf .git
        git init
        git remote add origin https://chromium.googlesource.com/angle/angle
        git fetch --depth 1 origin "$PREVIOUS_ANGLE_COMMIT_HASH"
        git add -A
        regenerate_changes_diff "$PREVIOUS_ANGLE_COMMIT_HASH"
        rm -rf .git
        cat changes.diff
        echo
        echo "Success."
        exit 0
    fi
    echo "Unrecognized argument: $1"
    exit 1
fi

echo "This script helps you update the copy of ANGLE in Source/ThirdParty/ANGLE"
echo "with the latest changes from upstream, without clobbering WebKit's local"
echo "changes."
echo


if ! which git-filter-repo > /dev/null; then
    echo "Please install git-filter-repo from https://github.com/newren/git-filter-repo"
    echo "git-filter-repo is recommended by the git project itself as a better"
    echo "alternative to the built-in git filter-branch."
    exit 1
fi

in_rebase() {
    test -d .git && { test -d "$(git rev-parse --git-path rebase-merge)" || test -d "$(git rev-parse --git-path rebase-apply)"; } ;
}

wait_for_rebase_to_complete() {
    if ! in_rebase; then
        return 1
    fi
    echo
    echo "For patches that have been upstreamed, you should choose the 'ours' version,"
    echo "and the resulting commits after rebase should be mostly empty. For patches"
    echo "that haven't been upstreamed, resolve conflicts prioritizing 'theirs' when"
    echo "possible to preserve WebKit's changes."
    echo
    echo "The script will pause now. Please complete the rebase, then come back and"
    echo "press Enter to continue:"
    read -r
    while in_rebase && ! GIT_EDITOR=true git rebase --continue; do
        echo
        echo "Rebase still in progress. Complete the rebase and press Enter to continue:"
        read -r
    done
}

cleanup_after_successful_rebase_and_exit() {
    cd "$ANGLE_DIR"
    echo
    regenerate_changes_diff "origin/master"
    git --no-pager diff -b --cached "$LAST_ROLL_COMMIT_HASH" -- Compiler.cmake GLESv2.cmake
    echo
    echo "Rebase complete!"
    echo "Above are the changes to Compiler.cmake and GLESv2.cmake."
    echo "Now you'll need to apply the equivalent changes to the ANGLE XCode"
    echo "project and make sure it builds. Please examine changes.diff and"
    echo "undo any unintentional changes or unnecessary added files."
    echo "You can examine the rebased history in the temporary git repository in"
    echo "Source/ThirdParty/ANGLE to see where changes came from."
    echo
    echo "This script will pause now. Press Enter to continue when you're"
    echo "done. The script will regenerate changes.diff and delete the"
    echo "temporary git repository in Source/ThirdParty/ANGLE."
    echo
    echo "Press Enter to continue after fixing build:"
    read -r
    regenerate_changes_diff "origin/master"
    echo "Removing temporary git repository from Source/ThirdParty/ANGLE"
    rm -rf .git
    git add -A .
    echo
    echo "ANGLE update is now staged. Ready to commit and upload patch."
    exit 0
}

if wait_for_rebase_to_complete ; then
    cleanup_after_successful_rebase_and_exit
fi

if [ -n "$(git status -s .)" ] ; then
    git status -s .
    echo "Error: ANGLE directory Source/ThirdParty/ANGLE has local uncommitted"
    echo "changes. Please stash your changes first and start with a clean"
    echo "checkout of WebKit master."
    exit 1
fi

PREVIOUS_ANGLE_COMMIT_HASH=$(grep -m 1 -o -E "[a-z0-9]{40}" ANGLE.plist)

cd ../../..
echo "Creating WebKit branch that only contains ANGLE changes, using git-filter-repo."
echo "This may take a few minutes, but massively speeds up rebasing later."
git branch -f just-angle master && git-filter-repo --refs refs/heads/just-angle --path Source/ThirdParty/ANGLE --path-rename Source/ThirdParty/ANGLE/: --force
cd "$ANGLE_DIR"

echo "Downloading latest ANGLE via git clone."
# Remove all files including hidden ones, but not . or ..
rm -rf ..?* .[!.]* ./*
git clone --branch master https://chromium.googlesource.com/angle/angle .
echo "Successfully downloaded latest ANGLE."
echo "Commit hash: "
COMMIT_HASH=$(git rev-parse HEAD)
echo "$COMMIT_HASH"
echo ""

echo "Generating angle_commit.h"
./src/commit_id.py gen src/angle_commit.h.TEMP

echo "Applying WebKit's local ANGLE changes to the old ANGLE version."
echo "Fetching WebKit changes into ANGLE repo."
git remote add webkit ../../.. -t just-angle
git fetch webkit
git checkout just-angle

PREVIOUS_ANGLE_COMMIT_HASH=$(grep -m 1 -o -E "[a-z0-9]{40}" ANGLE.plist)
LAST_ROLL_COMMIT_HASH=$(git log --format="%H" -1 ANGLE.plist)

echo "Updating ANGLE.plist commit hashes."
sed -i.bak -e "s/\([^a-z0-9]\)[a-z0-9]\{40\}\([^a-z0-9]\)/\1$COMMIT_HASH\2/g" ANGLE.plist
echo "Updating ANGLE.plist date."
sed -i.bak -e "s/<string>[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]<\/string>/<string>$(date +%Y-%m-%d)<\/string>/g" ANGLE.plist
rm ANGLE.plist.bak

echo "Translating gni build files to cmake."
git checkout origin/master -- src/compiler.gni src/libGLESv2.gni src/libANGLE/renderer/d3d/BUILD.gn
./gni-to-cmake.py src/compiler.gni Compiler.cmake
./gni-to-cmake.py src/libGLESv2.gni GLESv2.cmake
./gni-to-cmake.py src/libANGLE/renderer/d3d/BUILD.gn D3D.cmake --prepend 'src/libANGLE/renderer/d3d/'
./gni-to-cmake.py src/libANGLE/renderer/gl/BUILD.gn GL.cmake --prepend 'src/libANGLE/renderer/gl/'
./gni-to-cmake.py src/libANGLE/renderer/metal/BUILD.gn Metal.cmake --prepend 'src/libANGLE/renderer/metal/'
git checkout src/compiler.gni src/libGLESv2.gni

echo "Moving angle_commit.h into place"
mv src/angle_commit.h.TEMP src/angle_commit.h

git add -A .
git commit -m "Updated ANGLE.plist, angle_commit.h and cmake files."

# Graft the WebKit commit history on top of the ANGLE commit history at
# the point of the last ANGLE roll. This will allow us to rebase just
# the WebKit changes since the last roll on top of ANGLE master.
git replace --graft "$LAST_ROLL_COMMIT_HASH" "$PREVIOUS_ANGLE_COMMIT_HASH"
# Rebase the WebKit commit history on top of ANGLE master.
git checkout -b rebased-webkit-changes

echo "Rebasing WebKit's local changes on latest ANGLE master."
if ! git rebase origin/master; then
    echo
    echo "There is now a temporary git repo in Source/ThirdParty/ANGLE with a"
    echo "rebase in progress. You must resolve the merge conflict and continue"
    echo "the rebase. Make sure to do this in the temporary"
    echo "Source/ThirdParty/ANGLE repo, not the main WebKit repo."
    wait_for_rebase_to_complete
fi
cleanup_after_successful_rebase_and_exit
