From a6b4ce6cc1ff6d5b6f6772e8a111718428db38c2 Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Mon, 21 Nov 2016 11:57:38 +0000 Subject: [PATCH] add a cache breaker to the yarn cache based on the current version to prevent dependency shifting (#1965) --- bin/yarn.js | 34 ++++++++++++++++++++++++---------- src/constants.js | 2 ++ 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/bin/yarn.js b/bin/yarn.js index d12197bcca..a3241be2d0 100755 --- a/bin/yarn.js +++ b/bin/yarn.js @@ -4,16 +4,7 @@ /* eslint-disable flowtype/require-valid-file-annotation */ 'use strict'; -// init roadrunner -var mkdirp = require('mkdirp'); -var constants = require('../lib-legacy/constants'); -mkdirp.sync(constants.GLOBAL_INSTALL_DIRECTORY); -mkdirp.sync(constants.MODULE_CACHE_DIRECTORY); -var roadrunner = require('roadrunner'); -roadrunner.load(constants.CACHE_FILENAME); -roadrunner.setup(constants.CACHE_FILENAME); - -// get node version +// validate that used node version is supported var semver = require('semver'); var ver = process.versions.node; ver = ver.split('-')[0]; // explode and truncate tag from version #511 @@ -33,6 +24,29 @@ if (semver.satisfies(ver, '>=5.0.0')) { process.exit(1); } +// ensure cache directory exists +var mkdirp = require('mkdirp'); +var constants = require('../lib-legacy/constants'); +mkdirp.sync(constants.GLOBAL_INSTALL_DIRECTORY); +mkdirp.sync(constants.MODULE_CACHE_DIRECTORY); + +// init roadrunner +var YARN_VERSION = require('../package.json').version; +var roadrunner = require('roadrunner'); + +// load cache +roadrunner.load(constants.CACHE_FILENAME); +var cacheVersion = roadrunner.get('CACHE_BREAKER').version; +if (!cacheVersion || cacheVersion !== YARN_VERSION) { + // reset cache if it's for an older yarn + roadrunner.reset(constants.CACHE_FILENAME); +} +// set this cache to the current yarn version +roadrunner.set('CACHE_BREAKER', {version: YARN_VERSION}); + +// save cache on SIGINT +roadrunner.setup(constants.CACHE_FILENAME); + var i = 0; for (; i < possibles.length; i++) { var possible = possibles[i]; diff --git a/src/constants.js b/src/constants.js index b0a6351403..f73f9cedfe 100644 --- a/src/constants.js +++ b/src/constants.js @@ -1,6 +1,8 @@ /* @flow */ + const path = require('path'); let userHome = require('user-home'); + if (process.platform === 'linux' && process.env.USER === 'root') { userHome = path.resolve('/usr/local/share'); }