From ac09b9d7cd2a70a428bb57bcbfbd89811755e6db Mon Sep 17 00:00:00 2001 From: Rhys Arkins <rhys@arkins.net> Date: Mon, 15 Jan 2018 11:53:02 +0100 Subject: [PATCH] feat: cache npm results in memory per-run MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We currently use got’s inbuilt caching for npmjs, however it still results in a roundtrip/304 even when cached. The when using presets is that a package like renovate-config-default gets looked up 10+ times unnecessarily. With this feature we assume that npm lookups don’t change for the duration of a run, and even if they did then we’d prefer the reliability of using the first lookup. Closes #1389 --- lib/manager/npm/registry.js | 14 ++++++++++++++ lib/workers/repository/init/apis.js | 1 + 2 files changed, 15 insertions(+) diff --git a/lib/manager/npm/registry.js b/lib/manager/npm/registry.js index fb8ae67fdd..38a7879d19 100644 --- a/lib/manager/npm/registry.js +++ b/lib/manager/npm/registry.js @@ -10,15 +10,24 @@ const parse = require('github-url-from-git'); module.exports = { setNpmrc, getDependency, + resetMemCache, resetCache, }; let map = new Map(); +let memcache = {}; + let npmrc = null; +function resetMemCache() { + logger.debug('resetMemCache()'); + memcache = {}; +} + function resetCache() { map = new Map(); + resetMemCache(); } function setNpmrc(input) { @@ -31,6 +40,10 @@ function setNpmrc(input) { async function getDependency(name) { logger.trace(`getDependency(${name})`); + if (memcache[name]) { + logger.debug('Returning cached result'); + return memcache[name]; + } const scope = name.split('/')[0]; let regUrl; try { @@ -84,6 +97,7 @@ async function getDependency(name) { }; }); logger.trace({ dep }, 'dep'); + memcache[name] = dep; return dep; } catch (err) { if (err.statusCode === 401) { diff --git a/lib/workers/repository/init/apis.js b/lib/workers/repository/init/apis.js index 5652443e9e..3cf04ce584 100644 --- a/lib/workers/repository/init/apis.js +++ b/lib/workers/repository/init/apis.js @@ -26,6 +26,7 @@ async function initApis(input, token) { config = await assignPlatform(config); config = await getPlatformConfig(config); config.npmrc = config.npmrc || (await platform.getFile('.npmrc')); + npmApi.resetMemCache(); npmApi.setNpmrc(config.npmrc); return config; } -- GitLab