generated from ubiquity-os/plugin-template
-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathrun-demo.ts
128 lines (116 loc) · 3.79 KB
/
run-demo.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
123
124
125
126
127
128
import { Context } from "../types";
async function isUserAdmin({ payload, octokit, logger }: Context) {
const username = payload.sender.login;
try {
await octokit.rest.orgs.getMembershipForUser({
org: payload.repository.owner.login,
username,
});
return true;
} catch (e) {
logger.debug(`${username} is not a member of ${payload.repository.owner.login}`, { e });
return false;
}
}
async function openIssue({ octokit, payload }: Context): Promise<void> {
const repo = payload.repository.name;
const issueNumber = payload.issue.number;
const owner = payload.repository.owner.login;
await octokit.rest.issues.update({
owner,
repo,
issue_number: issueNumber,
state: "open",
});
}
async function createPullRequest({ payload, logger, userOctokit, userName }: Context) {
const sourceRepo = payload.repository.name;
const sourceIssueNumber = payload.issue.number;
const sourceOwner = payload.repository.owner.login;
logger.info(`Creating fork for user: ${userName}`);
await userOctokit.rest.repos.createFork({
owner: sourceOwner,
repo: sourceRepo,
});
logger.debug("Waiting for the fork to be ready...");
await new Promise((resolve) => setTimeout(resolve, 5000));
const { data: repoData } = await userOctokit.rest.repos.get({
owner: sourceOwner,
repo: sourceRepo,
});
const defaultBranch = repoData.default_branch;
logger.debug("Repository data", { defaultBranch, repoUrl: repoData.html_url });
const { data: refData } = await userOctokit.rest.git.getRef({
owner: sourceOwner,
repo: sourceRepo,
ref: `heads/${defaultBranch}`,
});
const ref = `fix/${crypto.randomUUID()}`;
await userOctokit.rest.git.createRef({
owner: userName,
repo: sourceRepo,
ref: `refs/heads/${ref}`,
sha: refData.object.sha,
});
const { data: commit } = await userOctokit.rest.git.getCommit({
owner: userName,
repo: sourceRepo,
commit_sha: refData.object.sha,
});
const { data: newCommit } = await userOctokit.rest.git.createCommit({
owner: userName,
repo: sourceRepo,
message: "chore: empty commit",
tree: commit.tree.sha,
parents: [refData.object.sha],
});
await userOctokit.rest.git.updateRef({
owner: userName,
repo: sourceRepo,
ref: `heads/${ref}`,
sha: newCommit.sha,
});
return await userOctokit.rest.pulls.create({
owner: sourceOwner,
repo: sourceRepo,
head: `${userName}:${ref}`,
base: defaultBranch,
body: `Resolves #${sourceIssueNumber}`,
title: ref,
});
}
export async function handleComment(context: Context<"issue_comment.created">) {
const { payload, logger, octokit, userName, userOctokit } = context;
const body = payload.comment.body;
const repo = payload.repository.name;
const owner = payload.repository.owner.login;
const issueNumber = payload.issue.number;
if (body.trim().startsWith("/demo")) {
if (!(await isUserAdmin(context))) {
throw logger.error("You do not have permissions to start the demo. You can set up your own instance at demo.ubq.fi");
}
logger.info("Processing /demo command");
await openIssue(context);
// Create initial comments
await userOctokit.rest.issues.createComment({
owner,
repo,
issue_number: issueNumber,
body: "/start",
});
await userOctokit.rest.issues.createComment({
owner,
repo,
issue_number: issueNumber,
body: "/ask can you help me solving this task by showing the code I should change?",
});
} else if (body.includes("ubiquity-os-command-start-stop") && body.includes(userName)) {
logger.info("Processing ubiquity-os-command-start-stop post comment");
const pr = await createPullRequest(context);
await octokit.rest.pulls.merge({
owner,
repo,
pull_number: pr.data.number,
});
}
}