From 99e68cddd39844648fbf1c2b9fc2005b5430ed5c Mon Sep 17 00:00:00 2001 From: Rhys Arkins <rhys@keylocation.sg> Date: Fri, 11 Aug 2017 08:03:18 +0200 Subject: [PATCH] feat: process all package rules in parent->child order (#666) --- lib/config/index.js | 8 +--- lib/workers/dep-type/index.js | 63 ++++++++++++++--------------- test/config/index.spec.js | 13 ++++-- test/workers/dep-type/index.spec.js | 8 ++-- 4 files changed, 47 insertions(+), 45 deletions(-) diff --git a/lib/config/index.js b/lib/config/index.js index 351fb6e129..50429d6e51 100644 --- a/lib/config/index.js +++ b/lib/config/index.js @@ -119,12 +119,8 @@ function mergeChildConfig(parentConfig, childConfig) { if (option.mergeable && childConfig[option.name]) { logger.debug(`mergeable option: ${option.name}`); if (option.type === 'list') { - if (parentConfig[option.name]) { - // Place parent values *after* child - config[option.name] = config[option.name].concat( - parentConfig[option.name] - ); - } + config[option.name] = (parentConfig[option.name] || []) + .concat(config[option.name] || []); } else { config[option.name] = { ...parentConfig[option.name], diff --git a/lib/workers/dep-type/index.js b/lib/workers/dep-type/index.js index a4c6d45450..a089b82215 100644 --- a/lib/workers/dep-type/index.js +++ b/lib/workers/dep-type/index.js @@ -55,45 +55,44 @@ async function renovateDepType(packageContent, config) { } function getDepConfig(depTypeConfig, dep) { - const depConfig = configParser.mergeChildConfig(depTypeConfig, dep); + let depConfig = configParser.mergeChildConfig(depTypeConfig, dep); // Apply any matching package rules if (depConfig.packageRules) { - let packageRuleApplied = false; depConfig.packageRules.forEach(packageRule => { - // Apply at most 1 package fule - if (!packageRuleApplied) { - if ( - packageRule.packageNames && - packageRule.packageNames.includes(depConfig.depName) - ) { - packageRuleApplied = true; - } else if (packageRule.packagePatterns) { - for (const packagePattern of packageRule.packagePatterns) { - const packageRegex = new RegExp(packagePattern); - if (depConfig.depName.match(packageRegex)) { - packageRuleApplied = true; - } + let applyRule = false; + if ( + packageRule.packageNames && + packageRule.packageNames.includes(depConfig.depName) + ) { + applyRule = true; + } else if (packageRule.packagePatterns) { + for (const packagePattern of packageRule.packagePatterns) { + const packageRegex = new RegExp(packagePattern); + if (depConfig.depName.match(packageRegex)) { + applyRule = true; } } - if ( - packageRule.excludePackageNames && - packageRule.excludePackageNames.includes(depConfig.depName) - ) { - packageRuleApplied = false; - } else if (packageRule.excludePackagePatterns) { - for (const packagePattern of packageRule.excludePackagePatterns) { - const packageRegex = new RegExp(packagePattern); - if (depConfig.depName.match(packageRegex)) { - packageRuleApplied = false; - } + } + if ( + packageRule.excludePackageNames && + packageRule.excludePackageNames.includes(depConfig.depName) + ) { + applyRule = false; + } else if (packageRule.excludePackagePatterns) { + for (const packagePattern of packageRule.excludePackagePatterns) { + const packageRegex = new RegExp(packagePattern); + if (depConfig.depName.match(packageRegex)) { + applyRule = false; } } - if (packageRuleApplied) { - // Package rule config overrides any existing config - Object.assign(depConfig, packageRule); - delete depConfig.packageNames; - delete depConfig.packagePatterns; - } + } + if (applyRule) { + // Package rule config overrides any existing config + depConfig = configParser.mergeChildConfig(depConfig, packageRule); + delete depConfig.packageNames; + delete depConfig.packagePatterns; + delete depConfig.excludePackageNames; + delete depConfig.excludePackagePatterns; } }); } diff --git a/test/config/index.spec.js b/test/config/index.spec.js index 67f02e13f0..d432a21b96 100644 --- a/test/config/index.spec.js +++ b/test/config/index.spec.js @@ -184,13 +184,13 @@ describe('config/index', () => { const configParser = require('../../lib/config/index.js'); const config = configParser.mergeChildConfig(parentConfig, childConfig); expect(config.packageRules.map(rule => rule.a)).toMatchObject([ - 3, - 4, 1, 2, + 3, + 4, ]); }); - it('skips null parent packageRules', () => { + it('handles null parent packageRules', () => { const parentConfig = { ...defaultConfig }; Object.assign(parentConfig, { packageRules: null, @@ -202,5 +202,12 @@ describe('config/index', () => { const config = configParser.mergeChildConfig(parentConfig, childConfig); expect(config.packageRules).toHaveLength(2); }); + it('handles null child packageRules', () => { + const parentConfig = { ...defaultConfig }; + parentConfig.packageRules = [{ a: 3 }, { a: 4 }]; + const configParser = require('../../lib/config/index.js'); + const config = configParser.mergeChildConfig(parentConfig, {}); + expect(config.packageRules).toHaveLength(2); + }); }); }); diff --git a/test/workers/dep-type/index.spec.js b/test/workers/dep-type/index.spec.js index 325f41ef10..d97e55e328 100644 --- a/test/workers/dep-type/index.spec.js +++ b/test/workers/dep-type/index.spec.js @@ -64,22 +64,22 @@ describe('lib/workers/dep-type/index', () => { }, ], }; - it('applies only one rule for a', () => { + it('applies both rules for a', () => { const dep = { depName: 'a', }; const res = depTypeWorker.getDepConfig(depTypeConfig, dep); expect(res.x).toBe(2); - expect(res.y).toBeUndefined(); + expect(res.y).toBe(2); expect(res.packageRules).toBeUndefined(); }); - it('applies only one rule for b', () => { + it('applies both rules for b', () => { const dep = { depName: 'b', }; const res = depTypeWorker.getDepConfig(depTypeConfig, dep); expect(res.x).toBe(2); - expect(res.y).toBeUndefined(); + expect(res.y).toBe(2); expect(res.packageRules).toBeUndefined(); }); it('applies the second rule', () => { -- GitLab