From 9dbbc79c66099577b31c8a430aab18e77c20c854 Mon Sep 17 00:00:00 2001 From: Dean Schmigelski Date: Thu, 23 Oct 2025 11:49:24 -0400 Subject: [PATCH 01/12] ci: add pr size labeler --- .github/workflows/pr-size-labeler.yml | 73 +++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 .github/workflows/pr-size-labeler.yml diff --git a/.github/workflows/pr-size-labeler.yml b/.github/workflows/pr-size-labeler.yml new file mode 100644 index 000000000..00e1ac553 --- /dev/null +++ b/.github/workflows/pr-size-labeler.yml @@ -0,0 +1,73 @@ +name: PR Size Labeler + +on: + pull_request_target: + branches: main + +jobs: + authorization-check: + permissions: read-all + runs-on: ubuntu-latest + outputs: + approval-env: ${{ steps.collab-check.outputs.result }} + steps: + - name: Collaborator Check + uses: actions/github-script@v8 + id: collab-check + with: + result-encoding: string + script: | + try { + const permissionResponse = await github.rest.repos.getCollaboratorPermissionLevel({ + owner: context.repo.owner, + repo: context.repo.repo, + username: context.payload.pull_request.user.login, + }); + const permission = permissionResponse.data.permission; + const hasWriteAccess = ['write', 'admin'].includes(permission); + if (!hasWriteAccess) { + console.log(`User ${context.payload.pull_request.user.login} does not have write access`); + return "manual-approval" + } else { + console.log(`Verified ${context.payload.pull_request.user.login} has write access. Auto approving.`) + return "auto-approve" + } + } catch (error) { + console.log(`${context.payload.pull_request.user.login} does not have write access.`) + return "manual-approval" + } + + size-label: + runs-on: ubuntu-latest + needs: authorization-check + if: needs.authorization-check.outputs.approval-env == 'auto-approve' + permissions: + contents: read + pull-requests: write + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: Calculate PR size and apply label + uses: actions/github-script@v8 + with: + script: | + const pr = context.payload.pull_request; + const totalChanges = pr.additions + pr.deletions; + + let sizeLabel; + if (totalChanges <= 20) sizeLabel = 'size/xs'; + else if (totalChanges <= 100) sizeLabel = 'size/s'; + else if (totalChanges <= 500) sizeLabel = 'size/m'; + else if (totalChanges <= 1000) sizeLabel = 'size/l'; + else { + sizeLabel = 'size/xl'; + core.setFailed(`PR is too large (${totalChanges} lines). Please split into smaller PRs.`); + } + + await github.rest.issues.addLabels({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.payload.pull_request.number, + labels: [sizeLabel] + }); From 2063c0fc532ec1ce3987eb990648da52c0773472 Mon Sep 17 00:00:00 2001 From: Dean Schmigelski Date: Thu, 23 Oct 2025 16:05:41 -0400 Subject: [PATCH 02/12] Update pr-size-labeler.yml --- .github/workflows/pr-size-labeler.yml | 44 +++------------------------ 1 file changed, 5 insertions(+), 39 deletions(-) diff --git a/.github/workflows/pr-size-labeler.yml b/.github/workflows/pr-size-labeler.yml index 00e1ac553..9f7dea4bd 100644 --- a/.github/workflows/pr-size-labeler.yml +++ b/.github/workflows/pr-size-labeler.yml @@ -1,53 +1,16 @@ name: PR Size Labeler on: - pull_request_target: + pull_request: branches: main jobs: - authorization-check: - permissions: read-all - runs-on: ubuntu-latest - outputs: - approval-env: ${{ steps.collab-check.outputs.result }} - steps: - - name: Collaborator Check - uses: actions/github-script@v8 - id: collab-check - with: - result-encoding: string - script: | - try { - const permissionResponse = await github.rest.repos.getCollaboratorPermissionLevel({ - owner: context.repo.owner, - repo: context.repo.repo, - username: context.payload.pull_request.user.login, - }); - const permission = permissionResponse.data.permission; - const hasWriteAccess = ['write', 'admin'].includes(permission); - if (!hasWriteAccess) { - console.log(`User ${context.payload.pull_request.user.login} does not have write access`); - return "manual-approval" - } else { - console.log(`Verified ${context.payload.pull_request.user.login} has write access. Auto approving.`) - return "auto-approve" - } - } catch (error) { - console.log(`${context.payload.pull_request.user.login} does not have write access.`) - return "manual-approval" - } - size-label: runs-on: ubuntu-latest - needs: authorization-check - if: needs.authorization-check.outputs.approval-env == 'auto-approve' permissions: contents: read pull-requests: write steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - name: Calculate PR size and apply label uses: actions/github-script@v8 with: @@ -62,7 +25,6 @@ jobs: else if (totalChanges <= 1000) sizeLabel = 'size/l'; else { sizeLabel = 'size/xl'; - core.setFailed(`PR is too large (${totalChanges} lines). Please split into smaller PRs.`); } await github.rest.issues.addLabels({ @@ -71,3 +33,7 @@ jobs: issue_number: context.payload.pull_request.number, labels: [sizeLabel] }); + + if (sizeLabel = 'size/xl') { + core.setFailed(`PR is too large (${totalChanges} lines). Please split into smaller PRs.`); + } From 1487b3720d00f275aa3f9f3948acbc2836a64245 Mon Sep 17 00:00:00 2001 From: Dean Schmigelski Date: Thu, 23 Oct 2025 16:07:10 -0400 Subject: [PATCH 03/12] Update pr-size-labeler.yml --- .github/workflows/pr-size-labeler.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pr-size-labeler.yml b/.github/workflows/pr-size-labeler.yml index 9f7dea4bd..086d9ccc8 100644 --- a/.github/workflows/pr-size-labeler.yml +++ b/.github/workflows/pr-size-labeler.yml @@ -2,7 +2,7 @@ name: PR Size Labeler on: pull_request: - branches: main + branches: main, pr-size-labeler jobs: size-label: From cc497dcb9d79eb2519eb3b9742ebdc5da29b0404 Mon Sep 17 00:00:00 2001 From: Dean Schmigelski Date: Thu, 23 Oct 2025 16:08:07 -0400 Subject: [PATCH 04/12] Update pr-size-labeler.yml --- .github/workflows/pr-size-labeler.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pr-size-labeler.yml b/.github/workflows/pr-size-labeler.yml index 086d9ccc8..cfa298ba3 100644 --- a/.github/workflows/pr-size-labeler.yml +++ b/.github/workflows/pr-size-labeler.yml @@ -2,7 +2,7 @@ name: PR Size Labeler on: pull_request: - branches: main, pr-size-labeler + branches: pr-size-labeler jobs: size-label: From bfff42ccefaab7545eaf01f638643a7e2beb4a90 Mon Sep 17 00:00:00 2001 From: Dean Schmigelski Date: Thu, 23 Oct 2025 16:12:27 -0400 Subject: [PATCH 05/12] Update pr-size-labeler.yml --- .github/workflows/pr-size-labeler.yml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/.github/workflows/pr-size-labeler.yml b/.github/workflows/pr-size-labeler.yml index cfa298ba3..e5af4e08e 100644 --- a/.github/workflows/pr-size-labeler.yml +++ b/.github/workflows/pr-size-labeler.yml @@ -18,6 +18,25 @@ jobs: const pr = context.payload.pull_request; const totalChanges = pr.additions + pr.deletions; + // Remove existing size labels + const labels = await github.rest.issues.listLabelsOnIssue({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.payload.pull_request.number + }); + + for (const label of labels.data) { + if (label.name.startsWith('size/')) { + await github.rest.issues.removeLabel({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.payload.pull_request.number, + name: label.name + }); + } + } + + // Determine and apply new size label let sizeLabel; if (totalChanges <= 20) sizeLabel = 'size/xs'; else if (totalChanges <= 100) sizeLabel = 'size/s'; From 95da1e3bccfb92e5a6df8ba537000bf45bf4979b Mon Sep 17 00:00:00 2001 From: Dean Schmigelski Date: Thu, 23 Oct 2025 16:16:36 -0400 Subject: [PATCH 06/12] Update pr-size-labeler.yml --- .github/workflows/pr-size-labeler.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pr-size-labeler.yml b/.github/workflows/pr-size-labeler.yml index e5af4e08e..cdbcec1d2 100644 --- a/.github/workflows/pr-size-labeler.yml +++ b/.github/workflows/pr-size-labeler.yml @@ -53,6 +53,6 @@ jobs: labels: [sizeLabel] }); - if (sizeLabel = 'size/xl') { + if (sizeLabel === 'size/xl') { core.setFailed(`PR is too large (${totalChanges} lines). Please split into smaller PRs.`); } From 662a72f2cd9abe9d3e46e93406d29786acde08ec Mon Sep 17 00:00:00 2001 From: Dean Schmigelski Date: Thu, 23 Oct 2025 16:23:43 -0400 Subject: [PATCH 07/12] Update pr-size-labeler.yml --- .github/workflows/pr-size-labeler.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pr-size-labeler.yml b/.github/workflows/pr-size-labeler.yml index cdbcec1d2..322e0507b 100644 --- a/.github/workflows/pr-size-labeler.yml +++ b/.github/workflows/pr-size-labeler.yml @@ -2,7 +2,7 @@ name: PR Size Labeler on: pull_request: - branches: pr-size-labeler + branches: main jobs: size-label: From 91ab1b59c7a699da5288ff277f65b0062a7bbad9 Mon Sep 17 00:00:00 2001 From: Dean Schmigelski Date: Thu, 23 Oct 2025 16:28:18 -0400 Subject: [PATCH 08/12] Update pr-size-labeler.yml --- .github/workflows/pr-size-labeler.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/pr-size-labeler.yml b/.github/workflows/pr-size-labeler.yml index 322e0507b..4a7620b1c 100644 --- a/.github/workflows/pr-size-labeler.yml +++ b/.github/workflows/pr-size-labeler.yml @@ -9,7 +9,8 @@ jobs: runs-on: ubuntu-latest permissions: contents: read - pull-requests: write + pull-requests: read + issues: write steps: - name: Calculate PR size and apply label uses: actions/github-script@v8 From 66c6a080873cf38de38217175f71df8c4cfcfdf5 Mon Sep 17 00:00:00 2001 From: Dean Schmigelski Date: Thu, 23 Oct 2025 16:32:28 -0400 Subject: [PATCH 09/12] Update pr-size-labeler.yml --- .github/workflows/pr-size-labeler.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/pr-size-labeler.yml b/.github/workflows/pr-size-labeler.yml index 4a7620b1c..6169408a9 100644 --- a/.github/workflows/pr-size-labeler.yml +++ b/.github/workflows/pr-size-labeler.yml @@ -5,11 +5,10 @@ on: branches: main jobs: - size-label: + label-size: runs-on: ubuntu-latest permissions: - contents: read - pull-requests: read + pull-requests: write issues: write steps: - name: Calculate PR size and apply label From c98c2cf911d07ee08d3c26236ab7701ea20d4f6d Mon Sep 17 00:00:00 2001 From: Dean Schmigelski Date: Thu, 23 Oct 2025 16:49:28 -0400 Subject: [PATCH 10/12] Update pr-size-labeler.yml --- .github/workflows/pr-size-labeler.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pr-size-labeler.yml b/.github/workflows/pr-size-labeler.yml index 6169408a9..992266dfc 100644 --- a/.github/workflows/pr-size-labeler.yml +++ b/.github/workflows/pr-size-labeler.yml @@ -2,7 +2,7 @@ name: PR Size Labeler on: pull_request: - branches: main + branches: pr-size-labeler jobs: label-size: From 91fe28cb52047d2e5bb6df6b26f7dca5a6bf5bc8 Mon Sep 17 00:00:00 2001 From: Dean Schmigelski Date: Thu, 23 Oct 2025 16:50:23 -0400 Subject: [PATCH 11/12] Update pr-size-labeler.yml --- .github/workflows/pr-size-labeler.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pr-size-labeler.yml b/.github/workflows/pr-size-labeler.yml index 992266dfc..6169408a9 100644 --- a/.github/workflows/pr-size-labeler.yml +++ b/.github/workflows/pr-size-labeler.yml @@ -2,7 +2,7 @@ name: PR Size Labeler on: pull_request: - branches: pr-size-labeler + branches: main jobs: label-size: From 5500fdacca350b455b00f791137b6dfb7c616086 Mon Sep 17 00:00:00 2001 From: Dean Schmigelski Date: Fri, 24 Oct 2025 09:44:35 -0400 Subject: [PATCH 12/12] Update pr-size-labeler.yml --- .github/workflows/pr-size-labeler.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pr-size-labeler.yml b/.github/workflows/pr-size-labeler.yml index 6169408a9..bc4d52c6d 100644 --- a/.github/workflows/pr-size-labeler.yml +++ b/.github/workflows/pr-size-labeler.yml @@ -1,7 +1,7 @@ name: PR Size Labeler on: - pull_request: + pull_request_target: branches: main jobs: