From 514d527d7aeb1d167e84d1d48dd1382205cd3097 Mon Sep 17 00:00:00 2001
From: Ilya Savchuk <33482666+IlyaSavchuk@users.noreply.github.com>
Date: Tue, 22 Jan 2019 11:27:14 +0200
Subject: [PATCH] feat(automerge): merge passing branch even if PR exists
 (#3097)

Automerge branch even if PR has previously been raised, so long as only one commit exists. This handles the case where an initial update e.g. v1.0.1 fails, causing PR to be raised, but then a v1.0.2 is published which fixes the failure.

Closes #1381
---
 lib/workers/branch/automerge.js       | 16 +++++++++++++---
 test/workers/branch/automerge.spec.js | 17 ++++++++++++++++-
 2 files changed, 29 insertions(+), 4 deletions(-)

diff --git a/lib/workers/branch/automerge.js b/lib/workers/branch/automerge.js
index 2e878306d4..0bd8952ca4 100644
--- a/lib/workers/branch/automerge.js
+++ b/lib/workers/branch/automerge.js
@@ -8,13 +8,23 @@ async function tryBranchAutomerge(config) {
     return 'no automerge';
   }
   const existingPr = await platform.getBranchPr(config.branchName);
-  if (existingPr) {
-    return 'automerge aborted - PR exists';
-  }
+
   const branchStatus = await platform.getBranchStatus(
     config.branchName,
     config.requiredStatusChecks
   );
+
+  if (existingPr) {
+    if (branchStatus === 'success') {
+      if (existingPr.canRebase) {
+        await platform.mergeBranch(config.branchName, config.automergeType);
+        logger.info({ branch: config.branchName }, 'Branch automerged');
+        return 'automerged'; // Branch no longer exists
+      }
+      return 'automerge aborted - Human commits detected';
+    }
+    return 'automerge aborted - PR exists';
+  }
   if (branchStatus === 'success') {
     logger.debug(`Automerging branch`);
     try {
diff --git a/test/workers/branch/automerge.spec.js b/test/workers/branch/automerge.spec.js
index 3fbdd5cd55..36394db797 100644
--- a/test/workers/branch/automerge.spec.js
+++ b/test/workers/branch/automerge.spec.js
@@ -34,11 +34,19 @@ describe('workers/branch/automerge', () => {
       platform.getBranchPr.mockReturnValueOnce({});
       config.automerge = true;
       config.automergeType = 'branch';
-      platform.getBranchStatus.mockReturnValueOnce('success');
       expect(await tryBranchAutomerge(config)).toBe(
         'automerge aborted - PR exists'
       );
     });
+    it('returns false if PR exists and success branch', async () => {
+      platform.getBranchPr.mockReturnValueOnce({});
+      config.automerge = true;
+      config.automergeType = 'branch';
+      platform.getBranchStatus.mockReturnValueOnce('success');
+      expect(await tryBranchAutomerge(config)).toBe(
+        'automerge aborted - Human commits detected'
+      );
+    });
     it('returns false if automerge fails', async () => {
       config.automerge = true;
       config.automergeType = 'branch';
@@ -54,5 +62,12 @@ describe('workers/branch/automerge', () => {
       platform.getBranchStatus.mockReturnValueOnce('success');
       expect(await tryBranchAutomerge(config)).toBe('automerged');
     });
+    it('merge branch if PR exists and have one commit and success branch', async () => {
+      platform.getBranchPr.mockReturnValueOnce({ canRebase: true });
+      config.automerge = true;
+      config.automergeType = 'branch';
+      platform.getBranchStatus.mockReturnValueOnce('success');
+      expect(await tryBranchAutomerge(config)).toBe('automerged');
+    });
   });
 });
-- 
GitLab