diff options
Diffstat (limited to 'app/services/merge_requests/mergeability')
10 files changed, 116 insertions, 50 deletions
diff --git a/app/services/merge_requests/mergeability/check_base_service.rb b/app/services/merge_requests/mergeability/check_base_service.rb index e614a7c27fe..e1c4d751296 100644 --- a/app/services/merge_requests/mergeability/check_base_service.rb +++ b/app/services/merge_requests/mergeability/check_base_service.rb @@ -9,6 +9,10 @@ module MergeRequests @params = params end + def self.identifier + failure_reason + end + def skip? raise NotImplementedError end @@ -24,12 +28,22 @@ module MergeRequests private + def failure_reason + self.class.failure_reason + end + def success(**args) - Gitlab::MergeRequests::Mergeability::CheckResult.success(payload: args) + Gitlab::MergeRequests::Mergeability::CheckResult + .success(payload: default_payload(args)) end def failure(**args) - Gitlab::MergeRequests::Mergeability::CheckResult.failed(payload: args) + Gitlab::MergeRequests::Mergeability::CheckResult + .failed(payload: default_payload(args)) + end + + def default_payload(args) + args.merge(identifier: self.class.identifier) end end end diff --git a/app/services/merge_requests/mergeability/check_broken_status_service.rb b/app/services/merge_requests/mergeability/check_broken_status_service.rb index 6fe4eb4a57f..25293c53bb5 100644 --- a/app/services/merge_requests/mergeability/check_broken_status_service.rb +++ b/app/services/merge_requests/mergeability/check_broken_status_service.rb @@ -2,6 +2,10 @@ module MergeRequests module Mergeability class CheckBrokenStatusService < CheckBaseService + def self.failure_reason + :broken_status + end + def execute if merge_request.broken? failure(reason: failure_reason) @@ -17,12 +21,6 @@ module MergeRequests def cacheable? false end - - private - - def failure_reason - :broken_status - end end end end diff --git a/app/services/merge_requests/mergeability/check_ci_status_service.rb b/app/services/merge_requests/mergeability/check_ci_status_service.rb index 9e09b513c57..f7fa3259d97 100644 --- a/app/services/merge_requests/mergeability/check_ci_status_service.rb +++ b/app/services/merge_requests/mergeability/check_ci_status_service.rb @@ -2,6 +2,10 @@ module MergeRequests module Mergeability class CheckCiStatusService < CheckBaseService + def self.failure_reason + :ci_must_pass + end + def execute if merge_request.mergeable_ci_state? success @@ -17,12 +21,6 @@ module MergeRequests def cacheable? false end - - private - - def failure_reason - :ci_must_pass - end end end end diff --git a/app/services/merge_requests/mergeability/check_conflict_status_service.rb b/app/services/merge_requests/mergeability/check_conflict_status_service.rb new file mode 100644 index 00000000000..2bc253322c9 --- /dev/null +++ b/app/services/merge_requests/mergeability/check_conflict_status_service.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +module MergeRequests + module Mergeability + class CheckConflictStatusService < CheckBaseService + def self.failure_reason + :conflict + end + + def execute + if merge_request.can_be_merged? + success + else + failure(reason: failure_reason) + end + end + + def skip? + false + end + + def cacheable? + false + end + end + end +end diff --git a/app/services/merge_requests/mergeability/check_discussions_status_service.rb b/app/services/merge_requests/mergeability/check_discussions_status_service.rb index 3421d96e8ae..34db5f8a944 100644 --- a/app/services/merge_requests/mergeability/check_discussions_status_service.rb +++ b/app/services/merge_requests/mergeability/check_discussions_status_service.rb @@ -2,6 +2,10 @@ module MergeRequests module Mergeability class CheckDiscussionsStatusService < CheckBaseService + def self.failure_reason + :discussions_not_resolved + end + def execute if merge_request.mergeable_discussions_state? success @@ -17,12 +21,6 @@ module MergeRequests def cacheable? false end - - private - - def failure_reason - :discussions_not_resolved - end end end end diff --git a/app/services/merge_requests/mergeability/check_draft_status_service.rb b/app/services/merge_requests/mergeability/check_draft_status_service.rb index a1524317155..85b67fdc629 100644 --- a/app/services/merge_requests/mergeability/check_draft_status_service.rb +++ b/app/services/merge_requests/mergeability/check_draft_status_service.rb @@ -3,6 +3,10 @@ module MergeRequests module Mergeability class CheckDraftStatusService < CheckBaseService + def self.failure_reason + :draft_status + end + def execute if merge_request.draft? failure(reason: failure_reason) @@ -12,18 +16,12 @@ module MergeRequests end def skip? - false + params[:skip_draft_check].present? end def cacheable? false end - - private - - def failure_reason - :draft_status - end end end end diff --git a/app/services/merge_requests/mergeability/check_open_status_service.rb b/app/services/merge_requests/mergeability/check_open_status_service.rb index 29f3d0d3ccb..f5b70f18394 100644 --- a/app/services/merge_requests/mergeability/check_open_status_service.rb +++ b/app/services/merge_requests/mergeability/check_open_status_service.rb @@ -3,6 +3,10 @@ module MergeRequests module Mergeability class CheckOpenStatusService < CheckBaseService + def self.failure_reason + :not_open + end + def execute if merge_request.open? success @@ -18,12 +22,6 @@ module MergeRequests def cacheable? false end - - private - - def failure_reason - :not_open - end end end end diff --git a/app/services/merge_requests/mergeability/check_rebase_status_service.rb b/app/services/merge_requests/mergeability/check_rebase_status_service.rb new file mode 100644 index 00000000000..2163fec8bd6 --- /dev/null +++ b/app/services/merge_requests/mergeability/check_rebase_status_service.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +module MergeRequests + module Mergeability + class CheckRebaseStatusService < CheckBaseService + def self.failure_reason + :need_rebase + end + + def execute + if merge_request.should_be_rebased? + failure(reason: failure_reason) + else + success + end + end + + def skip? + params[:skip_rebase_check].present? + end + + def cacheable? + false + end + 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 987d6ce8e9f..86c8122604c 100644 --- a/app/services/merge_requests/mergeability/detailed_merge_status_service.rb +++ b/app/services/merge_requests/mergeability/detailed_merge_status_service.rb @@ -24,7 +24,7 @@ module MergeRequests ci_check_failure_reason end else - check_results.failure_reason + check_results.payload[:failure_reason] end end @@ -46,7 +46,11 @@ module MergeRequests def check_results strong_memoize(:check_results) do - merge_request.execute_merge_checks(params: { skip_ci_check: true }) + merge_request + .execute_merge_checks( + MergeRequest.mergeable_state_checks, + params: { skip_ci_check: true } + ) end end diff --git a/app/services/merge_requests/mergeability/run_checks_service.rb b/app/services/merge_requests/mergeability/run_checks_service.rb index 740a6feac2c..5150c03d0a3 100644 --- a/app/services/merge_requests/mergeability/run_checks_service.rb +++ b/app/services/merge_requests/mergeability/run_checks_service.rb @@ -9,8 +9,8 @@ module MergeRequests @params = params end - def execute - @results = merge_request.mergeability_checks.each_with_object([]) do |check_class, result_hash| + def execute(checks, execute_all: false) + @results = checks.each_with_object([]) do |check_class, result_hash| check = check_class.new(merge_request: merge_request, params: params) next if check.skip? @@ -21,24 +21,20 @@ module MergeRequests result_hash << check_result - break result_hash if check_result.failed? + break result_hash if check_result.failed? && !execute_all end logger.commit - self - end - - def success? - raise 'Execute needs to be called before' if results.nil? - - results.all?(&:success?) - end - - def failure_reason - raise 'Execute needs to be called before' if results.nil? + return ServiceResponse.success(payload: { results: results }) if all_results_success? - results.find(&:failed?)&.payload&.fetch(:reason)&.to_sym + ServiceResponse.error( + message: 'Checks failed.', + payload: { + results: results, + failure_reason: failure_reason + } + ) end private @@ -67,6 +63,14 @@ module MergeRequests MergeRequests::Mergeability::Logger.new(merge_request: merge_request) end end + + def all_results_success? + results.all?(&:success?) + end + + def failure_reason + results.find(&:failed?)&.payload&.fetch(:reason)&.to_sym + end end end end |