diff --git a/lib/manager/common.ts b/lib/manager/common.ts index 1cb67931e68cba04e7c0f5fe0687674f3842ff8c..57f36f7453c781cb0c4e49ef918f1a3eb5650fba 100644 --- a/lib/manager/common.ts +++ b/lib/manager/common.ts @@ -158,6 +158,7 @@ export interface PackageDependency<T = Record<string, any>> extends Package<T> { digestOneAndOnly?: boolean; displayFrom?: string; displayTo?: string; + fixedVersion?: string; fromVersion?: string; lockedVersion?: string; propSource?: string; diff --git a/lib/util/cache/repository/index.ts b/lib/util/cache/repository/index.ts index 0612ab0dc690dc776d6dc983618a9df56a62fd81..9258fbc2ded9e3bbdc2aef0e562ba23b78b2d9ca 100644 --- a/lib/util/cache/repository/index.ts +++ b/lib/util/cache/repository/index.ts @@ -11,7 +11,30 @@ export interface BaseBranchCache { packageFiles: PackageFile[]; // extract result } +export interface BranchUpgradeCache { + currentDigest?: string; + currentValue?: string; + datasource?: string; + depName?: string; + fixedVersion?: string; + fromVersion?: string; + lookupName?: string; + newDigest?: string; + newValue?: string; + toVersion?: string; +} + +export interface BranchCache { + automerge: boolean; + branchName: string; + isModified: boolean; + prNo: number | null; + sha: string | null; + upgrades: BranchUpgradeCache[]; +} + export interface Cache { + branches?: BranchCache[]; repository?: string; init?: RepoInitConfig; scan?: Record<string, BaseBranchCache>; diff --git a/lib/workers/repository/cache.ts b/lib/workers/repository/cache.ts new file mode 100644 index 0000000000000000000000000000000000000000..932571f61ee74d7d4436d0a6d324a62f79f69c75 --- /dev/null +++ b/lib/workers/repository/cache.ts @@ -0,0 +1,67 @@ +/* istanbul ignore file */ + +import { logger } from '../../logger'; +import { platform } from '../../platform'; +import { + BranchCache, + BranchUpgradeCache, + getCache, +} from '../../util/cache/repository'; +import { getBranchCommit, isBranchModified } from '../../util/git'; +import { BranchConfig, BranchUpgradeConfig } from '../common'; + +function generateBranchUpgradeCache( + upgrade: BranchUpgradeConfig +): BranchUpgradeCache { + const { + datasource, + depName, + lookupName, + fixedVersion, + fromVersion, + toVersion, + currentDigest, + newDigest, + } = upgrade; + return { + datasource, + depName, + lookupName, + fixedVersion, + fromVersion, + toVersion, + currentDigest, + newDigest, + }; +} + +async function generateBranchCache(branch: BranchConfig): Promise<BranchCache> { + const { branchName } = branch; + try { + const sha = getBranchCommit(branchName) || null; + let prNo = null; + if (sha) { + const branchPr = await platform.getBranchPr(branchName); + if (branchPr) { + prNo = branchPr.number; + } + } + const automerge = !!branch.automerge; + const isModified = await isBranchModified(branchName); + const upgrades: BranchUpgradeCache[] = branch.upgrades + ? branch.upgrades.map(generateBranchUpgradeCache) + : []; + return { branchName, sha, prNo, automerge, isModified, upgrades }; + } catch (err) { + logger.error({ err, branchName }, 'Error generating branch cache'); + return null; + } +} + +export async function setBranchCache(branches: BranchConfig[]): Promise<void> { + const branchCache: BranchCache[] = []; + for (const branch of branches) { + branchCache.push(await generateBranchCache(branch)); + } + getCache().branches = branchCache.filter(Boolean); +} diff --git a/lib/workers/repository/index.ts b/lib/workers/repository/index.ts index 07c297529aee37764e05a14598f18675cc833e5e..97a97dabc19aa418579250c672d14b9b1742f0ae 100644 --- a/lib/workers/repository/index.ts +++ b/lib/workers/repository/index.ts @@ -3,6 +3,7 @@ import { RenovateConfig } from '../../config'; import { logger, setMeta } from '../../logger'; import { deleteLocalFile } from '../../util/fs'; import { addSplit, getSplits, splitInit } from '../../util/split'; +import { setBranchCache } from './cache'; import { ensureMasterIssue } from './dependency-dashboard'; import handleError from './error'; import { finaliseRepo } from './finalise'; @@ -41,6 +42,7 @@ export async function renovateRepository( await ensureOnboardingPr(config, packageFiles, branches); const res = await updateRepo(config, branches); addSplit('update'); + await setBranchCache(branches); if (res !== 'automerged') { await ensureMasterIssue(config, branches); }