From 7136432d14d3a868947ecb87f63f5bc034a75913 Mon Sep 17 00:00:00 2001 From: Sergio Zharinov Date: Sat, 27 Jun 2020 18:07:48 +0400 Subject: [PATCH 1/6] fix(npm): Fix titles for PRs grouped with @types package --- lib/workers/repository/updates/generate.ts | 59 ++++++++++++---------- 1 file changed, 31 insertions(+), 28 deletions(-) diff --git a/lib/workers/repository/updates/generate.ts b/lib/workers/repository/updates/generate.ts index c37f56c146b69f..aa7b28e94b6c1c 100644 --- a/lib/workers/repository/updates/generate.ts +++ b/lib/workers/repository/updates/generate.ts @@ -11,16 +11,29 @@ function ifTypesGroup( hasGroupName: boolean, branchUpgrades: any[] ): boolean { - return ( - depNames.length === 2 && - !hasGroupName && - ((branchUpgrades[0].depName && - branchUpgrades[0].depName.startsWith('@types/') && - branchUpgrades[0].depName.endsWith(branchUpgrades[1].depName)) || - (branchUpgrades[1].depName && - branchUpgrades[1].depName.startsWith('@types/') && - branchUpgrades[1].depName.endsWith(branchUpgrades[0].depName))) + const hasTypes = (): boolean => + branchUpgrades.some(({ depName }) => depName?.startsWith('@types/')); + + const hasSameName = (): boolean => { + const names = branchUpgrades.map(({ depName }) => + depName?.replace(/^@types\//, '') + ); + const namesSet = new Set(names); + return namesSet.size === 1; + }; + + return depNames.length > 1 && !hasGroupName && hasTypes() && hasSameName(); +} + +function sortTypesGroup(upgrades: BranchUpgradeConfig[]): void { + const isTypesUpgrade = ({ depName }: BranchUpgradeConfig): boolean => + depName.startsWith('@types/'); + const regularUpgrades = upgrades.filter( + (upgrade) => !isTypesUpgrade(upgrade) ); + const typesUpgrades = upgrades.filter(isTypesUpgrade); + upgrades.splice(0, upgrades.length); + upgrades.push(...regularUpgrades, ...typesUpgrades); } function getTableValues( @@ -254,25 +267,15 @@ export function generateBranchConfig( } } } - if ( - depNames.length === 2 && - !hasGroupName && - config.upgrades[0].depName && - config.upgrades[0].depName.startsWith('@types/') && - config.upgrades[0].depName.endsWith(config.upgrades[1].depName) - ) { - logger.debug('Found @types - reversing upgrades to use depName in PR'); - config.upgrades.reverse(); - config.upgrades[0].recreateClosed = false; - config.hasTypes = true; - } else if ( - depNames.length === 2 && - !hasGroupName && - config.upgrades[1].depName && - config.upgrades[1].depName.startsWith('@types/') && - config.upgrades[1].depName.endsWith(config.upgrades[0].depName) - ) { - // do nothing + + const isTypesGroup = ifTypesGroup(depNames, hasGroupName, branchUpgrades); + if (isTypesGroup) { + if (config.upgrades[0].depName?.startsWith('@types/')) { + logger.debug('Found @types - reversing upgrades to use depName in PR'); + sortTypesGroup(config.upgrades); + config.upgrades[0].recreateClosed = false; + config.hasTypes = true; + } } else { config.upgrades.sort((a, b) => { if (a.fileReplacePosition && b.fileReplacePosition) { From 5c5d8d8fa8d6fcbb7643f613d73b5fdb77238860 Mon Sep 17 00:00:00 2001 From: Sergio Zharinov Date: Sat, 27 Jun 2020 18:13:26 +0400 Subject: [PATCH 2/6] Refactor a bit --- lib/workers/repository/updates/generate.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/workers/repository/updates/generate.ts b/lib/workers/repository/updates/generate.ts index aa7b28e94b6c1c..2eaac81e601bcb 100644 --- a/lib/workers/repository/updates/generate.ts +++ b/lib/workers/repository/updates/generate.ts @@ -6,7 +6,7 @@ import { logger } from '../../../logger'; import * as template from '../../../util/template'; import { BranchConfig, BranchUpgradeConfig } from '../../common'; -function ifTypesGroup( +function isTypesGroup( depNames: string[], hasGroupName: boolean, branchUpgrades: any[] @@ -167,10 +167,11 @@ export function generateBranchConfig( delete upgrade.group; delete upgrade.lazyGrouping; - const isTypesGroup = ifTypesGroup(depNames, hasGroupName, branchUpgrades); - // istanbul ignore else - if (toVersions.length > 1 && !isTypesGroup) { + if ( + toVersions.length > 1 && + !isTypesGroup(depNames, hasGroupName, branchUpgrades) + ) { logger.trace({ toVersions }); delete upgrade.commitMessageExtra; upgrade.recreateClosed = true; @@ -268,8 +269,7 @@ export function generateBranchConfig( } } - const isTypesGroup = ifTypesGroup(depNames, hasGroupName, branchUpgrades); - if (isTypesGroup) { + if (isTypesGroup(depNames, hasGroupName, branchUpgrades)) { if (config.upgrades[0].depName?.startsWith('@types/')) { logger.debug('Found @types - reversing upgrades to use depName in PR'); sortTypesGroup(config.upgrades); From 5870d6dc2924366d289a4d3bdbce3f29280c483f Mon Sep 17 00:00:00 2001 From: Sergio Zharinov Date: Sat, 27 Jun 2020 18:19:13 +0400 Subject: [PATCH 3/6] Add null check --- lib/workers/repository/updates/generate.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/workers/repository/updates/generate.ts b/lib/workers/repository/updates/generate.ts index 2eaac81e601bcb..bcb12795b0b792 100644 --- a/lib/workers/repository/updates/generate.ts +++ b/lib/workers/repository/updates/generate.ts @@ -27,7 +27,7 @@ function isTypesGroup( function sortTypesGroup(upgrades: BranchUpgradeConfig[]): void { const isTypesUpgrade = ({ depName }: BranchUpgradeConfig): boolean => - depName.startsWith('@types/'); + depName?.startsWith('@types/'); const regularUpgrades = upgrades.filter( (upgrade) => !isTypesUpgrade(upgrade) ); From 731f9e217490b63e6a0d6c9753fb13a587d54cfd Mon Sep 17 00:00:00 2001 From: Sergio Zharinov Date: Sat, 27 Jun 2020 19:04:30 +0400 Subject: [PATCH 4/6] Extend tests --- .../__snapshots__/generate.spec.ts.snap | 86 +++++++++++++++++++ .../repository/updates/generate.spec.ts | 23 +++++ 2 files changed, 109 insertions(+) diff --git a/lib/workers/repository/updates/__snapshots__/generate.spec.ts.snap b/lib/workers/repository/updates/__snapshots__/generate.spec.ts.snap index 0cac1ab725db06..2da948ad7a471c 100644 --- a/lib/workers/repository/updates/__snapshots__/generate.spec.ts.snap +++ b/lib/workers/repository/updates/__snapshots__/generate.spec.ts.snap @@ -34,6 +34,18 @@ Object { "prTitle": "some-title", "prettyDepType": "dependency", }, + Object { + "branchName": "some-branch", + "commitBodyTable": true, + "commitMessage": "", + "datasource": "npm", + "depName": "some-dep", + "displayFrom": "", + "displayTo": "1.0.0", + "newValue": "1.0.0", + "prTitle": "some-other-title", + "prettyDepType": "dependency", + }, Object { "branchName": "some-branch", "commitMessage": "", @@ -48,6 +60,80 @@ Object { } `; +exports[`workers/repository/updates/generate generateBranchConfig() handles @types specially 1`] = ` +Object { + "automerge": false, + "blockedByPin": false, + "branchName": "some-branch", + "canBeUnpublished": false, + "commitBodyTable": true, + "commitMessage": " + +| datasource | package | from | to | +| ---------- | --------------- | ----- | ----- | +| npm | @types/some-dep | 0.5.7 | 0.5.8 | +", + "datasource": "npm", + "depName": "some-dep", + "displayFrom": "", + "displayTo": "0.6.0", + "hasTypes": true, + "isRange": false, + "masterIssueApproval": false, + "masterIssuePrApproval": false, + "newValue": "0.6.0", + "prTitle": "some-title", + "prettyDepType": "dependency", + "recreateClosed": false, + "releaseTimestamp": undefined, + "reuseLockFiles": true, + "upgrades": Array [ + Object { + "branchName": "some-branch", + "commitBodyTable": true, + "commitMessage": "", + "datasource": "npm", + "depName": "some-dep", + "displayFrom": "", + "displayTo": "0.6.0", + "isRange": false, + "newValue": "0.6.0", + "prTitle": "some-title", + "prettyDepType": "dependency", + "recreateClosed": false, + }, + Object { + "branchName": "some-branch", + "commitBodyTable": true, + "commitMessage": "", + "datasource": "npm", + "depName": "some-dep", + "displayFrom": "", + "displayTo": "1.0.0", + "isRange": false, + "newValue": "1.0.0", + "prTitle": "some-other-title", + "prettyDepType": "dependency", + }, + Object { + "branchName": "some-branch", + "commitBodyTable": true, + "commitMessage": "", + "currentValue": "0.5.7", + "datasource": "npm", + "depName": "@types/some-dep", + "displayFrom": "0.5.7", + "displayTo": "", + "fromVersion": "0.5.7", + "isRange": false, + "prTitle": "some-title", + "prettyDepType": "dependency", + "toVersion": "0.5.8", + }, + ], +} +`; + exports[`workers/repository/updates/generate generateBranchConfig() handles upgrades 1`] = `"some-title ()"`; exports[`workers/repository/updates/generate generateBranchConfig() supports manual prTitle 1`] = `"upgrade some-dep"`; diff --git a/lib/workers/repository/updates/generate.spec.ts b/lib/workers/repository/updates/generate.spec.ts index da2a1e94281aab..394c94c748a5b0 100644 --- a/lib/workers/repository/updates/generate.spec.ts +++ b/lib/workers/repository/updates/generate.spec.ts @@ -395,10 +395,22 @@ describe('workers/repository/updates/generate', () => { newValue: '0.6.0', group: {}, }, + { + commitBodyTable: true, + datasource: datasourceNpm.id, + depName: 'some-dep', + groupName: null, + branchName: 'some-branch', + prTitle: 'some-other-title', + lazyGrouping: true, + newValue: '1.0.0', + group: {}, + }, ]; const res = generateBranchConfig(branch); expect(res.recreateClosed).toBe(false); expect(res.groupName).toBeUndefined(); + expect(generateBranchConfig(branch)).toMatchSnapshot(); }); it('handles @types specially (reversed)', () => { const branch: BranchUpgradeConfig[] = [ @@ -411,6 +423,17 @@ describe('workers/repository/updates/generate', () => { newValue: '0.6.0', group: {}, }, + { + commitBodyTable: true, + datasource: datasourceNpm.id, + depName: 'some-dep', + groupName: null, + branchName: 'some-branch', + prTitle: 'some-other-title', + lazyGrouping: true, + newValue: '1.0.0', + group: {}, + }, { depName: '@types/some-dep', groupName: null, From 2e3ad77236f665e7f35914a55b2773c63e1ed5f6 Mon Sep 17 00:00:00 2001 From: Sergio Zharinov Date: Mon, 29 Jun 2020 17:42:40 +0400 Subject: [PATCH 5/6] Refactor more --- lib/workers/repository/updates/generate.ts | 34 +++++++++------------- 1 file changed, 13 insertions(+), 21 deletions(-) diff --git a/lib/workers/repository/updates/generate.ts b/lib/workers/repository/updates/generate.ts index bcb12795b0b792..b09effb53a1bde 100644 --- a/lib/workers/repository/updates/generate.ts +++ b/lib/workers/repository/updates/generate.ts @@ -6,23 +6,16 @@ import { logger } from '../../../logger'; import * as template from '../../../util/template'; import { BranchConfig, BranchUpgradeConfig } from '../../common'; -function isTypesGroup( - depNames: string[], - hasGroupName: boolean, - branchUpgrades: any[] -): boolean { - const hasTypes = (): boolean => - branchUpgrades.some(({ depName }) => depName?.startsWith('@types/')); - - const hasSameName = (): boolean => { - const names = branchUpgrades.map(({ depName }) => - depName?.replace(/^@types\//, '') - ); - const namesSet = new Set(names); - return namesSet.size === 1; - }; +function isTypesGroup(branchUpgrades: any[]): boolean { + if (!branchUpgrades.some(({ depName }) => depName?.startsWith('@types/'))) { + return false; + } - return depNames.length > 1 && !hasGroupName && hasTypes() && hasSameName(); + const names = branchUpgrades.map(({ depName }) => + depName?.replace(/^@types\//, '') + ); + const namesSet = new Set(names); + return namesSet.size === 1; } function sortTypesGroup(upgrades: BranchUpgradeConfig[]): void { @@ -108,6 +101,8 @@ export function generateBranchConfig( // eslint-disable-next-line no-param-reassign branchUpgrades[0].commitMessageExtra = `to v${toVersions[0]}`; } + const typesGroup = + depNames.length > 1 && !hasGroupName && isTypesGroup(branchUpgrades); logger.trace(`groupEligible: ${groupEligible}`); const useGroupSettings = hasGroupName && groupEligible; logger.trace(`useGroupSettings: ${useGroupSettings}`); @@ -168,10 +163,7 @@ export function generateBranchConfig( delete upgrade.lazyGrouping; // istanbul ignore else - if ( - toVersions.length > 1 && - !isTypesGroup(depNames, hasGroupName, branchUpgrades) - ) { + if (toVersions.length > 1 && !typesGroup) { logger.trace({ toVersions }); delete upgrade.commitMessageExtra; upgrade.recreateClosed = true; @@ -269,7 +261,7 @@ export function generateBranchConfig( } } - if (isTypesGroup(depNames, hasGroupName, branchUpgrades)) { + if (typesGroup) { if (config.upgrades[0].depName?.startsWith('@types/')) { logger.debug('Found @types - reversing upgrades to use depName in PR'); sortTypesGroup(config.upgrades); From 886e33b8678582fbfb9cedfbe76b998dc94d79fb Mon Sep 17 00:00:00 2001 From: Sergio Zharinov Date: Mon, 29 Jun 2020 22:04:52 +0400 Subject: [PATCH 6/6] Fix coverage --- lib/workers/repository/updates/generate.ts | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/lib/workers/repository/updates/generate.ts b/lib/workers/repository/updates/generate.ts index b09effb53a1bde..946b1c47d396c8 100644 --- a/lib/workers/repository/updates/generate.ts +++ b/lib/workers/repository/updates/generate.ts @@ -7,15 +7,12 @@ import * as template from '../../../util/template'; import { BranchConfig, BranchUpgradeConfig } from '../../common'; function isTypesGroup(branchUpgrades: any[]): boolean { - if (!branchUpgrades.some(({ depName }) => depName?.startsWith('@types/'))) { - return false; - } - - const names = branchUpgrades.map(({ depName }) => - depName?.replace(/^@types\//, '') + return ( + branchUpgrades.some(({ depName }) => depName?.startsWith('@types/')) && + new Set( + branchUpgrades.map(({ depName }) => depName?.replace(/^@types\//, '')) + ).size === 1 ); - const namesSet = new Set(names); - return namesSet.size === 1; } function sortTypesGroup(upgrades: BranchUpgradeConfig[]): void {