-
Notifications
You must be signed in to change notification settings - Fork 132
/
mergeable.js
80 lines (68 loc) · 2.25 KB
/
mergeable.js
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
const GitHub = require('github-api');
const Slack = require('@slack/client').WebClient;
const secrets = require('./secrets');
const OPEN_PRS = { state: 'open' }
function Mergeable(secrets) {
this.gitHubSecrets = secrets.gitHub;
this.slackRecipient = secrets.slack.recipient;
this.gitHub = new GitHub(secrets.gitHub.credentials);
this.slack = new Slack(secrets.slack.token);
}
Mergeable.prototype.checkMergeability = function() {
const repo = this.gitHub.getRepo(
this.gitHubSecrets.repoOwner,
this.gitHubSecrets.repoName
);
return repo.listPullRequests(OPEN_PRS)
.then(getIndividualPullRequests(repo))
.then(findUnmergeablePrs)
.then(notifySlack(this.slack, this.slackRecipient));
}
function getIndividualPullRequests(repo) {
return function(listOfPrs) {
const allPrs = listOfPrs.data.map(each => {
return repo.getPullRequest(each.number)
.then(toData);
});
return Promise.all(allPrs);
}
}
function toData(pullRequest) {
return Promise.resolve(pullRequest.data);
}
function findUnmergeablePrs(pullRequests) {
const unmergablePrs = pullRequests.filter(filterUnmergeable);
return Promise.resolve({
isCalculating: unmergablePrs.filter(filterCalculating).length > 0,
prs: unmergablePrs
});
}
const filterUnmergeable = (pr) => !pr.mergeable;
const filterCalculating = (pr) => pr.mergeable === null;
function notifySlack(slack, slackRecipient) {
return function(result) {
console.log(result);
if (result.isCalculating) {
return postToSlack(slack, slackRecipient, calculatingMessage())
.then(Promise.resolve(result));
} else if (result.prs.length === 0) {
return Promise.resolve(result);
} else {
return Promise.all(result.prs.map(each => {
const message = conflictMessage(each);
return postToSlack(slack, slackRecipient, message)
.then(Promise.resolve(result));
}));
}
}
}
function calculatingMessage() {
return `Github is still calculating conflicts ¯\\_(ツ)_/¯`;
}
function conflictMessage(pr) {
return `<${pr.html_url}|${pr.title}> has conflicts with master!`;
}
function postToSlack(slack, slackRecipient, message) {
return slack.chat.postMessage(slackRecipient, message, { as_user: true})
}
module.exports = Mergeable;