๐Ÿ“ฆ ljharb / can-merge

๐Ÿ“„ evaluatePullRequest.js ยท 49 lines
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'use strict';

const pullRequestStatus = require('./models/pullRequestStatus');
const evaluateChecks = require('./evaluateChecks');
const doesPRHaveConflicts = (pullRequest) => pullRequest.mergeable === 'MERGEABLE';

module.exports = function evaluatePullRequest(response, requiredChecks) {
	if (!response) {
		return false;
	}
	const {
		merged,
		state,
		reviewDecision,
		viewerCanMergeAsAdmin,
	} = response;

	if (state !== 'OPEN') {
		if (merged) {
			return pullRequestStatus.MERGED;
		}
		return pullRequestStatus.CLOSED;
	}

	if (!doesPRHaveConflicts(response)) {
		return pullRequestStatus.CONFLICT;
	}

	if (reviewDecision === 'CHANGES_REQUESTED') {
		return pullRequestStatus.REVIEW_DISAPPROVED;
	}

	if (reviewDecision === 'REVIEW_REQUIRED') {
		return viewerCanMergeAsAdmin ? pullRequestStatus.BYPASSABLE : pullRequestStatus.REVIEW_REQUIRED;
	}

	const { failure, pending } = evaluateChecks(response, requiredChecks);

	if (failure.some((f) => f.isRequired)) {
		return pullRequestStatus.STATUS_FAILURE;
	}

	if (pending.some((p) => p.isRequired)) {
		return pullRequestStatus.STATUS_PENDING;
	}

	return pullRequestStatus.MERGEABLE;
};