Skip to content

Commit d4e5e66

Browse files
committed
Add stale issues workflow
1 parent 2fe2445 commit d4e5e66

File tree

1 file changed

+107
-0
lines changed

1 file changed

+107
-0
lines changed

.github/workflows/stale.yml

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
name: stale-bot
2+
3+
on:
4+
schedule:
5+
# run every day at midnight
6+
- cron: "0 0 * * *"
7+
issue_comment:
8+
types: ["created"]
9+
10+
jobs:
11+
stale-bot:
12+
runs-on: ubuntu-latest
13+
steps:
14+
- name: Mark stale
15+
if: github.event_name == 'schedule'
16+
uses: actions/github-script@v3
17+
with:
18+
github-token: ${{github.token}}
19+
script: |
20+
// Get a list of all open issues labeled `waiting for feedback`
21+
const opts = github.issues.listForRepo.endpoint.merge({
22+
...context.repo,
23+
state: 'open',
24+
labels: ['waiting for feedback'],
25+
});
26+
const issues = await github.paginate(opts);
27+
28+
// Set this value to whatever makes sense for the repo.
29+
let elapsedDays = 30
30+
31+
let elapsed = elapsedDays * 24 * 60 * 60 * 1000;
32+
let now = new Date().getTime();
33+
for (const issue of issues) {
34+
// If an issue was active in the past 15 days, leave it alone.
35+
if (now - new Date(issue.updated_at).getTime() < elapsed) {
36+
continue;
37+
}
38+
39+
// If we're here, we've been waiting for feedback for more than
40+
// 15 days, mark as stale.
41+
github.issues.addLabels({
42+
...context.repo,
43+
issue_number: issue.number,
44+
labels: ['stale']
45+
});
46+
}
47+
48+
- name: Mark active
49+
if: github.event_name == 'issue_comment'
50+
uses: actions/github-script@v3
51+
with:
52+
github-token: ${{github.token}}
53+
script: |
54+
// Every time a comment is added to an issue, close it if it contains
55+
// the `stale` label.
56+
57+
// Load issue's labels.
58+
const opts = github.issues.listLabelsOnIssue.endpoint.merge({
59+
...context.repo,
60+
issue_number: context.issue.number
61+
});
62+
const labels = await github.paginate(opts);
63+
64+
// Search for `stale`.
65+
for (const label of labels) {
66+
if (label.name === 'stale') {
67+
await github.issues.removeLabel({
68+
...context.repo,
69+
issue_number: context.issue.number,
70+
name: 'stale'
71+
})
72+
return;
73+
}
74+
}
75+
76+
- name: Close stale
77+
if: github.event_name == 'schedule'
78+
uses: actions/github-script@v3
79+
with:
80+
github-token: ${{github.token}}
81+
script: |
82+
// Load all the `stale` issues
83+
const opts = github.issues.listForRepo.endpoint.merge({
84+
...context.repo,
85+
state: 'open',
86+
labels: ['stale'],
87+
});
88+
const issues = await github.paginate(opts);
89+
90+
// Set this value to whatever makes sense for the repo.
91+
let elapsedDays = 15;
92+
93+
let elapsed = elapsedDays * 24 * 60 * 60 * 1000;
94+
let now = new Date().getTime();
95+
for (const issue of issues) {
96+
// If an issue was stale for less than elapsed time, leave it alone.
97+
if (now - new Date(issue.updated_at).getTime() < elapsed) {
98+
continue;
99+
}
100+
101+
// Close the stale issue.
102+
await github.issues.update({
103+
...context.repo,
104+
issue_number: issue.number,
105+
state: 'closed'
106+
});
107+
}

0 commit comments

Comments
 (0)