diff --git a/lib/workers/repository/init/apis.spec.ts b/lib/workers/repository/init/apis.spec.ts index c35030fc98e08a331501030753b34c502dcc6bc3..d03c7319e97637474f95b18cbd0ad3960ca70ee8 100644 --- a/lib/workers/repository/init/apis.spec.ts +++ b/lib/workers/repository/init/apis.spec.ts @@ -74,6 +74,19 @@ describe('workers/repository/init/apis', () => { expect(workerPlatformConfig).toBeTruthy(); }); + it('does not throw for forkProcessing=enabled', async () => { + platform.initRepo.mockResolvedValueOnce({ + defaultBranch: 'master', + isFork: true, + repoFingerprint: '123', + }); + platform.getJsonFile.mockResolvedValueOnce({ + forkProcessing: 'enabled', + }); + const workerPlatformConfig = await initApis(config); + expect(workerPlatformConfig).toBeTruthy(); + }); + it('ignores platform.getJsonFile() failures', async () => { platform.initRepo.mockResolvedValueOnce({ defaultBranch: 'master', @@ -91,6 +104,21 @@ describe('workers/repository/init/apis', () => { ).resolves.not.toThrow(); }); + it('throws for fork with platform.getJsonFile() failures', async () => { + platform.initRepo.mockResolvedValueOnce({ + defaultBranch: 'master', + isFork: true, + repoFingerprint: '123', + }); + platform.getJsonFile.mockRejectedValue(new Error()); + await expect( + initApis({ + ...config, + forkProcessing: 'disabled', + }), + ).rejects.toThrow(REPOSITORY_FORKED); + }); + it('uses the onboardingConfigFileName if set', async () => { platform.initRepo.mockResolvedValueOnce({ defaultBranch: 'master', diff --git a/lib/workers/repository/init/apis.ts b/lib/workers/repository/init/apis.ts index fd392a208c5779d018f57fec295eb0da476e3d53..aa2b3261d06546139105ad577aac0f17baa6ae1c 100644 --- a/lib/workers/repository/init/apis.ts +++ b/lib/workers/repository/init/apis.ts @@ -13,7 +13,7 @@ export type WorkerPlatformConfig = RepoResult & Record<string, any>; // TODO #22198 -const defaultConfigFile = (config: RenovateConfig): string => +const getDefaultConfigFile = (config: RenovateConfig): string => configFileNames.includes(config.onboardingConfigFileName!) ? config.onboardingConfigFileName! : configFileNames[0]; @@ -30,7 +30,7 @@ async function validateOptimizeForDisabled( config: RenovateConfig, ): Promise<void> { if (config.optimizeForDisabled) { - const renovateConfig = await getJsonFile(defaultConfigFile(config)); + const renovateConfig = await getJsonFile(getDefaultConfigFile(config)); if (renovateConfig?.enabled === false) { throw new Error(REPOSITORY_DISABLED_BY_CONFIG); } @@ -62,14 +62,31 @@ async function validateOptimizeForDisabled( async function validateIncludeForks(config: RenovateConfig): Promise<void> { if (config.forkProcessing !== 'enabled' && config.isFork) { - const renovateConfig = await getJsonFile(defaultConfigFile(config)); - if ( - renovateConfig?.includeForks !== true && - renovateConfig?.forkProcessing !== 'enabled' - ) { + const defaultConfigFile = getDefaultConfigFile(config); + const repoConfig = await getJsonFile(defaultConfigFile); + if (!repoConfig) { + logger.debug( + `Default config file ${defaultConfigFile} not found in repo`, + ); throw new Error(REPOSITORY_FORKED); } - logger.debug('Repository config enables forks - continuing'); + if (repoConfig.includeForks) { + logger.debug( + `Found legacy setting includeForks in ${defaultConfigFile} - continuing`, + ); + return; + } + if (repoConfig.forkProcessing === 'enabled') { + logger.debug( + `Found forkProcessing=enabled in ${defaultConfigFile} - continuing`, + ); + return; + } + logger.debug( + { config: repoConfig }, + `Default config file ${defaultConfigFile} found in repo but does not enable forks`, + ); + throw new Error(REPOSITORY_FORKED); } }