Skip to content

Commit 75a84c8

Browse files
authored
Create test.yml
1 parent 6a99002 commit 75a84c8

1 file changed

Lines changed: 102 additions & 0 deletions

File tree

.github/workflows/test.yml

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
name: Triage on Comment
2+
3+
on:
4+
issue_comment:
5+
types: [created]
6+
7+
permissions:
8+
issues: write
9+
pull-requests: write
10+
11+
env:
12+
LABEL_AWAITING_TEAM: "Awaiting Team"
13+
LABEL_AWAITING_CUSTOMER: "Awaiting Customer"
14+
APPLY_TO_PULL_REQUESTS: "false"
15+
TEAM_USERNAMES: "" # Comma-separated list, e.g. "user1,user2,user3"
16+
PERMISSION_MODE: "write-access" # Either "users" or "write-access"
17+
18+
jobs:
19+
label-comment:
20+
runs-on: ubuntu-latest
21+
steps:
22+
- name: Check user permissions
23+
id: check-permissions
24+
uses: actions/github-script@v8
25+
with:
26+
script: |
27+
const issueNumber = context.issue.number;
28+
const issueType = github.event.issue.pull_request ? 'PR' : 'Issue';
29+
30+
// Skip if issue is a PR and not configured to support PR
31+
if (issueType === 'PR' && process.env.APPLY_TO_PULL_REQUESTS !== 'true'){
32+
console.log(`Skipping Issue ${issueNumber} is a PR and PRs are not configured.`);
33+
core.setOutput('skip', 'true');
34+
return;
35+
}
36+
37+
// Skip if commenter is a bot
38+
if (context.actor.endsWith('[bot]')) {
39+
console.log(`Skipping bot user: ${context.actor}`);
40+
core.setOutput('skip', 'true');
41+
return;
42+
}
43+
44+
let hasWriteAccess = false;
45+
const permissionMode = process.env.PERMISSION_MODE;
46+
47+
console.log(`Processing ${issueType} #${issueNumber}, commenter: ${context.actor}, mode: ${permissionMode}`);
48+
49+
if (permissionMode === 'users') {
50+
const teamUsernames = process.env.TEAM_USERNAMES;
51+
const userList = teamUsernames ? teamUsernames.split(',').map(u => u.trim()) : [];
52+
hasWriteAccess = !userList.includes(context.actor);
53+
console.log(`Username list mode - User ${context.actor} classified as: ${hasWriteAccess ? 'customer' : 'team member'}`);
54+
} else {
55+
const { data: permission } = await github.rest.repos.getCollaboratorPermissionLevel({
56+
owner: context.repo.owner,
57+
repo: context.repo.repo,
58+
username: context.actor
59+
});
60+
hasWriteAccess = ['admin', 'write'].includes(permission.permission);
61+
console.log(`Write-access mode - User ${context.actor} permission: ${permission.permission}, classified as: ${hasWriteAccess ? 'customer' : 'team member'}`);
62+
}
63+
64+
const labelToAdd = hasWriteAccess ? process.env.LABEL_AWAITING_CUSTOMER : process.env.LABEL_AWAITING_TEAM;
65+
66+
console.log(`${issueType} #${issueNumber}: Will apply label "${labelToAdd}"`);
67+
68+
core.setOutput('label-to-add', labelToAdd);
69+
core.setOutput('skip', 'false');
70+
71+
- name: Update labels
72+
if: steps.check-permissions.outputs.skip == 'false'
73+
uses: actions/github-script@v8
74+
with:
75+
script: |
76+
const issueNumber = context.issue.number;
77+
const labelToAdd = '${{ steps.check-permissions.outputs.label-to-add }}';
78+
const issueType = github.event.issue.pull_request ? 'PR' : 'Issue';
79+
80+
// Get current labels
81+
const { data: issue } = await github.rest.issues.get({
82+
owner: context.repo.owner,
83+
repo: context.repo.repo,
84+
issue_number: issueNumber
85+
});
86+
87+
// Filter out conflicting labels and add new one
88+
const conflictingLabels = [process.env.LABEL_AWAITING_TEAM, process.env.LABEL_AWAITING_CUSTOMER];
89+
const newLabels = issue.labels
90+
.map(label => label.name)
91+
.filter(name => !conflictingLabels.includes(name))
92+
.concat([labelToAdd]);
93+
94+
// Replace all labels atomically
95+
await github.rest.issues.setLabels({
96+
owner: context.repo.owner,
97+
repo: context.repo.repo,
98+
issue_number: issueNumber,
99+
labels: newLabels
100+
});
101+
102+
console.log(`${issueType} #${issueNumber}: Successfully applied label "${labelToAdd}"`);

0 commit comments

Comments
 (0)