Class: Mutations::MergeRequests::Accept

Inherits:
Base
  • Object
show all
Defined in:
app/graphql/mutations/merge_requests/accept.rb

Constant Summary collapse

NOT_MERGEABLE =
'This branch cannot be merged'
HOOKS_VALIDATION_ERROR =
'Pre-merge hooks failed'
SHA_MISMATCH =
'The merge-head is not at the anticipated SHA'
MERGE_FAILED =
'The merge failed'
ALREADY_SCHEDULED =
'The merge request is already scheduled to be merged'

Constants inherited from BaseMutation

BaseMutation::ERROR_MESSAGE

Constants included from Gitlab::Graphql::Authorize::AuthorizeResource

Gitlab::Graphql::Authorize::AuthorizeResource::ConfigurationError, Gitlab::Graphql::Authorize::AuthorizeResource::RESOURCE_ACCESS_ERROR

Instance Method Summary collapse

Methods included from ResolvesIssuable

#resolve_issuable

Methods inherited from BaseMutation

#api_user?, authorization, authorized?, authorizes_object?, #current_user, #errors_on_object, #load_application_object, #read_only?, #ready?, #unauthorized_object

Methods included from Gitlab::Graphql::Authorize::AuthorizeResource

#authorize!, #authorized_find!, #authorized_resource?, #find_object, #raise_resource_not_available_error!

Instance Method Details

#resolve(project_path:, iid:, **args) ⇒ Object



44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'app/graphql/mutations/merge_requests/accept.rb', line 44

def resolve(project_path:, iid:, **args)
  Gitlab::QueryLimiting.disable!('https://gitlab.com/gitlab-org/gitlab/-/issues/4796')

  merge_request = authorized_find!(project_path: project_path, iid: iid)
  project = merge_request.target_project
  merge_params = args.compact.with_indifferent_access
  merge_service = ::MergeRequests::MergeService.new(project: project, current_user: current_user, params: merge_params)

  if error = validate(merge_request, merge_service, merge_params)
    return { merge_request: merge_request, errors: [error] }
  end

  merge_request.update(merge_error: nil, squash: merge_params[:squash])

  result = if merge_params.key?(:auto_merge_strategy)
             service = AutoMergeService.new(project, current_user, merge_params)
             service.execute(merge_request, merge_params[:auto_merge_strategy])
           else
             merge_service.execute(merge_request)
           end

  {
    merge_request: merge_request,
    errors: result == :failed ? [MERGE_FAILED] : []
  }
rescue ::MergeRequests::MergeBaseService::MergeError => e
  {
    merge_request: merge_request,
    errors: [e.message]
  }
end

#validate(merge_request, merge_service, merge_params) ⇒ Object



76
77
78
79
80
81
82
83
84
85
86
# File 'app/graphql/mutations/merge_requests/accept.rb', line 76

def validate(merge_request, merge_service, merge_params)
  if merge_request.auto_merge_enabled?
    ALREADY_SCHEDULED
  elsif !merge_request.mergeable?(skip_ci_check: merge_params.key?(:auto_merge_strategy))
    NOT_MERGEABLE
  elsif !merge_service.hooks_validation_pass?(merge_request)
    HOOKS_VALIDATION_ERROR
  elsif merge_params[:sha] != merge_request.diff_head_sha
    SHA_MISMATCH
  end
end