diff --git a/src/config.js b/src/config.js index 47de6d88a264e080b587ea281cb6b48810c7b647..833f1525457a7c6d8f9719e5faf23f6f20b5dbf0 100644 --- a/src/config.js +++ b/src/config.js @@ -6,16 +6,19 @@ module.exports = { return `renovate/${params.depName}-${params.newVersionMajor}.x`; }, commitMessage: (params) => { - return `Upgrade dependency ${params.depName} to version ${params.newVersion}`; + return `Update dependency ${params.depName} to version ${params.newVersion}`; }, prBody: (params) => { return `This Pull Request updates dependency ${params.depName} from version ${params.currentVersion} to ${params.newVersion}.`; }, prTitleMajor: (params) => { - return `Upgrade dependency ${params.depName} to version ${params.newVersionMajor}.x`; + return `Update dependency ${params.depName} to version ${params.newVersionMajor}.x`; }, prTitleMinor: (params) => { - return `Upgrade dependency ${params.depName} to version ${params.newVersion}`; + return `Update dependency ${params.depName} to version ${params.newVersion}`; + }, + prTitlePin: (params) => { + return `Pin dependency ${params.depName} to version ${params.newVersion}`; }, } }; diff --git a/src/helpers/npm.js b/src/helpers/npm.js index 1138fe30906e7d5be3073c12701ab95379bccdea..e1aff780a634c8e8ee241790ddd33ecdea4871c3 100644 --- a/src/helpers/npm.js +++ b/src/helpers/npm.js @@ -32,7 +32,7 @@ module.exports = { } Object.keys(packageContents[depType]).forEach(function(depName) { var currentVersion = packageContents[depType][depName]; - if (!semver.valid(currentVersion)) { + if (!isValidVersion(currentVersion)) { if (config.verbose) { console.log(`${depName}: Skipping invalid version ${currentVersion}`); } @@ -44,12 +44,13 @@ module.exports = { if (config.verbose) { console.log(`${depName}: Upgrades = ${JSON.stringify(res)}`); } - Object.keys(res).forEach(function(majorVersion) { + Object.keys(res).forEach(function(key) { allDependencyUpgrades.push({ + upgradeType: (key === 'pin') ? 'pin' : 'upgrade', depType: depType, depName: depName, currentVersion: currentVersion, - newVersion: res[majorVersion], + newVersion: res[key], }); }); } else { @@ -74,10 +75,14 @@ function getDependency(depName) { function getDependencyUpgrades(depName, currentVersion) { return getDependency(depName) .then(res => { - let allUpgrades = {}; if (!res.body['versions']) { console.log(depName + ' versions is null'); } + if (isRange(currentVersion)) { + // Pin ranges to their maximum satisfying version + return { 'pin': semver.maxSatisfying(Object.keys(res.body.versions), currentVersion) }; + } + const allUpgrades = {}; Object.keys(res.body['versions']).forEach(function(version) { if (stable.is(currentVersion) && !stable.is(version)) { // Ignore unstable versions, unless the current version is unstable @@ -94,3 +99,13 @@ function getDependencyUpgrades(depName, currentVersion) { return allUpgrades; }); } + +function isRange(input) { + // Pinned versions also return true for semver.validRange + // We need to check first that they're not "valid" to get only ranges + return !semver.valid(input) && semver.validRange(input); +} + +function isValidVersion(input) { + return semver.valid(input) || semver.validRange(input); +} diff --git a/src/index.js b/src/index.js index 3c41a8c8a12228fa4d7f0c5858fb58547cdd7583..03eee1929eb792422cf3925f66140be33a034fe1 100644 --- a/src/index.js +++ b/src/index.js @@ -65,16 +65,18 @@ function processUpgradesSequentially(upgrades) { // 2. Edge case collision of branch name, e.g. dependency also listed as dev dependency return upgrades.reduce((promise, upgrade) => { return promise.then(() => { - return updateDependency(upgrade.depType, upgrade.depName, upgrade.currentVersion, upgrade.newVersion); + return updateDependency(upgrade.upgradeType, upgrade.depType, upgrade.depName, upgrade.currentVersion, upgrade.newVersion); }); }, Promise.resolve()); } -function updateDependency(depType, depName, currentVersion, newVersion) { +function updateDependency(upgradeType, depType, depName, currentVersion, newVersion) { const newVersionMajor = semver.major(newVersion); const branchName = config.templates.branchName({depType, depName, currentVersion, newVersion, newVersionMajor}); let prTitle = ''; - if (newVersionMajor > semver.major(currentVersion)) { + if (upgradeType === 'pin') { + prTitle = config.templates.prTitlePin({ depType, depName, currentVersion, newVersion, newVersionMajor }); + } else if (newVersionMajor > semver.major(currentVersion)) { prTitle = config.templates.prTitleMajor({ depType, depName, currentVersion, newVersion, newVersionMajor }); } else { prTitle = config.templates.prTitleMinor({ depType, depName, currentVersion, newVersion, newVersionMajor });