renovate
Version:
Automated dependency updates. Flexible so you don't need to be.
121 lines (120 loc) • 3.61 kB
JavaScript
import { GlobalConfig } from "../../../../config/global.js";
import { logger } from "../../../../logger/index.js";
import { isScheduledNow } from "../branch/schedule.js";
import { scm } from "../../../../modules/platform/scm.js";
import { platform } from "../../../../modules/platform/index.js";
import { ensureComment, ensureCommentRemoval } from "../../../../modules/platform/comment.js";
import { resolveBranchStatus } from "../branch/status-checks.js";
//#region lib/workers/repository/update/pr/automerge.ts
async function checkAutoMerge(pr, config) {
logger.trace({ config }, "checkAutoMerge");
const { branchName, baseBranch, automergeType, automergeStrategy, pruneBranchAfterAutomerge, automergeComment, ignoreTests, rebaseRequested } = config;
if (!isScheduledNow(config, "automergeSchedule")) {
logger.debug(`PR automerge is off schedule`);
return {
automerged: false,
prAutomergeBlockReason: "off schedule"
};
}
if (config.isConflicted ?? await scm.isBranchConflicted(baseBranch, branchName)) {
logger.debug("PR is conflicted");
return {
automerged: false,
prAutomergeBlockReason: "Conflicted"
};
}
if (!ignoreTests && pr.cannotMergeReason) {
logger.debug(`Platform reported that PR is not ready for merge. Reason: [${pr.cannotMergeReason}]`);
return {
automerged: false,
prAutomergeBlockReason: "PlatformNotReady"
};
}
const branchStatus = await resolveBranchStatus(branchName, !!config.internalChecksAsSuccess, config.ignoreTests);
if (branchStatus !== "green") {
logger.debug(`PR is not ready for merge (branch status is ${branchStatus})`);
return {
automerged: false,
prAutomergeBlockReason: "BranchNotGreen"
};
}
if (await scm.isBranchModified(branchName, baseBranch)) {
logger.debug("PR is ready for automerge but has been modified");
return {
automerged: false,
prAutomergeBlockReason: "BranchModified"
};
}
if (automergeType === "pr-comment") {
logger.debug(`Applying automerge comment: ${automergeComment}`);
// istanbul ignore if
if (GlobalConfig.get("dryRun")) {
logger.info(`DRY-RUN: Would add PR automerge comment to PR #${pr.number}`);
return {
automerged: false,
prAutomergeBlockReason: "DryRun"
};
}
if (rebaseRequested) await ensureCommentRemoval({
type: "by-content",
number: pr.number,
content: automergeComment
});
await ensureComment({
number: pr.number,
topic: null,
content: automergeComment
});
return {
automerged: true,
branchRemoved: false
};
}
// istanbul ignore if
if (GlobalConfig.get("dryRun")) {
logger.info(`DRY-RUN: Would merge PR #${pr.number} with strategy "${automergeStrategy}"`);
return {
automerged: false,
prAutomergeBlockReason: "DryRun"
};
}
logger.debug(`Automerging #${pr.number} with strategy ${automergeStrategy}`);
if (await platform.mergePr({
branchName,
id: pr.number,
strategy: automergeStrategy
})) {
logger.info({
pr: pr.number,
prTitle: pr.title
}, "PR automerged");
if (!pruneBranchAfterAutomerge) {
logger.info("Skipping pruning of merged branch");
return {
automerged: true,
branchRemoved: false
};
}
let branchRemoved = false;
try {
await scm.deleteBranch(branchName);
branchRemoved = true;
} catch (err) /* istanbul ignore next */ {
logger.warn({
branchName,
err
}, "Branch auto-remove failed");
}
return {
automerged: true,
branchRemoved
};
}
return {
automerged: false,
prAutomergeBlockReason: "PlatformRejection"
};
}
//#endregion
export { checkAutoMerge };
//# sourceMappingURL=automerge.js.map