diff --git a/lib/manager/travis/package.js b/lib/manager/travis/package.js index 4c3588a7f253145a233bfe08c5bf4e313a2673ae..a9c21b10bdddce204b1cb4411c0bac849f06237c 100644 --- a/lib/manager/travis/package.js +++ b/lib/manager/travis/package.js @@ -1,4 +1,6 @@ const { isEqual } = require('lodash'); +const semver = require('semver'); +const { getRepoReleases } = require('../../datasource/github'); module.exports = { getPackageUpdates, @@ -13,19 +15,25 @@ const policies = { lts_latest: [8], }; -function getPackageUpdates(config) { +async function getPackageUpdates(config) { logger.debug('travis.getPackageUpdates()'); let { supportPolicy } = config; if (!(supportPolicy && supportPolicy.length)) { supportPolicy = ['lts']; } - const newVersion = supportPolicy + let newVersion = supportPolicy .map(policy => policies[policy]) .reduce((result, policy) => result.concat(policy), []) .sort() // sort combined array .reverse() // we want to order latest to oldest .map(version => `${version}`); // convert to strings logger.debug({ newVersion }); + if (config.pinVersions || semver.valid(config.currentVersion[0])) { + const releases = await getRepoReleases('nodejs/node'); + newVersion = newVersion.map(version => + semver.maxSatisfying(releases, version).replace(/^v/, '') + ); + } if (isEqual([...config.currentVersion].sort(), [...newVersion].sort())) { return []; } diff --git a/test/manager/travis/__snapshots__/package.spec.js.snap b/test/manager/travis/__snapshots__/package.spec.js.snap index 267bdc40a144e6b23e5b4dad7578042a277bf2fa..bb6c31a3bfd26a2a73e14ad1a80431075f5729cd 100644 --- a/test/manager/travis/__snapshots__/package.spec.js.snap +++ b/test/manager/travis/__snapshots__/package.spec.js.snap @@ -1,5 +1,19 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`lib/workers/package/node getPackageUpdates detects pinning 1`] = ` +Array [ + Object { + "isRange": true, + "newVersion": Array [ + "8.9.4", + "6.11.0", + "4.4.4", + ], + "repositoryUrl": "https://github.com/nodejs/node", + }, +] +`; + exports[`lib/workers/package/node getPackageUpdates returns result if needing updates 1`] = ` Array [ Object { diff --git a/test/manager/travis/package.spec.js b/test/manager/travis/package.spec.js index 43aed6dbf7c30e609a3243ab26f5e7ba52d6f4cb..e7ebcec7c0c38f9210cf4b86b31e0911ee9b1cc6 100644 --- a/test/manager/travis/package.spec.js +++ b/test/manager/travis/package.spec.js @@ -1,5 +1,8 @@ const node = require('../../../lib/manager/travis/package'); const defaultConfig = require('../../../lib/config/defaults').getConfig(); +const githubDatasource = require('../../../lib/datasource/github'); + +jest.mock('../../../lib/datasource/github'); describe('lib/workers/package/node', () => { describe('getPackageUpdates', () => { @@ -18,5 +21,17 @@ describe('lib/workers/package/node', () => { config.currentVersion = ['6', '8']; expect(await node.getPackageUpdates(config)).toMatchSnapshot(); }); + it('detects pinning', async () => { + config.currentVersion = ['6.1.0', '8.4.0']; + githubDatasource.getRepoReleases.mockReturnValueOnce([ + 'v4.4.4', + 'v5.5.5', + 'v6.11.0', + 'v7.0.0', + 'v8.9.4', + 'v9.5.0', + ]); + expect(await node.getPackageUpdates(config)).toMatchSnapshot(); + }); }); });