feat: implements bid matching in provider-inventory #1456
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: Labeler | |
| on: | |
| pull_request_target: | |
| types: [opened, synchronize, reopened] | |
| permissions: | |
| contents: read | |
| pull-requests: write | |
| jobs: | |
| label: | |
| permissions: | |
| contents: read | |
| pull-requests: write | |
| runs-on: [self-hosted, akash] | |
| steps: | |
| - name: Apply PR size label | |
| uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 | |
| with: | |
| github-token: ${{ secrets.GITHUB_TOKEN }} | |
| script: | # js | |
| const pullRequest = context.payload.pull_request; | |
| if (!pullRequest) { | |
| return; | |
| } | |
| const sizeLabels = ["size: XS", "size: S", "size: M", "size: L", "size: XL"]; | |
| const labelColor = "b76e79"; | |
| for (const label of sizeLabels) { | |
| try { | |
| await github.rest.issues.getLabel({ | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| name: label, | |
| }); | |
| } catch (error) { | |
| if (error?.status !== 404) { | |
| throw error; | |
| } | |
| await github.rest.issues.createLabel({ | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| name: label, | |
| color: labelColor, | |
| }); | |
| } | |
| } | |
| const files = await github.paginate(github.rest.pulls.listFiles, { | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| pull_number: pullRequest.number, | |
| per_page: 100, | |
| }); | |
| const excludedLockfiles = new Set([ | |
| "pnpm-lock.yaml", | |
| "package-lock.json", | |
| "yarn.lock", | |
| "bun.lockb", | |
| ]); | |
| const totalChangedLines = files.reduce((total, file) => { | |
| const path = file.filename ?? ""; | |
| if (excludedLockfiles.has(path) || (path.includes("/drizzle/meta/") && path.endsWith('.json'))) { | |
| return total; | |
| } | |
| return total + (file.additions ?? 0) + (file.deletions ?? 0); | |
| }, 0); | |
| let targetSizeLabel = "size: XL"; | |
| if (totalChangedLines < 50) { | |
| targetSizeLabel = "size: XS"; | |
| } else if (totalChangedLines < 200) { | |
| targetSizeLabel = "size: S"; | |
| } else if (totalChangedLines < 500) { | |
| targetSizeLabel = "size: M"; | |
| } else if (totalChangedLines < 1000) { | |
| targetSizeLabel = "size: L"; | |
| } | |
| const currentLabels = await github.paginate(github.rest.issues.listLabelsOnIssue, { | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| issue_number: pullRequest.number, | |
| per_page: 100, | |
| }); | |
| for (const label of currentLabels) { | |
| const name = label.name ?? ""; | |
| if (!sizeLabels.includes(name) || name === targetSizeLabel) { | |
| continue; | |
| } | |
| await github.rest.issues.removeLabel({ | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| issue_number: pullRequest.number, | |
| name, | |
| }); | |
| } | |
| await github.rest.issues.addLabels({ | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| issue_number: pullRequest.number, | |
| labels: [targetSizeLabel], | |
| }); | |
| - name: Apply maintainer or trusted-contributor label | |
| uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 | |
| with: | |
| github-token: ${{ secrets.GITHUB_TOKEN }} | |
| script: | # js | |
| const login = context.payload.pull_request?.user?.login; | |
| if (!login) { | |
| return; | |
| } | |
| const repo = `${context.repo.owner}/${context.repo.repo}`; | |
| const trustedLabel = "trusted-contributor"; | |
| const experiencedLabel = "experienced-contributor"; | |
| const trustedThreshold = 4; | |
| const experiencedThreshold = 10; | |
| const mergedQuery = `repo:${repo} is:pr is:merged author:${login}`; | |
| let mergedCount = 0; | |
| try { | |
| const merged = await github.rest.search.issuesAndPullRequests({ | |
| q: mergedQuery, | |
| per_page: 1, | |
| }); | |
| mergedCount = merged?.data?.total_count ?? 0; | |
| } catch (error) { | |
| if (error?.status !== 422) { | |
| throw error; | |
| } | |
| core.warning(`Skipping merged search for ${login}; treating as 0.`); | |
| } | |
| if (mergedCount >= experiencedThreshold) { | |
| await github.rest.issues.addLabels({ | |
| ...context.repo, | |
| issue_number: context.payload.pull_request.number, | |
| labels: [experiencedLabel], | |
| }); | |
| return; | |
| } | |
| if (mergedCount >= trustedThreshold) { | |
| await github.rest.issues.addLabels({ | |
| ...context.repo, | |
| issue_number: context.payload.pull_request.number, | |
| labels: [trustedLabel], | |
| }); | |
| } |