diff --git a/lib/config/templates/default/pr-title.hbs b/lib/config/templates/default/pr-title.hbs index 002c01227effc1ce2b7ad8bac207e22f06612def..8565257e77425bbad06d166ac1001a6386fc7903 100644 --- a/lib/config/templates/default/pr-title.hbs +++ b/lib/config/templates/default/pr-title.hbs @@ -1 +1 @@ -{{semanticPrefix}}{{#if isPin}}Pin{{else}}{{#if isRollback}}Roll back{{else}}Update{{/if}}{{/if}} dependency {{depName}} to {{#if isRange}}{{newVersion}}{{else}}{{#if isMajor}}v{{newVersionMajor}}.x{{else}}v{{newVersion}}{{/if}}{{/if}} +{{semanticPrefix}}{{#if isPin}}Pin{{else}}{{#if isRollback}}Roll back{{else}}Update{{/if}}{{/if}} dependency {{depName}} to {{#if isRange}}{{newVersion}}{{else}}{{#if isMajor}}v{{newVersionMajor}}{{else}}v{{newVersion}}{{/if}}{{/if}} diff --git a/lib/workers/branch/index.js b/lib/workers/branch/index.js index 04aba4e90b2607b31e94107bd46416e5030d6022..dcbb653383e357e961957ef1e9a79666e8eefbed 100644 --- a/lib/workers/branch/index.js +++ b/lib/workers/branch/index.js @@ -216,8 +216,13 @@ async function ensureBranch(config) { async function processBranchUpgrades(branchUpgrades, errors, warnings) { logger = branchUpgrades.logger || logger; - logger.trace({ config: branchUpgrades }, 'processBranchUpgrades'); const config = { ...branchUpgrades }; + logger = logger.child({ + repository: config.repository, + branch: config.branchName, + }); + config.logger = logger; + logger.trace({ config: branchUpgrades }, 'processBranchUpgrades'); // Check schedule if ( config.schedule && @@ -228,23 +233,25 @@ async function processBranchUpgrades(branchUpgrades, errors, warnings) { return; } - logger = logger.child({ - repository: config.repository, - branch: config.branchName, - }); - config.logger = logger; - const packageNames = config.upgrades.map(upgrade => upgrade.depName); logger.info(`Branch has ${packageNames.length} upgrade(s): ${packageNames}`); try { - if ( - // Groups and lock file maintenance should set this to true - config.recreateClosed === false && - (await config.api.checkForClosedPr(config.branchName, config.prTitle)) - ) { - logger.info(`Skipping branch as matching closed PR already existed`); - return; + // Groups and lock file maintenance should set this to true + if (config.recreateClosed === false) { + if ( + // Check for current PR title format + await config.api.checkForClosedPr(config.branchName, config.prTitle) + ) { + return; + } + // Check for legacy PR title format + const legacyPrTitle = config.prTitle + .replace(/to v(\d+)$/, 'to version $1.x') // Major + .replace(/to v(\d+)/, 'to version $1'); // Non-major + if (await config.api.checkForClosedPr(config.branchName, legacyPrTitle)) { + return; + } } const branchCreated = await module.exports.ensureBranch(config); if (branchCreated) { diff --git a/test/workers/branch/__snapshots__/index.spec.js.snap b/test/workers/branch/__snapshots__/index.spec.js.snap index 4f8e01e72babb430f49b2a79308b42a83101f1d4..48df282e6c8d4d3d2d9039bb8569683f13eae4a7 100644 --- a/test/workers/branch/__snapshots__/index.spec.js.snap +++ b/test/workers/branch/__snapshots__/index.spec.js.snap @@ -43,3 +43,29 @@ Object { ], } `; + +exports[`workers/branch processBranchUpgrades(upgrades) returns if legacy closed major PR found 1`] = ` +Array [ + Array [ + "renovate/a-2.x", + "Upgrade a to v2", + ], + Array [ + "renovate/a-2.x", + "Upgrade a to version 2.x", + ], +] +`; + +exports[`workers/branch processBranchUpgrades(upgrades) returns if legacy closed minor PR found 1`] = ` +Array [ + Array [ + "renovate/a-2.x", + "Upgrade a to v2.1.0", + ], + Array [ + "renovate/a-2.x", + "Upgrade a to version 2.1.0", + ], +] +`; diff --git a/test/workers/branch/index.spec.js b/test/workers/branch/index.spec.js index 3e52d0d9fe2b4e098918a37ec80d7b3aee1bec9c..71b63d618e875bf2d9baec65656287b4b2cd143a 100644 --- a/test/workers/branch/index.spec.js +++ b/test/workers/branch/index.spec.js @@ -367,6 +367,24 @@ describe('workers/branch', () => { await branchWorker.processBranchUpgrades(config); expect(branchWorker.ensureBranch.mock.calls.length).toBe(0); }); + it('returns if legacy closed major PR found', async () => { + config.branchName = 'renovate/a-2.x'; + config.prTitle = 'Upgrade a to v2'; + config.api.checkForClosedPr.mockReturnValueOnce(false); + config.api.checkForClosedPr.mockReturnValueOnce(true); + await branchWorker.processBranchUpgrades(config); + expect(branchWorker.ensureBranch.mock.calls.length).toBe(0); + expect(config.api.checkForClosedPr.mock.calls).toMatchSnapshot(); + }); + it('returns if legacy closed minor PR found', async () => { + config.branchName = 'renovate/a-2.x'; + config.prTitle = 'Upgrade a to v2.1.0'; + config.api.checkForClosedPr.mockReturnValueOnce(false); + config.api.checkForClosedPr.mockReturnValueOnce(true); + await branchWorker.processBranchUpgrades(config); + expect(branchWorker.ensureBranch.mock.calls.length).toBe(0); + expect(config.api.checkForClosedPr.mock.calls).toMatchSnapshot(); + }); it('does not return immediately if recreateClosed true', async () => { config.api.checkForClosedPr.mockReturnValue(true); config.recreateClosed = true; diff --git a/test/workers/package/__snapshots__/index.spec.js.snap b/test/workers/package/__snapshots__/index.spec.js.snap index 981e41f6c29d2359f3abe5898d2709da76e3ac3b..bf15efd7038d8c1cb2591d075b45f611e2b813ad 100644 --- a/test/workers/package/__snapshots__/index.spec.js.snap +++ b/test/workers/package/__snapshots__/index.spec.js.snap @@ -195,7 +195,7 @@ Please make sure the following warnings are safe to ignore: This {{#if isGitHub}}PR{{else}}MR{{/if}} has been generated by [Renovate Bot](https://renovateapp.com).", "prCreation": "immediate", - "prTitle": "{{semanticPrefix}}{{#if isPin}}Pin{{else}}{{#if isRollback}}Roll back{{else}}Update{{/if}}{{/if}} dependency {{depName}} to {{#if isRange}}{{newVersion}}{{else}}{{#if isMajor}}v{{newVersionMajor}}.x{{else}}v{{newVersion}}{{/if}}{{/if}}", + "prTitle": "{{semanticPrefix}}{{#if isPin}}Pin{{else}}{{#if isRollback}}Roll back{{else}}Update{{/if}}{{/if}} dependency {{depName}} to {{#if isRange}}{{newVersion}}{{else}}{{#if isMajor}}v{{newVersionMajor}}{{else}}v{{newVersion}}{{/if}}{{/if}}", "rebaseStalePrs": false, "recreateClosed": false, "repoIsOnboarded": true,