diff --git a/docs/usage/configuration-options.md b/docs/usage/configuration-options.md index 981e1d621e3..139b2e9a7e6 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 `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. @@ -346,24 +346,27 @@ 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 + +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 `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.: +The simplest approach is exact matches, e.g. `["main", "dev"]`. +`baseBranchPatterns` also supports Regular Expressions that must begin and end with `/`, e.g.: ```json { - "baseBranches": ["main", "/^release\\/.*/"] + "baseBranchPatterns": ["main", "/^release\\/.*/"] } ``` @@ -373,7 +376,7 @@ With a negation, all branches except those matching the regex will be added to t ```json { - "baseBranches": ["!/^pre-release\\/.*/"] + "baseBranchPatterns": ["!/^pre-release\\/.*/"] } ``` @@ -381,13 +384,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 @@ -751,12 +754,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 50690ca3f24..4ccb15362a2 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 e1b3a9f614a..cf97553fd27 100644 --- a/docs/usage/getting-started/running.md +++ b/docs/usage/getting-started/running.md @@ -129,6 +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 `baseBranchPatterns` config option ### Hosting Renovate diff --git a/lib/config/__snapshots__/migration.spec.ts.snap b/lib/config/__snapshots__/migration.spec.ts.snap index cd197aa8ed9..830c6b59d0f 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 76be8feb79d..68a3d60a823 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', () => { @@ -391,7 +392,7 @@ describe('config/migration', () => { const { isMigrated, migratedConfig } = configMigration.migrateConfig(config); expect(migratedConfig).toEqual({ - baseBranches: [], + baseBranchPatterns: [], commitMessage: 'test', ignorePaths: [], includePaths: ['test'], @@ -771,4 +772,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-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/migrations-service.ts b/lib/config/migrations/migrations-service.ts index 71b5c77d905..5ee90343cb5 100644 --- a/lib/config/migrations/migrations-service.ts +++ b/lib/config/migrations/migrations-service.ts @@ -106,6 +106,7 @@ export class MigrationsService { ['masterIssueTitle', 'dependencyDashboardTitle'], ['masterIssueLabels', 'dependencyDashboardLabels'], ['regexManagers', 'customManagers'], + ['baseBranches', 'baseBranchPatterns'], ]); static readonly customMigrations: readonly MigrationConstructor[] = [ diff --git a/lib/config/options/index.ts b/lib/config/options/index.ts index 27f5fc36747..e09279525e7 100644 --- a/lib/config/options/index.ts +++ b/lib/config/options/index.ts @@ -1059,7 +1059,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 2090109af60..1da99f0e329 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[]; + /** user configurable base branch patterns*/ + baseBranchPatterns?: 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 4386718ed7a..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]', @@ -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 in order 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..77de2ab81a6 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 in order to use them inside matchBaseBranches.`, }); } } diff --git a/lib/config/validation-helpers/types.ts b/lib/config/validation-helpers/types.ts index 873f0398212..cb5f8063558 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; - baseBranches?: string[]; + /** user configurable base branch patterns*/ + baseBranchPatterns?: string[]; } diff --git a/lib/config/validation.spec.ts b/lib/config/validation.spec.ts index 64ca2f435d5..26bb449c2ab 100644 --- a/lib/config/validation.spec.ts +++ b/lib/config/validation.spec.ts @@ -228,7 +228,7 @@ describe('config/validation', () => { it('validates matchBaseBranches', async () => { const config = { - baseBranches: ['foo'], + baseBranchPatterns: ['foo'], packageRules: [ { matchBaseBranches: ['foo'], @@ -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,15 +372,15 @@ describe('config/validation', () => { ]); }); - it('catches invalid baseBranches regex', async () => { + it('catches invalid baseBranchPatterns 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 8205fa8ea43..4fdfaa03fbb 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( @@ -578,15 +578,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 ef3e1d96b3b..e33699a4520 100644 --- a/lib/util/git/index.spec.ts +++ b/lib/util/git/index.spec.ts @@ -1216,7 +1216,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/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 84ce5c8f101..f7d73e4e671 100644 --- a/lib/workers/global/config/parse/env.ts +++ b/lib/workers/global/config/parse/env.ts @@ -43,6 +43,7 @@ const renameKeys = { mergeConfidenceApiBaseUrl: 'mergeConfidenceEndpoint', mergeConfidenceSupportedDatasources: 'mergeConfidenceDatasources', allowedPostUpgradeCommands: 'allowedCommands', + baseBranches: 'baseBranchPatterns', }; function renameEnvKeys(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv { 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/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/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 67962e223f7..373552ef75c 100644 --- a/lib/workers/repository/process/extract-update.ts +++ b/lib/workers/repository/process/extract-update.ts @@ -177,8 +177,8 @@ export async function extract( }; } // 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 e132d74f8ef..463e6111738 100644 --- a/lib/workers/repository/process/index.spec.ts +++ b/lib/workers/repository/process/index.spec.ts @@ -26,9 +26,9 @@ describe('workers/repository/process/index', () => { expect(res).toBeUndefined(); }); - it('processes baseBranches', async () => { + it('processes baseBranchPatterns', 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); @@ -61,12 +61,12 @@ 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() .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, @@ -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); @@ -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 e44a5cc51df..7c5192a5337 100644 --- a/lib/workers/repository/process/index.ts +++ b/lib/workers/repository/process/index.ts @@ -73,10 +73,10 @@ async function getBaseBranchConfig( } // baseBranches value should be based off the default branch - baseBranchConfig.baseBranches = config.baseBranches; + baseBranchConfig.baseBranchPatterns = config.baseBranchPatterns; } - 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); } } @@ -122,14 +122,17 @@ export async function extractDependencies( branchList: [], packageFiles: {}, }; - if (GlobalConfig.get('platform') !== 'local' && config.baseBranches?.length) { - config.baseBranches = unfoldBaseBranches( + if ( + GlobalConfig.get('platform') !== 'local' && + config.baseBranchPatterns?.length + ) { + config.baseBranchPatterns = unfoldBaseBranches( config.defaultBranch!, - config.baseBranches, + 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 (scm.syncForkWithUpstream) { @@ -143,7 +146,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);