debian-mirror-gitlab/app/services/merge_requests/merge_to_ref_service.rb

68 lines
2 KiB
Ruby
Raw Normal View History

2019-07-07 11:18:12 +05:30
# frozen_string_literal: true
module MergeRequests
2019-09-30 21:07:59 +05:30
# Performs the merge between source SHA and the target branch or the specified first parent ref. Instead
2019-07-07 11:18:12 +05:30
# of writing the result to the MR target branch, it targets the `target_ref`.
#
# Ideally this should leave the `target_ref` state with the same state the
# target branch would have if we used the regular `MergeService`, but without
# every side-effect that comes with it (MR updates, mails, source branch
# deletion, etc). This service should be kept idempotent (i.e. can
# be executed regardless of the `target_ref` current state).
#
class MergeToRefService < MergeRequests::MergeBaseService
2019-09-30 21:07:59 +05:30
extend ::Gitlab::Utils::Override
2019-07-07 11:18:12 +05:30
def execute(merge_request)
@merge_request = merge_request
2019-09-30 21:07:59 +05:30
error_check!
2019-07-07 11:18:12 +05:30
commit_id = commit
raise_error('Conflicts detected during merge') unless commit_id
commit = project.commit(commit_id)
target_id, source_id = commit.parent_ids
success(commit_id: commit.id,
target_id: target_id,
source_id: source_id)
2019-09-30 21:07:59 +05:30
rescue MergeError, ArgumentError => error
2019-07-07 11:18:12 +05:30
error(error.message)
end
private
2019-09-30 21:07:59 +05:30
override :source
def source
merge_request.diff_head_sha
2019-07-07 11:18:12 +05:30
end
2019-09-30 21:07:59 +05:30
override :error_check!
2019-07-07 11:18:12 +05:30
def error_check!
2019-09-30 21:07:59 +05:30
check_source
2019-07-07 11:18:12 +05:30
end
2019-09-30 21:07:59 +05:30
##
# The parameter `target_ref` is where the merge result will be written.
# Default is the merge ref i.e. `refs/merge-requests/:iid/merge`.
def target_ref
params[:target_ref] || merge_request.merge_ref_path
2019-07-07 11:18:12 +05:30
end
2019-09-30 21:07:59 +05:30
##
# The parameter `first_parent_ref` is the main line of the merge commit.
# Default is the target branch ref of the merge request.
def first_parent_ref
params[:first_parent_ref] || merge_request.target_branch_ref
2019-07-07 11:18:12 +05:30
end
def commit
2019-09-30 21:07:59 +05:30
repository.merge_to_ref(current_user, source, merge_request, target_ref, commit_message, first_parent_ref)
2019-07-07 11:18:12 +05:30
rescue Gitlab::Git::PreReceiveError => error
raise MergeError, error.message
end
end
end