renovate
Version:
Automated dependency updates. Flexible so you don't need to be.
96 lines (95 loc) • 3.88 kB
JavaScript
import { logger } from "../../../../logger/index.js";
import { scm } from "../../../../modules/platform/scm.js";
import { platform } from "../../../../modules/platform/index.js";
//#region lib/workers/repository/update/branch/reuse.ts
async function shouldKeepUpdated(config, _baseBranch, _branchName) {
const keepUpdatedLabel = config.keepUpdatedLabel;
if (!keepUpdatedLabel) return false;
if ((await platform.getBranchPr(config.branchName, config.baseBranch))?.labels?.includes(keepUpdatedLabel)) return true;
return false;
}
async function shouldReuseExistingBranch(config) {
const { baseBranch, branchName } = config;
const result = {
...config,
reuseExistingBranch: false
};
const keepUpdated = await shouldKeepUpdated(result, baseBranch, branchName);
await determineRebaseWhenValue(result, keepUpdated);
if (!await scm.branchExists(branchName)) {
logger.debug(`Branch needs creating`);
return result;
}
logger.debug(`Branch already exists`);
if (result.rebaseWhen === "behind-base-branch" || keepUpdated) {
if (await scm.isBranchBehindBase(branchName, baseBranch)) {
logger.debug(`Branch is behind base branch and needs rebasing`);
if (await scm.isBranchModified(branchName, baseBranch)) {
logger.debug("Cannot rebase branch as it has been modified");
result.reuseExistingBranch = true;
result.isModified = true;
return result;
}
logger.debug("Branch is unmodified, so can be rebased");
return result;
}
logger.debug("Branch is up-to-date");
} else logger.debug(`Skipping behind base branch check due to rebaseWhen=${result.rebaseWhen}`);
result.isConflicted = await scm.isBranchConflicted(baseBranch, branchName);
if (result.isConflicted) {
logger.debug("Branch is conflicted");
if (await scm.isBranchModified(branchName, baseBranch) === false) {
logger.debug(`Branch is not mergeable and needs rebasing`);
if (result.rebaseWhen === "never" && !keepUpdated) {
logger.debug("Rebasing disabled by config");
result.reuseExistingBranch = true;
result.isModified = false;
}
return result;
}
logger.debug(`Branch is not mergeable but can't be rebased`);
}
logger.debug(`Branch does not need rebasing`);
const groupedByPackageFile = {};
for (const upgrade of result.upgrades) {
const packageFile = upgrade.packageFile;
groupedByPackageFile[packageFile] ??= /* @__PURE__ */ new Set();
groupedByPackageFile[packageFile].add(upgrade.rangeStrategy);
if (groupedByPackageFile[packageFile].size > 1 && groupedByPackageFile[packageFile].has("update-lockfile")) {
logger.debug(`Detected multiple rangeStrategies along with update-lockfile`);
result.reuseExistingBranch = false;
result.isModified = false;
return result;
}
}
result.reuseExistingBranch = true;
result.isModified = false;
return result;
}
/**
* This method updates rebaseWhen value when it's set to auto(default) or automerging
*
* @param result BranchConfig
* @param keepUpdated boolean
*/
async function determineRebaseWhenValue(result, keepUpdated) {
if (result.rebaseWhen === "auto" || result.rebaseWhen === "automerging") {
let reason;
let newValue = "behind-base-branch";
if (result.automerge === true) reason = "automerge=true";
else if (keepUpdated) reason = "keep-updated label is set";
else if (result.rebaseWhen === "automerging") {
newValue = "never";
reason = "no keep-updated label and automerging is set";
} else if (await platform.getBranchForceRebase?.(result.baseBranch)) reason = "platform is configured to require up-to-date branches";
else {
newValue = "conflicted";
reason = "no rule for behind-base-branch applies";
}
logger.debug(`Converting rebaseWhen=${result.rebaseWhen} to rebaseWhen=${newValue} because ${reason}`);
result.rebaseWhen = newValue;
}
}
//#endregion
export { shouldReuseExistingBranch };
//# sourceMappingURL=reuse.js.map