From f13c4e3d7812a9f1b4ac3cd71d580f57e59775fc Mon Sep 17 00:00:00 2001 From: Jean Lauliac Date: Fri, 11 Nov 2016 05:04:13 -0800 Subject: [PATCH] packager TransformCache.js: use directory specific to project Reviewed By: davidaurelio Differential Revision: D4159761 fbshipit-source-id: 1f4b1bbcf4c4fbb834a672e38cb2cf55f425b28b --- react-packager/src/lib/TransformCache.js | 33 +++++++++++++++++++----- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/react-packager/src/lib/TransformCache.js b/react-packager/src/lib/TransformCache.js index 93d12b86..86c700b7 100644 --- a/react-packager/src/lib/TransformCache.js +++ b/react-packager/src/lib/TransformCache.js @@ -25,10 +25,28 @@ const rimraf = require('rimraf'); const writeFileAtomicSync = require('write-file-atomic').sync; const CACHE_NAME = 'react-native-packager-cache'; -const TMP_DIR = path.join(require('os').tmpdir(), CACHE_NAME); type CacheFilePaths = {transformedCode: string, metadata: string}; +/** + * If packager is running for two different directories, we don't want the + * caches to conflict with each other. `__dirname` carries that because packager + * will be, for example, installed in a different `node_modules/` folder for + * different projects. + */ +const getCacheDirPath = (function () { + let dirPath; + return function () { + if (dirPath == null) { + dirPath = path.join( + require('os').tmpdir(), + CACHE_NAME + '-' + imurmurhash(__dirname).result().toString(16), + ); + } + return dirPath; + }; +})(); + function hashSourceCode(props: { sourceCode: string, transformCacheKey: string, @@ -52,7 +70,7 @@ function getCacheFilePaths(props: { hash = Array(8 - hash.length + 1).join('0') + hash; const prefix = hash.substr(0, 2); const fileName = `${hash.substr(2)}${path.basename(props.filePath)}`; - const base = path.join(TMP_DIR, prefix, fileName); + const base = path.join(getCacheDirPath(), prefix, fileName); return {transformedCode: base, metadata: base + '.meta'}; } @@ -141,10 +159,11 @@ const GARBAGE_COLLECTOR = new (class GarbageCollector { } _collectSync() { - mkdirp.sync(TMP_DIR); - const prefixDirs = fs.readdirSync(TMP_DIR); + const cacheDirPath = getCacheDirPath(); + mkdirp.sync(cacheDirPath); + const prefixDirs = fs.readdirSync(cacheDirPath); for (let i = 0; i < prefixDirs.length; ++i) { - const prefixDir = path.join(TMP_DIR, prefixDirs[i]); + const prefixDir = path.join(cacheDirPath, prefixDirs[i]); const cacheFileNames = fs.readdirSync(prefixDir); for (let j = 0; j < cacheFileNames.length; ++j) { const cacheFilePath = path.join(prefixDir, cacheFileNames[j]); @@ -172,13 +191,13 @@ const GARBAGE_COLLECTOR = new (class GarbageCollector { console.error( 'Error: Cleaning up the cache folder failed. Continuing anyway.', ); - console.error('The cache folder is: %s', TMP_DIR); + console.error('The cache folder is: %s', getCacheDirPath()); } this._lastCollected = Date.now(); } _resetCache() { - rimraf.sync(TMP_DIR); + rimraf.sync(getCacheDirPath()); console.log('Warning: The transform cache was reset.'); this._cacheWasReset = true; this._lastCollected = Date.now();