From fdaa88efb1cd6a87d5b6bd4c02a66c764ca5ded2 Mon Sep 17 00:00:00 2001
From: Rhys Arkins <rhys@keylocation.sg>
Date: Mon, 17 Jul 2017 16:13:59 +0200
Subject: [PATCH] feat(cleanup): Add specific lock file maintenance cleanup

Now cleans up lock file maintenance branch - which is usually scheduled - if it has become unmergeable or pointless.
---
 lib/workers/repository/cleanup.js       | 23 ++++++++++++-
 test/workers/repository/cleanup.spec.js | 46 +++++++++++++++++++++++++
 2 files changed, 68 insertions(+), 1 deletion(-)

diff --git a/lib/workers/repository/cleanup.js b/lib/workers/repository/cleanup.js
index 5771c6b1f5..16a9cb7eb8 100644
--- a/lib/workers/repository/cleanup.js
+++ b/lib/workers/repository/cleanup.js
@@ -13,8 +13,29 @@ async function pruneStaleBranches(config, branchList) {
     logger.debug('Platform is not GitHub - returning');
     return;
   }
-  const renovateBranches = await config.api.getAllRenovateBranches();
+  let renovateBranches = await config.api.getAllRenovateBranches();
   logger.debug(`renovateBranches=${renovateBranches}`);
+  if (renovateBranches.indexOf('renovate/lock-file-maintenance') !== -1) {
+    logger.debug('Checking lock file branch');
+    const pr = await config.api.getBranchPr('renovate/lock-file-maintenance');
+    if (pr.isClosed) {
+      logger.info(
+        'Deleting lock file maintenance branch as PR has been closed'
+      );
+      await config.api.deleteBranch('renovate/lock-file-maintenance');
+    } else if (pr.isUnmergeable) {
+      logger.info('Deleting lock file maintenance branch as it is unmergeable');
+      await config.api.deleteBranch('renovate/lock-file-maintenance');
+    } else if (pr.changed_files === 0) {
+      logger.info(
+        'Deleting lock file maintenance branch as it has no changed files'
+      );
+      await config.api.deleteBranch('renovate/lock-file-maintenance');
+    }
+    renovateBranches = renovateBranches.filter(
+      branch => branch !== 'renovate/lock-file-maintenance'
+    );
+  }
   const remainingBranches = renovateBranches.filter(
     branch => branchList.indexOf(branch) === -1
   );
diff --git a/test/workers/repository/cleanup.spec.js b/test/workers/repository/cleanup.spec.js
index bf711aa34a..a29d9660c4 100644
--- a/test/workers/repository/cleanup.spec.js
+++ b/test/workers/repository/cleanup.spec.js
@@ -38,5 +38,51 @@ describe('workers/repository/cleanup', () => {
       expect(config.api.getAllRenovateBranches.mock.calls).toHaveLength(1);
       expect(config.api.deleteBranch.mock.calls).toHaveLength(1);
     });
+    it('deletes lock file maintenance if pr is closed', async () => {
+      branchNames = ['renovate/lock-file-maintenance'];
+      config.api.getAllRenovateBranches.mockReturnValueOnce([
+        'renovate/lock-file-maintenance',
+      ]);
+      config.api.getBranchPr = jest.fn(() => ({ isClosed: true }));
+      await cleanup.pruneStaleBranches(config, [
+        'renovate/lock-file-maintenance',
+      ]);
+      expect(config.api.getAllRenovateBranches.mock.calls).toHaveLength(1);
+      expect(config.api.deleteBranch.mock.calls).toHaveLength(1);
+    });
+    it('deletes lock file maintenance if pr is unmergeable', async () => {
+      branchNames = ['renovate/lock-file-maintenance'];
+      config.api.getAllRenovateBranches.mockReturnValueOnce([
+        'renovate/lock-file-maintenance',
+      ]);
+      config.api.getBranchPr = jest.fn(() => ({ isUnmergeable: true }));
+      await cleanup.pruneStaleBranches(config, [
+        'renovate/lock-file-maintenance',
+      ]);
+      expect(config.api.getAllRenovateBranches.mock.calls).toHaveLength(1);
+      expect(config.api.deleteBranch.mock.calls).toHaveLength(1);
+    });
+    it('deletes lock file maintenance if no changed files', async () => {
+      branchNames = ['renovate/lock-file-maintenance'];
+      config.api.getAllRenovateBranches.mockReturnValueOnce([
+        'renovate/lock-file-maintenance',
+      ]);
+      config.api.getBranchPr = jest.fn(() => ({ changed_files: 0 }));
+      await cleanup.pruneStaleBranches(config, [
+        'renovate/lock-file-maintenance',
+      ]);
+      expect(config.api.getAllRenovateBranches.mock.calls).toHaveLength(1);
+      expect(config.api.deleteBranch.mock.calls).toHaveLength(1);
+    });
+    it('calls delete only once', async () => {
+      branchNames = ['renovate/lock-file-maintenance'];
+      config.api.getAllRenovateBranches.mockReturnValueOnce([
+        'renovate/lock-file-maintenance',
+      ]);
+      config.api.getBranchPr = jest.fn(() => ({ isClosed: true }));
+      await cleanup.pruneStaleBranches(config, []);
+      expect(config.api.getAllRenovateBranches.mock.calls).toHaveLength(1);
+      expect(config.api.deleteBranch.mock.calls).toHaveLength(1);
+    });
   });
 });
-- 
GitLab