From 33e4b5112630aceb1a85e9694065a65d806b5f9d Mon Sep 17 00:00:00 2001 From: Rhys Arkins <rhys@arkins.net> Date: Mon, 18 Dec 2017 13:43:29 +0100 Subject: [PATCH] feat: raise config validation issue if onboarded repo has invalid package.json MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously, if someone updated a package.json to include invalid JSON, Renovate fails to parse it (as expected), so ignores it. As a result, any existing PRs would be autoclosed. Instead, Renovate will now skip the repository and raise a warning issue until the file parsing is complete or the file is added to Renovate’s ignore list. --- lib/manager/resolve.js | 13 +++++++++++-- .../__snapshots__/resolve.spec.js.snap | 18 ++++++++++-------- test/manager/resolve.spec.js | 19 +++++++++++++++++-- 3 files changed, 38 insertions(+), 12 deletions(-) diff --git a/lib/manager/resolve.js b/lib/manager/resolve.js index 45b3ffc4ef..12e467ac5f 100644 --- a/lib/manager/resolve.js +++ b/lib/manager/resolve.js @@ -46,9 +46,18 @@ async function resolvePackageFiles(config) { { packageFile: packageFile.packageFile }, 'Cannot parse package.json' ); - config.warnings.push({ + if (config.repoIsOnboarded) { + const error = new Error('config-validation'); + error.configFile = packageFile.packageFile; + error.validationError = 'Cannot parse package.json'; + error.validationMessage = + 'This package.json contains invalid JSON and cannot be parsed. Please fix it, or add it to your "ignorePaths" array in your renovate config so that Renovate can continue.'; + throw error; + } + config.errors.push({ depName: packageFile.packageFile, - message: 'Cannot parse package.json (invalid JSON)', + message: + "Cannot parse package.json (invalid JSON). Please fix the contents or add the file/path to the `ignorePaths` array in Renovate's config", }); return null; } diff --git a/test/manager/__snapshots__/resolve.spec.js.snap b/test/manager/__snapshots__/resolve.spec.js.snap index 9096535ab8..e62eb84483 100644 --- a/test/manager/__snapshots__/resolve.spec.js.snap +++ b/test/manager/__snapshots__/resolve.spec.js.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`manager/resolve resolvePackageFiles() detect package.json and warns if cannot parse 1`] = ` +exports[`manager/resolve resolvePackageFiles() detect package.json and adds error if cannot parse (onboarding) 1`] = ` Object { "assignees": Array [], "autodiscover": false, @@ -232,7 +232,12 @@ This PR has been generated by [Renovate Bot](https://renovateapp.com).", "enabled": true, "encrypted": null, "endpoint": null, - "errors": Array [], + "errors": Array [ + Object { + "depName": "package.json", + "message": "Cannot parse package.json (invalid JSON). Please fix the contents or add the file/path to the \`ignorePaths\` array in Renovate's config", + }, + ], "excludePackageNames": Array [], "excludePackagePatterns": Array [], "extends": Array [], @@ -519,16 +524,13 @@ This PR has been generated by [Renovate Bot](https://renovateapp.com).", "unpublishSafe": false, "unstablePattern": null, "updateNotScheduled": true, - "warnings": Array [ - Object { - "depName": "package.json", - "message": "Cannot parse package.json (invalid JSON)", - }, - ], + "warnings": Array [], "yarnrc": null, } `; +exports[`manager/resolve resolvePackageFiles() detect package.json and throws error if cannot parse (onboarded) 1`] = `[Error: config-validation]`; + exports[`manager/resolve resolvePackageFiles() detects accompanying files 1`] = ` Object { "assignees": Array [], diff --git a/test/manager/resolve.spec.js b/test/manager/resolve.spec.js index 4198dea418..08798b39e0 100644 --- a/test/manager/resolve.spec.js +++ b/test/manager/resolve.spec.js @@ -25,14 +25,29 @@ describe('manager/resolve', () => { expect(res).toMatchSnapshot(); expect(res.errors).toHaveLength(2); }); - it('detect package.json and warns if cannot parse', async () => { + it('detect package.json and adds error if cannot parse (onboarding)', async () => { manager.detectPackageFiles = jest.fn(() => [ { packageFile: 'package.json' }, ]); platform.getFile.mockReturnValueOnce('not json'); const res = await resolvePackageFiles(config); expect(res).toMatchSnapshot(); - expect(res.warnings).toHaveLength(1); + expect(res.errors).toHaveLength(1); + }); + it('detect package.json and throws error if cannot parse (onboarded)', async () => { + manager.detectPackageFiles = jest.fn(() => [ + { packageFile: 'package.json' }, + ]); + platform.getFile.mockReturnValueOnce('not json'); + config.repoIsOnboarded = true; + let e; + try { + await resolvePackageFiles(config); + } catch (err) { + e = err; + } + expect(e).toBeDefined(); + expect(e).toMatchSnapshot(); }); it('detects package.json and parses json with renovate config', async () => { manager.detectPackageFiles = jest.fn(() => [ -- GitLab