diff --git a/lib/workers/branch/index.spec.ts b/lib/workers/branch/index.spec.ts index 13f94011ed3ff4fa6f3ce7e4c0a70e2d6e5e1c26..43329a15d8666c850768e30467dcc124e25609e6 100644 --- a/lib/workers/branch/index.spec.ts +++ b/lib/workers/branch/index.spec.ts @@ -215,6 +215,22 @@ describe('workers/branch', () => { 'pr-limit-reached' ); }); + it('returns if pr creation limit exceeded and branch exists', async () => { + getUpdated.getUpdatedPackageFiles.mockResolvedValueOnce({ + ...updatedPackageFiles, + }); + npmPostExtract.getAdditionalFiles.mockResolvedValueOnce({ + artifactErrors: [], + updatedArtifacts: [], + }); + git.branchExists.mockResolvedValue(true); + prWorker.ensurePr.mockResolvedValueOnce({ + prResult: PrResult.LimitReached, + }); + expect(await branchWorker.processBranch(config, true)).toEqual( + 'pr-limit-reached' + ); + }); it('returns if commit limit exceeded', async () => { getUpdated.getUpdatedPackageFiles.mockResolvedValueOnce({ ...updatedPackageFiles, diff --git a/lib/workers/branch/index.ts b/lib/workers/branch/index.ts index f32c5887e9ce7f38da39c2b5d7d2bdd34badb12e..1a903e6e5558e6d4b650caa0f524cabcf87438e5 100644 --- a/lib/workers/branch/index.ts +++ b/lib/workers/branch/index.ts @@ -560,7 +560,11 @@ export async function processBranch( logger.debug( `There are ${config.errors.length} errors and ${config.warnings.length} warnings` ); - const { prResult: result, pr } = await ensurePr(config); + const { prResult: result, pr } = await ensurePr(config, prLimitReached); + if (result === PrResult.LimitReached) { + logger.debug('Reached PR limit - skipping PR creation'); + return 'pr-limit-reached'; + } // TODO: ensurePr should check for automerge itself if (result === PrResult.AwaitingApproval) { return 'needs-pr-approval'; diff --git a/lib/workers/common.ts b/lib/workers/common.ts index b0673050a363b2b42789e392bde2a876d2aa842e..5b65c79364c04dd990b43eddebb036926d8834a6 100644 --- a/lib/workers/common.ts +++ b/lib/workers/common.ts @@ -72,6 +72,7 @@ export enum PrResult { ErrorAlreadyExists = 'ErrorAlreadyExists', NotUpdated = 'NotUpdated', Updated = 'Updated', + LimitReached = 'LimitReached', } export type ProcessBranchResult = diff --git a/lib/workers/pr/index.spec.ts b/lib/workers/pr/index.spec.ts index 80244ccf655ae6ead7f6b3ef455a96b82a9bdce0..24cbecbc1a39afbdcaa567066451e0542f1bcdaa 100644 --- a/lib/workers/pr/index.spec.ts +++ b/lib/workers/pr/index.spec.ts @@ -261,6 +261,16 @@ describe('workers/pr', () => { expect(platform.createPr.mock.calls[0]).toMatchSnapshot(); existingPr.body = platform.createPr.mock.calls[0][0].prBody; }); + it('should not create PR if limit is reached', async () => { + platform.getBranchStatus.mockResolvedValueOnce(BranchStatus.green); + config.logJSON = await getChangeLogJSON(config); + config.prCreation = 'status-success'; + config.automerge = true; + config.schedule = ['before 5am']; + const { prResult } = await prWorker.ensurePr(config, true); + expect(prResult).toEqual(PrResult.LimitReached); + expect(platform.createPr.mock.calls).toBeEmpty(); + }); it('should create group PR', async () => { config.upgrades = config.upgrades.concat([ { diff --git a/lib/workers/pr/index.ts b/lib/workers/pr/index.ts index 4e42001f63a4ab6dd77ae301856749f280c6cb7a..fe7771f971a45dfff5aa6d793c479d311de5c137 100644 --- a/lib/workers/pr/index.ts +++ b/lib/workers/pr/index.ts @@ -96,7 +96,8 @@ export async function addAssigneesReviewers( // Ensures that PR exists with matching title/body export async function ensurePr( - prConfig: BranchConfig + prConfig: BranchConfig, + prLimitReached?: boolean ): Promise<{ prResult: PrResult; pr?: Pr; @@ -359,6 +360,9 @@ export async function ensurePr( config.automergeType === 'pr' && config.gitLabAutomerge, }; + if (prLimitReached) { + return { prResult: PrResult.LimitReached }; + } pr = await platform.createPr({ branchName, targetBranch: config.baseBranch,