mirror of
https://github.com/CHN-beta/nixpkgs.git
synced 2026-01-12 02:40:31 +08:00
The reason this was a separate shell script was, that this would be
included in multiple workflows separately. But a while ago this had been
changed to a re-usable workflow, so we can just as well inline the
script.
This also allows us to use actions/github-script, which makes for a much
more readable script than the bash script before.
(cherry picked from commit 277f7b998c)
80 lines
2.9 KiB
YAML
80 lines
2.9 KiB
YAML
name: Get merge commit
|
|
|
|
on:
|
|
pull_request:
|
|
paths:
|
|
- .github/workflows/get-merge-commit.yml
|
|
workflow_call:
|
|
outputs:
|
|
mergedSha:
|
|
description: "The merge commit SHA"
|
|
value: ${{ jobs.resolve-merge-commit.outputs.mergedSha }}
|
|
targetSha:
|
|
description: "The target commit SHA"
|
|
value: ${{ jobs.resolve-merge-commit.outputs.targetSha }}
|
|
systems:
|
|
description: "The supported systems"
|
|
value: ${{ jobs.resolve-merge-commit.outputs.systems }}
|
|
|
|
permissions: {}
|
|
|
|
jobs:
|
|
resolve-merge-commit:
|
|
runs-on: ubuntu-24.04-arm
|
|
outputs:
|
|
mergedSha: ${{ fromJSON(steps.merged.outputs.result).mergedSha }}
|
|
targetSha: ${{ fromJSON(steps.merged.outputs.result).targetSha }}
|
|
systems: ${{ steps.systems.outputs.systems }}
|
|
steps:
|
|
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
|
with:
|
|
path: base
|
|
sparse-checkout: ci
|
|
|
|
- name: Check if the PR can be merged and get the test merge commit
|
|
id: merged
|
|
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
|
|
with:
|
|
script: |
|
|
if (context.eventName == 'push') return { mergedSha: context.sha }
|
|
|
|
for (const retryInterval of [5, 10, 20, 40, 80]) {
|
|
console.log("Checking whether the pull request can be merged...")
|
|
const prInfo = (await github.rest.pulls.get({
|
|
owner: context.repo.owner,
|
|
repo: context.repo.repo,
|
|
pull_number: context.payload.pull_request.number
|
|
})).data
|
|
|
|
if (prInfo.state != 'open') throw new Error ("PR is not open anymore.")
|
|
|
|
if (prInfo.mergeable == null) {
|
|
console.log(`GitHub is still computing whether this PR can be merged, waiting ${retryInterval} seconds before trying again...`)
|
|
await new Promise(resolve => setTimeout(resolve, retryInterval * 1000))
|
|
continue
|
|
}
|
|
|
|
if (prInfo.mergeable) {
|
|
console.log("The PR can be merged.")
|
|
|
|
const mergedSha = prInfo.merge_commit_sha
|
|
const targetSha = (await github.rest.repos.getCommit({
|
|
owner: context.repo.owner,
|
|
repo: context.repo.repo,
|
|
ref: prInfo.merge_commit_sha
|
|
})).data.parents[0].sha
|
|
|
|
console.log(`Checking the commits:\nmerged:${mergedSha}\ntarget:${targetSha}`)
|
|
|
|
return { mergedSha, targetSha }
|
|
} else {
|
|
throw new Error("The PR has a merge conflict. Skipping the rest...")
|
|
}
|
|
}
|
|
throw new Error("Not retrying anymore. It's likely that GitHub is having internal issues: check https://www.githubstatus.com.")
|
|
|
|
- name: Load supported systems
|
|
id: systems
|
|
run: |
|
|
echo "systems=$(jq -c <base/ci/supportedSystems.json)" >> "$GITHUB_OUTPUT"
|