From 0aaee7bd82dee3ed50748414c01a366d8a29663b Mon Sep 17 00:00:00 2001
From: Rhys Arkins <rhys@arkins.net>
Date: Mon, 4 Jun 2018 12:23:21 +0200
Subject: [PATCH] refactor: simplify lookup

---
 lib/versioning/pep440/range.js                |  2 +-
 lib/versioning/semver/range.js                |  9 +++--
 .../repository/process/lookup/index.js        | 36 ++++++++-----------
 .../repository/process/lookup/rollback.js     |  4 +--
 test/versioning/semver.spec.js                |  9 +++--
 5 files changed, 27 insertions(+), 33 deletions(-)

diff --git a/lib/versioning/pep440/range.js b/lib/versioning/pep440/range.js
index 092de87e74..e4a9e21a67 100644
--- a/lib/versioning/pep440/range.js
+++ b/lib/versioning/pep440/range.js
@@ -2,7 +2,7 @@ module.exports = {
   getNewValue,
 };
 
-function getNewValue(config, currentValue, fromVersion, toVersion) {
+function getNewValue(config, fromVersion, toVersion) {
   const { rangeStrategy } = config;
   // istanbul ignore if
   if (rangeStrategy !== 'pin') {
diff --git a/lib/versioning/semver/range.js b/lib/versioning/semver/range.js
index 5a04714150..89571cd306 100644
--- a/lib/versioning/semver/range.js
+++ b/lib/versioning/semver/range.js
@@ -1,13 +1,13 @@
-const { inc: increment, major, minor, valid } = require('semver');
+const { inc: increment, major, minor, valid: isVersion } = require('semver');
 const { parseRange } = require('semver-utils');
 
 module.exports = {
   getNewValue,
 };
 
-function getNewValue(config, currentValue, fromVersion, toVersion) {
-  const { rangeStrategy } = config;
-  if (rangeStrategy === 'pin' || valid(currentValue)) {
+function getNewValue(config, fromVersion, toVersion) {
+  const { currentValue, rangeStrategy } = config;
+  if (rangeStrategy === 'pin' || isVersion(currentValue)) {
     return toVersion;
   }
   const parsedRange = parseRange(currentValue);
@@ -15,7 +15,6 @@ function getNewValue(config, currentValue, fromVersion, toVersion) {
   if (rangeStrategy === 'widen') {
     const newValue = getNewValue(
       { ...config, rangeStrategy: 'replace' },
-      currentValue,
       fromVersion,
       toVersion
     );
diff --git a/lib/workers/repository/process/lookup/index.js b/lib/workers/repository/process/lookup/index.js
index 1947b5da3b..3267151f02 100644
--- a/lib/workers/repository/process/lookup/index.js
+++ b/lib/workers/repository/process/lookup/index.js
@@ -12,7 +12,8 @@ module.exports = {
 };
 
 async function lookupUpdates(config) {
-  const { versionScheme, depName, currentValue, lockedVersion } = config;
+  const { depName, currentValue } = config;
+  logger.debug({ depName, currentValue }, 'lookupUpdates');
   const {
     getMajor,
     getMinor,
@@ -20,15 +21,15 @@ async function lookupUpdates(config) {
     isRange,
     matches,
     getNewValue,
-  } = versioning(versionScheme);
-  logger.debug({ depName, currentValue }, 'lookupUpdates');
-  let dependency;
+  } = versioning(config.versionScheme);
   const purl = parse(config.purl);
   if (!purl) {
     logger.error('Missing purl');
     return [];
   }
+  let dependency;
   if (purl.type === 'npm') {
+    // TODO: move this into datasource
     npmApi.setNpmrc(
       config.npmrc,
       config.global ? config.global.exposeEnv : false
@@ -50,14 +51,15 @@ async function lookupUpdates(config) {
       { dependency: depName, packageFile: config.packageFile },
       result.message
     );
+    // TODO: return an object
     return [result];
   }
-  const { latestVersion } = dependency;
   const allVersions = Object.keys(dependency.versions);
   // istanbul ignore if
   if (allVersions.length === 0) {
     const message = `No versions returned from registry for this package`;
     logger.warn({ dependency }, message);
+    // TODO: return an object
     return [
       {
         type: 'warning',
@@ -65,6 +67,7 @@ async function lookupUpdates(config) {
       },
     ];
   }
+  // Check that existing constraint can be satisfied
   const allSatisfyingVersions = allVersions.filter(version =>
     matches(version, currentValue)
   );
@@ -73,13 +76,7 @@ async function lookupUpdates(config) {
     updates.push(getRollbackUpdate(config, allVersions));
   }
   const rangeStrategy = getRangeStrategy(config);
-  const fromVersion = getFromVersion(
-    config,
-    currentValue,
-    rangeStrategy,
-    lockedVersion,
-    allVersions
-  );
+  const fromVersion = getFromVersion(config, rangeStrategy, allVersions);
   if (isRange(currentValue) && rangeStrategy === 'pin') {
     updates.push({
       type: 'pin',
@@ -89,10 +86,11 @@ async function lookupUpdates(config) {
       unpublishable: false,
     });
   }
+  // Filter latest, unstable, etc
   const filteredVersions = filterVersions(
     config,
     fromVersion,
-    latestVersion,
+    dependency.latestVersion,
     allVersions
   );
   if (!filteredVersions.length) {
@@ -101,7 +99,7 @@ async function lookupUpdates(config) {
   const buckets = {};
   for (const toVersion of filteredVersions) {
     const update = { fromVersion, toVersion };
-    update.newValue = getNewValue(config, currentValue, fromVersion, toVersion);
+    update.newValue = getNewValue(config, fromVersion, toVersion);
     if (!update.newValue || update.newValue === currentValue) {
       continue; // eslint-disable-line no-continue
     }
@@ -175,14 +173,8 @@ function getBucket(config, update) {
   return type;
 }
 
-function getFromVersion(
-  config,
-  currentValue,
-  rangeStrategy,
-  lockedVersion,
-  allVersions
-) {
-  const { versionScheme } = config;
+function getFromVersion(config, rangeStrategy, allVersions) {
+  const { currentValue, lockedVersion, versionScheme } = config;
   const { isRange, maxSatisfyingVersion, minSatisfyingVersion } = versioning(
     versionScheme
   );
diff --git a/lib/workers/repository/process/lookup/rollback.js b/lib/workers/repository/process/lookup/rollback.js
index 3e6fed8a4d..2da5e4729e 100644
--- a/lib/workers/repository/process/lookup/rollback.js
+++ b/lib/workers/repository/process/lookup/rollback.js
@@ -13,7 +13,7 @@ function getRollbackUpdate(config, versions) {
   if (!isLessThanRange) {
     logger.info(
       { versionScheme },
-      'Current version scheme does not suppot isLessThanRange()'
+      'Current version scheme does not support isLessThanRange()'
     );
     return [];
   }
@@ -35,7 +35,7 @@ function getRollbackUpdate(config, versions) {
   lessThanVersions.sort(sortVersions);
   const toVersion = lessThanVersions.pop();
   let fromVersion;
-  const newValue = getNewValue(config, currentValue, fromVersion, toVersion);
+  const newValue = getNewValue(config, fromVersion, toVersion);
   return {
     type: 'rollback',
     branchName:
diff --git a/test/versioning/semver.spec.js b/test/versioning/semver.spec.js
index 3f5d5d7218..fa2b4df48e 100644
--- a/test/versioning/semver.spec.js
+++ b/test/versioning/semver.spec.js
@@ -40,14 +40,17 @@ describe('semver.isRange(input)', () => {
 describe('semver.getNewValue()', () => {
   it('bumps equals', () => {
     expect(
-      semver.getNewValue({ rangeStrategy: 'bump' }, '=1.0.0', '1.0.0', '1.1.0')
+      semver.getNewValue(
+        { currentValue: '=1.0.0', rangeStrategy: 'bump' },
+        '1.0.0',
+        '1.1.0'
+      )
     ).toEqual('=1.1.0');
   });
   it('replaces equals', () => {
     expect(
       semver.getNewValue(
-        { rangeStrategy: 'replace' },
-        '=1.0.0',
+        { currentValue: '=1.0.0', rangeStrategy: 'replace' },
         '1.0.0',
         '1.1.0'
       )
-- 
GitLab