-
Notifications
You must be signed in to change notification settings - Fork 2.1k
/
automerge.ts
91 lines (90 loc) · 2.56 KB
/
automerge.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
import { getAdminConfig } from '../../config/admin';
import { logger } from '../../logger';
import { Pr, platform } from '../../platform';
import { BranchStatus } from '../../types';
import { isBranchModified } from '../../util/git';
import { BranchConfig } from '../types';
export async function checkAutoMerge(
pr: Pr,
config: BranchConfig
): Promise<boolean> {
logger.trace({ config }, 'checkAutoMerge');
const {
branchName,
automerge,
automergeType,
automergeComment,
requiredStatusChecks,
rebaseRequested,
} = config;
logger.debug(
{ automerge, automergeType, automergeComment },
`Checking #${pr.number} for automerge`
);
if (automerge) {
logger.debug('PR is configured for automerge');
// Return if PR not ready for automerge
if (pr.isConflicted) {
logger.debug('PR is conflicted');
logger.debug({ pr });
return false;
}
if (requiredStatusChecks && pr.canMerge !== true) {
logger.debug(
{ canMergeReason: pr.canMergeReason },
'PR is not ready for merge'
);
return false;
}
const branchStatus = await platform.getBranchStatus(
branchName,
requiredStatusChecks
);
if (branchStatus !== BranchStatus.green) {
logger.debug(
`PR is not ready for merge (branch status is ${branchStatus})`
);
return false;
}
// Check if it's been touched
if (await isBranchModified(branchName)) {
logger.debug('PR is ready for automerge but has been modified');
return false;
}
if (automergeType === 'pr-comment') {
logger.debug(`Applying automerge comment: ${automergeComment}`);
// istanbul ignore if
if (getAdminConfig().dryRun) {
logger.info(
`DRY-RUN: Would add PR automerge comment to PR #${pr.number}`
);
return false;
}
if (rebaseRequested) {
await platform.ensureCommentRemoval({
number: pr.number,
content: automergeComment,
});
}
return platform.ensureComment({
number: pr.number,
topic: null,
content: automergeComment,
});
}
// Let's merge this
logger.debug(`Automerging #${pr.number}`);
// istanbul ignore if
if (getAdminConfig().dryRun) {
logger.info(`DRY-RUN: Would merge PR #${pr.number}`);
return false;
}
const res = await platform.mergePr(pr.number, branchName);
if (res) {
logger.info({ pr: pr.number, prTitle: pr.title }, 'PR automerged');
}
return res;
}
logger.debug('No automerge');
return false;
}