#!/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
    
    
    elif [ "$1" = "--regenerate-changes-diff-main" ] ; then
        rm -rf .git
        git init
        git remote add origin https://chromium.googlesource.com/angle/angle
        git fetch --depth 1 origin main
        git add -A
        regenerate_changes_diff origin/main
        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/main"
    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/main"
    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 main."
    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 main && 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 main 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/main -- 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 main.
git replace --graft "$LAST_ROLL_COMMIT_HASH" "$PREVIOUS_ANGLE_COMMIT_HASH"
# Rebase the WebKit commit history on top of ANGLE main.
git checkout -b rebased-webkit-changes

echo "Rebasing WebKit's local changes on latest ANGLE main."
if ! git rebase origin/main; 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
