-
Notifications
You must be signed in to change notification settings - Fork 202
/
postOrUpdateComment.ts
122 lines (104 loc) · 3.28 KB
/
postOrUpdateComment.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/**
* Copyright 2020 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { endGroup, startGroup } from "@actions/core";
import type { GitHub } from "@actions/github/lib/utils";
import { Context } from "@actions/github/lib/context";
import {
ChannelSuccessResult,
interpretChannelDeployResult,
ErrorResult,
} from "./deploy";
import { createDeploySignature } from "./hash";
const BOT_SIGNATURE =
"<sub>🔥 via [Firebase Hosting GitHub Action](https://github.com/marketplace/actions/deploy-to-firebase-hosting) 🌎</sub>";
export function createBotCommentIdentifier(signature: string) {
return function isCommentByBot(comment): boolean {
return comment.user.type === "Bot" && comment.body.includes(signature);
};
}
export function getURLsMarkdownFromChannelDeployResult(
result: ChannelSuccessResult
): string {
const { urls } = interpretChannelDeployResult(result);
return urls.length === 1
? `[${urls[0]}](${urls[0]})`
: urls.map((url) => `- [${url}](${url})`).join("\n");
}
export function getChannelDeploySuccessComment(
result: ChannelSuccessResult,
commit: string
) {
const deploySignature = createDeploySignature(result);
const urlList = getURLsMarkdownFromChannelDeployResult(result);
const { expireTime } = interpretChannelDeployResult(result);
return `
Visit the preview URL for this PR (updated for commit ${commit}):
${urlList}
<sub>(expires ${new Date(expireTime).toUTCString()})</sub>
${BOT_SIGNATURE}
<sub>Sign: ${deploySignature}</sub>`.trim();
}
export async function postChannelSuccessComment(
github: InstanceType<typeof GitHub>,
context: Context,
result: ChannelSuccessResult,
commit: string
) {
const commentInfo = {
...context.repo,
issue_number: context.issue.number,
};
const commentMarkdown = getChannelDeploySuccessComment(result, commit);
const comment = {
...commentInfo,
body: commentMarkdown,
};
startGroup(`Commenting on PR`);
const deploySignature = createDeploySignature(result);
const isCommentByBot = createBotCommentIdentifier(deploySignature);
let commentId;
try {
const comments = (await github.issues.listComments(commentInfo)).data;
for (let i = comments.length; i--; ) {
const c = comments[i];
if (isCommentByBot(c)) {
commentId = c.id;
break;
}
}
} catch (e) {
console.log("Error checking for previous comments: " + e.message);
}
if (commentId) {
try {
await github.issues.updateComment({
...context.repo,
comment_id: commentId,
body: comment.body,
});
} catch (e) {
commentId = null;
}
}
if (!commentId) {
try {
await github.issues.createComment(comment);
} catch (e) {
console.log(`Error creating comment: ${e.message}`);
}
}
endGroup();
}