@@ -30,43 +30,44 @@ async function removeDuplicateIssues() {
30
30
31
31
for ( const issue of onlyIssues ) {
32
32
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 ) ;
35
36
}
37
+ }
36
38
37
- const existingIssue = issuesByTitle . get ( issue . title ) ;
39
+ for ( const [ title , duplicateIssues ] of issuesByTitle ) {
40
+ if ( duplicateIssues . length === 1 ) continue ;
38
41
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 ) ) ;
40
43
41
- let issueToClose ;
44
+ console . log ( `\nFound ${ duplicateIssues . length - 1 } duplicates for issue # ${ originalIssue . number } " ${ title } "` ) ;
42
45
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
+ }
49
50
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
+ }
66
68
}
67
69
68
- console . log ( `Removed ${ counter } issues` ) ;
69
- console . log ( 'Duplicate removal process completed' ) ;
70
+ console . log ( `\nDuplicate removal process completed; ${ counter } issues closed` ) ;
70
71
} catch ( error ) {
71
72
console . log ( `Failed to remove duplicate issues: ${ error . stack } ` ) ;
72
73
process . exit ( 1 ) ;
0 commit comments