From a1e1b1770f4c0801d0784c6834f72eec65e75529 Mon Sep 17 00:00:00 2001
From: Rhys Arkins <rhys@keylocation.sg>
Date: Sat, 5 Aug 2017 05:53:24 +0200
Subject: [PATCH] fix: log full package lock generation error (#621)

---
 lib/workers/branch/index.js       |  6 +++++-
 lib/workers/branch/npm.js         | 17 ++++++++++++++---
 lib/workers/branch/yarn.js        | 18 +++++++++++++++---
 test/workers/branch/index.spec.js |  6 ++++++
 4 files changed, 40 insertions(+), 7 deletions(-)

diff --git a/lib/workers/branch/index.js b/lib/workers/branch/index.js
index 8527009ff9..42ec44e3a0 100644
--- a/lib/workers/branch/index.js
+++ b/lib/workers/branch/index.js
@@ -260,7 +260,11 @@ async function processBranchUpgrades(branchUpgrades, errors, warnings) {
       }
     }
   } catch (err) {
-    logger.error({ err }, `Error updating branch: ${err.message}`);
+    if (err.message !== 'Error generating lock file') {
+      logger.error({ err }, `Error updating branch: ${err.message}`);
+    } else {
+      logger.info('Error updating branch');
+    }
     // Don't throw here - we don't want to stop the other renovations
   }
 }
diff --git a/lib/workers/branch/npm.js b/lib/workers/branch/npm.js
index 5646f970f7..60b511a528 100644
--- a/lib/workers/branch/npm.js
+++ b/lib/workers/branch/npm.js
@@ -13,13 +13,14 @@ async function generateLockFile(newPackageJson, npmrcContent, logger) {
   logger.debug('Generating new package-lock.json file');
   const tmpDir = tmp.dirSync({ unsafeCleanup: true });
   let packageLock;
+  let result = {};
   try {
     fs.writeFileSync(path.join(tmpDir.name, 'package.json'), newPackageJson);
     if (npmrcContent) {
       fs.writeFileSync(path.join(tmpDir.name, '.npmrc'), npmrcContent);
     }
     logger.debug('Spawning npm install');
-    const result = cp.spawnSync('npm', ['install', '--ignore-scripts'], {
+    result = cp.spawnSync('npm', ['install', '--ignore-scripts'], {
       cwd: tmpDir.name,
       shell: true,
       env: { ...process.env, ...{ NODE_ENV: 'dev' } },
@@ -29,13 +30,23 @@ async function generateLockFile(newPackageJson, npmrcContent, logger) {
       'npm install complete'
     );
     packageLock = fs.readFileSync(path.join(tmpDir.name, 'package-lock.json'));
-  } catch (error) /* istanbul ignore next */ {
+  } catch (err) /* istanbul ignore next */ {
+    logger.warn(
+      {
+        err,
+        newPackageJson,
+        npmrcContent,
+        stdout: result.stdout,
+        stderr: result.stderr,
+      },
+      'Error generating package-lock.json'
+    );
     try {
       tmpDir.removeCallback();
     } catch (err2) {
       logger.warn(`Failed to remove tmpDir ${tmpDir.name}`);
     }
-    throw error;
+    throw Error('Error generating lock file');
   }
   try {
     tmpDir.removeCallback();
diff --git a/lib/workers/branch/yarn.js b/lib/workers/branch/yarn.js
index 6514379d8d..b9a232e6de 100644
--- a/lib/workers/branch/yarn.js
+++ b/lib/workers/branch/yarn.js
@@ -20,6 +20,7 @@ async function generateLockFile(
   logger.debug('Generating new yarn.lock file');
   const tmpDir = tmp.dirSync({ unsafeCleanup: true });
   let yarnLock;
+  let result = {};
   try {
     fs.writeFileSync(path.join(tmpDir.name, 'package.json'), newPackageJson);
     if (npmrcContent) {
@@ -40,7 +41,7 @@ async function generateLockFile(
       `yarn-${yarnVersion}.js`
     );
     const yarnOptions = [yarnBin, 'install', '--ignore-scripts'];
-    const result = cp.spawnSync('node', yarnOptions, {
+    result = cp.spawnSync('node', yarnOptions, {
       cwd: tmpDir.name,
       shell: true,
       env: { ...process.env, ...{ NODE_ENV: 'dev' } },
@@ -48,13 +49,24 @@ async function generateLockFile(
     logger.debug(String(result.stdout));
     logger.debug(String(result.stderr));
     yarnLock = fs.readFileSync(path.join(tmpDir.name, 'yarn.lock'));
-  } catch (error) /* istanbul ignore next */ {
+  } catch (err) /* istanbul ignore next */ {
+    logger.warn(
+      {
+        err,
+        newPackageJson,
+        npmrcContent,
+        yarnrcContent,
+        stdout: result.stdout,
+        stderr: result.stderr,
+      },
+      'Error generating yarn.lock'
+    );
     try {
       tmpDir.removeCallback();
     } catch (err2) {
       logger.warn(`Failed to remove tmpDir ${tmpDir.name}`);
     }
-    throw error;
+    throw Error('Error generating lock file');
   }
   try {
     tmpDir.removeCallback();
diff --git a/test/workers/branch/index.spec.js b/test/workers/branch/index.spec.js
index 71b63d618e..40e33c75d9 100644
--- a/test/workers/branch/index.spec.js
+++ b/test/workers/branch/index.spec.js
@@ -419,5 +419,11 @@ describe('workers/branch', () => {
       await branchWorker.processBranchUpgrades(config);
       expect(branchWorker.ensureBranch.mock.calls.length).toBe(0);
     });
+    it('handles known errors', async () => {
+      branchWorker.ensureBranch.mockImplementationOnce(() => {
+        throw Error('Error generating lock file');
+      });
+      await branchWorker.processBranchUpgrades(config);
+    });
   });
 });
-- 
GitLab