From a2ef094485c3082e08bf4f8e4bbd7664eac1f2b3 Mon Sep 17 00:00:00 2001
From: Rhys Arkins <rhys@arkins.net>
Date: Tue, 6 Mar 2018 22:17:45 +0100
Subject: [PATCH] feat: support pinned versions in .travis.yml

If the existing version was pinned, or if pinVersions=true, then Renovate will use pinned versions for all the new values.

Closes #1605
---
 lib/manager/travis/package.js                     | 12 ++++++++++--
 .../travis/__snapshots__/package.spec.js.snap     | 14 ++++++++++++++
 test/manager/travis/package.spec.js               | 15 +++++++++++++++
 3 files changed, 39 insertions(+), 2 deletions(-)

diff --git a/lib/manager/travis/package.js b/lib/manager/travis/package.js
index 4c3588a7f2..a9c21b10bd 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 267bdc40a1..bb6c31a3bf 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 43aed6dbf7..e7ebcec7c0 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();
+    });
   });
 });
-- 
GitLab