Skip to content
Snippets Groups Projects
Commit dd43fb32 authored by Rhys Arkins's avatar Rhys Arkins Committed by GitHub
Browse files

fix: replace repository do-while loop with recursion (#976)

parent cc2288ef
No related branches found
No related tags found
No related merge requests found
...@@ -24,30 +24,26 @@ function pinDependenciesFirst(a, b) { ...@@ -24,30 +24,26 @@ function pinDependenciesFirst(a, b) {
return a.branchName > b.branchName; return a.branchName > b.branchName;
} }
async function renovateRepository(repoConfig, token) { async function renovateRepositoryInner(repoConfig, token, count = 1) {
let config = { ...repoConfig }; let config = { ...repoConfig };
const { logger } = config; const { logger } = config;
config.tmpDir = tmp.dirSync({ unsafeCleanup: true }); // istanbul ignore if
config.errors = []; if (count > 5) {
config.warnings = []; // This is an arbitrary number added in to cut short any unintended infinite recursion
logger.trace({ config }, 'renovateRepository'); throw new Error('Existing renovateRepositoryInner after 5 loops');
try { }
let branchList; logger.info(`renovateRepository loop ${count}`);
let baseBranchUpdated; let branchList = [];
let loopCount = 1;
do {
logger.debug(`renovateRepository loop ${loopCount}`);
baseBranchUpdated = false;
config = await apis.initApis(config, token); config = await apis.initApis(config, token);
config = await apis.mergeRenovateJson(config); config = await apis.mergeRenovateJson(config);
if (config.enabled === false) { if (config.enabled === false) {
logger.debug('repository is disabled'); logger.debug('repository is disabled');
await cleanup.pruneStaleBranches(config, []); await cleanup.pruneStaleBranches(config, []);
return; return null;
} }
if (config.isFork && !config.renovateJsonPresent) { if (config.isFork && !config.renovateJsonPresent) {
logger.debug('repository is a fork and not manually configured'); logger.debug('repository is a fork and not manually configured');
return; return null;
} }
if (config.baseBranch) { if (config.baseBranch) {
// Renovate should read content and target PRs here // Renovate should read content and target PRs here
...@@ -86,11 +82,14 @@ async function renovateRepository(repoConfig, token) { ...@@ -86,11 +82,14 @@ async function renovateRepository(repoConfig, token) {
throw new Error('no package files'); throw new Error('no package files');
} }
} }
return; return null;
} }
logger.debug( logger.info(
`Detected ${config.packageFiles {
.length} package files: ${config.packageFiles}` packageFiles: config.packageFiles,
count: config.packageFiles.length,
},
`Detected package files`
); );
} }
logger.debug('Resolving package files and content'); logger.debug('Resolving package files and content');
...@@ -113,6 +112,7 @@ async function renovateRepository(repoConfig, token) { ...@@ -113,6 +112,7 @@ async function renovateRepository(repoConfig, token) {
// eslint-disable-next-line no-loop-function // eslint-disable-next-line no-loop-function
branchUpgrades.sort(pinDependenciesFirst); branchUpgrades.sort(pinDependenciesFirst);
const branchStartTime = process.hrtime(); const branchStartTime = process.hrtime();
branchList = branchUpgrades.map(upgrade => upgrade.branchName);
for (const branchUpgrade of branchUpgrades) { for (const branchUpgrade of branchUpgrades) {
const branchResult = await branchWorker.processBranch( const branchResult = await branchWorker.processBranch(
branchUpgrade, branchUpgrade,
...@@ -122,32 +122,42 @@ async function renovateRepository(repoConfig, token) { ...@@ -122,32 +122,42 @@ async function renovateRepository(repoConfig, token) {
if (branchResult === 'automerged') { if (branchResult === 'automerged') {
// Stop procesing other branches because base branch has been changed by an automerge // Stop procesing other branches because base branch has been changed by an automerge
logger.info('Restarting repo renovation after automerge'); logger.info('Restarting repo renovation after automerge');
baseBranchUpdated = true; return renovateRepositoryInner(repoConfig, token, count + 1);
break;
} else if (branchResult === 'lockFileError') { } else if (branchResult === 'lockFileError') {
logger.info('Lock file error - stopping branch updates'); logger.info('Lock file error - stopping branch updates');
break; return branchList;
} else if (branchUpgrade.type === 'pin') { } else if (branchUpgrade.type === 'pin') {
logger.info( logger.info(
'Stopping branch processing until Pin Dependencies is merged' 'Stopping branch processing until Pin Dependencies is merged'
); );
break; return branchList;
} }
} }
logger.info( logger.info(
{ seconds: convertHrTime(process.hrtime(branchStartTime)).seconds }, { seconds: convertHrTime(process.hrtime(branchStartTime)).seconds },
'Finished updating branches' 'Finished updating branches'
); );
branchList = branchUpgrades.map(upgrade => upgrade.branchName);
logger.debug(`branchList=${branchList}`);
} else { } else {
await onboarding.ensurePr(config, branchUpgrades); await onboarding.ensurePr(config, branchUpgrades);
logger.info('"Configure Renovate" PR needs to be closed first'); logger.info('"Configure Renovate" PR needs to be closed first');
branchList = [`${config.branchPrefix}configure`]; branchList = [`${config.branchPrefix}configure`];
} }
loopCount += 1; logger.debug(`branchList=${branchList}`);
} while (baseBranchUpdated); return branchList;
}
async function renovateRepository(repoConfig, token) {
const config = { ...repoConfig };
const { logger } = config;
logger.trace({ config }, 'renovateRepository');
config.tmpDir = tmp.dirSync({ unsafeCleanup: true });
config.errors = [];
config.warnings = [];
try {
const branchList = await renovateRepositoryInner(config, token);
if (branchList) {
await cleanup.pruneStaleBranches(config, branchList); await cleanup.pruneStaleBranches(config, branchList);
}
} catch (err) { } catch (err) {
// Swallow this error so that other repositories can be processed // Swallow this error so that other repositories can be processed
if (err.message === 'uninitiated') { if (err.message === 'uninitiated') {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment