diff --git a/app/graphql/types/merge_requests/detailed_merge_status_enum.rb b/app/graphql/types/merge_requests/detailed_merge_status_enum.rb index ada572f45e820a9ef6b414f9041558168040c431..2d32bbe9148e5d499c85abe1facf854185b5d441 100644 --- a/app/graphql/types/merge_requests/detailed_merge_status_enum.rb +++ b/app/graphql/types/merge_requests/detailed_merge_status_enum.rb @@ -54,6 +54,12 @@ class DetailedMergeStatusEnum < BaseEnum value 'JIRA_ASSOCIATION', value: :jira_association_missing, description: 'Either the title or description must reference a Jira issue.' + value 'CONFLICT', + value: :conflict, + description: 'There are conflicts between the source and target branches.' + value 'NEED_REBASE', + value: :need_rebase, + description: 'Merge request needs to be rebased.' end end end diff --git a/app/services/merge_requests/mergeability/detailed_merge_status_service.rb b/app/services/merge_requests/mergeability/detailed_merge_status_service.rb index 2e28ffc4363900e360a65541caea8b4056ad80ba..e4444fdaea9e1b3196e8119a8e112d2c85f39a54 100644 --- a/app/services/merge_requests/mergeability/detailed_merge_status_service.rb +++ b/app/services/merge_requests/mergeability/detailed_merge_status_service.rb @@ -33,7 +33,7 @@ def execute attr_reader :merge_request, :checks, :ci_check def preparing? - merge_request.preparing? && !merge_request.merge_request_diff.persisted? + merge_request.preparing? end def checking? @@ -48,7 +48,7 @@ def check_results strong_memoize(:check_results) do merge_request .execute_merge_checks( - MergeRequest.mergeable_state_checks, + MergeRequest.all_mergeability_checks, params: { skip_ci_check: true } ) end diff --git a/doc/api/graphql/reference/index.md b/doc/api/graphql/reference/index.md index 41e227a1c0b2f04783285390011fa61cd7eb3b92..ef7d2e1b27b5cf97da33bd2c626193ab6be20fba 100644 --- a/doc/api/graphql/reference/index.md +++ b/doc/api/graphql/reference/index.md @@ -31203,11 +31203,13 @@ Detailed representation of whether a GitLab merge request can be merged. | <a id="detailedmergestatusci_must_pass"></a>`CI_MUST_PASS` | Pipeline must succeed before merging. | | <a id="detailedmergestatusci_still_running"></a>`CI_STILL_RUNNING` | Pipeline is still running. | | <a id="detailedmergestatuscommits_status"></a>`COMMITS_STATUS` | Source branch exists and contains commits. | +| <a id="detailedmergestatusconflict"></a>`CONFLICT` | There are conflicts between the source and target branches. | | <a id="detailedmergestatusdiscussions_not_resolved"></a>`DISCUSSIONS_NOT_RESOLVED` | Discussions must be resolved before merging. | | <a id="detailedmergestatusdraft_status"></a>`DRAFT_STATUS` | Merge request must not be draft before merging. | | <a id="detailedmergestatusexternal_status_checks"></a>`EXTERNAL_STATUS_CHECKS` | Status checks must pass. | | <a id="detailedmergestatusjira_association"></a>`JIRA_ASSOCIATION` | Either the title or description must reference a Jira issue. | | <a id="detailedmergestatusmergeable"></a>`MERGEABLE` | Branch can be merged. | +| <a id="detailedmergestatusneed_rebase"></a>`NEED_REBASE` | Merge request needs to be rebased. | | <a id="detailedmergestatusnot_approved"></a>`NOT_APPROVED` | Merge request must be approved before merging. | | <a id="detailedmergestatusnot_open"></a>`NOT_OPEN` | Merge request must be open before merging. | | <a id="detailedmergestatuspolicies_denied"></a>`POLICIES_DENIED` | There are denied policies for the merge request. | diff --git a/spec/services/merge_requests/mergeability/detailed_merge_status_service_spec.rb b/spec/services/merge_requests/mergeability/detailed_merge_status_service_spec.rb index a3c5427ee825a22729eb39be7076ca24c895190e..3d0b341b1faeeb39050c3d5ce7a09a933c819077 100644 --- a/spec/services/merge_requests/mergeability/detailed_merge_status_service_spec.rb +++ b/spec/services/merge_requests/mergeability/detailed_merge_status_service_spec.rb @@ -5,6 +5,16 @@ RSpec.describe ::MergeRequests::Mergeability::DetailedMergeStatusService, feature_category: :code_review_workflow do subject(:detailed_merge_status) { described_class.new(merge_request: merge_request).execute } + let(:merge_request) { create(:merge_request) } + + it 'calls every mergeability check' do + expect(merge_request).to receive(:execute_merge_checks) + .with(MergeRequest.all_mergeability_checks, any_args) + .and_call_original + + detailed_merge_status + end + context 'when merge status is cannot_be_merged_rechecking' do let(:merge_request) { create(:merge_request, merge_status: :cannot_be_merged_rechecking) } @@ -23,16 +33,6 @@ end end - context 'when merge status is preparing and merge request diff is persisted' do - let(:merge_request) { create(:merge_request, merge_status: :preparing) } - - it 'returns :checking' do - allow(merge_request.merge_request_diff).to receive(:persisted?).and_return(true) - - expect(detailed_merge_status).to eq(:mergeable) - end - end - context 'when merge status is checking' do let(:merge_request) { create(:merge_request, merge_status: :checking) }