From a12cda17d7753a30ecf80bc947a3a78ae982bbc9 Mon Sep 17 00:00:00 2001 From: Rahul Gautam Singh Date: Sun, 27 Apr 2025 13:22:43 +0530 Subject: [PATCH 1/8] feat: baseBranchPatterns --- docs/usage/configuration-options.md | 26 +++++++++---------- docs/usage/faq.md | 6 ++--- docs/usage/getting-started/running.md | 2 +- .../__snapshots__/migration.spec.ts.snap | 2 +- lib/config/migration.spec.ts | 2 +- .../custom/base-branch-migration.spec.ts | 16 ++++++++++-- .../custom/base-branch-migration.ts | 5 ++-- .../custom/base-branches-migration.spec.ts | 26 +++++++++++++++++++ .../custom/base-branches-migration.ts | 14 ++++++++++ lib/config/migrations/migrations-service.ts | 2 ++ lib/config/options/index.ts | 2 +- lib/config/types.ts | 3 ++- .../match-base-branches.spec.ts | 4 +-- .../validation-helpers/match-base-branches.ts | 6 ++--- lib/config/validation-helpers/types.ts | 2 +- lib/config/validation.spec.ts | 6 ++--- lib/config/validation.ts | 12 ++++----- lib/modules/platform/local/readme.md | 2 +- lib/util/git/index.spec.ts | 5 +++- .../onboarding/pr/base-branch.spec.ts | 8 +++--- .../repository/onboarding/pr/base-branch.ts | 8 +++--- lib/workers/repository/process/index.spec.ts | 16 +++++++----- lib/workers/repository/process/index.ts | 23 +++++++++------- 23 files changed, 132 insertions(+), 66 deletions(-) create mode 100644 lib/config/migrations/custom/base-branches-migration.spec.ts create mode 100644 lib/config/migrations/custom/base-branches-migration.ts diff --git a/docs/usage/configuration-options.md b/docs/usage/configuration-options.md index 18a169ee57a..1826da8ae0f 100644 --- a/docs/usage/configuration-options.md +++ b/docs/usage/configuration-options.md @@ -28,7 +28,7 @@ You can store your Renovate configuration file in one of these locations: When Renovate runs on a repository, it tries to find the configuration files in the order listed above. Renovate stops the search after it finds the first match. -Renovate always uses the config from the repository's default branch, even if that configuration specifies multiple `baseBranches`. +Renovate always uses the config from the repository's default branch, even if that configuration specifies multiple `baseBranchPatterns`. Renovate does not read/override the config from within each base branch if present. Also, be sure to check out Renovate's [shareable config presets](./config-presets.md) to save yourself from reinventing any wheels. @@ -303,24 +303,24 @@ If you're not already using `bors-ng` or similar, don't worry about this option. When creating a PR in Azure DevOps, some branches can be protected with branch policies to [check for linked work items](https://docs.microsoft.com/en-us/azure/devops/repos/git/branch-policies?view=azure-devops#check-for-linked-work-items). Creating a work item in Azure DevOps is beyond the scope of Renovate, but Renovate can link an already existing work item when creating PRs. -## baseBranches +## baseBranchPatterns By default, Renovate will detect and process only the repository's default branch. For most projects, this is the expected approach. -Renovate also allows users to explicitly configure `baseBranches`, e.g. for use cases such as: +Renovate also allows users to explicitly configure `baseBranchPatterns`, e.g. for use cases such as: -- You wish Renovate to process only a non-default branch, e.g. `dev`: `"baseBranches": ["dev"]` -- You have multiple release streams you need Renovate to keep up to date, e.g. in branches `main` and `next`: `"baseBranches": ["main", "next"]` -- You want to update your main branch and consistently named release branches, e.g. `main` and `release/`: `"baseBranches": ["main", "/^release\\/.*/"]` +- You wish Renovate to process only a non-default branch, e.g. `dev`: `"baseBranchPatterns": ["dev"]` +- You have multiple release streams you need Renovate to keep up to date, e.g. in branches `main` and `next`: `"baseBranchPatterns": ["main", "next"]` +- You want to update your main branch and consistently named release branches, e.g. `main` and `release/`: `"baseBranchPatterns": ["main", "/^release\\/.*/"]` It's possible to add this setting into the `renovate.json` file as part of the "Configure Renovate" onboarding PR. If so then Renovate will reflect this setting in its description and use package file contents from the custom base branch(es) instead of default. -`baseBranches` supports Regular Expressions that must begin and end with `/`, e.g.: +`baseBranchPatterns` supports Regular Expressions that must begin and end with `/`, e.g.: ```json { - "baseBranches": ["main", "/^release\\/.*/"] + "baseBranchPatterns": ["main", "/^release\\/.*/"] } ``` @@ -330,7 +330,7 @@ With a negation, all branches except those matching the regex will be added to t ```json { - "baseBranches": ["!/^pre-release\\/.*/"] + "baseBranchPatterns": ["!/^pre-release\\/.*/"] } ``` @@ -338,13 +338,13 @@ You can also use the special `"$default"` string to denote the repository's defa ```json { - "baseBranches": ["$default", "/^release\\/.*/"] + "baseBranchPatterns": ["$default", "/^release\\/.*/"] } ``` !!! note - Do _not_ use the `baseBranches` config option when you've set a `forkToken`. + Do _not_ use the `baseBranchPatterns` config option when you've set a `forkToken`. You may need a `forkToken` when you're using the Forking Renovate app. ## bbAutoResolvePrTasks @@ -589,12 +589,12 @@ To help you with this, Renovate will create config migration pull requests, when Example: -After we changed the [`baseBranches`](#basebranches) feature, the Renovate configuration migration pull request would make this change: +After we changed the [`baseBranchPatterns`](#basebranchpatterns) feature, the Renovate configuration migration pull request would make this change: ```diff { - "baseBranch": "main" -+ "baseBranches": ["main"] ++ "baseBranchPatterns": ["main"] } ``` diff --git a/docs/usage/faq.md b/docs/usage/faq.md index 1901e2f268a..a8df4fff6c4 100644 --- a/docs/usage/faq.md +++ b/docs/usage/faq.md @@ -112,17 +112,17 @@ Read our documentation on the [dependencyDashboardApproval](./configuration-opti ### Use an alternative branch as my Pull Request target Say your repository's default branch is `main` but you want Renovate to use the `next` branch as its PR target. -You can configure the PR target branch via the `baseBranches` option. +You can configure the PR target branch via the `baseBranchPatterns` option. Add this line to the `renovate.json` file that's in the _default_ branch (`main` in this example). ```json { - "baseBranches": ["next"] + "baseBranchPatterns": ["next"] } ``` -You can set more than one PR target branch in the `baseBranches` array. +You can set more than one PR target branch in the `baseBranchPatterns` array. ### Support private npm modules diff --git a/docs/usage/getting-started/running.md b/docs/usage/getting-started/running.md index 8009118c853..cf97553fd27 100644 --- a/docs/usage/getting-started/running.md +++ b/docs/usage/getting-started/running.md @@ -129,7 +129,7 @@ Forking Renovate needs only `read` level access to the code of any repository it If you use Forking Renovate, you'll miss out on these features of the regular Renovate app: - Automerge -- The `baseBranches` config option +- The `baseBranchPatterns` config option ### Hosting Renovate diff --git a/lib/config/__snapshots__/migration.spec.ts.snap b/lib/config/__snapshots__/migration.spec.ts.snap index d074ea4ef80..5af3c56b7a8 100644 --- a/lib/config/__snapshots__/migration.spec.ts.snap +++ b/lib/config/__snapshots__/migration.spec.ts.snap @@ -31,7 +31,7 @@ exports[`config/migration > migrateConfig(config, parentConfig) > migrates confi "autodiscover": true, "automerge": false, "automergeType": "branch", - "baseBranches": [ + "baseBranchPatterns": [ "next", ], "binarySource": "global", diff --git a/lib/config/migration.spec.ts b/lib/config/migration.spec.ts index ed14c5a97fe..8d292e82bb1 100644 --- a/lib/config/migration.spec.ts +++ b/lib/config/migration.spec.ts @@ -391,7 +391,7 @@ describe('config/migration', () => { const { isMigrated, migratedConfig } = configMigration.migrateConfig(config); expect(migratedConfig).toEqual({ - baseBranches: [], + baseBranchPatterns: [], commitMessage: 'test', ignorePaths: [], includePaths: ['test'], diff --git a/lib/config/migrations/custom/base-branch-migration.spec.ts b/lib/config/migrations/custom/base-branch-migration.spec.ts index 72f25879d1d..a938a9e803c 100644 --- a/lib/config/migrations/custom/base-branch-migration.spec.ts +++ b/lib/config/migrations/custom/base-branch-migration.spec.ts @@ -7,7 +7,7 @@ describe('config/migrations/custom/base-branch-migration', () => { baseBranch: 'test', }, { - baseBranches: ['test'], + baseBranchPatterns: ['test'], }, ); }); @@ -18,7 +18,19 @@ describe('config/migrations/custom/base-branch-migration', () => { baseBranch: ['test'], } as any, { - baseBranches: ['test'], + baseBranchPatterns: ['test'], + }, + ); + }); + + it('should push to existing bassBranchPatterns', () => { + expect(BaseBranchMigration).toMigrate( + { + baseBranch: ['test'], + baseBranchPatterns: ['base'], + } as any, + { + baseBranchPatterns: ['base', 'test'], }, ); }); diff --git a/lib/config/migrations/custom/base-branch-migration.ts b/lib/config/migrations/custom/base-branch-migration.ts index 3a1e0494d3b..62f8b0049c3 100644 --- a/lib/config/migrations/custom/base-branch-migration.ts +++ b/lib/config/migrations/custom/base-branch-migration.ts @@ -6,11 +6,12 @@ export class BaseBranchMigration extends AbstractMigration { override readonly propertyName = 'baseBranch'; override run(value: unknown): void { + const baseBranchPatterns = this.get('baseBranchPatterns') ?? []; if (is.array(value)) { - this.setSafely('baseBranches', value); + this.setHard('baseBranchPatterns', baseBranchPatterns.concat(value)); } if (is.string(value)) { - this.setSafely('baseBranches', [value]); + this.setHard('baseBranchPatterns', baseBranchPatterns.concat([value])); } } } diff --git a/lib/config/migrations/custom/base-branches-migration.spec.ts b/lib/config/migrations/custom/base-branches-migration.spec.ts new file mode 100644 index 00000000000..5ea0562374e --- /dev/null +++ b/lib/config/migrations/custom/base-branches-migration.spec.ts @@ -0,0 +1,26 @@ +import { BaseBranchesMigration } from './base-branches-migration'; + +describe('config/migrations/custom/base-branches-migration', () => { + it('should migrate value to array', () => { + expect(BaseBranchesMigration).toMigrate( + { + baseBranches: ['test'], + }, + { + baseBranchPatterns: ['test'], + }, + ); + }); + + it('should push to existing bassBranchPatterns', () => { + expect(BaseBranchesMigration).toMigrate( + { + baseBranches: ['test'], + baseBranchPatterns: ['base'], + } as any, + { + baseBranchPatterns: ['base', 'test'], + }, + ); + }); +}); diff --git a/lib/config/migrations/custom/base-branches-migration.ts b/lib/config/migrations/custom/base-branches-migration.ts new file mode 100644 index 00000000000..38bde98aa9d --- /dev/null +++ b/lib/config/migrations/custom/base-branches-migration.ts @@ -0,0 +1,14 @@ +import is from '@sindresorhus/is'; +import { AbstractMigration } from '../base/abstract-migration'; + +export class BaseBranchesMigration extends AbstractMigration { + override readonly deprecated = true; + override readonly propertyName = 'baseBranches'; + + override run(value: unknown): void { + const baseBranchPatterns = this.get('baseBranchPatterns') ?? []; + if (is.array(value)) { + this.setHard('baseBranchPatterns', baseBranchPatterns.concat(value)); + } + } +} diff --git a/lib/config/migrations/migrations-service.ts b/lib/config/migrations/migrations-service.ts index 6516aa1bfd4..e4f0bd316fc 100644 --- a/lib/config/migrations/migrations-service.ts +++ b/lib/config/migrations/migrations-service.ts @@ -10,6 +10,7 @@ import { AutomergePatchMigration } from './custom/automerge-patch-migration'; import { AutomergeTypeMigration } from './custom/automerge-type-migration'; import { AzureGitLabAutomergeMigration } from './custom/azure-gitlab-automerge-migration'; import { BaseBranchMigration } from './custom/base-branch-migration'; +import { BaseBranchesMigration } from './custom/base-branches-migration'; import { BinarySourceMigration } from './custom/binary-source-migration'; import { BranchNameMigration } from './custom/branch-name-migration'; import { BranchPrefixMigration } from './custom/branch-prefix-migration'; @@ -161,6 +162,7 @@ export class MigrationsService { MatchManagersMigration, CustomManagersMigration, PlatformCommitMigration, + BaseBranchesMigration, ]; static run( diff --git a/lib/config/options/index.ts b/lib/config/options/index.ts index 126765e5d91..8cfb47e6fab 100644 --- a/lib/config/options/index.ts +++ b/lib/config/options/index.ts @@ -1034,7 +1034,7 @@ const options: RenovateOptions[] = [ globalOnly: true, }, { - name: 'baseBranches', + name: 'baseBranchPatterns', description: 'List of one or more custom base branches defined as exact strings and/or via regex expressions.', type: 'array', diff --git a/lib/config/types.ts b/lib/config/types.ts index 7b2802afd45..9fd1f01ea31 100644 --- a/lib/config/types.ts +++ b/lib/config/types.ts @@ -233,7 +233,8 @@ export interface RenovateConfig reportPath?: string; reportType?: 'logging' | 'file' | 's3' | null; depName?: string; - baseBranches?: string[]; + baseBranchPatterns?: string[]; // user configurable + baseBranches?: string[]; // internal use commitBody?: string; useBaseBranchConfig?: UseBaseBranchConfigType; baseBranch?: string; diff --git a/lib/config/validation-helpers/match-base-branches.spec.ts b/lib/config/validation-helpers/match-base-branches.spec.ts index 4386718ed7a..859c09f0c4d 100644 --- a/lib/config/validation-helpers/match-base-branches.spec.ts +++ b/lib/config/validation-helpers/match-base-branches.spec.ts @@ -10,7 +10,7 @@ describe('config/validation-helpers/match-base-branches', () => { { topic: 'Configuration Error', message: - 'packageRules[0]: You must configure baseBranches inorder to use them inside matchBaseBranches.', + 'packageRules[0]: You must configure baseBranchPatterns inorder to use them inside matchBaseBranches.', }, ]); }); @@ -19,7 +19,7 @@ describe('config/validation-helpers/match-base-branches', () => { const res = check({ resolvedRule: { matchBaseBranches: ['develop'], addLabels: ['develop'] }, currentPath: 'packageRules[0]', - baseBranches: ['develop', 'main'], + baseBranchPatterns: ['develop', 'main'], }); expect(res).toBeEmptyArray(); }); diff --git a/lib/config/validation-helpers/match-base-branches.ts b/lib/config/validation-helpers/match-base-branches.ts index e64017b2e7f..967b942ab1f 100644 --- a/lib/config/validation-helpers/match-base-branches.ts +++ b/lib/config/validation-helpers/match-base-branches.ts @@ -8,14 +8,14 @@ import type { CheckBaseBranchesArgs } from './types'; export function check({ resolvedRule, currentPath, - baseBranches, + baseBranchPatterns, }: CheckBaseBranchesArgs): ValidationMessage[] { const warnings: ValidationMessage[] = []; if (Array.isArray(resolvedRule.matchBaseBranches)) { - if (!is.nonEmptyArray(baseBranches)) { + if (!is.nonEmptyArray(baseBranchPatterns)) { warnings.push({ topic: 'Configuration Error', - message: `${currentPath}: You must configure baseBranches inorder to use them inside matchBaseBranches.`, + message: `${currentPath}: You must configure baseBranchPatterns inorder to use them inside matchBaseBranches.`, }); } } diff --git a/lib/config/validation-helpers/types.ts b/lib/config/validation-helpers/types.ts index 873f0398212..2d194175417 100644 --- a/lib/config/validation-helpers/types.ts +++ b/lib/config/validation-helpers/types.ts @@ -13,5 +13,5 @@ export interface CheckMatcherArgs { export interface CheckBaseBranchesArgs { resolvedRule: PackageRule; currentPath: string; - baseBranches?: string[]; + baseBranchPatterns?: string[]; } diff --git a/lib/config/validation.spec.ts b/lib/config/validation.spec.ts index 4cf3e39eab2..9ac9d94a946 100644 --- a/lib/config/validation.spec.ts +++ b/lib/config/validation.spec.ts @@ -227,7 +227,7 @@ describe('config/validation', () => { it('validates matchBaseBranches', async () => { const config = { - baseBranches: ['foo'], + baseBranchPatterns: ['foo'], packageRules: [ { matchBaseBranches: ['foo'], @@ -373,13 +373,13 @@ describe('config/validation', () => { it('catches invalid baseBranches regex', async () => { const config = { - baseBranches: ['/***$}{]][/', '/branch/i'], + baseBranchPatterns: ['/***$}{]][/', '/branch/i'], }; const { errors } = await configValidation.validateConfig('repo', config); expect(errors).toEqual([ { topic: 'Configuration Error', - message: 'Invalid regExp for baseBranches: `/***$}{]][/`', + message: 'Invalid regExp for baseBranchPatterns: `/***$}{]][/`', }, ]); }); diff --git a/lib/config/validation.ts b/lib/config/validation.ts index cb5d0b5e7f0..02d0a02ba35 100644 --- a/lib/config/validation.ts +++ b/lib/config/validation.ts @@ -421,7 +421,7 @@ export async function validateConfig( ...matchBaseBranchesValidator.check({ resolvedRule, currentPath: `${currentPath}[${subIndex}]`, - baseBranches: config.baseBranches!, + baseBranchPatterns: config.baseBranchPatterns!, }), ); const selectorLength = Object.keys(resolvedRule).filter( @@ -590,15 +590,15 @@ export async function validateConfig( } } } - if (key === 'baseBranches') { - for (const baseBranch of val as string[]) { + if (key === 'baseBranchPatterns') { + for (const baseBranchPattern of val as string[]) { if ( - isRegexMatch(baseBranch) && - !getRegexPredicate(baseBranch) + isRegexMatch(baseBranchPattern) && + !getRegexPredicate(baseBranchPattern) ) { errors.push({ topic: 'Configuration Error', - message: `Invalid regExp for ${currentPath}: \`${baseBranch}\``, + message: `Invalid regExp for ${currentPath}: \`${baseBranchPattern}\``, }); } } diff --git a/lib/modules/platform/local/readme.md b/lib/modules/platform/local/readme.md index 15ede0932e2..e0fb101af4d 100644 --- a/lib/modules/platform/local/readme.md +++ b/lib/modules/platform/local/readme.md @@ -18,5 +18,5 @@ The command doesn't do any "compare" - or before and after analysis - if you wan ## Limitations - `local>` presets can't be resolved. Normally these would point to the local platform such as GitHub, but in the case of running locally, it does not exist -- `baseBranches` are ignored +- `baseBranchPatterns` are ignored - Branch creation is not supported diff --git a/lib/util/git/index.spec.ts b/lib/util/git/index.spec.ts index eec91f38636..7aed9e94fca 100644 --- a/lib/util/git/index.spec.ts +++ b/lib/util/git/index.spec.ts @@ -1214,7 +1214,10 @@ describe('util/git/index', { timeout: 10000 }, () => { describe('syncGit()', () => { it('should clone a specified base branch', async () => { tmpDir = await tmp.dir({ unsafeCleanup: true }); - GlobalConfig.set({ baseBranches: ['develop'], localDir: tmpDir.path }); + GlobalConfig.set({ + baseBranchPatterns: ['develop'], + localDir: tmpDir.path, + }); await git.initRepo({ url: origin.path, defaultBranch: 'develop', diff --git a/lib/workers/repository/onboarding/pr/base-branch.spec.ts b/lib/workers/repository/onboarding/pr/base-branch.spec.ts index 75156329d12..48bba6863af 100644 --- a/lib/workers/repository/onboarding/pr/base-branch.spec.ts +++ b/lib/workers/repository/onboarding/pr/base-branch.spec.ts @@ -16,18 +16,18 @@ describe('workers/repository/onboarding/pr/base-branch', () => { }); it('describes baseBranch', () => { - config.baseBranches = ['some-branch']; + config.baseBranchPatterns = ['some-branch']; const res = getBaseBranchDesc(config); expect(res.trim()).toBe( 'You have configured Renovate to use branch `some-branch` as base branch.', ); }); - it('describes baseBranches', () => { - config.baseBranches = ['some-branch', 'some-other-branch']; + it('describes baseBranchPatterns', () => { + config.baseBranchPatterns = ['some-branch', 'some-other-branch']; const res = getBaseBranchDesc(config); expect(res.trim()).toBe( - 'You have configured Renovate to use the following baseBranches: `some-branch`, `some-other-branch`.', + 'You have configured Renovate to use the following baseBranchPatterns: `some-branch`, `some-other-branch`.', ); }); }); diff --git a/lib/workers/repository/onboarding/pr/base-branch.ts b/lib/workers/repository/onboarding/pr/base-branch.ts index 0e574e18dc6..4d71456073c 100644 --- a/lib/workers/repository/onboarding/pr/base-branch.ts +++ b/lib/workers/repository/onboarding/pr/base-branch.ts @@ -2,13 +2,13 @@ import type { RenovateConfig } from '../../../../config/types'; export function getBaseBranchDesc(config: RenovateConfig): string { // Describe base branch only if it's configured - if (!config.baseBranches?.length) { + if (!config.baseBranchPatterns?.length) { return ''; } - if (config.baseBranches.length > 1) { - return `You have configured Renovate to use the following baseBranches: ${config.baseBranches + if (config.baseBranchPatterns.length > 1) { + return `You have configured Renovate to use the following baseBranchPatterns: ${config.baseBranchPatterns .map((branch) => `\`${branch}\``) .join(', ')}.`; } - return `You have configured Renovate to use branch \`${config.baseBranches[0]}\` as base branch.\n\n`; + return `You have configured Renovate to use branch \`${config.baseBranchPatterns[0]}\` as base branch.\n\n`; } diff --git a/lib/workers/repository/process/index.spec.ts b/lib/workers/repository/process/index.spec.ts index e132d74f8ef..efa6c9dee09 100644 --- a/lib/workers/repository/process/index.spec.ts +++ b/lib/workers/repository/process/index.spec.ts @@ -28,7 +28,7 @@ describe('workers/repository/process/index', () => { it('processes baseBranches', async () => { extract.mockResolvedValue({} as never); - config.baseBranches = ['branch1', 'branch2']; + config.baseBranchPatterns = ['branch1', 'branch2']; scm.branchExists.mockResolvedValueOnce(false); scm.branchExists.mockResolvedValueOnce(true); scm.branchExists.mockResolvedValueOnce(false); @@ -45,7 +45,7 @@ describe('workers/repository/process/index', () => { it('reads config from default branch if useBaseBranchConfig not specified', async () => { scm.branchExists.mockResolvedValue(true); platform.getJsonFile.mockResolvedValueOnce({}); - config.baseBranches = ['master', 'dev']; + config.baseBranchPatterns = ['master', 'dev']; config.useBaseBranchConfig = 'none'; getCache().configFileName = 'renovate.json'; const res = await extractDependencies(config); @@ -66,7 +66,7 @@ describe('workers/repository/process/index', () => { platform.getJsonFile = vi .fn() .mockResolvedValue({ extends: [':approveMajorUpdates'] }); - config.baseBranches = ['master', 'dev']; + config.baseBranchPatterns = ['master', 'dev']; config.useBaseBranchConfig = 'merge'; getCache().configFileName = 'renovate.json'; const res = await extractDependencies(config); @@ -95,7 +95,7 @@ describe('workers/repository/process/index', () => { return {}; }); getCache().configFileName = 'renovate.json'; - config.baseBranches = ['master', 'dev']; + config.baseBranchPatterns = ['master', 'dev']; config.useBaseBranchConfig = 'merge'; await expect(extractDependencies(config)).rejects.toThrow( CONFIG_VALIDATION, @@ -119,7 +119,11 @@ describe('workers/repository/process/index', () => { it('finds baseBranches via regular expressions', async () => { extract.mockResolvedValue({} as never); - config.baseBranches = ['/^release\\/.*/i', 'dev', '!/^pre-release\\/.*/']; + config.baseBranchPatterns = [ + '/^release\\/.*/i', + 'dev', + '!/^pre-release\\/.*/', + ]; git.getBranchList.mockReturnValue([ 'dev', 'pre-release/v0', @@ -157,7 +161,7 @@ describe('workers/repository/process/index', () => { it('maps $default to defaultBranch', async () => { extract.mockResolvedValue({} as never); - config.baseBranches = ['$default']; + config.baseBranchPatterns = ['$default']; config.defaultBranch = 'master'; git.getBranchList.mockReturnValue(['dev', 'master']); scm.branchExists.mockResolvedValue(true); diff --git a/lib/workers/repository/process/index.ts b/lib/workers/repository/process/index.ts index f06b11e87cd..b852424c65b 100644 --- a/lib/workers/repository/process/index.ts +++ b/lib/workers/repository/process/index.ts @@ -76,7 +76,7 @@ async function getBaseBranchConfig( baseBranchConfig.baseBranches = config.baseBranches; } - if (config.baseBranches!.length > 1) { + if (config.baseBranchPatterns!.length > 1) { baseBranchConfig.branchPrefix += `${baseBranch}-`; baseBranchConfig.hasBaseBranches = true; } @@ -88,24 +88,24 @@ async function getBaseBranchConfig( function unfoldBaseBranches( defaultBranch: string, - baseBranches: string[], + baseBranchPatterns: string[], ): string[] { const unfoldedList: string[] = []; const allBranches = getBranchList(); - for (const baseBranch of baseBranches) { - const isAllowedPred = getRegexPredicate(baseBranch); + for (const baseBranchPattern of baseBranchPatterns) { + const isAllowedPred = getRegexPredicate(baseBranchPattern); if (isAllowedPred) { const matchingBranches = allBranches.filter(isAllowedPred); logger.debug( - `baseBranches regex "${baseBranch}" matches [${matchingBranches.join()}]`, + `baseBranchePatterns regex "${baseBranchPattern}" matches [${matchingBranches.join()}]`, ); unfoldedList.push(...matchingBranches); - } else if (baseBranch === '$default') { - logger.debug(`baseBranches "$default" matches "${defaultBranch}"`); + } else if (baseBranchPattern === '$default') { + logger.debug(`baseBranchPatterns "$default" matches "${defaultBranch}"`); unfoldedList.push(defaultBranch); } else { - unfoldedList.push(baseBranch); + unfoldedList.push(baseBranchPattern); } } @@ -121,10 +121,13 @@ export async function extractDependencies( branchList: [], packageFiles: {}, }; - if (GlobalConfig.get('platform') !== 'local' && config.baseBranches?.length) { + if ( + GlobalConfig.get('platform') !== 'local' && + config.baseBranchPatterns?.length + ) { config.baseBranches = unfoldBaseBranches( config.defaultBranch!, - config.baseBranches, + config.baseBranchPatterns, ); logger.debug({ baseBranches: config.baseBranches }, 'baseBranches'); const extracted: Record> = {}; From 178b883f0a48bb46d1ed9082d8881cbe6dd29672 Mon Sep 17 00:00:00 2001 From: Rahul Gautam Singh Date: Wed, 30 Apr 2025 23:44:50 +0530 Subject: [PATCH 2/8] Apply suggestions --- docs/usage/configuration-options.md | 2 ++ .../validation-helpers/match-base-branches.spec.ts | 2 +- .../validation-helpers/match-base-branches.ts | 2 +- lib/workers/global/config/parse/env.spec.ts | 13 +++++++------ lib/workers/global/config/parse/env.ts | 1 + 5 files changed, 12 insertions(+), 8 deletions(-) diff --git a/docs/usage/configuration-options.md b/docs/usage/configuration-options.md index 1826da8ae0f..704b315fe21 100644 --- a/docs/usage/configuration-options.md +++ b/docs/usage/configuration-options.md @@ -305,6 +305,8 @@ Creating a work item in Azure DevOps is beyond the scope of Renovate, but Renova ## baseBranchPatterns +This configuration option was formerly known as `baseBranches`. + By default, Renovate will detect and process only the repository's default branch. For most projects, this is the expected approach. Renovate also allows users to explicitly configure `baseBranchPatterns`, e.g. for use cases such as: diff --git a/lib/config/validation-helpers/match-base-branches.spec.ts b/lib/config/validation-helpers/match-base-branches.spec.ts index 859c09f0c4d..16bd0b30f87 100644 --- a/lib/config/validation-helpers/match-base-branches.spec.ts +++ b/lib/config/validation-helpers/match-base-branches.spec.ts @@ -10,7 +10,7 @@ describe('config/validation-helpers/match-base-branches', () => { { topic: 'Configuration Error', message: - 'packageRules[0]: You must configure baseBranchPatterns inorder to use them inside matchBaseBranches.', + 'packageRules[0]: You must configure baseBranchPatterns in order to use them inside matchBaseBranches.', }, ]); }); diff --git a/lib/config/validation-helpers/match-base-branches.ts b/lib/config/validation-helpers/match-base-branches.ts index 967b942ab1f..77de2ab81a6 100644 --- a/lib/config/validation-helpers/match-base-branches.ts +++ b/lib/config/validation-helpers/match-base-branches.ts @@ -15,7 +15,7 @@ export function check({ if (!is.nonEmptyArray(baseBranchPatterns)) { warnings.push({ topic: 'Configuration Error', - message: `${currentPath}: You must configure baseBranchPatterns inorder to use them inside matchBaseBranches.`, + message: `${currentPath}: You must configure baseBranchPatterns in order to use them inside matchBaseBranches.`, }); } } diff --git a/lib/workers/global/config/parse/env.spec.ts b/lib/workers/global/config/parse/env.spec.ts index ebea4d91bc1..5ddf27164b7 100644 --- a/lib/workers/global/config/parse/env.spec.ts +++ b/lib/workers/global/config/parse/env.spec.ts @@ -87,12 +87,13 @@ describe('workers/global/config/parse/env', () => { }); test.each` - envArg | config - ${{ RENOVATE_RECREATE_CLOSED: 'true' }} | ${{ recreateWhen: 'always' }} - ${{ RENOVATE_RECREATE_CLOSED: 'false' }} | ${{ recreateWhen: 'auto' }} - ${{ RENOVATE_RECREATE_WHEN: 'auto' }} | ${{ recreateWhen: 'auto' }} - ${{ RENOVATE_RECREATE_WHEN: 'always' }} | ${{ recreateWhen: 'always' }} - ${{ RENOVATE_RECREATE_WHEN: 'never' }} | ${{ recreateWhen: 'never' }} + envArg | config + ${{ RENOVATE_RECREATE_CLOSED: 'true' }} | ${{ recreateWhen: 'always' }} + ${{ RENOVATE_RECREATE_CLOSED: 'false' }} | ${{ recreateWhen: 'auto' }} + ${{ RENOVATE_RECREATE_WHEN: 'auto' }} | ${{ recreateWhen: 'auto' }} + ${{ RENOVATE_RECREATE_WHEN: 'always' }} | ${{ recreateWhen: 'always' }} + ${{ RENOVATE_RECREATE_WHEN: 'never' }} | ${{ recreateWhen: 'never' }} + ${{ RENOVATE_BASE_BRANCHES: '["main", "dev"]' }} | ${{ baseBranchPatterns: ['main', 'dev'] }} `('"$envArg" -> $config', async ({ envArg, config }) => { expect(await env.getConfig(envArg)).toMatchObject(config); }); diff --git a/lib/workers/global/config/parse/env.ts b/lib/workers/global/config/parse/env.ts index 5ac65b01405..3df5b6a95ad 100644 --- a/lib/workers/global/config/parse/env.ts +++ b/lib/workers/global/config/parse/env.ts @@ -44,6 +44,7 @@ const renameKeys = { mergeConfidenceSupportedDatasources: 'mergeConfidenceDatasources', allowPostUpgradeCommandTemplating: 'allowCommandTemplating', allowedPostUpgradeCommands: 'allowedCommands', + baseBranches: 'baseBranchPatterns', }; function renameEnvKeys(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv { From 562174cb2531aa352e18f919ce0394a9419a6c05 Mon Sep 17 00:00:00 2001 From: Rahul Gautam Singh Date: Thu, 1 May 2025 21:01:20 +0530 Subject: [PATCH 3/8] use rename migration --- lib/config/migration.spec.ts | 10 +++++++ .../custom/base-branches-migration.spec.ts | 26 ------------------- .../custom/base-branches-migration.ts | 14 ---------- lib/config/migrations/migrations-service.ts | 3 +-- 4 files changed, 11 insertions(+), 42 deletions(-) delete mode 100644 lib/config/migrations/custom/base-branches-migration.spec.ts delete mode 100644 lib/config/migrations/custom/base-branches-migration.ts diff --git a/lib/config/migration.spec.ts b/lib/config/migration.spec.ts index 8d292e82bb1..38f24c13610 100644 --- a/lib/config/migration.spec.ts +++ b/lib/config/migration.spec.ts @@ -172,6 +172,7 @@ describe('config/migration', () => { expect(migratedConfig.automerge).toBe(false); expect(migratedConfig.packageRules).toHaveLength(11); expect(migratedConfig.hostRules).toHaveLength(1); + expect(migratedConfig.baseBranchPatterns).toMatchObject(['next']); }); it('migrates before and after schedules', () => { @@ -769,4 +770,13 @@ describe('config/migration', () => { res = configMigration.migrateConfig(config); expect(res.isMigrated).toBeTrue(); }); + + it('migrates baseBranches and baseBranch', () => { + const config = { baseBranches: ['main', 'dev'] }; + const res = configMigration.migrateConfig(config); + expect(res.isMigrated).toBeTrue(); + expect(res.migratedConfig).toEqual({ + baseBranchPatterns: ['main', 'dev'], + }); + }); }); diff --git a/lib/config/migrations/custom/base-branches-migration.spec.ts b/lib/config/migrations/custom/base-branches-migration.spec.ts deleted file mode 100644 index 5ea0562374e..00000000000 --- a/lib/config/migrations/custom/base-branches-migration.spec.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { BaseBranchesMigration } from './base-branches-migration'; - -describe('config/migrations/custom/base-branches-migration', () => { - it('should migrate value to array', () => { - expect(BaseBranchesMigration).toMigrate( - { - baseBranches: ['test'], - }, - { - baseBranchPatterns: ['test'], - }, - ); - }); - - it('should push to existing bassBranchPatterns', () => { - expect(BaseBranchesMigration).toMigrate( - { - baseBranches: ['test'], - baseBranchPatterns: ['base'], - } as any, - { - baseBranchPatterns: ['base', 'test'], - }, - ); - }); -}); diff --git a/lib/config/migrations/custom/base-branches-migration.ts b/lib/config/migrations/custom/base-branches-migration.ts deleted file mode 100644 index 38bde98aa9d..00000000000 --- a/lib/config/migrations/custom/base-branches-migration.ts +++ /dev/null @@ -1,14 +0,0 @@ -import is from '@sindresorhus/is'; -import { AbstractMigration } from '../base/abstract-migration'; - -export class BaseBranchesMigration extends AbstractMigration { - override readonly deprecated = true; - override readonly propertyName = 'baseBranches'; - - override run(value: unknown): void { - const baseBranchPatterns = this.get('baseBranchPatterns') ?? []; - if (is.array(value)) { - this.setHard('baseBranchPatterns', baseBranchPatterns.concat(value)); - } - } -} diff --git a/lib/config/migrations/migrations-service.ts b/lib/config/migrations/migrations-service.ts index 983856bf455..d0ebe24d4b7 100644 --- a/lib/config/migrations/migrations-service.ts +++ b/lib/config/migrations/migrations-service.ts @@ -10,7 +10,6 @@ import { AutomergePatchMigration } from './custom/automerge-patch-migration'; import { AutomergeTypeMigration } from './custom/automerge-type-migration'; import { AzureGitLabAutomergeMigration } from './custom/azure-gitlab-automerge-migration'; import { BaseBranchMigration } from './custom/base-branch-migration'; -import { BaseBranchesMigration } from './custom/base-branches-migration'; import { BinarySourceMigration } from './custom/binary-source-migration'; import { BranchNameMigration } from './custom/branch-name-migration'; import { BranchPrefixMigration } from './custom/branch-prefix-migration'; @@ -106,6 +105,7 @@ export class MigrationsService { ['masterIssueTitle', 'dependencyDashboardTitle'], ['masterIssueLabels', 'dependencyDashboardLabels'], ['regexManagers', 'customManagers'], + ['baseBranches', 'baseBranchPatterns'], ]); static readonly customMigrations: readonly MigrationConstructor[] = [ @@ -163,7 +163,6 @@ export class MigrationsService { MatchManagersMigration, CustomManagersMigration, PlatformCommitMigration, - BaseBranchesMigration, ]; static run( From 0355ffb84cc6035719b55734aba9f0ea31683a33 Mon Sep 17 00:00:00 2001 From: Rahul Gautam Singh Date: Wed, 7 May 2025 20:40:02 +0530 Subject: [PATCH 4/8] add tsdoc comments --- lib/config/types.ts | 6 ++++-- lib/config/validation-helpers/types.ts | 1 + 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/config/types.ts b/lib/config/types.ts index 09931c8b462..11437212835 100644 --- a/lib/config/types.ts +++ b/lib/config/types.ts @@ -232,8 +232,10 @@ export interface RenovateConfig reportPath?: string; reportType?: 'logging' | 'file' | 's3' | null; depName?: string; - baseBranchPatterns?: string[]; // user configurable - baseBranches?: string[]; // internal use + /** user configurable */ + baseBranchPatterns?: string[]; + /** for internal use */ + baseBranches?: string[]; commitBody?: string; useBaseBranchConfig?: UseBaseBranchConfigType; baseBranch?: string; diff --git a/lib/config/validation-helpers/types.ts b/lib/config/validation-helpers/types.ts index 2d194175417..d18b83b62f0 100644 --- a/lib/config/validation-helpers/types.ts +++ b/lib/config/validation-helpers/types.ts @@ -13,5 +13,6 @@ export interface CheckMatcherArgs { export interface CheckBaseBranchesArgs { resolvedRule: PackageRule; currentPath: string; + /** user configurable */ baseBranchPatterns?: string[]; } From 0781c10deeb13edbf098c70b09d0efee89a5a038 Mon Sep 17 00:00:00 2001 From: Rahul Gautam Singh Date: Wed, 7 May 2025 20:50:47 +0530 Subject: [PATCH 5/8] fix bad merge --- lib/config/validation.ts | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/lib/config/validation.ts b/lib/config/validation.ts index 9298e5a13c8..4fdfaa03fbb 100644 --- a/lib/config/validation.ts +++ b/lib/config/validation.ts @@ -578,18 +578,6 @@ export async function validateConfig( } } } - if (key === 'fileMatch') { - for (const fileMatch of val as string[]) { - try { - regEx(fileMatch); - } catch { - errors.push({ - topic: 'Configuration Error', - message: `Invalid regExp for ${currentPath}: \`${fileMatch}\``, - }); - } - } - } if (key === 'baseBranchPatterns') { for (const baseBranchPattern of val as string[]) { if ( From 593a7b66596c96078611767c563811f716886f12 Mon Sep 17 00:00:00 2001 From: Rahul Gautam Singh Date: Tue, 13 May 2025 15:26:08 +0530 Subject: [PATCH 6/8] update docs --- docs/usage/configuration-options.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/usage/configuration-options.md b/docs/usage/configuration-options.md index a290ac41d8c..5106eaffcf6 100644 --- a/docs/usage/configuration-options.md +++ b/docs/usage/configuration-options.md @@ -28,7 +28,7 @@ You can store your Renovate configuration file in one of these locations: When Renovate runs on a repository, it tries to find the configuration files in the order listed above. Renovate stops the search after it finds the first match. -Renovate always uses the config from the repository's default branch, even if that configuration specifies multiple `baseBranchPatterns`. +Renovate always uses the config from the repository's default branch, even if that configuration specifies `baseBranchPatterns`. Renovate does not read/override the config from within each base branch if present. Also, be sure to check out Renovate's [shareable config presets](./config-presets.md) to save yourself from reinventing any wheels. @@ -322,7 +322,8 @@ Renovate also allows users to explicitly configure `baseBranchPatterns`, e.g. fo It's possible to add this setting into the `renovate.json` file as part of the "Configure Renovate" onboarding PR. If so then Renovate will reflect this setting in its description and use package file contents from the custom base branch(es) instead of default. -`baseBranchPatterns` supports Regular Expressions that must begin and end with `/`, e.g.: +The simplest approach is exact matches, e.g. `["main", "dev"]`. +`baseBranchPatterns` also supports Regular Expressions that must begin and end with `/`, e.g.: ```json { From 020d6de85d89536a61941d096d86b565008e0628 Mon Sep 17 00:00:00 2001 From: Rahul Gautam Singh Date: Thu, 15 May 2025 09:07:04 +0530 Subject: [PATCH 7/8] refactor --- lib/config/types.ts | 2 -- .../validation-helpers/match-base-branches.spec.ts | 2 +- lib/config/validation.spec.ts | 4 ++-- lib/workers/repository/finalize/prune.spec.ts | 2 +- lib/workers/repository/finalize/prune.ts | 4 ++-- lib/workers/repository/process/extract-update.spec.ts | 6 +++--- lib/workers/repository/process/extract-update.ts | 4 ++-- lib/workers/repository/process/index.spec.ts | 6 +++--- lib/workers/repository/process/index.ts | 10 +++++----- lib/workers/repository/process/write.spec.ts | 2 +- lib/workers/repository/process/write.ts | 2 +- 11 files changed, 21 insertions(+), 23 deletions(-) diff --git a/lib/config/types.ts b/lib/config/types.ts index acd3721842a..517f8c9c72d 100644 --- a/lib/config/types.ts +++ b/lib/config/types.ts @@ -235,8 +235,6 @@ export interface RenovateConfig depName?: string; /** user configurable */ baseBranchPatterns?: string[]; - /** for internal use */ - baseBranches?: string[]; commitBody?: string; useBaseBranchConfig?: UseBaseBranchConfigType; baseBranch?: string; diff --git a/lib/config/validation-helpers/match-base-branches.spec.ts b/lib/config/validation-helpers/match-base-branches.spec.ts index 16bd0b30f87..7babc0b9e15 100644 --- a/lib/config/validation-helpers/match-base-branches.spec.ts +++ b/lib/config/validation-helpers/match-base-branches.spec.ts @@ -1,7 +1,7 @@ import { check } from './match-base-branches'; describe('config/validation-helpers/match-base-branches', () => { - it('returns error when baseBranches is not defined', () => { + it('returns error when baseBranchPatterns is not defined', () => { const res = check({ resolvedRule: { matchBaseBranches: ['develop'], addLabels: ['develop'] }, currentPath: 'packageRules[0]', diff --git a/lib/config/validation.spec.ts b/lib/config/validation.spec.ts index ca55171aa44..26bb449c2ab 100644 --- a/lib/config/validation.spec.ts +++ b/lib/config/validation.spec.ts @@ -244,7 +244,7 @@ describe('config/validation', () => { expect(warnings).toHaveLength(0); }); - it('catches invalid matchBaseBranches when baseBranches is not defined', async () => { + it('catches invalid matchBaseBranches when baseBranchPatterns is not defined', async () => { const config = { packageRules: [ { @@ -372,7 +372,7 @@ describe('config/validation', () => { ]); }); - it('catches invalid baseBranches regex', async () => { + it('catches invalid baseBranchPatterns regex', async () => { const config = { baseBranchPatterns: ['/***$}{]][/', '/branch/i'], }; diff --git a/lib/workers/repository/finalize/prune.spec.ts b/lib/workers/repository/finalize/prune.spec.ts index 98eb23cb463..53b570442c5 100644 --- a/lib/workers/repository/finalize/prune.spec.ts +++ b/lib/workers/repository/finalize/prune.spec.ts @@ -82,7 +82,7 @@ describe('workers/repository/finalize/prune', () => { it('deletes with base branches', async () => { config.branchList = ['renovate/main-a']; - config.baseBranches = ['main', 'maint/v7']; + config.baseBranchPatterns = ['main', 'maint/v7']; git.getBranchList.mockReturnValueOnce( config.branchList.concat([ 'renovate/main-b', diff --git a/lib/workers/repository/finalize/prune.ts b/lib/workers/repository/finalize/prune.ts index 918751344bb..c16495dacdc 100644 --- a/lib/workers/repository/finalize/prune.ts +++ b/lib/workers/repository/finalize/prune.ts @@ -117,7 +117,7 @@ async function cleanUpBranches( * @param config Renovate configuration */ function calculateBaseBranchRegex(config: RenovateConfig): RegExp | null { - if (!config.baseBranches?.length) { + if (!config.baseBranchPatterns?.length) { return null; } @@ -128,7 +128,7 @@ function calculateBaseBranchRegex(config: RenovateConfig): RegExp | null { .map(escapeRegExp); // calculate possible base branches and escape for regex - const baseBranches = config.baseBranches.map(escapeRegExp); + const baseBranches = config.baseBranchPatterns.map(escapeRegExp); // create regex to extract base branche from branch name const baseBranchRe = regEx( diff --git a/lib/workers/repository/process/extract-update.spec.ts b/lib/workers/repository/process/extract-update.spec.ts index 56c7c12ebc7..1ae6fbaa63d 100644 --- a/lib/workers/repository/process/extract-update.spec.ts +++ b/lib/workers/repository/process/extract-update.spec.ts @@ -52,7 +52,7 @@ describe('workers/repository/process/extract-update', () => { }); describe('extract()', () => { - it('runs with no baseBranches', async () => { + it('runs with no baseBranchPatterns', async () => { const config = { repoIsOnboarded: true, }; @@ -75,9 +75,9 @@ describe('workers/repository/process/extract-update', () => { await expect(update(config, res.branches)).resolves.not.toThrow(); }); - it('runs with baseBranches', async () => { + it('runs with baseBranchPatterns', async () => { const config = { - baseBranches: ['master', 'dev'], + baseBranchPatterns: ['master', 'dev'], repoIsOnboarded: true, enabledManagers: ['npm'], javascript: { diff --git a/lib/workers/repository/process/extract-update.ts b/lib/workers/repository/process/extract-update.ts index 61c2bac433d..932a1c2e870 100644 --- a/lib/workers/repository/process/extract-update.ts +++ b/lib/workers/repository/process/extract-update.ts @@ -170,8 +170,8 @@ export async function extract( packageFiles, }; // Clean up cached branch extracts - const baseBranches = is.nonEmptyArray(config.baseBranches) - ? config.baseBranches + const baseBranches = is.nonEmptyArray(config.baseBranchPatterns) + ? config.baseBranchPatterns : [baseBranch]; Object.keys(cache.scan).forEach((branchName) => { if (!baseBranches.includes(branchName)) { diff --git a/lib/workers/repository/process/index.spec.ts b/lib/workers/repository/process/index.spec.ts index efa6c9dee09..463e6111738 100644 --- a/lib/workers/repository/process/index.spec.ts +++ b/lib/workers/repository/process/index.spec.ts @@ -26,7 +26,7 @@ describe('workers/repository/process/index', () => { expect(res).toBeUndefined(); }); - it('processes baseBranches', async () => { + it('processes baseBranchPatterns', async () => { extract.mockResolvedValue({} as never); config.baseBranchPatterns = ['branch1', 'branch2']; scm.branchExists.mockResolvedValueOnce(false); @@ -61,7 +61,7 @@ describe('workers/repository/process/index', () => { ); }); - it('reads config from branches in baseBranches if useBaseBranchConfig specified', async () => { + it('reads config from branches in baseBranchPatterns if useBaseBranchConfig specified', async () => { scm.branchExists.mockResolvedValue(true); platform.getJsonFile = vi .fn() @@ -104,7 +104,7 @@ describe('workers/repository/process/index', () => { expect(addMeta).toHaveBeenNthCalledWith(2, { baseBranch: 'dev' }); }); - it('processes baseBranches dryRun extract', async () => { + it('processes baseBranchPatterns dryRun extract', async () => { extract.mockResolvedValue({} as never); GlobalConfig.set({ dryRun: 'extract' }); const res = await extractDependencies(config); diff --git a/lib/workers/repository/process/index.ts b/lib/workers/repository/process/index.ts index b852424c65b..438aa99e908 100644 --- a/lib/workers/repository/process/index.ts +++ b/lib/workers/repository/process/index.ts @@ -73,7 +73,7 @@ async function getBaseBranchConfig( } // baseBranches value should be based off the default branch - baseBranchConfig.baseBranches = config.baseBranches; + baseBranchConfig.baseBranchPatterns = config.baseBranchPatterns; } if (config.baseBranchPatterns!.length > 1) { @@ -125,13 +125,13 @@ export async function extractDependencies( GlobalConfig.get('platform') !== 'local' && config.baseBranchPatterns?.length ) { - config.baseBranches = unfoldBaseBranches( + config.baseBranchPatterns = unfoldBaseBranches( config.defaultBranch!, config.baseBranchPatterns, ); - logger.debug({ baseBranches: config.baseBranches }, 'baseBranches'); + logger.debug({ baseBranches: config.baseBranchPatterns }, 'baseBranches'); const extracted: Record> = {}; - for (const baseBranch of config.baseBranches) { + for (const baseBranch of config.baseBranchPatterns) { addMeta({ baseBranch }); if (await scm.branchExists(baseBranch)) { const baseBranchConfig = await getBaseBranchConfig(baseBranch, config); @@ -141,7 +141,7 @@ export async function extractDependencies( } } addSplit('extract'); - for (const baseBranch of config.baseBranches) { + for (const baseBranch of config.baseBranchPatterns) { if (await scm.branchExists(baseBranch)) { addMeta({ baseBranch }); const baseBranchConfig = await getBaseBranchConfig(baseBranch, config); diff --git a/lib/workers/repository/process/write.spec.ts b/lib/workers/repository/process/write.spec.ts index 813b73c9424..7fb24cd967d 100644 --- a/lib/workers/repository/process/write.spec.ts +++ b/lib/workers/repository/process/write.spec.ts @@ -129,7 +129,7 @@ describe('workers/repository/process/write', () => { scm.branchExists.mockResolvedValueOnce(false).mockResolvedValue(true); GlobalConfig.set({ dryRun: 'full' }); - config.baseBranches = ['main', 'dev']; + config.baseBranchPatterns = ['main', 'dev']; await writeUpdates(config, branches); expect(counts.get('Branches')).toBe(1); expect(addMeta).toHaveBeenCalledWith({ diff --git a/lib/workers/repository/process/write.ts b/lib/workers/repository/process/write.ts index 7729be1b42c..9722a6d0488 100644 --- a/lib/workers/repository/process/write.ts +++ b/lib/workers/repository/process/write.ts @@ -138,7 +138,7 @@ export async function writeUpdates( for (const branch of branches) { const { baseBranch, branchName } = branch; const meta: Record = { branch: branchName }; - if (config.baseBranches?.length && baseBranch) { + if (config.baseBranchPatterns?.length && baseBranch) { meta.baseBranch = baseBranch; } addMeta(meta); From 1b9b3e325f307b7d7877deb5aba5f052d1f49bd9 Mon Sep 17 00:00:00 2001 From: Rahul Gautam Singh Date: Tue, 27 May 2025 20:04:03 +0530 Subject: [PATCH 8/8] apply suggestions --- lib/config/types.ts | 2 +- lib/config/validation-helpers/types.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/config/types.ts b/lib/config/types.ts index 517f8c9c72d..cddc660a34c 100644 --- a/lib/config/types.ts +++ b/lib/config/types.ts @@ -233,7 +233,7 @@ export interface RenovateConfig reportPath?: string; reportType?: 'logging' | 'file' | 's3' | null; depName?: string; - /** user configurable */ + /** user configurable base branch patterns*/ baseBranchPatterns?: string[]; commitBody?: string; useBaseBranchConfig?: UseBaseBranchConfigType; diff --git a/lib/config/validation-helpers/types.ts b/lib/config/validation-helpers/types.ts index d18b83b62f0..cb5f8063558 100644 --- a/lib/config/validation-helpers/types.ts +++ b/lib/config/validation-helpers/types.ts @@ -13,6 +13,6 @@ export interface CheckMatcherArgs { export interface CheckBaseBranchesArgs { resolvedRule: PackageRule; currentPath: string; - /** user configurable */ + /** user configurable base branch patterns*/ baseBranchPatterns?: string[]; }