From c1c21e964c3a318ab38a70518900d8cb748343ef Mon Sep 17 00:00:00 2001 From: Sam Huang Date: Wed, 26 Oct 2022 05:58:39 -0700 Subject: [PATCH] Contributor project automations via workflows (#2584) Co-authored-by: Stephan T. Lavavej --- .../workflows/move-ready-for-review-prs.yml | 68 +++++++++++++++++ .../workflows/move-work-in-progress-prs.yml | 73 +++++++++++++++++++ 2 files changed, 141 insertions(+) create mode 100644 .github/workflows/move-ready-for-review-prs.yml create mode 100644 .github/workflows/move-work-in-progress-prs.yml diff --git a/.github/workflows/move-ready-for-review-prs.yml b/.github/workflows/move-ready-for-review-prs.yml new file mode 100644 index 0000000000..2c9c0f5299 --- /dev/null +++ b/.github/workflows/move-ready-for-review-prs.yml @@ -0,0 +1,68 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +name: Move PR To Initial Review +on: + issue_comment: + types: [created] + branch: + - main + +jobs: + move-pr-to-initial-review: + if: > + github.event.issue.pull_request + && github.event.comment.user.login == github.event.issue.user.login + && contains(github.event.comment.body, '/pr review') + runs-on: ubuntu-latest + steps: + - name: Move To Initial Review + uses: actions/github-script@v6 + with: + script: | + // Find "Code Reviews" project manually by name matching + // This avoids hardcoding the project ID + const projects = await github.paginate(github.rest.projects.listForRepo, { + owner: context.repo.owner, + repo: context.repo.repo, + }); + const code_reviews = projects.find(project => project.name === 'Code Reviews'); + if (!code_reviews) { + console.error("'Code Reviews' project not found!"); + return; + } + + // Find "Initial Review" column manually by name matching + // This assumes the card is in "Work In Progress" column + // This avoids hardcoding the column ID and card ID + const columns = await github.paginate(github.rest.projects.listColumns, { + project_id: code_reviews.id, + }); + + const work_in_progress = columns.find(column => column.name === 'Work In Progress'); + if (!work_in_progress) { + console.error("'Work In Progress' column not found!"); + return; + } + + const initial_review = columns.find(column => column.name === 'Initial Review'); + if (!initial_review) { + console.error("'Initial Review' column not found!"); + return; + } + + const pr_card = await github.paginate(github.rest.projects.listCards, { + column_id: work_in_progress.id, + }).then(cards => cards.find(card => card.content_url === context.payload.issue.url)); + if (!pr_card) { + console.error("Corresponding card for PR not found!"); + return; + } + + github.rest.projects.moveCard({ + card_id: pr_card.id, + position: 'bottom', + column_id: initial_review.id, + }).catch(error => { + console.error(`Error occurred while moving card to 'Initial Review': ${error}`); + }); diff --git a/.github/workflows/move-work-in-progress-prs.yml b/.github/workflows/move-work-in-progress-prs.yml new file mode 100644 index 0000000000..11813607d3 --- /dev/null +++ b/.github/workflows/move-work-in-progress-prs.yml @@ -0,0 +1,73 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +name: Move PR To Work In Progress +on: + issue_comment: + types: [created] + branch: + - main + +jobs: + move-pr-to-wip: + if: > + github.event.issue.pull_request + && github.event.comment.user.login == github.event.issue.user.login + && contains(github.event.comment.body, '/pr wip') + runs-on: ubuntu-latest + steps: + - name: Move To Work In Progress + uses: actions/github-script@v6 + with: + script: | + // Find "Code Reviews" project manually by name matching + // This avoids hardcoding the project ID + const projects = await github.paginate(github.rest.projects.listForRepo, { + owner: context.repo.owner, + repo: context.repo.repo, + }); + const code_reviews = projects.find(project => project.name === 'Code Reviews'); + if (!code_reviews) { + console.error("'Code Reviews' project not found!"); + return; + } + + // Find "Work In Progress" column manually by name matching + // Also find the card of the PR in either "Initial Review" or "Final Review" + // This avoids hardcoding the column ID and card ID + const columns = await github.paginate(github.rest.projects.listColumns, { + project_id: code_reviews.id, + }); + + const work_in_progress = columns.find(column => column.name === 'Work In Progress'); + if (!work_in_progress) { + console.error("'Work In Progress' column not found!"); + return; + } + + const move_card_in_column = async (column) => { + const cards = await github.paginate(github.rest.projects.listCards, { + column_id: column.id, + }); + + const pr_card = cards.find(card => card.content_url === context.payload.issue.url); + if (!pr_card) { + return; // the PR card is not in this column + } + + await github.rest.projects.moveCard({ + card_id: pr_card.id, + position: 'bottom', + column_id: work_in_progress.id, + }); + }; + + columns.forEach(column => { + if (column.name !== 'Initial Review' && column.name !== 'Final Review') { + return; // no reason to search through other columns and avoids unnecessary API calls + } + + move_card_in_column(column).catch(error => { + console.error(`Error occurred while moving card to 'Work In Progress': ${error}`); + }); + });