From 254d08fcbd632cbfce2de50502846fa0e995b4cb Mon Sep 17 00:00:00 2001 From: Rhys Arkins <rhys@arkins.net> Date: Sat, 10 Apr 2021 19:41:39 +0200 Subject: [PATCH] fix(config): migrate nested config (#9489) Adds an extra migration step after resolving config in order to migrate nested presets. Closes #8579 --- lib/workers/repository/init/config.spec.ts | 23 ++++++++++++++++++++++ lib/workers/repository/init/config.ts | 9 ++++++++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/lib/workers/repository/init/config.spec.ts b/lib/workers/repository/init/config.spec.ts index 6ccdda752b..a28ca94ba8 100644 --- a/lib/workers/repository/init/config.spec.ts +++ b/lib/workers/repository/init/config.spec.ts @@ -6,6 +6,7 @@ import { mocked, } from '../../../../test/util'; import * as _migrateAndValidate from '../../../config/migrate-validate'; +import * as _migrate from '../../../config/migration'; import { checkForRepoConfigError, detectRepoFileConfig, @@ -15,6 +16,7 @@ import { jest.mock('../../../util/fs'); jest.mock('../../../util/git'); +const migrate = mocked(_migrate); const migrateAndValidate = mocked(_migrateAndValidate); let config: RenovateConfig; @@ -25,6 +27,7 @@ beforeEach(() => { config.warnings = []; }); +jest.mock('../../../config/migration'); jest.mock('../../../config/migrate-validate'); describe('workers/repository/init/config', () => { @@ -99,6 +102,12 @@ describe('workers/repository/init/config', () => { }); }); describe('mergeRenovateConfig()', () => { + beforeEach(() => { + migrate.migrateConfig.mockReturnValue({ + isMigrated: false, + migratedConfig: {}, + }); + }); it('throws error if misconfigured', async () => { git.getFileList.mockResolvedValue(['package.json', '.renovaterc.json']); fs.readLocalFile.mockResolvedValue('{}'); @@ -114,6 +123,20 @@ describe('workers/repository/init/config', () => { expect(e).toBeDefined(); expect(e).toMatchSnapshot(); }); + it('migrates nested config', async () => { + git.getFileList.mockResolvedValue(['renovate.json']); + fs.readLocalFile.mockResolvedValue('{}'); + migrateAndValidate.migrateAndValidate.mockResolvedValue({ + warnings: [], + errors: [], + }); + migrate.migrateConfig.mockReturnValueOnce({ + isMigrated: true, + migratedConfig: {}, + }); + config.extends = [':automergeDisabled']; + expect(await mergeRenovateConfig(config)).not.toBeUndefined(); + }); it('continues if no errors', async () => { git.getFileList.mockResolvedValue(['package.json', '.renovaterc.json']); fs.readLocalFile.mockResolvedValue('{}'); diff --git a/lib/workers/repository/init/config.ts b/lib/workers/repository/init/config.ts index 634c3a7f5a..3c055fa863 100644 --- a/lib/workers/repository/init/config.ts +++ b/lib/workers/repository/init/config.ts @@ -7,6 +7,7 @@ import { RenovateConfig, mergeChildConfig } from '../../../config'; import { configFileNames } from '../../../config/app-strings'; import { decryptConfig } from '../../../config/decrypt'; import { migrateAndValidate } from '../../../config/migrate-validate'; +import { migrateConfig } from '../../../config/migration'; import * as presets from '../../../config/presets'; import { CONFIG_VALIDATION, @@ -186,10 +187,16 @@ export async function mergeRenovateConfig( npmApi.setNpmrc(decryptedConfig.npmrc); } // Decrypt after resolving in case the preset contains npm authentication instead - const resolvedConfig = decryptConfig( + let resolvedConfig = decryptConfig( await presets.resolveConfigPresets(decryptedConfig, config) ); logger.trace({ config: resolvedConfig }, 'resolved config'); + const migrationResult = migrateConfig(resolvedConfig); + if (migrationResult.isMigrated) { + logger.debug('Resolved config needs migrating'); + logger.trace({ config: resolvedConfig }, 'resolved config after migrating'); + resolvedConfig = migrationResult.migratedConfig; + } // istanbul ignore if if (is.string(resolvedConfig.npmrc)) { logger.debug( -- GitLab