diff --git a/.github/workflows/auto-retarget-main-pr-to-dev.yml b/.github/workflows/auto-retarget-main-pr-to-dev.yml new file mode 100644 index 00000000..3732a723 --- /dev/null +++ b/.github/workflows/auto-retarget-main-pr-to-dev.yml @@ -0,0 +1,73 @@ +name: auto-retarget-main-pr-to-dev + +on: + pull_request_target: + types: + - opened + - reopened + - edited + branches: + - main + +permissions: + contents: read + issues: write + pull-requests: write + +jobs: + retarget: + if: github.actor != 'github-actions[bot]' + runs-on: ubuntu-latest + steps: + - name: Retarget PR base to dev + uses: actions/github-script@v7 + with: + script: | + const pr = context.payload.pull_request; + const prNumber = pr.number; + const { owner, repo } = context.repo; + + const baseRef = pr.base?.ref; + const headRef = pr.head?.ref; + const desiredBase = "dev"; + + if (baseRef !== "main") { + core.info(`PR #${prNumber} base is ${baseRef}; nothing to do.`); + return; + } + + if (headRef === desiredBase) { + core.info(`PR #${prNumber} is ${desiredBase} -> main; skipping retarget.`); + return; + } + + core.info(`Retargeting PR #${prNumber} base from ${baseRef} to ${desiredBase}.`); + + try { + await github.rest.pulls.update({ + owner, + repo, + pull_number: prNumber, + base: desiredBase, + }); + } catch (error) { + core.setFailed(`Failed to retarget PR #${prNumber} to ${desiredBase}: ${error.message}`); + return; + } + + const body = [ + `This pull request targeted \`${baseRef}\`.`, + "", + `The base branch has been automatically changed to \`${desiredBase}\`.`, + ].join("\n"); + + try { + await github.rest.issues.createComment({ + owner, + repo, + issue_number: prNumber, + body, + }); + } catch (error) { + core.warning(`Failed to comment on PR #${prNumber}: ${error.message}`); + }