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