| #!/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" --full-index --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' \ |
| ':(exclude)ChangeLog*' \ |
| ':(exclude)scripts/copy-frameworks-to-secondary-path.sh' \ |
| ':(exclude)third_party/r8/custom_d8.jar' \ |
| > 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 "Generating contents of commit message into commit-message.txt." |
| echo "Be sure to copy out this file's contents and delete it before committing." |
| echo "Update ANGLE to $(git log -1 ${COMMIT_HASH} --format=%cs) (${COMMIT_HASH}))" > commit-message.txt |
| echo "" >> commit-message.txt |
| echo "Contains upstream commits:" >> commit-message.txt |
| echo git log --oneline "$PREVIOUS_ANGLE_COMMIT_HASH".."$COMMIT_HASH" --pretty="%h %s" >> commit-message.txt |
| git log --oneline "$PREVIOUS_ANGLE_COMMIT_HASH".."$COMMIT_HASH" --pretty="%h %s" >> commit-message.txt |
| echo "Removing temporary git repository from Source/ThirdParty/ANGLE" |
| rm -rf .git |
| git add -A . |
| # Undo the addition of commit-message.txt to make it easier for the user to remove. |
| git restore --staged commit-message.txt |
| 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 |