diff --git a/lib/workers/repository/cleanup.js b/lib/workers/repository/cleanup.js index 5771c6b1f5064427f8025bb702ca0848f773b1db..16a9cb7eb83aae275c4a931255351ab32b5d953e 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 bf711aa34a36f150d5ab09dea1ce930622ae031c..a29d9660c41c3f8a8e81c1e813167dc835ac0023 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); + }); }); });