diff --git a/.github/workflows/pull_request_labels.yaml b/.github/workflows/pull_request_labels.yaml new file mode 100644 index 00000000000000..35a40213d0e092 --- /dev/null +++ b/.github/workflows/pull_request_labels.yaml @@ -0,0 +1,25 @@ +name: Add labels to pull requests + +on: + pull_request_target: + types: [ + opened, + reopened, + review_requested, + ] + pull_request_review: + types: [submitted, edited, dismissed] + +jobs: + pull_request_labels: + runs-on: ubuntu-22.04 + if: github.repository == 'denoland/deno' + + steps: + - uses: actions/checkout@v4 + + - name: Label pull request + uses: actions/github-script@v7 + with: + script: | + require('./tools/label_pull_request.js')({ context, github }) diff --git a/tools/label_pull_request.js b/tools/label_pull_request.js new file mode 100644 index 00000000000000..c89d408ff565dd --- /dev/null +++ b/tools/label_pull_request.js @@ -0,0 +1,55 @@ +// Copyright 2018-2025 the Deno authors. MIT license. + +// deno-lint-ignore-file no-console camelcase + +async function createComment(context, github) { + await github.rest.issues.createComment({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + body: `Thanks for the PR! + +Once you are done, please request a review from a Deno team member.`, + }); +} + +async function updateLabels(context, github) { + const result = await github.rest.issues + .listLabelsOnIssue({ + issue_number: context.payload.pull_request.number, + owner: context.repo.owner, + repo: context.repo.repo, + }); + const labelNames = result.data.map((label) => label.name); + labelNames.push("pr:needs-review"); + + return github.rest.issues.setLabels({ + issue_number: context.payload.pull_request.number, + owner: context.repo.owner, + repo: context.repo.repo, + labels: labelNames, + }); +} + +// TODO(bartlomieju): figure out how to use ES modules in GH Actions scripts +module.exports = async ({ context, github }) => { + const eventHandlers = { + opened: createComment, + reopened: createComment, + review_requested: updateLabels, + }; + + const eventName = context.payload.action; + const eventHandler = eventHandlers[eventName]; + + if (!eventHandler) { + console.log(`::warning::'${eventName}' event has no handler, skipping.`); + return; + } + + try { + await eventHandler(context, github); + } catch (error) { + console.log("::warning::Error, during update, bailing out: ", error); + } +};