summaryrefslogtreecommitdiff
path: root/app/services/merge_requests/merge_base_service.rb
diff options
context:
space:
mode:
authorOswaldo Ferreira <oswaldo@gitlab.com>2019-01-31 16:32:44 -0200
committerOswaldo Ferreira <oswaldo@gitlab.com>2019-02-25 10:40:58 -0300
commit1ad699677fa4b24a9bc002c6dc20164b8832bca5 (patch)
tree8018d8af35b14d78b20144788a0b271226347a9b /app/services/merge_requests/merge_base_service.rb
parent992183534dd1af54bf891789aca5777ea91c0942 (diff)
downloadgitlab-ce-1ad699677fa4b24a9bc002c6dc20164b8832bca5.tar.gz
Support merge to ref for merge-commit and squash
Adds the ground work for writing into the merge ref refs/merge-requests/:iid/merge the merge result between source and target branches of a MR, without further side-effects such as mailing, MR updates and target branch changes.
Diffstat (limited to 'app/services/merge_requests/merge_base_service.rb')
-rw-r--r--app/services/merge_requests/merge_base_service.rb53
1 files changed, 53 insertions, 0 deletions
diff --git a/app/services/merge_requests/merge_base_service.rb b/app/services/merge_requests/merge_base_service.rb
new file mode 100644
index 00000000000..4c5a0d96957
--- /dev/null
+++ b/app/services/merge_requests/merge_base_service.rb
@@ -0,0 +1,53 @@
+# frozen_string_literal: true
+
+module MergeRequests
+ class MergeBaseService < MergeRequests::BaseService
+ include Gitlab::Utils::StrongMemoize
+
+ MergeError = Class.new(StandardError)
+
+ attr_reader :merge_request
+
+ # Overridden in EE.
+ def hooks_validation_pass?(_merge_request)
+ true
+ end
+
+ # Overridden in EE.
+ def hooks_validation_error(_merge_request)
+ end
+
+ def source
+ if merge_request.squash
+ squash_sha!
+ else
+ merge_request.diff_head_sha
+ end
+ end
+
+ private
+
+ def handle_merge_error(*args)
+ # No-op
+ end
+
+ def commit_message
+ params[:commit_message] ||
+ merge_request.default_merge_commit_message
+ 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
+ end
+end