renovate
Version:
Automated dependency updates. Flexible so you don't need to be.
124 lines (123 loc) • 5.48 kB
JavaScript
import { addMeta, logger, removeMeta } from "../../../logger/index.js";
import { instrument } from "../../../instrumentation/index.js";
import { getCache } from "../../../util/cache/repository/index.js";
import { incCountValue, setCount } from "../../global/limits.js";
import { scm } from "../../../modules/platform/scm.js";
import { hashMap } from "../../../modules/manager/fingerprint.generated.js";
import "../../../modules/manager/index.js";
import { fingerprint } from "../../../util/fingerprint.js";
import { setBranchNewCommit } from "../../../util/git/set-branch-commit.js";
import { processBranch } from "../update/branch/index.js";
import { upgradeFingerprintFields } from "./fingerprint-fields.js";
import { getCommitsHourlyCount, getConcurrentBranchesCount, getConcurrentPrsCount, getPrHourlyCount } from "./limits.js";
import { isString } from "@sindresorhus/is";
import { ATTR_VCS_REF_BASE_TYPE, ATTR_VCS_REF_HEAD_NAME, ATTR_VCS_REF_TYPE } from "@opentelemetry/semantic-conventions/incubating";
//#region lib/workers/repository/process/write.ts
function generateCommitFingerprintConfig(branch) {
return branch.upgrades.map((upgrade) => {
const filteredUpgrade = {};
for (const field of upgradeFingerprintFields) filteredUpgrade[field] = upgrade[field];
return filteredUpgrade;
});
}
function compareCacheFingerprint(branchState, commitFingerprint) {
if (!branchState.commitFingerprint) {
logger.trace("branch.isUpToDate(): no fingerprint");
return "no-fingerprint";
}
if (commitFingerprint !== branchState.commitFingerprint) {
logger.debug("branch.isUpToDate(): needs recalculation");
return "no-match";
}
logger.debug("branch.isUpToDate(): using cached result \"true\"");
return "matched";
}
async function syncBranchState(branchName, baseBranch) {
logger.debug("syncBranchState()");
const branchSha = await scm.getBranchCommit(branchName);
const baseBranchSha = await scm.getBranchCommit(baseBranch);
const cache = getCache();
cache.branches ??= [];
const { branches: cachedBranches } = cache;
let branchState = cachedBranches.find((br) => br.branchName === branchName);
if (!branchState) {
logger.debug("syncBranchState(): Branch cache not found, creating minimal branchState");
branchState = {
branchName,
sha: branchSha,
baseBranch,
baseBranchSha
};
cachedBranches.push(branchState);
}
if (baseBranch !== branchState.baseBranch) {
logger.debug("syncBranchState(): update baseBranch name");
branchState.baseBranch = baseBranch;
delete branchState.isModified;
branchState.pristine = false;
}
if (baseBranchSha !== branchState.baseBranchSha) {
logger.debug("syncBranchState(): update baseBranchSha");
delete branchState.isBehindBase;
delete branchState.isConflicted;
branchState.baseBranchSha = baseBranchSha;
branchState.pristine = false;
}
if (branchSha !== branchState.sha) {
logger.debug("syncBranchState(): update branchSha");
delete branchState.isBehindBase;
delete branchState.isConflicted;
delete branchState.isModified;
delete branchState.commitFingerprint;
const commitDate = await scm.getBranchUpdateDate(branchName);
if (commitDate) branchState.commitTimestamp = commitDate.toISO();
branchState.sha = branchSha;
branchState.pristine = false;
}
return branchState;
}
async function writeUpdates(config, allBranches) {
const branches = allBranches;
logger.debug(`Processing ${branches.length} branch${branches.length === 1 ? "" : "es"}: ${branches.map((b) => b.branchName).sort().join(", ")}`);
setCount("ConcurrentPRs", await getConcurrentPrsCount(config, branches));
setCount("Branches", await getConcurrentBranchesCount(branches));
setCount("HourlyPRs", await getPrHourlyCount(config));
setCount("HourlyCommits", await getCommitsHourlyCount(branches));
for (const branch of branches) {
const { baseBranch, branchName } = branch;
const res = await instrument(branchName, async () => {
const meta = { branch: branchName };
if (config.baseBranchPatterns?.length && baseBranch) meta.baseBranch = baseBranch;
addMeta(meta);
const branchExisted = await scm.branchExists(branchName);
const branchState = await syncBranchState(branchName, baseBranch);
const managers = [...new Set(branch.upgrades.map((upgrade) => hashMap.get(upgrade.manager) ?? upgrade.manager).filter(isString))].sort();
const commitFingerprint = fingerprint({
commitFingerprintConfig: generateCommitFingerprintConfig(branch),
managers
});
branch.cacheFingerprintMatch = compareCacheFingerprint(branchState, commitFingerprint);
const res = await processBranch(branch);
branch.prBlockedBy = res?.prBlockedBy;
branch.prNo = res?.prNo;
branch.result = res?.result;
branch.commitFingerprint = res?.updatesVerified ? commitFingerprint : branchState.commitFingerprint;
if (res?.commitSha) {
const commitDate = await scm.getBranchUpdateDate(branchName);
setBranchNewCommit(branchName, baseBranch, res.commitSha, commitDate);
}
if (branch.result === "automerged" && branch.automergeType !== "pr-comment") return "automerged";
if (!branchExisted && await scm.branchExists(branch.branchName)) incCountValue("Branches");
}, { attributes: {
[ATTR_VCS_REF_TYPE]: "branch",
[ATTR_VCS_REF_BASE_TYPE]: "branch",
[ATTR_VCS_REF_HEAD_NAME]: branchName
} });
if (res !== void 0) return res;
}
removeMeta(["branch", "baseBranch"]);
return "done";
}
//#endregion
export { writeUpdates };
//# sourceMappingURL=write.js.map