From c6135980055549d21f756296982754a93dd54aec Mon Sep 17 00:00:00 2001 From: RahulGautamSingh Date: Mon, 23 Feb 2026 01:00:31 +0530 Subject: [PATCH 1/4] refactor: move requireConfig to InheritConfig --- lib/config/global.ts | 1 + lib/config/inherit.ts | 1 + lib/config/types.ts | 1 + lib/workers/repository/init/merge.spec.ts | 3 +++ lib/workers/repository/init/merge.ts | 4 ++-- .../repository/onboarding/branch/check.spec.ts | 2 +- .../repository/onboarding/branch/check.ts | 14 ++++++++++---- .../repository/onboarding/branch/index.spec.ts | 17 ++++++++++++++++- .../repository/onboarding/pr/index.spec.ts | 6 ++++++ lib/workers/repository/onboarding/pr/index.ts | 2 +- 10 files changed, 42 insertions(+), 9 deletions(-) diff --git a/lib/config/global.ts b/lib/config/global.ts index 93b834f728a..7884c0965ba 100644 --- a/lib/config/global.ts +++ b/lib/config/global.ts @@ -45,6 +45,7 @@ export class GlobalConfig { 'platform', 'presetCachePersistence', 'repositoryCacheForceLocal', + 'requireConfig', 's3Endpoint', 's3PathStyle', 'toolSettings', diff --git a/lib/config/inherit.ts b/lib/config/inherit.ts index 31dc8e9c8c4..909a118f823 100644 --- a/lib/config/inherit.ts +++ b/lib/config/inherit.ts @@ -9,6 +9,7 @@ export class InheritConfig { 'onboardingAutoCloseAge', 'onboardingBranch', 'onboardingPrTitle', + 'requireConfig', ]; private static config: GlobalInheritableConfig = {}; diff --git a/lib/config/types.ts b/lib/config/types.ts index 4e1f27a1bef..9e35e809f5e 100644 --- a/lib/config/types.ts +++ b/lib/config/types.ts @@ -168,6 +168,7 @@ export interface GlobalInheritableConfig { onboardingAutoCloseAge?: number; onboardingBranch?: string; onboardingPrTitle?: string; + requireConfig?: RequiredConfig; } // Config options used only within the global worker diff --git a/lib/workers/repository/init/merge.spec.ts b/lib/workers/repository/init/merge.spec.ts index e60a0fb8d7f..3a18fdc34c2 100644 --- a/lib/workers/repository/init/merge.spec.ts +++ b/lib/workers/repository/init/merge.spec.ts @@ -4,6 +4,7 @@ import type { RenovateConfig } from '~test/util.ts'; import { fs, logger, partial, platform, scm } from '~test/util.ts'; import * as decrypt from '../../../config/decrypt.ts'; import { getConfig } from '../../../config/defaults.ts'; +import { GlobalConfig } from '../../../config/global.ts'; import * as _migrateAndValidate from '../../../config/migrate-validate.ts'; import * as _migrate from '../../../config/migration.ts'; import type { AllConfig } from '../../../config/types.ts'; @@ -44,6 +45,7 @@ function mockProcessExitOnce(): [MockInstance, Error] { beforeEach(() => { memCache.init(); + GlobalConfig.reset(); config = getConfig(); config.errors = []; config.warnings = []; @@ -387,6 +389,7 @@ describe('workers/repository/init/merge', () => { warnings: [], errors: [], }); + GlobalConfig.set({ requireConfig: 'ignored' }); expect( await mergeRenovateConfig({ ...config, diff --git a/lib/workers/repository/init/merge.ts b/lib/workers/repository/init/merge.ts index de0c9e476b1..b2a85acdd48 100644 --- a/lib/workers/repository/init/merge.ts +++ b/lib/workers/repository/init/merge.ts @@ -24,7 +24,7 @@ import { platform } from '../../../modules/platform/index.ts'; import { scm } from '../../../modules/platform/scm.ts'; import { ExternalHostError } from '../../../types/errors/external-host-error.ts'; import { getCache } from '../../../util/cache/repository/index.ts'; -import { parseJson } from '../../../util/common.ts'; +import { getInheritedOrGlobal, parseJson } from '../../../util/common.ts'; import { setUserEnv } from '../../../util/env.ts'; import { readLocalFile, readSystemFile } from '../../../util/fs/index.ts'; import * as hostRules from '../../../util/host-rules.ts'; @@ -189,7 +189,7 @@ export async function mergeRenovateConfig( ): Promise { let returnConfig = { ...config }; let repoConfig: RepoFileConfig = {}; - if (config.requireConfig !== 'ignored') { + if (getInheritedOrGlobal('requireConfig') !== 'ignored') { repoConfig = await detectRepoFileConfig(branchName); } if (!repoConfig.configFileParsed && config.mode === 'silent') { diff --git a/lib/workers/repository/onboarding/branch/check.spec.ts b/lib/workers/repository/onboarding/branch/check.spec.ts index 82bb6c0660a..ba6aea02cf9 100644 --- a/lib/workers/repository/onboarding/branch/check.spec.ts +++ b/lib/workers/repository/onboarding/branch/check.spec.ts @@ -16,7 +16,7 @@ const cache = vi.mocked(_cache); describe('workers/repository/onboarding/branch/check', () => { beforeAll(() => { - GlobalConfig.reset(); + GlobalConfig.set({ requireConfig: 'required' }); }); const config = partial({ diff --git a/lib/workers/repository/onboarding/branch/check.ts b/lib/workers/repository/onboarding/branch/check.ts index 0ba7b9da9ed..04a86e815bf 100644 --- a/lib/workers/repository/onboarding/branch/check.ts +++ b/lib/workers/repository/onboarding/branch/check.ts @@ -79,11 +79,14 @@ export async function isOnboarded(config: RenovateConfig): Promise { // - An onboarding cache is present, and // - The current default branch SHA matches the default SHA found in the cache // Also if there is a closed pr skip using cache as it is outdated - if (config.requireConfig === 'optional' && config.onboarding === false) { + if ( + getInheritedOrGlobal('requireConfig') === 'optional' && + config.onboarding === false + ) { // Return early and avoid checking for config files return true; } - if (config.requireConfig === 'ignored') { + if (getInheritedOrGlobal('requireConfig') === 'ignored') { logger.debug('Config file will be ignored'); return true; } @@ -144,7 +147,10 @@ export async function isOnboarded(config: RenovateConfig): Promise { // If onboarding has been disabled and config files are required then the // repository has not been onboarded yet - if (config.requireConfig === 'required' && config.onboarding === false) { + if ( + getInheritedOrGlobal('requireConfig') === 'required' && + config.onboarding === false + ) { throw new Error(REPOSITORY_NO_CONFIG); } @@ -153,7 +159,7 @@ export async function isOnboarded(config: RenovateConfig): Promise { return false; } logger.debug('Found closed onboarding PR'); - if (config.requireConfig === 'optional') { + if (getInheritedOrGlobal('requireConfig') === 'optional') { logger.debug('Config not mandatory so repo is considered onboarded'); return true; } diff --git a/lib/workers/repository/onboarding/branch/index.spec.ts b/lib/workers/repository/onboarding/branch/index.spec.ts index 286e0b29190..f6800dccfa0 100644 --- a/lib/workers/repository/onboarding/branch/index.spec.ts +++ b/lib/workers/repository/onboarding/branch/index.spec.ts @@ -44,7 +44,10 @@ describe('workers/repository/onboarding/branch/index', () => { memCache.init(); config = getConfig(); config.repository = 'some/repo'; - GlobalConfig.set({ onboardingBranch: config.onboardingBranch }); + GlobalConfig.set({ + onboardingBranch: config.onboardingBranch, + requireConfig: config.requireConfig, + }); OnboardingState.prUpdateRequested = false; scm.getFileList.mockResolvedValue([]); cache.getCache.mockReturnValue({}); @@ -163,6 +166,10 @@ describe('workers/repository/onboarding/branch/index', () => { it('handles skipped onboarding combined with requireConfig = optional', async () => { config.requireConfig = 'optional'; config.onboarding = false; + GlobalConfig.set({ + onboardingBranch: config.onboardingBranch, + requireConfig: 'optional', + }); const res = await checkOnboardingBranch(config); expect(res.repoIsOnboarded).toBeTrue(); }); @@ -178,6 +185,10 @@ describe('workers/repository/onboarding/branch/index', () => { it('handles skipped onboarding, requireConfig=ignored', async () => { config.requireConfig = 'ignored'; config.onboarding = false; + GlobalConfig.set({ + onboardingBranch: config.onboardingBranch, + requireConfig: 'ignored', + }); const res = await checkOnboardingBranch(config); expect(res.repoIsOnboarded).toBeTrue(); }); @@ -263,6 +274,10 @@ describe('workers/repository/onboarding/branch/index', () => { it('detects repo is onboarded via PR', async () => { config.requireConfig = 'optional'; + GlobalConfig.set({ + onboardingBranch: config.onboardingBranch, + requireConfig: 'optional', + }); platform.findPr.mockResolvedValueOnce(mock()); const res = await checkOnboardingBranch(config); expect(res.repoIsOnboarded).toBeTrue(); diff --git a/lib/workers/repository/onboarding/pr/index.spec.ts b/lib/workers/repository/onboarding/pr/index.spec.ts index 52d6a440f1e..1c8794b11e7 100644 --- a/lib/workers/repository/onboarding/pr/index.spec.ts +++ b/lib/workers/repository/onboarding/pr/index.spec.ts @@ -39,6 +39,7 @@ describe('workers/repository/onboarding/pr/index', () => { GlobalConfig.set({ onboardingBranch: config.onboardingBranch, onboardingPrTitle: 'Configure Renovate', // default value + requireConfig: config.requireConfig, }); InheritConfig.reset(); }); @@ -465,6 +466,11 @@ describe('workers/repository/onboarding/pr/index', () => { it('creates PR (no require config)', async () => { config.requireConfig = 'optional'; + GlobalConfig.set({ + onboardingBranch: config.onboardingBranch, + onboardingPrTitle: 'Configure Renovate', + requireConfig: 'optional', + }); await ensureOnboardingPr(config, packageFiles, branches); expect(platform.createPr).toHaveBeenCalledTimes(1); }); diff --git a/lib/workers/repository/onboarding/pr/index.ts b/lib/workers/repository/onboarding/pr/index.ts index 6be519fc960..c642196922c 100644 --- a/lib/workers/repository/onboarding/pr/index.ts +++ b/lib/workers/repository/onboarding/pr/index.ts @@ -142,7 +142,7 @@ export async function ensureOnboardingPr( config.productLinks!.homepage })! This is an onboarding PR to help you understand and configure settings before regular Pull Requests begin.\n\n`; prTemplate += - config.requireConfig === 'required' + getInheritedOrGlobal('requireConfig') === 'required' ? emojify( `:vertical_traffic_light: To activate Renovate, merge this Pull Request. To disable Renovate, simply close this Pull Request unmerged.\n\n`, ) From b17575cb04a72ecaf3b5aac5362c6877b02e0a76 Mon Sep 17 00:00:00 2001 From: RahulGautamSingh Date: Sun, 29 Mar 2026 18:20:17 +0545 Subject: [PATCH 2/4] fix test --- lib/workers/repository/onboarding/branch/index.spec.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/workers/repository/onboarding/branch/index.spec.ts b/lib/workers/repository/onboarding/branch/index.spec.ts index 52df15bf383..0f9943775ca 100644 --- a/lib/workers/repository/onboarding/branch/index.spec.ts +++ b/lib/workers/repository/onboarding/branch/index.spec.ts @@ -207,6 +207,7 @@ describe('workers/repository/onboarding/branch/index', () => { GlobalConfig.set({ onboarding: false, onboardingBranch: config.onboardingBranch, + requireConfig: 'required', }); scm.getFileList.mockResolvedValueOnce(['package.json']); fs.readLocalFile.mockResolvedValueOnce('{}'); From 9c8b2546a8d8dc21fc017a94bd5cc753b7d6f755 Mon Sep 17 00:00:00 2001 From: RahulGautamSingh Date: Sat, 11 Apr 2026 11:29:40 +0545 Subject: [PATCH 3/4] update test --- lib/workers/repository/onboarding/branch/index.spec.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/workers/repository/onboarding/branch/index.spec.ts b/lib/workers/repository/onboarding/branch/index.spec.ts index 0f9943775ca..8549fdd2064 100644 --- a/lib/workers/repository/onboarding/branch/index.spec.ts +++ b/lib/workers/repository/onboarding/branch/index.spec.ts @@ -45,9 +45,9 @@ describe('workers/repository/onboarding/branch/index', () => { config = getConfig(); config.repository = 'some/repo'; GlobalConfig.set({ + onboarding: true, onboardingBranch: config.onboardingBranch, requireConfig: config.requireConfig, - onboarding: true, }); OnboardingState.prUpdateRequested = false; scm.getFileList.mockResolvedValue([]); @@ -171,9 +171,9 @@ describe('workers/repository/onboarding/branch/index', () => { config.requireConfig = 'optional'; config.onboarding = false; GlobalConfig.set({ + onboarding: false, onboardingBranch: config.onboardingBranch, requireConfig: 'optional', - onboarding: false, }); const res = await checkOnboardingBranch(config); expect(res.repoIsOnboarded).toBeTrue(); @@ -194,9 +194,9 @@ describe('workers/repository/onboarding/branch/index', () => { config.requireConfig = 'ignored'; config.onboarding = false; GlobalConfig.set({ + onboarding: false, onboardingBranch: config.onboardingBranch, requireConfig: 'ignored', - onboarding: false, }); const res = await checkOnboardingBranch(config); expect(res.repoIsOnboarded).toBeTrue(); From d561fc8116e1d2cb9f22b5e7f0d17e79b09ae744 Mon Sep 17 00:00:00 2001 From: RahulGautamSingh Date: Mon, 13 Apr 2026 11:16:49 +0530 Subject: [PATCH 4/4] refactor --- lib/workers/repository/onboarding/branch/index.spec.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/workers/repository/onboarding/branch/index.spec.ts b/lib/workers/repository/onboarding/branch/index.spec.ts index 8549fdd2064..b6f0e60127e 100644 --- a/lib/workers/repository/onboarding/branch/index.spec.ts +++ b/lib/workers/repository/onboarding/branch/index.spec.ts @@ -169,7 +169,6 @@ describe('workers/repository/onboarding/branch/index', () => { it('handles skipped onboarding combined with requireConfig = optional', async () => { config.requireConfig = 'optional'; - config.onboarding = false; GlobalConfig.set({ onboarding: false, onboardingBranch: config.onboardingBranch, @@ -192,7 +191,6 @@ describe('workers/repository/onboarding/branch/index', () => { it('handles skipped onboarding, requireConfig=ignored', async () => { config.requireConfig = 'ignored'; - config.onboarding = false; GlobalConfig.set({ onboarding: false, onboardingBranch: config.onboardingBranch,