From d8a054410bbd4f81c0e39290ab13d9b77526b3c3 Mon Sep 17 00:00:00 2001
From: Rhys Arkins <rhys@keylocation.sg>
Date: Fri, 7 Jul 2017 11:09:52 +0200
Subject: [PATCH] =?UTF-8?q?feat(onboarding):=20Allow=20update=20of=20renov?=
 =?UTF-8?q?ate.json=20if=20it=E2=80=99s=20unmodified=20(#469)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

This allows for improvements to renovate’s default renovate.json to be passed on to users who haven’t merged or modified their Configure Renovate PR.

Closes #465
---
 lib/workers/repository/onboarding.js               |  8 +++++++-
 .../__snapshots__/onboarding.spec.js.snap          |  8 ++++----
 test/workers/repository/onboarding.spec.js         | 14 ++++++++++++--
 3 files changed, 23 insertions(+), 7 deletions(-)

diff --git a/lib/workers/repository/onboarding.js b/lib/workers/repository/onboarding.js
index 0ddba69e8b..33b31df6d9 100644
--- a/lib/workers/repository/onboarding.js
+++ b/lib/workers/repository/onboarding.js
@@ -176,6 +176,7 @@ async function getOnboardingStatus(config) {
     'Configure Renovate'
   );
   if (pr) {
+    config.logger.debug(`Found existing onboarding PR#${pr.number}`);
     if (pr.isClosed) {
       config.logger.debug('Found closed Configure Renovate PR');
       return true;
@@ -184,8 +185,13 @@ async function getOnboardingStatus(config) {
     config.logger.debug(
       `PR #${pr.displayNumber} needs to be closed to enable renovate to continue`
     );
-    return false;
+    const prDetails = await config.api.getPr(pr.number);
+    if (!prDetails.canRebase) {
+      // Cannot update files if rebasing not possible
+      return false;
+    }
   }
+  // Create or update files, then return
   await module.exports.createBranch(config);
   return false;
 }
diff --git a/test/workers/repository/__snapshots__/onboarding.spec.js.snap b/test/workers/repository/__snapshots__/onboarding.spec.js.snap
index d35d12af03..affb372c0b 100644
--- a/test/workers/repository/__snapshots__/onboarding.spec.js.snap
+++ b/test/workers/repository/__snapshots__/onboarding.spec.js.snap
@@ -201,7 +201,7 @@ Alternatively, you can add the same configuration settings into a \\"renovate\\"
 ]
 `;
 
-exports[`lib/workers/repository/onboarding getOnboardingStatus(config) enables semantic commits 1`] = `
+exports[`lib/workers/repository/onboarding getOnboardingStatus(config) commits files and returns false if no pr 1`] = `
 Array [
   "renovate/configure",
   Array [
@@ -219,7 +219,7 @@ Array [
   \\"ignoreDeps\\": [],
   \\"pinVersions\\": true,
   \\"separateMajorReleases\\": true,
-  \\"semanticCommits\\": true,
+  \\"semanticCommits\\": false,
   \\"semanticPrefix\\": \\"chore(deps): \\",
   \\"rebaseStalePrs\\": false,
   \\"prCreation\\": \\"immediate\\",
@@ -238,7 +238,7 @@ Array [
 ]
 `;
 
-exports[`lib/workers/repository/onboarding getOnboardingStatus(config) returns false if no pr 1`] = `
+exports[`lib/workers/repository/onboarding getOnboardingStatus(config) enables semantic commits 1`] = `
 Array [
   "renovate/configure",
   Array [
@@ -256,7 +256,7 @@ Array [
   \\"ignoreDeps\\": [],
   \\"pinVersions\\": true,
   \\"separateMajorReleases\\": true,
-  \\"semanticCommits\\": false,
+  \\"semanticCommits\\": true,
   \\"semanticPrefix\\": \\"chore(deps): \\",
   \\"rebaseStalePrs\\": false,
   \\"prCreation\\": \\"immediate\\",
diff --git a/test/workers/repository/onboarding.spec.js b/test/workers/repository/onboarding.spec.js
index 07ea36224e..dbf0bbb71b 100644
--- a/test/workers/repository/onboarding.spec.js
+++ b/test/workers/repository/onboarding.spec.js
@@ -177,6 +177,7 @@ describe('lib/workers/repository/onboarding', () => {
         commitFilesToBranch: jest.fn(),
         createPr: jest.fn(() => ({ displayNumber: 1 })),
         findPr: jest.fn(),
+        getPr: jest.fn(() => {}),
         getCommitMessages: jest.fn(),
       };
       config.logger = logger;
@@ -203,14 +204,23 @@ describe('lib/workers/repository/onboarding', () => {
       expect(config.api.findPr.mock.calls.length).toBe(1);
       expect(config.api.commitFilesToBranch.mock.calls.length).toBe(0);
     });
-    it('returns false if pr and pr is not closed', async () => {
+    it('commits files if pr is not closed and is rebaseable', async () => {
       config.api.findPr.mockReturnValueOnce({});
+      config.api.getPr.mockReturnValueOnce({ canRebase: true });
+      const res = await onboarding.getOnboardingStatus(config);
+      expect(res).toEqual(false);
+      expect(config.api.findPr.mock.calls.length).toBe(1);
+      expect(config.api.commitFilesToBranch.mock.calls.length).toBe(1);
+    });
+    it('skips file update if existing pr is not rebaseable', async () => {
+      config.api.findPr.mockReturnValueOnce({});
+      config.api.getPr.mockReturnValueOnce({ canRebase: false });
       const res = await onboarding.getOnboardingStatus(config);
       expect(res).toEqual(false);
       expect(config.api.findPr.mock.calls.length).toBe(1);
       expect(config.api.commitFilesToBranch.mock.calls.length).toBe(0);
     });
-    it('returns false if no pr', async () => {
+    it('commits files and returns false if no pr', async () => {
       const res = await onboarding.getOnboardingStatus(config);
       expect(res).toEqual(false);
       expect(config.api.findPr.mock.calls.length).toBe(1);
-- 
GitLab