From 46fae9473a63dbf21cb89a995f5a24a0a31eabdd Mon Sep 17 00:00:00 2001
From: Rhys Arkins <rhys@arkins.net>
Date: Tue, 26 Jun 2018 11:20:26 +0200
Subject: [PATCH] =?UTF-8?q?fix:=20abort=20renovation=20if=20branch?=
 =?UTF-8?q?=E2=80=99s=20PR=20has=20been=20closed=20or=20merged?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

This fixes a race condition where if someone merged multiple PRs in a row then a renovation-in-progress would get confused and post a “PR has been edited” message to an already-merged PR.

Closes #2115
---
 lib/workers/branch/index.js       |  6 ++++++
 test/workers/branch/index.spec.js | 11 +++++++++++
 2 files changed, 17 insertions(+)

diff --git a/lib/workers/branch/index.js b/lib/workers/branch/index.js
index 76eef99ec6..6a6b009744 100644
--- a/lib/workers/branch/index.js
+++ b/lib/workers/branch/index.js
@@ -86,6 +86,12 @@ async function processBranch(branchConfig, packageFiles) {
       const branchPr = await platform.getBranchPr(config.branchName);
       if (branchPr) {
         logger.debug('Found existing branch PR');
+        if (branchPr.state !== 'open') {
+          logger.info(
+            'PR has been closed or merged since this run started - aborting'
+          );
+          throw new Error('repository-changed');
+        }
         if (!branchPr.canRebase) {
           const subject = 'PR has been edited';
           logger.info(subject);
diff --git a/test/workers/branch/index.spec.js b/test/workers/branch/index.spec.js
index d296f028a2..5d1c7611e4 100644
--- a/test/workers/branch/index.spec.js
+++ b/test/workers/branch/index.spec.js
@@ -110,6 +110,17 @@ describe('workers/branch', () => {
       await branchWorker.processBranch(config);
       expect(parent.getParentBranch.mock.calls.length).toBe(0);
     });
+    it('throws error if closed PR found', async () => {
+      schedule.isScheduledNow.mockReturnValueOnce(false);
+      platform.branchExists.mockReturnValueOnce(true);
+      platform.getBranchPr.mockReturnValueOnce({
+        state: 'merged',
+        canRebase: false,
+      });
+      await expect(branchWorker.processBranch(config)).rejects.toThrow(
+        /repository-changed/
+      );
+    });
     it('skips branch if edited PR found', async () => {
       schedule.isScheduledNow.mockReturnValueOnce(false);
       platform.branchExists.mockReturnValueOnce(true);
-- 
GitLab