| #!/bin/bash |
| |
| # This script will sync github.com/llvm/llvm-project with |
| # github.com/llvm/llvm-project-release-prs and try to merge |
| # the changes in the release branch. |
| |
| set -e |
| set -x |
| |
| # We should always get the branch from the environment. |
| # But otherwise just default to something. We can probably |
| # have a better default here? |
| RELEASE_BRANCH="${RELEASE_BRANCH:-release/16.x}" |
| |
| # We will add two remotes here: |
| # main - which will point to the main llvm-project repo |
| # release - which will point to the release-prs repo |
| # The remotes will use random strings to avoid |
| # collisions |
| MAIN_REMOTE=$(uuidgen) |
| RELEASE_REMOTE=$(uuidgen) |
| CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD) |
| |
| git remote add $MAIN_REMOTE "https://github.com/llvm/llvm-project" |
| git remote add $RELEASE_REMOTE "https://github.com/llvm/llvm-project-release-prs" |
| |
| # Make sure we are up to date on all our repos first |
| git fetch $MAIN_REMOTE |
| git fetch $RELEASE_REMOTE |
| |
| # Create our sync branch. Starting with the main |
| # repo first since it's important to get those |
| # changes |
| MERGE_BRANCH=$(uuidgen) |
| git switch -c $MERGE_BRANCH $MAIN_REMOTE/$RELEASE_BRANCH |
| |
| # Merge changes from the release repo |
| git merge --ff-only $RELEASE_REMOTE/$RELEASE_BRANCH |
| |
| if ! git diff-index --quiet $MAIN_REMOTE/$RELEASE_BRANCH; then |
| echo "Changes in the release remote - pushing to main remote" |
| git push $MAIN_REMOTE $MERGE_BRANCH:$RELEASE_BRANCH |
| fi |
| |
| # Before we merge back into the release repo |
| # let's update to make sure nothing has been |
| # pushed to either repo while we do this work. |
| # Most of the time this won't do anything, and |
| # the real solution would instead be to fetch |
| # in a loop if pushing fails. But that's a very |
| # tiny edge-case, so let's not complicate this. |
| git fetch $MAIN_REMOTE |
| git fetch $RELEASE_REMOTE |
| |
| # And merge all the new data to the current branch |
| git merge --ff-only $MAIN_REMOTE/$RELEASE_BRANCH |
| |
| # If anything changed let's merge it |
| if ! git diff-index --quiet $RELEASE_REMOTE/$RELEASE_BRANCH; then |
| echo "Changes in main - pushing to release" |
| git push $RELEASE_REMOTE $MERGE_BRANCH:$RELEASE_BRANCH |
| fi |
| |
| # Cleanup - enable for debug |
| if false; then |
| git remote remove $RELEASE_REMOTE |
| git remote remove $MAIN_REMOTE |
| |
| git switch $CURRENT_BRANCH |
| git branch -D $MERGE_BRANCH |
| fi |