diff options
Diffstat (limited to 'app/services/merge_requests/merge_service.rb')
-rw-r--r-- | app/services/merge_requests/merge_service.rb | 31 |
1 files changed, 21 insertions, 10 deletions
diff --git a/app/services/merge_requests/merge_service.rb b/app/services/merge_requests/merge_service.rb index 70a67baa01c..449997bcf07 100644 --- a/app/services/merge_requests/merge_service.rb +++ b/app/services/merge_requests/merge_service.rb @@ -8,6 +8,8 @@ module MergeRequests # Executed when you do merge via GitLab UI # class MergeService < MergeRequests::BaseService + include Gitlab::Utils::StrongMemoize + MergeError = Class.new(StandardError) attr_reader :merge_request, :source @@ -37,15 +39,10 @@ module MergeRequests end def source - return merge_request.diff_head_sha unless merge_request.squash - - squash_result = ::MergeRequests::SquashService.new(project, current_user, params).execute(merge_request) - - case squash_result[:status] - when :success - squash_result[:squash_sha] - when :error - raise ::MergeRequests::MergeService::MergeError, squash_result[:message] + if merge_request.squash + squash_sha! + else + merge_request.diff_head_sha end end @@ -82,8 +79,22 @@ module MergeRequests merge_request.update!(merge_commit_sha: commit_id) end + def squash_sha! + strong_memoize(:squash_sha) do + params[:merge_request] = merge_request + squash_result = ::MergeRequests::SquashService.new(project, current_user, params).execute + + case squash_result[:status] + when :success + squash_result[:squash_sha] + when :error + raise ::MergeRequests::MergeService::MergeError, squash_result[:message] + end + end + end + def try_merge - message = params[:commit_message] || merge_request.merge_commit_message + message = params[:commit_message] || merge_request.default_merge_commit_message repository.merge(current_user, source, merge_request, message) rescue Gitlab::Git::PreReceiveError => e |