Skip to content

Commit 4899a46

Browse files
committed
Close duplicates with link to original issue
1 parent 636c49b commit 4899a46

File tree

1 file changed

+30
-29
lines changed

1 file changed

+30
-29
lines changed

scripts/reporter/duplicate/index.js

Lines changed: 30 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -30,43 +30,44 @@ async function removeDuplicateIssues() {
3030

3131
for (const issue of onlyIssues) {
3232
if (!issuesByTitle.has(issue.title)) {
33-
issuesByTitle.set(issue.title, issue);
34-
continue;
33+
issuesByTitle.set(issue.title, [issue]);
34+
} else {
35+
issuesByTitle.get(issue.title).push(issue);
3536
}
37+
}
3638

37-
const existingIssue = issuesByTitle.get(issue.title);
39+
for (const [ title, duplicateIssues ] of issuesByTitle) {
40+
if (duplicateIssues.length === 1) continue;
3841

39-
console.log(`Found duplicate for issue "${issue.title}"`);
42+
const originalIssue = duplicateIssues.reduce((oldest, current) => (new Date(current.created_at) < new Date(oldest.created_at) ? current : oldest));
4043

41-
let issueToClose;
44+
console.log(`\nFound ${duplicateIssues.length - 1} duplicates for issue #${originalIssue.number} "${title}"`);
4245

43-
if (new Date(issue.created_at) > new Date(existingIssue.created_at)) {
44-
issueToClose = issue;
45-
} else {
46-
issueToClose = existingIssue;
47-
issuesByTitle.set(issue.title, issue);
48-
}
46+
for (const issue of duplicateIssues) {
47+
if (issue.number === originalIssue.number) {
48+
continue;
49+
}
4950

50-
await octokit.request('PATCH /repos/{owner}/{repo}/issues/{issue_number}', { /* eslint-disable-line no-await-in-loop */
51-
owner,
52-
repo,
53-
issue_number: issueToClose.number,
54-
state: 'closed',
55-
});
56-
57-
await octokit.request('POST /repos/{owner}/{repo}/issues/{issue_number}/comments', { /* eslint-disable-line no-await-in-loop */
58-
owner,
59-
repo,
60-
issue_number: issueToClose.number,
61-
body: 'Closed duplicate issue.',
62-
});
63-
64-
counter++;
65-
console.log(`Closed issue #${issueToClose.number}: ${issueToClose.html_url}`);
51+
await octokit.request('PATCH /repos/{owner}/{repo}/issues/{issue_number}', { /* eslint-disable-line no-await-in-loop */
52+
owner,
53+
repo,
54+
issue_number: issue.number,
55+
state: 'closed',
56+
});
57+
58+
await octokit.request('POST /repos/{owner}/{repo}/issues/{issue_number}/comments', { /* eslint-disable-line no-await-in-loop */
59+
owner,
60+
repo,
61+
issue_number: issue.number,
62+
body: `Closing duplicate issue. Original issue: #${originalIssue.number}`,
63+
});
64+
65+
counter++;
66+
console.log(`Closed issue #${issue.number}: ${issue.html_url}`);
67+
}
6668
}
6769

68-
console.log(`Removed ${counter} issues`);
69-
console.log('Duplicate removal process completed');
70+
console.log(`\nDuplicate removal process completed; ${counter} issues closed`);
7071
} catch (error) {
7172
console.log(`Failed to remove duplicate issues: ${error.stack}`);
7273
process.exit(1);

0 commit comments

Comments
 (0)