From efd41a9a27d38e445c64024d32b9dc6ab3e3e3ef Mon Sep 17 00:00:00 2001 From: Stian Thorgersen Date: Wed, 29 Nov 2023 05:52:49 +0100 Subject: [PATCH] Add script to help with backporting PRs to release branches (#24015) Signed-off-by: Jon Koops Signed-off-by: stianst Co-authored-by: Jon Koops --- .github/scripts/pr-backport.sh | 85 ++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100755 .github/scripts/pr-backport.sh diff --git a/.github/scripts/pr-backport.sh b/.github/scripts/pr-backport.sh new file mode 100755 index 00000000000..2304e479611 --- /dev/null +++ b/.github/scripts/pr-backport.sh @@ -0,0 +1,85 @@ +#!/bin/bash -e + +TARGET_REMOTE=upstream +KEYCLOAK_REPO=https://github.com/keycloak/keycloak + +PR=$1 +TARGET=$2 + +function echo_header() { + echo "" + echo "=======================================================================" + echo "$1" + echo "-----------------------------------------------------------------------" +} + +function error() { + echo "=======================================================================" + echo "Error" + echo "-----------------------------------------------------------------------" + echo "$1" + echo "" + exit 1 +} + +if ! [ -x "$(command -v gh)" ]; then + error "The GitHub CLI is not installed. See: https://github.com/cli/cli#installation" +fi + +if ! [ -x "$(command -v jq)" ]; then + error "The jq CLI is not installed. See: https://jqlang.github.io/jq/download/" +fi + +if [ "$PR" == "" ] || [ "$TARGET" == "" ]; then + error "Usage: gh-backport-pr.sh " +fi + +TARGET_BRANCH=release/$TARGET + +echo_header "Fetching '$TARGET_REMOTE' remote." +git fetch $TARGET_REMOTE + +PR_STATE=$(gh pr view $PR --json state 2>/dev/null | jq -r .state) + +if [ "$PR_STATE" == "" ]; then + error "PR #$PR not found. Make sure the PR exists, and that it's been merged." +elif [ "$PR_STATE" != "MERGED" ]; then + error "PR #$PR not merged yet. Only merged PRs can be backported." +fi + +MERGE_COMMIT=$(gh pr view $PR --json mergeCommit | jq -r .mergeCommit.oid) + +if [ "$MERGE_COMMIT" == "" ]; then + error "Could not resolve merge commit for PR #$PR" +fi + +PR_BRANCH=backport-$PR-$TARGET +PR_BODY=$(gh pr view $PR --json body | jq -r .body) + +echo_header "Details" +echo "PR Body: $PR_BODY" +echo "" +echo "PR: $KEYCLOAK_REPO/pull/$PR" +echo "Commit: $KEYCLOAK_REPO/commit/$MERGE_COMMIT" +echo "" +echo "PR branch: $PR_BRANCH" +echo "Target branch: $KEYCLOAK_REPO/tree/$TARGET_BRANCH" +echo "" +echo -n "Continue (y/n): " +read PROMPT + +if [ "$PROMPT" != "y" ]; then + exit 1 +fi + +echo_header "Checkout '$TARGET_REMOTE/$TARGET_BRANCH' to '$PR_BRANCH'" +git checkout $TARGET_REMOTE/$TARGET_BRANCH -B $PR_BRANCH + +echo_header "Cherry-pick $MERGE_COMMIT" +git cherry-pick $MERGE_COMMIT + +echo_header "Push '$PR_BRANCH' to 'origin' remote" +git push origin $PR_BRANCH:$PR_BRANCH --set-upstream + +echo_header "Opening web browser to create pull request" +gh pr create -B $TARGET_BRANCH -f -w