diff --git a/.github/workflows/sync-release-to-pg.yml b/.github/workflows/sync-release-to-pg.yml index 981f124261..0748ef9a40 100644 --- a/.github/workflows/sync-release-to-pg.yml +++ b/.github/workflows/sync-release-to-pg.yml @@ -16,63 +16,53 @@ jobs: ref: release # Checkout the release branch - name: Fetch all branches - run: git fetch --all + run: git fetch pg - name: Checkout pg branch run: git checkout pg - - name: Get new commits from release - id: get_commits + - name: Merge release to pg + id: merge_commits run: | - # Compare the heads of pg and release + PG_HEAD=$(git rev-parse pg) RELEASE_HEAD=$(git rev-parse release) - echo "PG_HEAD=$PG_HEAD" >> $GITHUB_ENV - echo "RELEASE_HEAD=$RELEASE_HEAD" >> $GITHUB_ENV + echo "PG_HEAD=$PG_HEAD" + echo "RELEASE_HEAD=$RELEASE_HEAD" - # Get new commits on release that are not yet in pg - COMMITS=$(git log --reverse --pretty=format:"%H" $PG_HEAD..$RELEASE_HEAD) - echo "COMMITS=$COMMITS" >> $GITHUB_ENV + # Checkout the pg branch + git checkout pg - - name: Merge commits one by one - id: merge_commits - run: | - # Initialize an empty list for conflicted commits - conflicted_commits=() + # Attempt to merge release into pg + if ! git merge release; then + echo "Merge conflict detected during merge" - # Convert the string of commits to an array - IFS=' ' read -r -a commit_array <<< "$COMMITS" + # Capture the conflicting commit SHAs (both HEAD of pg and the merge commit from release) + CONFLICTING_COMMIT=$(git log -1 --pretty=format:"%H") + echo "CONFLICTING_COMMIT=$CONFLICTING_COMMIT" >> $GITHUB_ENV - # Loop through each commit - for commit in "${commit_array[@]}"; do - echo "Attempting to cherry-pick commit $commit" - if ! git cherry-pick $commit; then - echo "Conflict detected with commit $commit" - conflicted_commits+=($commit) - git cherry-pick --abort - fi - done - - # Save conflicted commits to environment variable - echo "CONFLICTED_COMMITS=\"${conflicted_commits[@]}\"" >> $GITHUB_ENV + git merge --abort + echo "MERGE_CONFLICT=true" >> $GITHUB_ENV + else + echo "MERGE_CONFLICT=false" >> $GITHUB_ENV + fi - name: Push changes - if: success() && steps.merge_commits.outputs.CONFLICTED_COMMITS == '' + if: env.MERGE_CONFLICT == 'false' run: | git push origin pg - name: Notify on merge conflicts - if: failure() + if: env.MERGE_CONFLICT == 'true' env: REPOSITORY_URL: ${{ github.repositoryUrl }} + CONFLICTING_COMMIT: ${{ env.CONFLICTING_COMMIT }} run: | # Prepare the message for Slack message="Merge conflict detected while merging release into pg branch. Conflicted commits:\n" - for commit in $CONFLICTED_COMMITS; do - commit_url="$REPOSITORY_URL/commit/$commit" - message+="$commit_url\n" - done + commit_url="$REPOSITORY_URL/commit/$CONFLICTING_COMMIT" + message+="$commit_url\n" # Send the message to Slack # This unwieldy horror of a sed command, converts standard Markdown links to Slack's unwieldy link syntax.