Skip to content

Commit 9e834f5

Browse files
committed
create comment (dry)
1 parent 4f56773 commit 9e834f5

File tree

1 file changed

+53
-19
lines changed
  • dev-packages/release-comment-issues-gh-action

1 file changed

+53
-19
lines changed

dev-packages/release-comment-issues-gh-action/index.mjs

Lines changed: 53 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,20 @@
11
import * as core from '@actions/core';
2-
import { context, getOctokit } from '@actions/github';
2+
import { context, getOctokit } from '@actions/github';
3+
4+
const RELEASE_COMMENT_HEADING = '## A PR closing this issue has just been released 🚀';
35

46
async function run() {
57
const { getInput } = core;
68

79
const githubToken = getInput('github_token');
8-
const version = getInput('version');
10+
const version = getInput('version');
911

1012
if (!githubToken || !version) {
1113
core.debug('Skipping because github_token or version are empty.');
1214
return;
1315
}
1416

15-
const {owner, repo} = context.repo;
17+
const { owner, repo } = context.repo;
1618

1719
const octokit = getOctokit(githubToken);
1820

@@ -21,34 +23,50 @@ async function run() {
2123
repo,
2224
tag: version,
2325
headers: {
24-
'X-GitHub-Api-Version': '2022-11-28'
25-
}
26+
'X-GitHub-Api-Version': '2022-11-28',
27+
},
2628
});
2729

28-
2930
const prNumbers = extractPrsFromReleaseBody(release.data.body);
3031

31-
if(!prNumbers.length) {
32+
if (!prNumbers.length) {
3233
core.debug('No PRs found in release body.');
3334
return;
3435
}
3536

3637
core.debug(`Found PRs in release body: ${prNumbers.join(', ')}`);
3738

38-
const linkedIssues = await Promise.all(prNumbers.map((prNumber) => getLinkedIssuesForPr(octokit, { repo, owner, prNumber })));
39-
40-
console.log(linkedIssues);
39+
const linkedIssues = await Promise.all(
40+
prNumbers.map(prNumber => getLinkedIssuesForPr(octokit, { repo, owner, prNumber })),
41+
);
4142

42-
for(const pr of linkedIssues) {
43-
if(!pr.issues.length) {
43+
for (const pr of linkedIssues) {
44+
if (!pr.issues.length) {
4445
core.debug(`No linked issues found for PR #${pr.prNumber}`);
4546
continue;
4647
}
4748

4849
core.debug(`Linked issues for PR #${pr.prNumber}: ${pr.issues.map(issue => issue.number).join(',')}`);
49-
}
5050

51+
for (const issue of pr.issues) {
52+
if (await hasExistingComment(octokit, { repo, owner, issueNumber: issue.number })) {
53+
core.debug(`Comment already exists for issue #${issue.number}`);
54+
continue;
55+
}
56+
57+
const body = `${RELEASE_COMMENT_HEADING}\n\nThis issue was closed by PR #${pr.prNumber}, which was included in the [${version} release](https://github.com/${owner}/${repo}/releases/tag/${version}).`;
58+
59+
core.debug(`Creating comment for issue #${issue.number}`);
60+
core.debug(body);
5161

62+
/* await octokit.rest.issues.createComment({
63+
repo,
64+
owner,
65+
issue_number: issue.number,
66+
body,
67+
}); */
68+
}
69+
}
5270
}
5371

5472
/**
@@ -58,10 +76,12 @@ async function run() {
5876
*/
5977
function extractPrsFromReleaseBody(body) {
6078
const regex = /\[#(\d+)\]\(https:\/\/github\.com\/getsentry\/sentry-javascript\/pull\/(?:\d+)\)/gm;
61-
const prNumbers = Array.from(new Set([...body.matchAll(regex)].map((match) => parseInt(match[1]))));
79+
const prNumbers = Array.from(new Set([...body.matchAll(regex)].map(match => parseInt(match[1]))));
80+
81+
return prNumbers.filter(number => !!number && !Number.isNaN(number));
82+
}
6283

63-
return prNumbers.filter(number => !!number && !Number.isNaN(number));
64-
}/**
84+
/**
6585
*
6686
* @param {ReturnType<import('@actions/github').getOctokit>} octokit
6787
* @param {{ repo: string, owner: string, prNumber: number}} options
@@ -92,13 +112,27 @@ query issuesForPr($owner: String!, $repo: String!, $prNumber: Int!) {
92112
},
93113
);
94114

95-
console.log(res);
96-
97115
const issues = res.repository?.pullRequest?.closingIssuesReferences.edges.map(edge => edge.node);
98116
return {
99117
prNumber,
100-
issues
118+
issues,
101119
};
102120
}
103121

122+
/**
123+
*
124+
* @param {ReturnType<import('@actions/github').getOctokit>} octokit
125+
* @param {{ repo: string, owner: string, issueNumber: number}} options
126+
* @returns {Promise<boolean>}
127+
*/
128+
async function hasExistingComment(octokit, { repo, owner, issueNumber }) {
129+
const { data: commentList } = await octokit.rest.issues.listComments({
130+
repo,
131+
owner,
132+
issue_number: issueNumber,
133+
});
134+
135+
return commentList.some(comment => comment.body.startsWith(RELEASE_COMMENT_HEADING));
136+
}
137+
104138
run();

0 commit comments

Comments
 (0)