llvm-project/llvm/utils/git/sync-release-repo.sh
Tobias Hieta 28226e5a1b
[Workflow] Run the repository sync script from GH.
Also various fixes to the script to work correctly
in GH actions.

Differential Revision: https://reviews.llvm.org/D156873
2023-08-10 09:01:18 +02:00

78 lines
2.7 KiB
Bash
Executable File

#!/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)
# depth here must make sure to fetch enough history to make a merge,
# it's an arbritary value at this point. Consider using --shallow-since=
FETCH_OPTIONS="--prune --no-tags --progress --depth=100"
git remote add $MAIN_REMOTE "https://github.com/llvm/llvm-project"
git remote add $RELEASE_REMOTE "https://token:$GH_TOKEN@github.com/llvm/llvm-project-release-prs"
# Make sure we are up to date on all our repos first
git fetch $FETCH_OPTIONS $MAIN_REMOTE $RELEASE_BRANCH
git fetch $FETCH_OPTIONS $RELEASE_REMOTE $RELEASE_BRANCH
# 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 $FETCH_OPTIONS $MAIN_REMOTE $RELEASE_BRANCH
git fetch $FETCH_OPTIONS $RELEASE_REMOTE $RELEASE_BRANCH
# 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"
# Remove the token stored by GH Actions, otherwise it
# won't use our own token in $GH_TOKEN
git config --unset-all http.https://github.com/.extraheader
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