From 2ce75cdbf1d1b04deb349022b1a686df3466469a Mon Sep 17 00:00:00 2001
From: Rhys Arkins <rhys@arkins.net>
Date: Mon, 10 Sep 2018 15:58:24 +0200
Subject: [PATCH] refactor(composer): reuse localDir for  lockfile generation

---
 lib/manager/composer/lock-file.js       | 13 +++++--------
 lib/workers/branch/get-updated.js       |  3 ++-
 lib/workers/repository/index.js         | 11 +++++++++++
 test/manager/composer/lock-file.spec.js | 18 ++++++++++++++----
 4 files changed, 32 insertions(+), 13 deletions(-)

diff --git a/lib/manager/composer/lock-file.js b/lib/manager/composer/lock-file.js
index c96efc1eea..d736d75e66 100644
--- a/lib/manager/composer/lock-file.js
+++ b/lib/manager/composer/lock-file.js
@@ -1,6 +1,5 @@
 const { exec } = require('child-process-promise');
 const fs = require('fs-extra');
-const tmp = require('tmp-promise');
 const upath = require('upath');
 
 const endpoints = require('../../util/endpoints');
@@ -12,7 +11,8 @@ module.exports = {
 async function getLockFile(
   packageFileName,
   updatedDeps,
-  newPackageFileContent
+  newPackageFileContent,
+  config
 ) {
   logger.debug(`composer.getLockFile(${packageFileName})`);
   const lockFileName = packageFileName.replace(/\.json$/, '.lock');
@@ -21,19 +21,18 @@ async function getLockFile(
     logger.debug('No composer.lock found');
     return null;
   }
-  const tmpDir = await tmp.dir({ unsafeCleanup: true });
-  const cwd = upath.join(tmpDir.path, upath.dirname(packageFileName));
+  const cwd = upath.join(config.localDir, upath.dirname(packageFileName));
   let stdout;
   let stderr;
   try {
-    const localPackageFileName = upath.join(tmpDir.path, packageFileName);
+    const localPackageFileName = upath.join(config.localDir, packageFileName);
     const newPackageFileParsed = JSON.parse(newPackageFileContent);
     delete newPackageFileParsed.scripts;
     await fs.outputFile(
       localPackageFileName,
       JSON.stringify(newPackageFileParsed)
     );
-    const localLockFileName = upath.join(tmpDir.path, lockFileName);
+    const localLockFileName = upath.join(config.localDir, lockFileName);
     await fs.outputFile(localLockFileName, existingLockFileContent);
     const credentials = endpoints.find({
       platform: 'github',
@@ -84,7 +83,5 @@ async function getLockFile(
       'Failed to generate composer.lock'
     );
     return null;
-  } finally {
-    tmpDir.cleanup();
   }
 }
diff --git a/lib/workers/branch/get-updated.js b/lib/workers/branch/get-updated.js
index bb58f94547..a3597965eb 100644
--- a/lib/workers/branch/get-updated.js
+++ b/lib/workers/branch/get-updated.js
@@ -61,7 +61,8 @@ async function getUpdatedPackageFiles(config) {
       const updatedLockFile = await getLockFile(
         packageFile.name,
         updatedDeps,
-        packageFile.contents
+        packageFile.contents,
+        config
       );
       if (updatedLockFile) {
         updatedLockFiles.push(updatedLockFile);
diff --git a/lib/workers/repository/index.js b/lib/workers/repository/index.js
index a0f9e84e08..7ed1c0cc10 100644
--- a/lib/workers/repository/index.js
+++ b/lib/workers/repository/index.js
@@ -1,3 +1,5 @@
+const tmp = require('tmp-promise');
+
 const { initRepo } = require('./init');
 const { ensureOnboardingPr } = require('./onboarding/pr');
 const { handleError } = require('./error');
@@ -15,7 +17,13 @@ async function renovateRepository(repoConfig) {
   logger.setMeta({ repository: config.repository });
   logger.info('Renovating repository');
   logger.trace({ config });
+  let tmpDir;
   try {
+    if (!config.localDir) {
+      // Use an ephemeral directory if none configured
+      tmpDir = await tmp.dir({ unsafeCleanup: true });
+      config.localDir = tmpDir.path;
+    }
     config = await initRepo(config);
     const { res, branches, branchList, packageFiles } = await processRepo(
       config
@@ -27,6 +35,9 @@ async function renovateRepository(repoConfig) {
     return processResult(config, await handleError(config, err));
   } finally {
     platform.cleanRepo();
+    if (tmpDir) {
+      await tmpDir.cleanup();
+    }
     logger.info('Finished repository');
   }
 }
diff --git a/test/manager/composer/lock-file.spec.js b/test/manager/composer/lock-file.spec.js
index 95d52b4cf9..14bd7d8bda 100644
--- a/test/manager/composer/lock-file.spec.js
+++ b/test/manager/composer/lock-file.spec.js
@@ -5,12 +5,18 @@ const fs = require('fs-extra');
 const { exec } = require('child-process-promise');
 const composer = require('../../../lib/manager/composer/lock-file');
 
+const config = {
+  localDir: '/tmp/github/some/repo',
+};
+
 describe('.getLockFile()', () => {
   beforeEach(() => {
     jest.resetAllMocks();
   });
   it('returns if no composer.lock found', async () => {
-    expect(await composer.getLockFile('composer.json', [], '{}')).toBeNull();
+    expect(
+      await composer.getLockFile('composer.json', [], '{}', config)
+    ).toBeNull();
   });
   it('returns null if unchanged', async () => {
     platform.getFile.mockReturnValueOnce('Current composer.lock');
@@ -19,7 +25,9 @@ describe('.getLockFile()', () => {
       stderror: '',
     });
     fs.readFile = jest.fn(() => 'Current composer.lock');
-    expect(await composer.getLockFile('composer.json', [], '{}')).toBeNull();
+    expect(
+      await composer.getLockFile('composer.json', [], '{}', config)
+    ).toBeNull();
   });
   it('returns updated composer.lock', async () => {
     platform.getFile.mockReturnValueOnce('Current composer.lock');
@@ -29,7 +37,7 @@ describe('.getLockFile()', () => {
     });
     fs.readFile = jest.fn(() => 'New composer.lock');
     expect(
-      await composer.getLockFile('composer.json', [], '{}')
+      await composer.getLockFile('composer.json', [], '{}', config)
     ).not.toBeNull();
   });
   it('catches errors', async () => {
@@ -37,6 +45,8 @@ describe('.getLockFile()', () => {
     fs.outputFile = jest.fn(() => {
       throw new Error('not found');
     });
-    expect(await composer.getLockFile('composer.json', [], '{}')).toBeNull();
+    expect(
+      await composer.getLockFile('composer.json', [], '{}', config)
+    ).toBeNull();
   });
 });
-- 
GitLab