diff --git a/docs/usage/configuration-options.md b/docs/usage/configuration-options.md index c89cd097d2cd384f1f73bb608db3050c6cd60116..9bb09058e75cc4f491bd9742b583996c92cda6be 100644 --- a/docs/usage/configuration-options.md +++ b/docs/usage/configuration-options.md @@ -1336,6 +1336,19 @@ For example, consider this config: It would take the entire `"config:base"` preset - which has a lot of sub-presets - but ignore the `":prHourlyLimit2"` rule. +## ignoreReviewers + +By default, Renovate does not add assignees or reviewers to PRs which are configured for automerge. +If tests have failed, Renovate then does add them, but only if the assignees and reviewers list is empty. +In the case that a user is automatically added as reviewer (such as Renovate Approve bot) and you want to ignore it for the purpose of this decision, add it to the `ignoreReviewers` list. + +```json +{ + "reviewers": ["foo"], + "ignoreReviewers": ["renovate-approve"] +} +``` + ## ignoreScripts Applicable for npm and Composer only for now. Set this to `true` if running scripts causes problems. diff --git a/docs/usage/key-concepts/automerge.md b/docs/usage/key-concepts/automerge.md index acad5034890ddad1a8e04b7da672fc683495d839..cbc711491929efe7e1ad9300a6dd5d216fcc43c3 100644 --- a/docs/usage/key-concepts/automerge.md +++ b/docs/usage/key-concepts/automerge.md @@ -137,6 +137,9 @@ If you have enabled branch protection which prevents Renovate from automerging d When automerge is enabled on a PR, Renovate will _not_ add assignees or reviewers at PR creation time, in order to decrease notifications noise a little. If tests subsequently _fail_, making automerge not possible, then Renovate will add the configured assignees and/or reviewers. +Note: Renovate won't add assignees and reviewers to a PR with failing checks if the PR already has assignees or reviewers present. +If there are accounts you wish to ignore (i.e. add assignees and reviewers regardless) then add them to `ignoreReviewers` to specify those which should be filtered out in such consideration. + ## Frequent problems and how to resolve them ### Automerge not enabled correctly in config diff --git a/lib/config/options/index.ts b/lib/config/options/index.ts index 898292ff8089eac64e2b591fd76cbabfd8e8bc88..ec1f31ecd569bae7ddeb1e6cd579f2c497fb26f9 100644 --- a/lib/config/options/index.ts +++ b/lib/config/options/index.ts @@ -1900,6 +1900,13 @@ const options: RenovateOptions[] = [ type: 'boolean', default: false, }, + { + name: 'ignoreReviewers', + description: + 'Reviewers to be ignored in PR reviewers presence (either username or email address depending on the platform).', + type: 'array', + subType: 'string', + }, { name: 'reviewers', description: diff --git a/lib/config/types.ts b/lib/config/types.ts index 3c2c8ef3757484a2f308d0bf7c537ef7105f97c6..817fcdca976dcb052fb8890dac24fd8c39ae5ece 100644 --- a/lib/config/types.ts +++ b/lib/config/types.ts @@ -262,6 +262,7 @@ export interface AssigneesAndReviewersConfig { assigneesFromCodeOwners?: boolean; assignees?: string[]; assigneesSampleSize?: number; + ignoreReviewers?: string[]; reviewersFromCodeOwners?: boolean; reviewers?: string[]; reviewersSampleSize?: number; diff --git a/lib/modules/platform/azure/__snapshots__/index.spec.ts.snap b/lib/modules/platform/azure/__snapshots__/index.spec.ts.snap index 52dc90bafe4efcc6dd265d7a1d1e3b5ae5f3c3e7..7c57b8934ba826c71249bcc75d44b2daaa0ab196 100644 --- a/lib/modules/platform/azure/__snapshots__/index.spec.ts.snap +++ b/lib/modules/platform/azure/__snapshots__/index.spec.ts.snap @@ -238,7 +238,6 @@ exports[`modules/platform/azure/index getPr(prNo) should return a pr in the righ }, "createdAt": undefined, "displayNumber": "Pull Request #1234", - "hasReviewers": false, "labels": [ "renovate", ], diff --git a/lib/modules/platform/azure/index.spec.ts b/lib/modules/platform/azure/index.spec.ts index 36358385f3e3933b43ef6ce93f5ed560c1ecca3d..54364a6e6bff5df06ff8650cc918a3c42770d612 100644 --- a/lib/modules/platform/azure/index.spec.ts +++ b/lib/modules/platform/azure/index.spec.ts @@ -379,7 +379,6 @@ describe('modules/platform/azure/index', () => { }, createdAt: undefined, displayNumber: 'Pull Request #1', - hasReviewers: false, labels: [], number: 1, pullRequestId: 1, diff --git a/lib/modules/platform/azure/index.ts b/lib/modules/platform/azure/index.ts index c2ea8376bfd81cb0983981d7942f11840578369a..39320768cc0bc983a50318965ab8c6843c7b160b 100644 --- a/lib/modules/platform/azure/index.ts +++ b/lib/modules/platform/azure/index.ts @@ -288,7 +288,6 @@ export async function getPr(pullRequestId: number): Promise<Pr | null> { .filter((label) => label.active) .map((label) => label.name) .filter(is.string); - azurePr.hasReviewers = is.nonEmptyArray(azurePr.reviewers); return azurePr; } diff --git a/lib/modules/platform/bitbucket-server/__snapshots__/index.spec.ts.snap b/lib/modules/platform/bitbucket-server/__snapshots__/index.spec.ts.snap index e135f302c2075ce3a3e0b83b9dc512cea19ed561..c1dcbecf200f4edd5ce334b37ae6d94846f486e4 100644 --- a/lib/modules/platform/bitbucket-server/__snapshots__/index.spec.ts.snap +++ b/lib/modules/platform/bitbucket-server/__snapshots__/index.spec.ts.snap @@ -32,7 +32,6 @@ exports[`modules/platform/bitbucket-server/index endpoint with no path getBranch }, "createdAt": 1547853840016, "displayNumber": "Pull Request #5", - "hasReviewers": true, "number": 5, "reviewers": [ "userName2", @@ -52,7 +51,6 @@ exports[`modules/platform/bitbucket-server/index endpoint with no path getPr() c }, "createdAt": 1547853840016, "displayNumber": "Pull Request #5", - "hasReviewers": true, "number": 5, "reviewers": [ "userName2", @@ -72,7 +70,6 @@ exports[`modules/platform/bitbucket-server/index endpoint with no path getPr() c }, "createdAt": 1547853840016, "displayNumber": "Pull Request #5", - "hasReviewers": true, "number": 5, "reviewers": [ "userName2", @@ -92,7 +89,6 @@ exports[`modules/platform/bitbucket-server/index endpoint with no path getPr() c }, "createdAt": 1547853840016, "displayNumber": "Pull Request #5", - "hasReviewers": true, "number": 5, "reviewers": [ "userName2", @@ -112,7 +108,6 @@ exports[`modules/platform/bitbucket-server/index endpoint with no path getPr() g }, "createdAt": 1547853840016, "displayNumber": "Pull Request #5", - "hasReviewers": true, "number": 5, "reviewers": [ "userName2", @@ -132,7 +127,6 @@ exports[`modules/platform/bitbucket-server/index endpoint with no path getPr() g }, "createdAt": undefined, "displayNumber": "Pull Request #undefined", - "hasReviewers": false, "number": undefined, "reviewers": [], "sourceBranch": undefined, @@ -248,7 +242,6 @@ exports[`modules/platform/bitbucket-server/index endpoint with path getBranchPr( }, "createdAt": 1547853840016, "displayNumber": "Pull Request #5", - "hasReviewers": true, "number": 5, "reviewers": [ "userName2", @@ -268,7 +261,6 @@ exports[`modules/platform/bitbucket-server/index endpoint with path getPr() canR }, "createdAt": 1547853840016, "displayNumber": "Pull Request #5", - "hasReviewers": true, "number": 5, "reviewers": [ "userName2", @@ -288,7 +280,6 @@ exports[`modules/platform/bitbucket-server/index endpoint with path getPr() canR }, "createdAt": 1547853840016, "displayNumber": "Pull Request #5", - "hasReviewers": true, "number": 5, "reviewers": [ "userName2", @@ -308,7 +299,6 @@ exports[`modules/platform/bitbucket-server/index endpoint with path getPr() canR }, "createdAt": 1547853840016, "displayNumber": "Pull Request #5", - "hasReviewers": true, "number": 5, "reviewers": [ "userName2", @@ -328,7 +318,6 @@ exports[`modules/platform/bitbucket-server/index endpoint with path getPr() gets }, "createdAt": 1547853840016, "displayNumber": "Pull Request #5", - "hasReviewers": true, "number": 5, "reviewers": [ "userName2", @@ -348,7 +337,6 @@ exports[`modules/platform/bitbucket-server/index endpoint with path getPr() gets }, "createdAt": undefined, "displayNumber": "Pull Request #undefined", - "hasReviewers": false, "number": undefined, "reviewers": [], "sourceBranch": undefined, diff --git a/lib/modules/platform/bitbucket-server/index.ts b/lib/modules/platform/bitbucket-server/index.ts index e71b0311d7fb53d66e83cf2f5a888a4ae4f087a8..c817596d08c651a0c82d1f294b35fdaea3ecf69c 100644 --- a/lib/modules/platform/bitbucket-server/index.ts +++ b/lib/modules/platform/bitbucket-server/index.ts @@ -1,4 +1,3 @@ -import is from '@sindresorhus/is'; import delay from 'delay'; import JSON5 from 'json5'; import type { PartialDeep } from 'type-fest'; @@ -265,7 +264,6 @@ export async function getPr( ...utils.prInfo(res.body), reviewers: res.body.reviewers.map((r) => r.user.name), }; - pr.hasReviewers = is.nonEmptyArray(pr.reviewers); // TODO #7154 pr.version = updatePrVersion(pr.number, pr.version!); diff --git a/lib/modules/platform/bitbucket/__snapshots__/index.spec.ts.snap b/lib/modules/platform/bitbucket/__snapshots__/index.spec.ts.snap index d85ff37cef732a00095ad5e713e5b121c5f54b58..c16e0e18d06fcb35b2b12fdf29375ccf6dea68a0 100644 --- a/lib/modules/platform/bitbucket/__snapshots__/index.spec.ts.snap +++ b/lib/modules/platform/bitbucket/__snapshots__/index.spec.ts.snap @@ -35,7 +35,6 @@ exports[`modules/platform/bitbucket/index getBranchPr() bitbucket finds PR for b }, "createdAt": "2018-07-02T07:02:25.275030+00:00", "displayNumber": "Pull Request #5", - "hasReviewers": false, "number": 5, "sourceBranch": "branch", "state": "open", @@ -70,7 +69,6 @@ exports[`modules/platform/bitbucket/index getPr() canRebase 1`] = ` }, "createdAt": "2018-07-02T07:02:25.275030+00:00", "displayNumber": "Pull Request #3", - "hasReviewers": false, "number": 3, "sourceBranch": "branch", "state": "open", @@ -86,7 +84,6 @@ exports[`modules/platform/bitbucket/index getPr() canRebase 2`] = ` }, "createdAt": "2018-07-02T07:02:25.275030+00:00", "displayNumber": "Pull Request #5", - "hasReviewers": false, "number": 5, "sourceBranch": "branch", "state": "open", @@ -102,7 +99,6 @@ exports[`modules/platform/bitbucket/index getPr() canRebase 3`] = ` }, "createdAt": "2018-07-02T07:02:25.275030+00:00", "displayNumber": "Pull Request #5", - "hasReviewers": false, "number": 5, "sourceBranch": "branch", "state": "open", @@ -118,7 +114,6 @@ exports[`modules/platform/bitbucket/index getPr() exists 1`] = ` }, "createdAt": "2018-07-02T07:02:25.275030+00:00", "displayNumber": "Pull Request #5", - "hasReviewers": false, "number": 5, "sourceBranch": "branch", "state": "open", diff --git a/lib/modules/platform/bitbucket/index.spec.ts b/lib/modules/platform/bitbucket/index.spec.ts index 55009a07bcb68c3f1ab078affc5e3970cfdd1183..36683143ecf24748f98df5017f40964b12ef0ca6 100644 --- a/lib/modules/platform/bitbucket/index.spec.ts +++ b/lib/modules/platform/bitbucket/index.spec.ts @@ -985,6 +985,32 @@ describe('modules/platform/bitbucket/index', () => { expect(await bitbucket.getPr(5)).toMatchSnapshot(); }); + + it('reviewers', async () => { + const reviewer = { + display_name: 'Jane Smith', + uuid: '{90b6646d-1724-4a64-9fd9-539515fe94e9}', + account_id: '456', + }; + const scope = await initRepoMock(); + scope.get('/2.0/repositories/some/repo/pullrequests/5').reply(200, { + ...pr, + reviewers: [reviewer], + }); + expect(await bitbucket.getPr(5)).toEqual({ + bodyStruct: { + hash: '761b7ad8ad439b2855fcbb611331c646ef0870b0631247bba3f3025cb6df5a53', + }, + createdAt: '2018-07-02T07:02:25.275030+00:00', + displayNumber: 'Pull Request #5', + number: 5, + reviewers: ['{90b6646d-1724-4a64-9fd9-539515fe94e9}'], + sourceBranch: 'branch', + state: 'open', + targetBranch: 'master', + title: 'title', + }); + }); }); describe('massageMarkdown()', () => { diff --git a/lib/modules/platform/bitbucket/index.ts b/lib/modules/platform/bitbucket/index.ts index c1db3ea9620374ab41c61ae55bcd396247effb77..397ab4269f25ee27051e9fe8ddc7140496e8174a 100644 --- a/lib/modules/platform/bitbucket/index.ts +++ b/lib/modules/platform/bitbucket/index.ts @@ -290,12 +290,16 @@ export async function getPr(prNo: number): Promise<Pr | null> { return null; } - const res: any = { + const res: Pr = { displayNumber: `Pull Request #${pr.id}`, ...utils.prInfo(pr), }; - res.hasReviewers = is.nonEmptyArray(pr.reviewers); + if (is.nonEmptyArray(pr.reviewers)) { + res.reviewers = pr.reviewers + .map(({ uuid }) => uuid) + .filter(is.nonEmptyString); + } return res; } diff --git a/lib/modules/platform/github/common.ts b/lib/modules/platform/github/common.ts index b8fbf81a5a7837cfcca0d8ee7edcafecad97591a..4d0af34c62bba7b9dad03ddfea07d889ec9aced3 100644 --- a/lib/modules/platform/github/common.ts +++ b/lib/modules/platform/github/common.ts @@ -38,7 +38,9 @@ export function coerceRestPr(pr: GhRestPr): GhPr { } if (pr.requested_reviewers) { - result.hasReviewers = true; + result.reviewers = pr.requested_reviewers + .map(({ login }) => login) + .filter(is.nonEmptyString); } if (pr.created_at) { diff --git a/lib/modules/platform/github/index.spec.ts b/lib/modules/platform/github/index.spec.ts index 4e059d0b7a47046701f192086116fcf38e42d6ea..23b69abb522146f340fd5a4c9c4862964e99a052 100644 --- a/lib/modules/platform/github/index.spec.ts +++ b/lib/modules/platform/github/index.spec.ts @@ -2580,7 +2580,6 @@ describe('modules/platform/github/index', () => { }, displayNumber: 'Pull Request #1234', hasAssignees: true, - hasReviewers: true, number: 1234, sourceBranch: 'some/branch', state: 'open', diff --git a/lib/modules/platform/gitlab/__snapshots__/index.spec.ts.snap b/lib/modules/platform/gitlab/__snapshots__/index.spec.ts.snap index 5aa3de2cc3f26ff55062bddc9b565e8c42c7cce1..c8fc7d11ac7b262790976e37d725547a5a01e98a 100644 --- a/lib/modules/platform/gitlab/__snapshots__/index.spec.ts.snap +++ b/lib/modules/platform/gitlab/__snapshots__/index.spec.ts.snap @@ -75,10 +75,10 @@ exports[`modules/platform/gitlab/index getBranchPr(branchName) should return the }, "displayNumber": "Merge Request #91", "hasAssignees": false, - "hasReviewers": false, "headPipelineStatus": undefined, "labels": undefined, "number": 91, + "reviewers": undefined, "sha": undefined, "sourceBranch": "some-branch", "state": "open", @@ -94,11 +94,11 @@ exports[`modules/platform/gitlab/index getBranchPr(branchName) should strip depr }, "displayNumber": "Merge Request #91", "hasAssignees": false, - "hasReviewers": false, "headPipelineStatus": undefined, "isDraft": true, "labels": undefined, "number": 91, + "reviewers": undefined, "sha": undefined, "sourceBranch": "some-branch", "state": "open", @@ -114,11 +114,11 @@ exports[`modules/platform/gitlab/index getBranchPr(branchName) should strip draf }, "displayNumber": "Merge Request #91", "hasAssignees": false, - "hasReviewers": false, "headPipelineStatus": undefined, "isDraft": true, "labels": undefined, "number": 91, + "reviewers": undefined, "sha": undefined, "sourceBranch": "some-branch", "state": "open", @@ -134,11 +134,11 @@ exports[`modules/platform/gitlab/index getPr(prNo) removes deprecated draft pref }, "displayNumber": "Merge Request #12345", "hasAssignees": false, - "hasReviewers": false, "headPipelineStatus": undefined, "isDraft": true, "labels": undefined, "number": 12345, + "reviewers": undefined, "sha": undefined, "sourceBranch": "some-branch", "state": "merged", @@ -154,11 +154,11 @@ exports[`modules/platform/gitlab/index getPr(prNo) removes draft prefix from ret }, "displayNumber": "Merge Request #12345", "hasAssignees": false, - "hasReviewers": false, "headPipelineStatus": undefined, "isDraft": true, "labels": undefined, "number": 12345, + "reviewers": undefined, "sha": undefined, "sourceBranch": "some-branch", "state": "merged", @@ -174,10 +174,10 @@ exports[`modules/platform/gitlab/index getPr(prNo) returns the PR 1`] = ` }, "displayNumber": "Merge Request #12345", "hasAssignees": false, - "hasReviewers": false, "headPipelineStatus": undefined, "labels": undefined, "number": 12345, + "reviewers": undefined, "sha": undefined, "sourceBranch": "some-branch", "state": "merged", @@ -193,10 +193,10 @@ exports[`modules/platform/gitlab/index getPr(prNo) returns the PR with nonexisti }, "displayNumber": "Merge Request #12345", "hasAssignees": true, - "hasReviewers": false, "headPipelineStatus": undefined, "labels": undefined, "number": 12345, + "reviewers": undefined, "sha": undefined, "sourceBranch": "some-branch", "state": "open", @@ -212,10 +212,10 @@ exports[`modules/platform/gitlab/index getPr(prNo) returns the mergeable PR 1`] }, "displayNumber": "Merge Request #12345", "hasAssignees": true, - "hasReviewers": false, "headPipelineStatus": undefined, "labels": undefined, "number": 12345, + "reviewers": undefined, "sha": undefined, "sourceBranch": "some-branch", "state": "open", diff --git a/lib/modules/platform/gitlab/index.spec.ts b/lib/modules/platform/gitlab/index.spec.ts index 3f4ebe1a781bba6e4fcc5b8c61716d9035b177b7..21406758b4231632979f31734a6d594e7c7030ea 100644 --- a/lib/modules/platform/gitlab/index.spec.ts +++ b/lib/modules/platform/gitlab/index.spec.ts @@ -1919,6 +1919,47 @@ describe('modules/platform/gitlab/index', () => { expect(pr).toMatchSnapshot(); expect(pr?.hasAssignees).toBeTrue(); }); + + it('returns the PR with reviewers', async () => { + httpMock + .scope(gitlabApiHost) + .get( + '/api/v4/projects/undefined/merge_requests/12345?include_diverged_commits_count=1' + ) + .reply(200, { + id: 1, + iid: 12345, + title: 'do something', + description: 'a merge request', + state: 'merged', + merge_status: 'cannot_be_merged', + diverged_commits_count: 5, + source_branch: 'some-branch', + target_branch: 'master', + assignees: [], + reviewers: [ + { id: 1, username: 'foo' }, + { id: 2, username: 'bar' }, + ], + }); + const pr = await gitlab.getPr(12345); + expect(pr).toEqual({ + bodyStruct: { + hash: '23f41dbec0785a6c77457dd6ebf99ae5970c5fffc9f7a8ad7f66c1b8eeba5b90', + }, + displayNumber: 'Merge Request #12345', + hasAssignees: false, + headPipelineStatus: undefined, + labels: undefined, + number: 12345, + reviewers: ['foo', 'bar'], + sha: undefined, + sourceBranch: 'some-branch', + state: 'merged', + targetBranch: 'master', + title: 'do something', + }); + }); }); describe('updatePr(prNo, title, body)', () => { diff --git a/lib/modules/platform/gitlab/index.ts b/lib/modules/platform/gitlab/index.ts index 4a6cca5bcaed26903bf602697e12d08877eb09e3..bec610187461e0cd706077641cde20e72093fbf9 100644 --- a/lib/modules/platform/gitlab/index.ts +++ b/lib/modules/platform/gitlab/index.ts @@ -628,7 +628,7 @@ export async function getPr(iid: number): Promise<GitlabPr> { state: mr.state === 'opened' ? 'open' : mr.state, headPipelineStatus: mr.head_pipeline?.status, hasAssignees: !!(mr.assignee?.id ?? mr.assignees?.[0]?.id), - hasReviewers: !!mr.reviewers?.length, + reviewers: mr.reviewers?.map(({ username }) => username), title: mr.title, labels: mr.labels, sha: mr.sha, diff --git a/lib/modules/platform/types.ts b/lib/modules/platform/types.ts index 3dc626c3b09cb710ee0dabd6a4db5955d5794bb6..d35a8f9658669fe70b3d18d4b9017e637a8ad6c8 100644 --- a/lib/modules/platform/types.ts +++ b/lib/modules/platform/types.ts @@ -67,7 +67,6 @@ export interface Pr { closedAt?: string; displayNumber?: string; hasAssignees?: boolean; - hasReviewers?: boolean; labels?: string[]; number: number; reviewers?: string[]; diff --git a/lib/workers/repository/update/pr/index.spec.ts b/lib/workers/repository/update/pr/index.spec.ts index db355ade89171206ae8e3cdc7526f5e6c69cf605..9c56179c055beb7d4a372df5c48b0f24436be19f 100644 --- a/lib/workers/repository/update/pr/index.spec.ts +++ b/lib/workers/repository/update/pr/index.spec.ts @@ -361,7 +361,6 @@ describe('workers/repository/update/pr/index', () => { const changedPr: Pr = { ...pr, hasAssignees: false, - hasReviewers: false, }; platform.getBranchPr.mockResolvedValueOnce(changedPr); checks.resolveBranchStatus.mockResolvedValueOnce('red'); @@ -377,6 +376,27 @@ describe('workers/repository/update/pr/index', () => { expect(participants.addParticipants).toHaveBeenCalled(); }); + it('adds reviewers for PR automerge with red status and existing ignorable reviewers that can be ignored', async () => { + const changedPr: Pr = { + ...pr, + hasAssignees: false, + reviewers: ['renovate-approve'], + }; + platform.getBranchPr.mockResolvedValueOnce(changedPr); + checks.resolveBranchStatus.mockResolvedValueOnce('red'); + + const res = await ensurePr({ + ...config, + automerge: true, + automergeType: 'pr', + assignAutomerge: false, + ignoreReviewers: ['renovate-approve'], + }); + + expect(res).toEqual({ type: 'with-pr', pr: changedPr }); + expect(participants.addParticipants).toHaveBeenCalled(); + }); + it('skips branch automerge and forces PR creation due to artifact errors', async () => { platform.createPr.mockResolvedValueOnce(pr); @@ -479,7 +499,6 @@ describe('workers/repository/update/pr/index', () => { const changedPr: Pr = { ...pr, hasAssignees: false, - hasReviewers: false, }; platform.getBranchPr.mockResolvedValueOnce(changedPr); checks.resolveBranchStatus.mockResolvedValueOnce('red'); @@ -504,7 +523,6 @@ describe('workers/repository/update/pr/index', () => { const changedPr: Pr = { ...pr, hasAssignees: false, - hasReviewers: false, }; platform.getBranchPr.mockResolvedValueOnce(changedPr); checks.resolveBranchStatus.mockResolvedValueOnce('red'); @@ -533,7 +551,6 @@ describe('workers/repository/update/pr/index', () => { const changedPr: Pr = { ...pr, hasAssignees: false, - hasReviewers: false, }; platform.getBranchPr.mockResolvedValueOnce(changedPr); checks.resolveBranchStatus.mockResolvedValueOnce('red'); diff --git a/lib/workers/repository/update/pr/index.ts b/lib/workers/repository/update/pr/index.ts index 5091ef1abf259cb6460d75a6cfdf9d6c1e7551f2..f34daccb90553c639d7a2d7bda1e06d56eba6003 100644 --- a/lib/workers/repository/update/pr/index.ts +++ b/lib/workers/repository/update/pr/index.ts @@ -74,6 +74,20 @@ export function updatePrDebugData( }; } +function hasNotIgnoredReviewers(pr: Pr, config: BranchConfig): boolean { + if ( + is.nonEmptyArray(config.ignoreReviewers) && + is.nonEmptyArray(pr.reviewers) + ) { + const ignoreReviewers = new Set(config.ignoreReviewers); + return ( + pr.reviewers.filter((reviewer) => !ignoreReviewers.has(reviewer)).length > + 0 + ); + } + return pr.reviewers ? pr.reviewers.length > 0 : false; +} + // Ensures that PR exists with matching title/body export async function ensurePr( prConfig: BranchConfig @@ -273,9 +287,10 @@ export async function ensurePr( try { if (existingPr) { logger.debug('Processing existing PR'); + if ( !existingPr.hasAssignees && - !existingPr.hasReviewers && + !hasNotIgnoredReviewers(existingPr, config) && config.automerge && !config.assignAutomerge && (await getBranchStatus()) === 'red'