[Workflow] Add Release Repo sync script
authorTobias Hieta <tobias@hieta.se>
Fri, 27 Jan 2023 15:46:19 +0000 (16:46 +0100)
committerTobias Hieta <tobias@hieta.se>
Fri, 10 Feb 2023 13:41:24 +0000 (14:41 +0100)
Adds a bash script that syncs llvm/llvm-project and llvm/llvm-project-release-prs.
This should run on pushes to any of the repositories release branches.

I will follow this up with a change to the github actions to run this
script.

This breaks out the sync script from: https://reviews.llvm.org/D133476
so we can keep them separate.

Reviewed By: kwk

Differential Revision: https://reviews.llvm.org/D142726

llvm/utils/git/sync-release-repo.sh [new file with mode: 0755]

diff --git a/llvm/utils/git/sync-release-repo.sh b/llvm/utils/git/sync-release-repo.sh
new file mode 100755 (executable)
index 0000000..a8264b3
--- /dev/null
@@ -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