| const core = require('@actions/core'); |
| const github = require('@actions/github'); |
| |
| const TRIGGER = "@bazel-io "; |
| const FLAGGED_LABEL = "potential release blocker"; |
| |
| async function run() { |
| const token = core.getInput("token"); |
| const octokit = github.getOctokit(token); |
| |
| const payload = github.context.payload; |
| if (!payload.comment.body.startsWith(TRIGGER)) return; |
| const command = payload.comment.body.slice(TRIGGER.length); |
| |
| const owner = payload.repository.owner.login; |
| const repo = payload.repository.name; |
| |
| if (command.startsWith("fork ")) { |
| // Check if the commenter is a collaborator of the repo |
| try { |
| await octokit.rest.repos.checkCollaborator({ |
| owner, |
| repo, |
| username: payload.comment.user.login, |
| }); |
| } catch (err) { |
| await octokit.rest.reactions.createForIssueComment({ |
| owner, |
| repo, |
| comment_id: payload.comment.id, |
| content: '-1', |
| }); |
| throw `user ${payload.comment.user.login} has no collaborator access in repo ${owner}/${repo}`; |
| } |
| |
| // Find the milestone corresponding to this branch |
| const branch = command.slice(5).trim(); |
| let milestoneNumber = null; |
| for await (const { data: milestones } of octokit.paginate.iterator( |
| octokit.rest.issues.listMilestones, |
| {owner, repo} |
| )) { |
| let milestone = milestones.find(m => m.title === `${branch} release blockers`); |
| if (milestone) { |
| milestoneNumber = milestone.number; |
| break; |
| } |
| } |
| if (milestoneNumber === null) { |
| await octokit.rest.reactions.createForIssueComment({ |
| owner, |
| repo, |
| comment_id: payload.comment.id, |
| content: 'confused', |
| }); |
| throw `no release blocker milestone found for ${branch}`; |
| } |
| |
| // Create an issue on this milestone |
| await octokit.rest.issues.create({ |
| owner, |
| repo, |
| title: `[${branch}] ` + payload.issue.title, |
| body: `Forked from #${payload.issue.number}`, |
| milestone: milestoneNumber, |
| }); |
| |
| // Remove the "potential release blocker" label if it's present |
| if (payload.issue.labels.some(label => label.name === FLAGGED_LABEL)) { |
| await octokit.rest.issues.removeLabel({ |
| owner, |
| repo, |
| issue_number: payload.issue.number, |
| name: FLAGGED_LABEL, |
| }); |
| } |
| } else if (command === "flag" || command.startsWith("flag ")) { |
| await octokit.rest.issues.addLabels({ |
| owner, |
| repo, |
| issue_number: payload.issue.number, |
| labels: [FLAGGED_LABEL], |
| }); |
| } else if (command === "unstable_ack" || command.startsWith("unstable_ack ")) { |
| await octokit.rest.issues.addLabels({ |
| owner, |
| repo, |
| issue_number: payload.issue.number, |
| labels: ["skip-url-stability-check"], |
| }); |
| } else { |
| await octokit.rest.reactions.createForIssueComment({ |
| owner, |
| repo, |
| comment_id: payload.comment.id, |
| content: 'confused', |
| }); |
| throw `unrecognized command: ${command}`; |
| } |
| |
| await octokit.rest.reactions.createForIssueComment({ |
| owner, |
| repo, |
| comment_id: payload.comment.id, |
| content: '+1', |
| }); |
| } |
| |
| run().catch(err => { core.setFailed(err); }); |