Fix stale thread route recovery #191
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: PR Size | |
| on: | |
| pull_request_target: | |
| branches: | |
| - built-from-scratch | |
| types: [opened, reopened, synchronize, ready_for_review, converted_to_draft] | |
| permissions: | |
| contents: read | |
| jobs: | |
| label: | |
| name: Label PR size | |
| runs-on: ubuntu-24.04 | |
| permissions: | |
| contents: read | |
| issues: read | |
| pull-requests: write | |
| concurrency: | |
| group: pr-size-${{ github.event.pull_request.number }} | |
| cancel-in-progress: true | |
| steps: | |
| - name: Sync PR size label | |
| uses: actions/github-script@v8 | |
| with: | |
| script: | | |
| const issueNumber = context.payload.pull_request.number; | |
| const managedLabelNames = new Set([ | |
| "size:XS", | |
| "size:S", | |
| "size:M", | |
| "size:L", | |
| "size:XL", | |
| "size:XXL", | |
| ]); | |
| // Keep this aligned with the repo's test entrypoints and test-only support files. | |
| const testFilePatterns = [ | |
| /(^|\/)__tests__(\/|$)/, | |
| /(^|\/)tests?(\/|$)/, | |
| /^apps\/server\/integration\//, | |
| /\.(test|spec|browser|integration)\.[^.\/]+$/, | |
| ]; | |
| const isTestFile = (filename) => | |
| testFilePatterns.some((pattern) => pattern.test(filename)); | |
| const resolveSizeLabel = (totalChangedLines) => { | |
| if (totalChangedLines < 10) { | |
| return "size:XS"; | |
| } | |
| if (totalChangedLines < 30) { | |
| return "size:S"; | |
| } | |
| if (totalChangedLines < 100) { | |
| return "size:M"; | |
| } | |
| if (totalChangedLines < 500) { | |
| return "size:L"; | |
| } | |
| if (totalChangedLines < 1000) { | |
| return "size:XL"; | |
| } | |
| return "size:XXL"; | |
| }; | |
| const files = await github.paginate( | |
| github.rest.pulls.listFiles, | |
| { | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| pull_number: issueNumber, | |
| per_page: 100, | |
| }, | |
| (response) => response.data, | |
| ); | |
| if (files.length >= 3000) { | |
| core.warning( | |
| "The GitHub pull request files API may truncate results at 3,000 files; PR size may be undercounted.", | |
| ); | |
| } | |
| let testChangedLines = 0; | |
| let nonTestChangedLines = 0; | |
| for (const file of files) { | |
| const changedLinesForFile = (file.additions ?? 0) + (file.deletions ?? 0); | |
| if (changedLinesForFile === 0) { | |
| continue; | |
| } | |
| if (isTestFile(file.filename)) { | |
| testChangedLines += changedLinesForFile; | |
| continue; | |
| } | |
| nonTestChangedLines += changedLinesForFile; | |
| } | |
| const changedLines = nonTestChangedLines === 0 ? testChangedLines : nonTestChangedLines; | |
| const nextLabelName = resolveSizeLabel(changedLines); | |
| const { data: currentLabels } = await github.rest.issues.listLabelsOnIssue({ | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| issue_number: issueNumber, | |
| per_page: 100, | |
| }); | |
| for (const label of currentLabels) { | |
| if (!managedLabelNames.has(label.name) || label.name === nextLabelName) { | |
| continue; | |
| } | |
| try { | |
| await github.rest.issues.removeLabel({ | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| issue_number: issueNumber, | |
| name: label.name, | |
| }); | |
| } catch (removeError) { | |
| if (removeError.status !== 404) { | |
| throw removeError; | |
| } | |
| } | |
| } | |
| if (!currentLabels.some((label) => label.name === nextLabelName)) { | |
| await github.rest.issues.addLabels({ | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| issue_number: issueNumber, | |
| labels: [nextLabelName], | |
| }); | |
| } | |
| const classification = | |
| nonTestChangedLines === 0 | |
| ? testChangedLines > 0 | |
| ? "test-only PR" | |
| : "no line changes" | |
| : testChangedLines > 0 | |
| ? "test lines excluded" | |
| : "all non-test changes"; | |
| core.info( | |
| `PR #${issueNumber}: ${nonTestChangedLines} non-test lines, ${testChangedLines} test lines, ${changedLines} effective lines -> ${nextLabelName} (${classification})`, | |
| ); |