diff --git a/.github/actions/isPullRequestMergeable/index.js b/.github/actions/isPullRequestMergeable/index.js index 6ab466f9133a..7c3e2cea37be 100644 --- a/.github/actions/isPullRequestMergeable/index.js +++ b/.github/actions/isPullRequestMergeable/index.js @@ -37,8 +37,15 @@ const run = function () { return; } + if (_.isEmpty(data.mergeable_state)) { + console.log('Pull request mergeable_state is not yet resolved...'); + retryCount++; + return; + } + mergeabilityResolved = true; - isMergeable = data.mergeable; + console.log(`Merge information for #${pullRequestNumber} - mergeable: ${data.mergeable}, mergeable_state: ${data.mergeable_state}`); + isMergeable = data.mergeable && data.mergeable_state.toUpperCase() !== 'BLOCKED'; }) .catch((githubError) => { mergeabilityResolved = true; diff --git a/.github/actions/isPullRequestMergeable/isPullRequestMergeable.js b/.github/actions/isPullRequestMergeable/isPullRequestMergeable.js index 55a7f3d12461..bb4a03d5dbc1 100644 --- a/.github/actions/isPullRequestMergeable/isPullRequestMergeable.js +++ b/.github/actions/isPullRequestMergeable/isPullRequestMergeable.js @@ -27,8 +27,15 @@ const run = function () { return; } + if (_.isEmpty(data.mergeable_state)) { + console.log('Pull request mergeable_state is not yet resolved...'); + retryCount++; + return; + } + mergeabilityResolved = true; - isMergeable = data.mergeable; + console.log(`Merge information for #${pullRequestNumber} - mergeable: ${data.mergeable}, mergeable_state: ${data.mergeable_state}`); + isMergeable = data.mergeable && data.mergeable_state.toUpperCase() !== 'BLOCKED'; }) .catch((githubError) => { mergeabilityResolved = true; diff --git a/tests/unit/isPullRequestMergeableTest.js b/tests/unit/isPullRequestMergeableTest.js index cf6a31b0bef1..2897b2589560 100644 --- a/tests/unit/isPullRequestMergeableTest.js +++ b/tests/unit/isPullRequestMergeableTest.js @@ -46,14 +46,14 @@ afterAll(() => { describe('isPullRequestMergeable', () => { test('Pull request immediately mergeable', () => { - mockGetPullRequest.mockResolvedValue({data: {mergeable: true}}); + mockGetPullRequest.mockResolvedValue({data: {mergeable: true, mergeable_state: 'CLEAN'}}); return run().then(() => { expect(mockSetOutput).toHaveBeenCalledWith('IS_MERGEABLE', true); }); }); test('Pull request immediately not mergeable', () => { - mockGetPullRequest.mockResolvedValue({data: {mergeable: false}}); + mockGetPullRequest.mockResolvedValue({data: {mergeable: false, mergeable_state: 'BLOCKED'}}); return run().then(() => { expect(mockSetOutput).toHaveBeenCalledWith('IS_MERGEABLE', false); }); @@ -61,7 +61,7 @@ describe('isPullRequestMergeable', () => { test('Pull request mergeable after delay', () => { mockGetPullRequest - .mockResolvedValue({data: {mergeable: true}}) + .mockResolvedValue({data: {mergeable: true, mergeable_state: 'CLEAN'}}) .mockResolvedValueOnce({data: {mergeable: null}}) .mockResolvedValueOnce({data: {mergeable: null}}); return run().then(() => { @@ -72,7 +72,7 @@ describe('isPullRequestMergeable', () => { test('Pull request not mergeable after delay', () => { mockGetPullRequest - .mockResolvedValue({data: {mergeable: false}}) + .mockResolvedValue({data: {mergeable: false, mergeable_state: 'BLOCKED'}}) .mockResolvedValueOnce({data: {mergeable: null}}) .mockResolvedValueOnce({data: {mergeable: null}}); return run().then(() => {