diff --git a/llvm/utils/git/sync-release-repo.sh b/llvm/utils/git/sync-release-repo.sh new file mode 100755 index 00000000000000..a8264b3bdeb1e8 --- /dev/null +++ b/llvm/utils/git/sync-release-repo.sh @@ -0,0 +1,71 @@ +#!/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