Tldraw/apps/huppy/src/flows/enforcePrLabels.tsx

73 wiersze
2.1 KiB
TypeScript

import { TLDRAW_ORG, TLDRAW_PUBLIC_REPO, TLDRAW_PUBLIC_REPO_MAIN_BRANCH } from '../config'
import { Flow } from '../flow'
export const enforcePrLabels: Flow = {
name: 'enforcePrLabels',
async onPullRequest(ctx, event) {
if (event.repository.full_name !== `${TLDRAW_ORG}/${TLDRAW_PUBLIC_REPO}`) return
if (event.pull_request.base.ref !== TLDRAW_PUBLIC_REPO_MAIN_BRANCH) return
const fail = async (message: string) => {
await ctx.octokit.rest.repos.createCommitStatus({
owner: event.repository.owner.login,
repo: event.repository.name,
sha: event.pull_request.head.sha,
state: 'failure',
description: message,
context: 'Release Label',
})
}
const succeed = async (message: string) => {
await ctx.octokit.rest.repos.createCommitStatus({
owner: event.repository.owner.login,
repo: event.repository.name,
sha: event.pull_request.head.sha,
state: 'success',
description: message,
context: 'Release Label',
})
}
const pull = event.pull_request
if (pull.draft) {
return await succeed('Draft PR, skipping label check')
}
if (pull.closed_at || pull.merged_at) {
return await succeed('Closed PR, skipping label check')
}
const availableLabels = (
await ctx.octokit.rest.issues.listLabelsForRepo({
owner: event.repository.owner.login,
repo: event.repository.name,
})
).data.map((x) => x.name)
const prBody = pull.body
const selectedReleaseLabels = availableLabels.filter((label) =>
prBody?.match(new RegExp(`^\\s*?-\\s*\\[\\s*x\\s*\\]\\s+\`${label}\``, 'm'))
) as string[]
if (selectedReleaseLabels.length === 0 && pull.labels.length === 0) {
return fail('Please add a label to the PR.')
}
// add any labels that are checked
console.log('adding labels')
if (selectedReleaseLabels.length > 0) {
await ctx.octokit.rest.issues.addLabels({
issue_number: pull.number,
owner: event.repository.organization ?? event.repository.owner.login,
repo: event.repository.name,
labels: selectedReleaseLabels,
} as any)
}
return await succeed(`PR is labelled!`)
},
}